{
    "name": "shlinkio/shlink",
    "type": "project",
    "homepage": "https://shlink.io",
    "description": "A self-hosted and PHP-based URL shortener application with CLI and REST interfaces",
    "license": "MIT",
    "authors": [
        {
            "name": "Alejandro Celaya Alastrué",
            "homepage": "https://www.alejandrocelaya.com",
            "email": "alejandro@alejandrocelaya.com"
        }
    ],
    "require": {
        "php": "^8.0",
        "ext-json": "*",
        "ext-pdo": "*",
        "akrabat/ip-address-middleware": "^2.1",
        "cakephp/chronos": "^2.3",
        "doctrine/migrations": "^3.3",
        "doctrine/orm": "^2.10",
        "endroid/qr-code": "^4.4",
        "geoip2/geoip2": "^2.12",
        "guzzlehttp/guzzle": "^7.4",
        "happyr/doctrine-specification": "^2.0",
        "jaybizzle/crawler-detect": "^1.2.110",
        "laminas/laminas-config": "^3.7",
        "laminas/laminas-config-aggregator": "^1.7",
        "laminas/laminas-diactoros": "^2.8",
        "laminas/laminas-inputfilter": "^2.13",
        "laminas/laminas-servicemanager": "^3.10",
        "laminas/laminas-stdlib": "^3.6",
        "lcobucci/jwt": "^4.1",
        "league/uri": "^6.4",
        "lstrojny/functional-php": "^1.17",
        "mezzio/mezzio": "^3.7",
        "mezzio/mezzio-fastroute": "^3.3",
        "mezzio/mezzio-problem-details": "^1.5",
        "mezzio/mezzio-swoole": "^4.0",
        "mlocati/ip-lib": "^1.17",
        "monolog/monolog": "^2.3",
        "nikolaposa/monolog-factory": "^3.1",
        "ocramius/proxy-manager": "^2.11",
        "pagerfanta/core": "^3.5",
        "php-amqplib/php-amqplib": "^3.1",
        "php-middleware/request-id": "^4.1",
        "predis/predis": "^1.1",
        "pugx/shortid-php": "^1.0",
        "ramsey/uuid": "^4.2",
        "shlinkio/shlink-common": "dev-main#cbcff58 as 4.4",
        "shlinkio/shlink-config": "^1.5",
        "shlinkio/shlink-event-dispatcher": "^2.3",
        "shlinkio/shlink-importer": "^2.5",
        "shlinkio/shlink-installer": "dev-develop#a008036 as 7.0",
        "shlinkio/shlink-ip-geolocation": "^2.2",
        "symfony/console": "^6.0",
        "symfony/filesystem": "^6.0",
        "symfony/lock": "^6.0",
        "symfony/mercure": "^0.6",
        "symfony/process": "^6.0",
        "symfony/string": "^6.0"
    },
    "require-dev": {
        "cebe/php-openapi": "^1.5",
        "devster/ubench": "^2.1",
        "dms/phpunit-arraysubset-asserts": "^0.3.0",
        "eaglewu/swoole-ide-helper": "dev-master",
        "infection/infection": "^0.26",
        "phpspec/prophecy-phpunit": "^2.0",
        "phpstan/phpstan": "^1.2",
        "phpstan/phpstan-doctrine": "^1.0",
        "phpstan/phpstan-symfony": "^1.0",
        "phpunit/php-code-coverage": "^9.2",
        "phpunit/phpunit": "^9.5",
        "roave/security-advisories": "dev-master",
        "shlinkio/php-coding-standard": "~2.2.0",
        "shlinkio/shlink-test-utils": "^2.5",
        "symfony/var-dumper": "^6.0",
        "veewee/composer-run-parallel": "^1.1"
    },
    "autoload": {
        "psr-4": {
            "Shlinkio\\Shlink\\CLI\\": "module/CLI/src",
            "Shlinkio\\Shlink\\Rest\\": "module/Rest/src",
            "Shlinkio\\Shlink\\Core\\": "module/Core/src"
        },
        "files": [
            "config/constants.php",
            "module/Core/functions/functions.php"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "ShlinkioTest\\Shlink\\CLI\\": "module/CLI/test",
            "ShlinkioTest\\Shlink\\Rest\\": "module/Rest/test",
            "ShlinkioApiTest\\Shlink\\Rest\\": "module/Rest/test-api",
            "ShlinkioTest\\Shlink\\Core\\": "module/Core/test",
            "ShlinkioDbTest\\Shlink\\Core\\": "module/Core/test-db"
        },
        "files": [
            "config/test/constants.php"
        ]
    },
    "scripts": {
        "ci": [
            "@cs",
            "@stan",
            "@swagger:validate",
            "@test:ci",
            "@infect:ci"
        ],
        "ci:parallel": [
            "@parallel cs stan swagger:validate test:unit:ci test:db:sqlite:ci test:db:mysql test:db:maria test:db:postgres test:db:ms",
            "@parallel infect:test:api infect:ci:unit infect:ci:db"
        ],
        "cs": "phpcs",
        "cs:fix": "phpcbf",
        "stan": "APP_ENV=test php vendor/bin/phpstan analyse module/*/src module/*/config config docker/config data/migrations --level=8",
        "test": [
            "@test:unit",
            "@test:db",
            "@test:api"
        ],
        "test:ci": [
            "@test:unit:ci",
            "@test:db",
            "@test:api:ci"
        ],
        "test:unit": "@php vendor/bin/phpunit --order-by=random --colors=always --coverage-php build/coverage-unit.cov --testdox",
        "test:unit:ci": "@test:unit --coverage-xml=build/coverage-unit/coverage-xml --log-junit=build/coverage-unit/junit.xml",
        "test:unit:pretty": "@php vendor/bin/phpunit --order-by=random --colors=always --coverage-html build/coverage-unit/coverage-html",
        "test:db": "@parallel test:db:sqlite:ci test:db:mysql test:db:maria test:db:postgres test:db:ms",
        "test:db:sqlite": "APP_ENV=test php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-db.xml",
        "test:db:sqlite:ci": "@test:db:sqlite --coverage-php build/coverage-db.cov --coverage-xml=build/coverage-db/coverage-xml --log-junit=build/coverage-db/junit.xml",
        "test:db:mysql": "DB_DRIVER=mysql composer test:db:sqlite",
        "test:db:maria": "DB_DRIVER=maria composer test:db:sqlite",
        "test:db:postgres": "DB_DRIVER=postgres composer test:db:sqlite",
        "test:db:ms": "DB_DRIVER=mssql composer test:db:sqlite",
        "test:api": "bin/test/run-api-tests.sh",
        "test:api:ci": "GENERATE_COVERAGE=yes composer test:api",
        "infect:ci:base": "infection --threads=4 --log-verbosity=default --only-covered --only-covering-test-cases --skip-initial-tests",
        "infect:ci:unit": "@infect:ci:base --coverage=build/coverage-unit --min-msi=80",
        "infect:ci:db": "@infect:ci:base --coverage=build/coverage-db --min-msi=95 --configuration=infection-db.json",
        "infect:ci:api": "@infect:ci:base --coverage=build/coverage-api --min-msi=80 --configuration=infection-api.json",
        "infect:ci": "@parallel infect:ci:unit infect:ci:db infect:ci:api",
        "infect:test": [
            "@parallel test:unit:ci test:db:sqlite:ci test:api:ci",
            "@infect:ci"
        ],
        "infect:test:unit": [
            "@test:unit:ci",
            "@infect:ci:unit"
        ],
        "infect:test:api": [
            "@test:api:ci",
            "@infect:ci:api"
        ],
        "swagger:validate": "php-openapi validate docs/swagger/swagger.json",
        "swagger:inline": "php-openapi inline docs/swagger/swagger.json docs/swagger/swagger-inlined.json",
        "clean:dev": "rm -f data/database.sqlite && rm -f config/params/generated_config.php"
    },
    "scripts-descriptions": {
        "ci": "<fg=blue;options=bold>Alias for \"cs\", \"stan\", \"swagger:validate\", \"test:ci\" and \"infect:ci\"</>",
        "ci:parallel": "<fg=blue;options=bold>Same as \"ci\", but parallelizing tasks as much as possible</>",
        "cs": "<fg=blue;options=bold>Checks coding styles</>",
        "cs:fix": "<fg=blue;options=bold>Fixes coding styles, when possible</>",
        "stan": "<fg=blue;options=bold>Inspects code with phpstan</>",
        "test": "<fg=blue;options=bold>Runs all test suites</>",
        "test:ci": "<fg=blue;options=bold>Runs all test suites, generating all needed reports and logs for CI envs</>",
        "test:unit": "<fg=blue;options=bold>Runs unit test suites</>",
        "test:unit:ci": "<fg=blue;options=bold>Runs unit test suites, generating all needed reports and logs for CI envs</>",
        "test:unit:pretty": "<fg=blue;options=bold>Runs unit test suites and generates an HTML code coverage report</>",
        "test:db": "<fg=blue;options=bold>Runs database test suites on a SQLite, MySQL, MariaDB, PostgreSQL and MsSQL</>",
        "test:db:sqlite": "<fg=blue;options=bold>Runs database test suites on a SQLite database</>",
        "test:db:sqlite:ci": "<fg=blue;options=bold>Runs database test suites on a SQLite database, generating all needed reports and logs for CI envs</>",
        "test:db:mysql": "<fg=blue;options=bold>Runs database test suites on a MySQL database</>",
        "test:db:maria": "<fg=blue;options=bold>Runs database test suites on a MariaDB database</>",
        "test:db:postgres": "<fg=blue;options=bold>Runs database test suites on a PostgreSQL database</>",
        "test:db:ms": "<fg=blue;options=bold>Runs database test suites on a Miscrosoft SQL Server database</>",
        "test:api": "<fg=blue;options=bold>Runs API test suites</>",
        "test:api:ci": "<fg=blue;options=bold>Runs API test suites, and generates code coverage reports</>",
        "infect:ci": "<fg=blue;options=bold>Checks unit and db tests quality applying mutation testing with existing reports and logs</>",
        "infect:ci:unit": "<fg=blue;options=bold>Checks unit tests quality applying mutation testing with existing reports and logs</>",
        "infect:ci:db": "<fg=blue;options=bold>Checks db tests quality applying mutation testing with existing reports and logs</>",
        "infect:test": "<fg=blue;options=bold>Runs unit and db tests, then checks tests quality applying mutation testing</>",
        "swagger:validate": "<fg=blue;options=bold>Validates the swagger docs, making sure they fulfil the spec</>",
        "swagger:inline": "<fg=blue;options=bold>Inlines swagger docs in a single file</>",
        "clean:dev": "<fg=blue;options=bold>Deletes artifacts which are gitignored and could affect dev env</>"
    },
    "config": {
        "sort-packages": true,
        "platform-check": false,
        "allow-plugins": {
            "composer/package-versions-deprecated": true,
            "dealerdirect/phpcodesniffer-composer-installer": true,
            "infection/extension-installer": true,
            "veewee/composer-run-parallel": true
        }
    }
}