diff --git a/.docker/Dockerfile-migration b/.docker/Dockerfile-migration deleted file mode 100644 index e439a75..0000000 --- a/.docker/Dockerfile-migration +++ /dev/null @@ -1,5 +0,0 @@ -FROM wyrihaximusnet/php:7.4-zts-alpine3.13-slim-dev AS migration - -WORKDIR /opt/migration -ENTRYPOINT ["wait-for", "postgres:5432", "-t", "600", "--"] -CMD ["make", "install_db"] diff --git a/.env.example b/.env.example deleted file mode 100644 index 4a650ab..0000000 --- a/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -PHINX_DB_HOST=postgres -PHINX_DB_USER=postgres -PHINX_DB_PASSWORD=postgres -PHINX_DB_DATABASE=postgres diff --git a/.env.github-actions b/.env.github-actions deleted file mode 100644 index 4a650ab..0000000 --- a/.env.github-actions +++ /dev/null @@ -1,4 +0,0 @@ -PHINX_DB_HOST=postgres -PHINX_DB_USER=postgres -PHINX_DB_PASSWORD=postgres -PHINX_DB_DATABASE=postgres diff --git a/.gitattributes b/.gitattributes index 02d565e..84ac135 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,24 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text eol=lf + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.webp binary +*.bmp binary +*.ttf binary +*.blp binary + # Ignoring files for distribution archieves -.idea/ .github/ export-ignore -etc/ export-ignore +etc/ci/ export-ignore +etc/dev-app/ export-ignore +etc/qa/ export-ignore +examples/ export-ignore tests/ export-ignore var/ export-ignore .devcontainer.json export-ignore @@ -9,6 +26,9 @@ var/ export-ignore .gitattributes export-ignore .gitignore export-ignore CONTRIBUTING.md export-ignore -infection.json.dist export-ignore +composer.lock export-ignore Makefile export-ignore README.md export-ignore + +# Diffing +*.php diff=php diff --git a/.github/renovate.json b/.github/renovate.json index c3a6d94..102fc02 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,10 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "github>WyriHaximus/renovate-config:php-package" - ] + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "github>WyriHaximus/renovate-config:php-package" + ], + "constraints": { + "php": "8.5.x", + "composer": "2.x" + } } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yaml similarity index 100% rename from .github/workflows/ci.yml rename to .github/workflows/ci.yaml diff --git a/.github/workflows/release-managment.yaml b/.github/workflows/release-management.yaml similarity index 94% rename from .github/workflows/release-managment.yaml rename to .github/workflows/release-management.yaml index c49b362..e472b26 100644 --- a/.github/workflows/release-managment.yaml +++ b/.github/workflows/release-management.yaml @@ -17,7 +17,7 @@ permissions: jobs: release-managment: name: Create Release - uses: WyriHaximus/github-workflows/.github/workflows/package-release-managment.yaml@main + uses: WyriHaximus/github-workflows/.github/workflows/package-release-management.yaml@main with: milestone: ${{ github.event.milestone.title }} description: ${{ github.event.milestone.title }} diff --git a/.gitignore b/.gitignore index 754836d..5076670 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ var/ vendor/ etc/qa/.phpunit.result.cache +var/* +!var/.gitkeep diff --git a/Makefile b/Makefile index c6aac98..73e6812 100644 --- a/Makefile +++ b/Makefile @@ -3,11 +3,15 @@ SHELL=bash .PHONY: * -COMPOSER_SHOW_EXTENSION_LIST=$(shell composer show -t | grep -o "\-\-\(ext-\).\+" | sort | uniq | cut -d- -f4- | tr -d '\n' | grep . | sed '/^$$/d' | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],' | sed 's/.$$//') -SLIM_DOCKER_IMAGE=$(shell php -r 'echo count(array_intersect(["gd", "vips"], explode(",", "${COMPOSER_SHOW_EXTENSION_LIST}"))) > 0 ? "" : "-slim";') -COMPOSER_CACHE_DIR=$(shell composer config --global cache-dir -q || echo ${HOME}/.composer-php/cache) -PHP_VERSION:=$(shell docker run --rm -v "`pwd`:`pwd`" jess/jq jq -r -c '.config.platform.php' "`pwd`/composer.json" | php -r "echo str_replace('|', '.', explode('.', implode('|', explode('.', stream_get_contents(STDIN), 2)), 2)[0]);") -COMPOSER_CONTAINER_CACHE_DIR=$(shell docker run --rm -it "ghcr.io/wyrihaximusnet/php:${PHP_VERSION}-nts-alpine${SLIM_DOCKER_IMAGE}-dev" composer config --global cache-dir -q || echo ${HOME}/.composer-php/cache) +DOCKER_AVAILABLE=$(shell ((command -v docker >/dev/null 2>&1) && echo 0 || echo 1)) +CONTAINER_REGISTRY_REPO="ghcr.io/wyrihaximusnet/php" +SLIM_DOCKER_IMAGE="-slim" +NTS_OR_ZTS_DOCKER_IMAGE="nts" +NEEDS_DOCKER_SOCKET=TRUE +PHP_VERSION="8.5" +CONTAINER_NAME=$(shell echo "${CONTAINER_REGISTRY_REPO}:${PHP_VERSION}-${NTS_OR_ZTS_DOCKER_IMAGE}-alpine${SLIM_DOCKER_IMAGE}-dev") +COMPOSER_CACHE_DIR=$(shell (command -v composer >/dev/null 2>&1) && composer config --global cache-dir -q 2>/dev/null || echo ${HOME}/.composer-php/cache) +COMPOSER_CONTAINER_CACHE_DIR=$(shell ((command -v docker >/dev/null 2>&1) && docker run --rm -it ${CONTAINER_NAME} composer config --global cache-dir -q) || echo ${HOME}/.composer-php/cache) ifneq ("$(wildcard /.you-are-in-a-wyrihaximus.net-php-docker-image)","") IN_DOCKER=TRUE @@ -17,12 +21,31 @@ endif ifeq ("$(IN_DOCKER)","TRUE") DOCKER_RUN:= + DOCKER_RUN_WITH_SOCKET:= + DOCKER_SHELL:= else - DOCKER_RUN:=docker run --rm -it \ - -v "`pwd`:`pwd`" \ - -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" \ - -w "`pwd`" \ - "ghcr.io/wyrihaximusnet/php:${PHP_VERSION}-nts-alpine${SLIM_DOCKER_IMAGE}-dev" + ifeq ($(DOCKER_AVAILABLE),0) + DOCKER_COMMON_OPS:=-v "`pwd`:`pwd`" -w "`pwd`" -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" -e OTEL_PHP_FIBERS_ENABLED="true" + ifeq ("$(NEEDS_DOCKER_SOCKET)","TRUE") + ifneq ("$(wildcard /var/run/docker.sock)","") + DOCKER_SOCKET_OPS:=-v "/var/run/docker.sock:/var/run/docker.sock" + DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:=-root + else + DOCKER_SOCKET_OPS:= + DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:= + endif + else + DOCKER_SOCKET_OPS:= + DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:= + endif + DOCKER_RUN:=docker run --rm -i ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}" + DOCKER_RUN_WITH_SOCKET:=docker run --rm -i ${DOCKER_COMMON_OPS} ${DOCKER_SOCKET_OPS} "${CONTAINER_NAME}${DOCKER_SOCKET_CONTAINER_NAME_SUFFIX}" + DOCKER_SHELL:=docker run --rm -it ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}" + else + DOCKER_RUN:= + DOCKER_RUN_WITH_SOCKET:= + DOCKER_SHELL:= + endif endif ifneq (,$(findstring icrosoft,$(shell cat /proc/version))) @@ -31,9 +54,248 @@ else THREADS=$(shell nproc) endif -all: ## Runs everything ### - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "###" | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | xargs --open-tty $(MAKE) +## Run everything extra point +all: ## Runs everything #### + $(DOCKER_RUN_WITH_SOCKET) make all-raw +all-raw: ## The real runs everything, but due to sponge it has to be ran inside DOCKER_RUN ##U## + $(MAKE) syntax-php rector-upgrade cs-fix cs stan unit-testing mutation-testing composer-require-checker composer-unused backward-compatibility-check ## Count: 10 + +## Temporary set of migrations to get all my repos in shape +migrations-git-enforce-gitattributes-contents: #### Enforce .gitattributes contents ##*I*## + ($(DOCKER_RUN) php -r 'file_put_contents(".gitattributes", base64_decode("IyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGNhc2UgcGVvcGxlIGRvbid0IGhhdmUgY29yZS5hdXRvY3JsZiBzZXQuCiogdGV4dCBlb2w9bGYKCiMgVGhlc2UgZmlsZXMgYXJlIGJpbmFyeSBhbmQgc2hvdWxkIGJlIGxlZnQgdW50b3VjaGVkCiMgKGJpbmFyeSBpcyBhIG1hY3JvIGZvciAtdGV4dCAtZGlmZikKKi5wbmcgYmluYXJ5CiouanBnIGJpbmFyeQoqLmpwZWcgYmluYXJ5CiouZ2lmIGJpbmFyeQoqLmljbyBiaW5hcnkKKi53ZWJwIGJpbmFyeQoqLmJtcCBiaW5hcnkKKi50dGYgYmluYXJ5CiouYmxwIGJpbmFyeQoKIyBJZ25vcmluZyBmaWxlcyBmb3IgZGlzdHJpYnV0aW9uIGFyY2hpZXZlcwouZ2l0aHViLyBleHBvcnQtaWdub3JlCmV0Yy9jaS8gZXhwb3J0LWlnbm9yZQpldGMvZGV2LWFwcC8gZXhwb3J0LWlnbm9yZQpldGMvcWEvIGV4cG9ydC1pZ25vcmUKZXhhbXBsZXMvIGV4cG9ydC1pZ25vcmUKdGVzdHMvIGV4cG9ydC1pZ25vcmUKdmFyLyBleHBvcnQtaWdub3JlCi5kZXZjb250YWluZXIuanNvbiBleHBvcnQtaWdub3JlCi5lZGl0b3Jjb25maWcgZXhwb3J0LWlnbm9yZQouZ2l0YXR0cmlidXRlcyBleHBvcnQtaWdub3JlCi5naXRpZ25vcmUgZXhwb3J0LWlnbm9yZQpDT05UUklCVVRJTkcubWQgZXhwb3J0LWlnbm9yZQpjb21wb3Nlci5sb2NrIGV4cG9ydC1pZ25vcmUKTWFrZWZpbGUgZXhwb3J0LWlnbm9yZQpSRUFETUUubWQgZXhwb3J0LWlnbm9yZQoKIyBEaWZmaW5nCioucGhwIGRpZmY9cGhwCg=="));' || true) + +migrations-git-make-sure-gitignore-exists: #### Make sure .gitignore exists ##*I*## + ($(DOCKER_RUN) touch .gitignore || true) + +migrations-git-make-sure-gitignore-ignores-var: #### Make sure .gitignore ignores var/* ##*I*## + ($(DOCKER_RUN) php -r '$$gitignoreFile = ".gitignore"; if (!file_exists($$gitignoreFile)) {exit;} $$txt = file_get_contents($$gitignoreFile); if (!is_string($$txt)) {exit;} if (strpos($$txt, "var/*") !== false) {exit;} file_put_contents($$gitignoreFile, "var/*\n", FILE_APPEND);' || true) + +migrations-git-make-sure-gitignore-excludes-var-gitkeep: #### Make sure .gitignore excludes var/.gitkeep ##*I*## + ($(DOCKER_RUN) php -r '$$gitignoreFile = ".gitignore"; if (!file_exists($$gitignoreFile)) {exit;} $$txt = file_get_contents($$gitignoreFile); if (!is_string($$txt)) {exit;} if (strpos($$txt, "!var/.gitkeep") !== false) {exit;} file_put_contents($$gitignoreFile, "!var/.gitkeep\n", FILE_APPEND);' || true) + +migrations-php-make-sure-var-exists: #### Make sure var/ exists ##*I*## + ($(DOCKER_RUN) mkdir var || true) + +migrations-php-make-sure-var-gitkeep-exists: #### Make sure var/.gitkeep exists ##*I*## + ($(DOCKER_RUN) touch var/.gitkeep || true) + +migrations-php-make-sure-etc-exists: #### Make sure etc/ exists ##*I*## + ($(DOCKER_RUN) mkdir etc || true) + +migrations-php-make-sure-etc-ci-exists: #### Make sure etc/ci/ exists ##*I*## + ($(DOCKER_RUN) mkdir etc/ci || true) + +migrations-php-make-sure-etc-qa-exists: #### Make sure etc/qa/ exists ##*I*## + ($(DOCKER_RUN) mkdir etc/qa || true) + +migrations-php-move-psalm-xml-config-to-etc: #### Move psalm.xml to etc/qa/psalm.xml ##*I*## + ($(DOCKER_RUN) mv psalm.xml etc/qa/psalm.xml || true) + +migrations-php-remove-psalm-xml-config: #### Make sure we remove etc/qa/psalm.xml ##*I*## + ($(DOCKER_RUN) rm etc/qa/psalm.xml || true) + +migrations-php-remove-old-phpunit-xml-dist-config: #### Make sure we remove phpunit.xml.dist ##*I*## + ($(DOCKER_RUN) rm phpunit.xml.dist || true) + +migrations-php-remove-old-phpunit-xml-config: #### Make sure we remove phpunit.xml ##*I*## + ($(DOCKER_RUN) rm phpunit.xml || true) + +migrations-php-ensure-etc-ci-markdown-link-checker-json-exists: #### Make sure we have etc/ci/markdown-link-checker.json ##*I*## + ($(DOCKER_RUN) php -r '$$markdownLinkCheckerFile = "etc/ci/markdown-link-checker.json"; $$json = json_decode("{\"httpHeaders\": [{\"urls\": [\"https://docs.github.com/\"],\"headers\": {\"Accept-Encoding\": \"zstd, br, gzip, deflate\"}}]}"); if (file_exists($$markdownLinkCheckerFile)) {exit;} file_put_contents($$markdownLinkCheckerFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-move-infection-config-to-etc: #### Move infection.json.dist to etc/qa/infection.json5 ##*I*## + ($(DOCKER_RUN) mv infection.json.dist etc/qa/infection.json5 || true) + +migrations-php-infection-create-config-if-not-exists: #### Create Infection config file if it doesn't exists at etc/qa/infection.json5 ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; $$infectionConfig = base64_decode("ewogICAgInRpbWVvdXQiOiAxMjAsCiAgICAic291cmNlIjogewogICAgICAgICJkaXJlY3RvcmllcyI6IFsKICAgICAgICAgICAgInNyYyIKICAgICAgICBdCiAgICB9LAogICAgImxvZ3MiOiB7CiAgICAgICAgInRleHQiOiAiLi4vLi4vdmFyL2luZmVjdGlvbi5sb2ciLAogICAgICAgICJzdW1tYXJ5IjogIi4uLy4uL3Zhci9pbmZlY3Rpb24tc3VtbWFyeS5sb2ciLAogICAgICAgICJqc29uIjogIi4uLy4uL3Zhci9pbmZlY3Rpb24uanNvbiIsCiAgICAgICAgInBlck11dGF0b3IiOiAiLi4vLi4vdmFyL2luZmVjdGlvbi1wZXItbXV0YXRvci5tZCIsCiAgICAgICAgImdpdGh1YiI6IHRydWUKICAgIH0sCiAgICAibWluTXNpIjogMTAwLAogICAgIm1pbkNvdmVyZWRNc2kiOiAxMDAsCiAgICAiaWdub3JlTXNpV2l0aE5vTXV0YXRpb25zIjogdHJ1ZSwKICAgICJtdXRhdG9ycyI6IHsKICAgICAgICAiQGRlZmF1bHQiOiB0cnVlCiAgICB9Cn0K"); if (file_exists($$infectionFile)) {exit;} file_put_contents($$infectionFile, $$infectionConfig);' || true) + +migrations-php-remove-phpunit-config-dir-from-infection: #### Drop XXX from etc/qa/infection.json5 ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("phpUnit", $$json)) {exit;} unset($$json["phpUnit"]); file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-fix-logs-relative-paths-for-infection: #### Fix logs paths in etc/qa/infection.json5 ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) {exit;} foreach ($$json["logs"] as $$logsKey => $$logsPath) { if (is_string($$json["logs"][$$logsKey]) && str_starts_with($$json["logs"][$$logsKey], "./var/infection")) { $$json["logs"][$$logsKey] = str_replace("./var/infection", "../../var/infection", $$json["logs"][$$logsKey]); } } file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-infection-ensure-log-text-has-the-correct-path: #### Ensure infection's log.text has config directive has the correct path ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) { $$json["logs"] = []; } $$json["logs"]["text"] = "../../var/infection.log"; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-infection-ensure-log-summary-has-the-correct-path: #### Ensure infection's log.summary has config directive has the correct path ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) { $$json["logs"] = []; } $$json["logs"]["summary"] = "../../var/infection-summary.log"; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-infection-ensure-log-json-has-the-correct-path: #### Ensure infection's log.json has config directive has the correct path ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) { $$json["logs"] = []; } $$json["logs"]["json"] = "../../var/infection.json"; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-infection-ensure-log-per-mutator-has-the-correct-path: #### Ensure infection's log.perMutator has config directive has the correct path ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) { $$json["logs"] = []; } $$json["logs"]["perMutator"] = "../../var/infection-per-mutator.md"; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-add-github-true-to-for-infection: #### Ensure we configure infection to emit logs to GitHub in etc/qa/infection.json5 ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) {exit;} if (array_key_exists("github", $$json["logs"])) {exit;} $$json["logs"]["github"] = true; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-make-paths-compatible-with-infection-0-32: #### We update path to be relative to etc/qa/infection.json5 as of 0.32 ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("source", $$json)) {exit;} if (!array_key_exists("directories", $$json["source"])) {exit;} foreach ($$json["source"]["directories"] as $$key => $$value) { if (!str_starts_with($$value, "../../")) {$$json["source"]["directories"][$$key] = "../../" . $$value;} } file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-set-phpunit-ensure-config-file-exists: #### Make sure we have a PHPUnit config file at etc/qa/phpunit.xml ##*I*## + ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (file_exists($$phpUnitConfigFIle)) {exit;} file_put_contents($$phpUnitConfigFIle, base64_decode("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBocHVuaXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgYm9vdHN0cmFwPSIuLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwIiBjb2xvcnM9InRydWUiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi92ZW5kb3IvcGhwdW5pdC9waHB1bml0L3BocHVuaXQueHNkIiBjYWNoZURpcmVjdG9yeT0iLi4vLi4vdmFyL3BocHVuaXQvY2FjaGUiPgogICAgPHRlc3RzdWl0ZXM+CiAgICAgICAgPHRlc3RzdWl0ZSBuYW1lPSJUZXN0IFN1aXRlIj4KICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi90ZXN0cy88L2RpcmVjdG9yeT4KICAgICAgICA8L3Rlc3RzdWl0ZT4KICAgIDwvdGVzdHN1aXRlcz4KICAgIDxzb3VyY2U+CiAgICAgICAgPGluY2x1ZGU+CiAgICAgICAgICAgIDxkaXJlY3Rvcnkgc3VmZml4PSIucGhwIj4uLi8uLi9zcmMvPC9kaXJlY3Rvcnk+CiAgICAgICAgPC9pbmNsdWRlPgogICAgPC9zb3VyY2U+CiAgICA8ZXh0ZW5zaW9ucz4KICAgICAgICA8Ym9vdHN0cmFwIGNsYXNzPSJFcmdlYm5pc1xQSFBVbml0XFNsb3dUZXN0RGV0ZWN0b3JcRXh0ZW5zaW9uIi8+CiAgICA8L2V4dGVuc2lvbnM+CjwvcGhwdW5pdD4K"));' || true) + +migrations-php-set-phpunit-xsd-path-to-local: #### Ensure that the PHPUnit XDS referred in etc/qa/phpunit.xml points to vendor/phpunit/phpunit/phpunit.xsd so we don't go over the network ##*I*## + ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (!file_exists($$phpUnitConfigFIle)) {exit;} $$xml = file_get_contents($$phpUnitConfigFIle); if (!is_string($$xml)) {exit;} for ($$major = 0; $$major < 23; $$major++) { for ($$minor = 0; $$minor < 23; $$minor++) { $$xml = str_replace("https://schema.phpunit.de/" . $$major . "." . $$minor . "/phpunit.xsd", "../../vendor/phpunit/phpunit/phpunit.xsd", $$xml); } } file_put_contents($$phpUnitConfigFIle, $$xml);' || true) + +migrations-php-move-phpstan: #### Move phpstan.neon to etc/qa/phpstan.neon ##*I*## + ($(DOCKER_RUN) mv phpstan.neon etc/qa/phpstan.neon || true) + +migrations-php-set-phpstan-ensure-config-file-exists: #### Make sure we have a PHPStan config file at etc/qa/phpstan.neon ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (file_exists($$phpStanConfigFIle)) {exit;} file_put_contents($$phpStanConfigFIle, "#parameters:");' || true) + +migrations-php-set-phpstan-uncomment-parameters: #### Ensure PHPStan config as parameters not commented out in etc/qa/phpstan.neon ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (!str_starts_with($$neon, "#parameters:")) {exit;} $$neon = str_replace("#parameters:", "parameters:", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file: #### Add parameters to PHPStan config file at etc/qa/phpstan.neon if it's not present ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (strpos($$neon, "parameters:") !== false) {exit;} file_put_contents($$phpStanConfigFIle, "parameters:", FILE_APPEND);' || true) + +migrations-php-set-phpstan-paths-in-config: #### Ensure PHPStan config has the etc, src, and tests paths set in etc/qa/phpstan.neon ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; $$pathsString = "\n\tpaths:\n\t\t- ../../etc\n\t\t- ../../src\n\t\t- ../../tests"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (strpos($$neon, $$pathsString) !== false) {exit;} $$neon = str_replace("parameters:", "parameters:" . $$pathsString, $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-set-phpstan-level-max-in-config: #### Ensure PHPStan config has level set to max in etc/qa/phpstan.neon ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; $$levelString = "\n\tlevel: max"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (strpos($$neon, $$levelString) !== false) {exit;} $$neon = str_replace("parameters:", "parameters:" . $$levelString, $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended: #### Ensure PHPStan config uses ergebnis.noExtends.classesAllowedToBeExtended not ergebnis.classesAllowedToBeExtended ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("\tergebnis:\n\t\tclassesAllowedToBeExtended:\n", "\tergebnis:\n\t\tnoExtends:\n\t\t\tclassesAllowedToBeExtended:\n", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType: #### Ensure PHPStan config doesn't contain checkGenericClassInNonGenericObjectType as it's no longer a valid config option ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("\tcheckGenericClassInNonGenericObjectType: false\n", "", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list: #### PHPStan add ../../ to anything in a list that starts with vendor ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("- vendor", "- ../../vendor", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-set-phpstan-drop-include-test-utilities-rules: #### Ensure PHPStan config doesn't contain include for wyrihaximus/async-utilities/rules.neon as it's now an extension ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("\nincludes:\n\t- ../../vendor/wyrihaximus/test-utilities/rules.neon\n", "", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-set-phpstan-drop-include-async-test-utilities-rules: #### Ensure PHPStan config doesn't contain include for wyrihaximus/async-test-utilities/rules.neon as it's now an extension ##*I*## + ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("\nincludes:\n\t- ../../vendor/wyrihaximus/async-test-utilities/rules.neon\n", "", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) + +migrations-php-set-rector-create-config-if-not-exists: #### Create Rector config file if it doesn't exists at etc/qa/rector.php ##*I*## + ($(DOCKER_RUN) php -r '$$rectorConfigFile = "etc/qa/rector.php"; $$defaultRectorConfig = "", "", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-cache-is-correct-relatively: #### Make sure PHPCS cache path is has ../../var/.phpcs.cache and not .phpcs.cache ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("", "", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc: #### Make sure PHPCS has ../../ prefixing etc/ to ensure correct relative path ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("etc", "../../etc/", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-sure-etc-has-no-trailing-slash: #### Make sure PHPCS has no tailing / on etc ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("../../etc/", "../../etc", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src: #### Make sure PHPCS has ../../ prefixing src/ to ensure correct relative path ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("src", "../../src/", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-sure-src-has-no-trailing-slash: #### Make sure PHPCS has no tailing / on src ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("../../src/", "../../src", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests: #### Make sure PHPCS has ../../ prefixing tests/ to ensure correct relative path ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("tests", "../../tests/", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-sure-tests-has-no-trailing-slash: #### Make sure PHPCS has no tailing / on tests ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("../../tests/", "../../tests", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-phpcs-make-sure-etc-is-ran-through: #### Make sure PHPCS runs through etc ##*I*## + ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} if (strpos($$xml, "../../etc") !== false) {exit;} $$xml = str_replace("../../src", "../../etc\n ../../src", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-phpcs-include-examples-directory-when-present: #### Make sure PHPCS runs through examples when it exists ##*I*## + ($(DOCKER_RUN) php -r 'if (!file_exists("examples/")) {exit;} $$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} if (strpos($$xml, "../../examples") !== false) {exit;} $$xml = str_replace("../../etc", "../../etc\n ../../examples", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) + +migrations-php-move-composer-require-checker: #### Move composer-require-checker.json to etc/qa/composer-require-checker.json ##*I*## + ($(DOCKER_RUN) mv composer-require-checker.json etc/qa/composer-require-checker.json || true) + +migrations-php-composer-require-checker-create-config-if-not-exists: #### Create Composer Require Checker config file if it doesn't exists at etc/qa/composer-require-checker.json ##*I*## + ($(DOCKER_RUN) php -r '$$composerRequireCheckerConfigFile = "etc/qa/composer-require-checker.json"; $$composerRequireCheckerConfig = base64_decode("ewogICJzeW1ib2wtd2hpdGVsaXN0IiA6IFsKICAgICJudWxsIiwgInRydWUiLCAiZmFsc2UiLAogICAgInN0YXRpYyIsICJzZWxmIiwgInBhcmVudCIsCiAgICAiYXJyYXkiLCAic3RyaW5nIiwgImludCIsICJmbG9hdCIsICJib29sIiwgIml0ZXJhYmxlIiwgImNhbGxhYmxlIiwgInZvaWQiLCAib2JqZWN0IgogIF0sCiAgInBocC1jb3JlLWV4dGVuc2lvbnMiIDogWwogICAgIkNvcmUiLAogICAgImRhdGUiLAogICAgInBjcmUiLAogICAgIlBoYXIiLAogICAgIlJlZmxlY3Rpb24iLAogICAgIlNQTCIsCiAgICAic3RhbmRhcmQiCiAgXSwKICAic2Nhbi1maWxlcyIgOiBbXQp9Cg=="); if (file_exists($$composerRequireCheckerConfigFile)) {exit;} file_put_contents($$composerRequireCheckerConfigFile, $$composerRequireCheckerConfig);' || true) + +migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line: #### Remove all lines that contains @phpstan-ignore-next-line ##*I*## + ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "@phpstan-ignore-next-line")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true) + +migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line: #### Remove rest of line for all lines that contain @phpstan-ignore-line ##*I*## + ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "/** @phpstan-ignore-line")) { [$$fileContents[$$lineNumber]] = explode("/** @phpstan-ignore-line", $$lineContent); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true) + +migrations-inline-code-psalm-remove-line-psalm-suppress: #### Remove all lines that contain @psalm-suppress ##*I*## + ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "@psalm-suppress")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true) + +migrations-php-make-sure-github-exists: #### Make sure .github/ exists ##*I*## + ($(DOCKER_RUN) mkdir .github || true) + +migrations-github-codeowners: #### Ensure a CODEOWNERS file is present, create only if it doesn't exist yet ##*I*## + ($(DOCKER_RUN) php -r '$$codeOwnersFile = ".github/CODEOWNERS"; if (file_exists($$codeOwnersFile)) {exit;} file_put_contents($$codeOwnersFile, "* @WyriHaximus" . PHP_EOL);' || true) + +migrations-php-make-sure-github-workflows-exists: #### Make sure .github/workflows exists ##*I*## + ($(DOCKER_RUN) mkdir .github/workflows || true) + +migrations-github-actions-remove-composer-diff: #### Remove composer-diff.yaml it has been folded into centralized workflows through ci.yaml ##*I*## + ($(DOCKER_RUN) rm .github/workflows/composer-diff.yaml || true) + +migrations-github-actions-remove-markdown-check-links: #### Remove markdown-check-links.yaml it has been folded into centralized workflows through ci.yaml ##*I*## + ($(DOCKER_RUN) rm .github/workflows/markdown-check-links.yaml || true) + +migrations-github-actions-remove-markdown-craft-release: #### Remove craft-release.yaml it has been folded into centralized workflows through release-management.yaml ##*I*## + ($(DOCKER_RUN) rm .github/workflows/craft-release.yaml || true) + +migrations-github-actions-remove-set-milestone-on-pr: #### Remove set-milestone-on-pr.yaml it has been folded into centralized workflows through release-management.yaml ##*I*## + ($(DOCKER_RUN) rm .github/workflows/set-milestone-on-pr.yaml || true) + +migrations-github-actions-move-ci: #### Move .github/workflows/ci.yml to .github/workflows/ci.yaml ##*I*## + ($(DOCKER_RUN) mv .github/workflows/ci.yml .github/workflows/ci.yaml || true) + +migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow: #### Remove CI Workflow if its the old style PHP CI Workflow ##*I*## + ($(DOCKER_RUN) php -r '$$ciWorkflowFile = ".github/workflows/ci.yaml"; if (!file_exists($$ciWorkflowFile)) {exit;} $$yaml = file_get_contents($$ciWorkflowFile); if (!is_string($$yaml)) {exit;} if (strpos($$yaml, "composer: [lowest, locked, highest]") !== false || strpos($$yaml, "composer: [lowest, current, highest]") !== false || strpos($$yaml, "- run: make ${{ matrix.check }}") !== false || strpos($$yaml, base64_decode("aWY6IG1hdHJpeC5jaGVjayA9PSAnYmFja3dhcmQtY29tcGF0aWJpbGl0eS1jaGVjayc=")) !== false) { unlink($$ciWorkflowFile); }' || true) + +migrations-github-actions-create-ci-if-not-exists: #### Create CI Workflow if it doesn't exists at .github/workflows/ci.yaml ##*I*## + ($(DOCKER_RUN) php -r '$$ciWorkflowFile = ".github/workflows/ci.yaml"; $$ciWorkflowContents = base64_decode("bmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgpvbjoKICBwdXNoOgogICAgYnJhbmNoZXM6CiAgICAgIC0gJ21haW4nCiAgICAgIC0gJ21hc3RlcicKICAgICAgLSAncmVmcy9oZWFkcy92WzAtOV0rLlswLTldKy5bMC05XSsnCiAgcHVsbF9yZXF1ZXN0OgojIyBUaGlzIHdvcmtmbG93IG5lZWRzIHRoZSBgcHVsbC1yZXF1ZXN0YCBwZXJtaXNzaW9ucyB0byB3b3JrIGZvciB0aGUgcGFja2FnZSBkaWZmaW5nCiMjIFJlZnM6IGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvcmVmZXJlbmNlL3dvcmtmbG93LXN5bnRheC1mb3ItZ2l0aHViLWFjdGlvbnMjcGVybWlzc2lvbnMKcGVybWlzc2lvbnM6CiAgcHVsbC1yZXF1ZXN0czogd3JpdGUKICBjb250ZW50czogcmVhZApqb2JzOgogIGNpOgogICAgbmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgogICAgdXNlczogV3lyaUhheGltdXMvZ2l0aHViLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9wYWNrYWdlLnlhbWxAbWFpbgo="); if (file_exists($$ciWorkflowFile)) {exit;} file_put_contents($$ciWorkflowFile, $$ciWorkflowContents);' || true) + +migrations-github-actions-move-release-management: #### Move .github/workflows/release-managment.yaml to .github/workflows/release-management.yaml ##*I*## + ($(DOCKER_RUN) mv .github/workflows/release-managment.yaml .github/workflows/release-management.yaml || true) + +migrations-github-actions-fix-management-in-release-management-referenced-workflow-file: #### Fix management in release-management referenced workflow file ##*I*## + ($(DOCKER_RUN) sed -i -e 's/release-managment.yaml/release-management.yaml/g' .github/workflows/release-management.yaml || true) + +migrations-github-actions-create-release-management-if-not-exists: #### Create Release Management Workflow if it doesn't exists at .github/workflows/release-management.yaml ##*I*## + ($(DOCKER_RUN) php -r '$$releaseManagementWorkflowFile = ".github/workflows/release-management.yaml"; $$releaseManagementWorkflowContents = base64_decode("bmFtZTogUmVsZWFzZSBNYW5hZ2VtZW50Cm9uOgogIHB1bGxfcmVxdWVzdDoKICAgIHR5cGVzOgogICAgICAtIG9wZW5lZAogICAgICAtIGxhYmVsZWQKICAgICAgLSB1bmxhYmVsZWQKICAgICAgLSBzeW5jaHJvbml6ZQogICAgICAtIHJlb3BlbmVkCiAgICAgIC0gbWlsZXN0b25lZAogICAgICAtIGRlbWlsZXN0b25lZAogICAgICAtIHJlYWR5X2Zvcl9yZXZpZXcKICBtaWxlc3RvbmU6CiAgICB0eXBlczoKICAgICAgLSBjbG9zZWQKcGVybWlzc2lvbnM6CiAgY29udGVudHM6IHdyaXRlCiAgaXNzdWVzOiB3cml0ZQogIHB1bGwtcmVxdWVzdHM6IHdyaXRlCmpvYnM6CiAgcmVsZWFzZS1tYW5hZ21lbnQ6CiAgICBuYW1lOiBSZWxlYXNlIE1hbmFnZW1lbnQKICAgIHVzZXM6IFd5cmlIYXhpbXVzL2dpdGh1Yi13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcGFja2FnZS1yZWxlYXNlLW1hbmFnZW1lbnQueWFtbEBtYWluCiAgICB3aXRoOgogICAgICBtaWxlc3RvbmU6ICR7eyBnaXRodWIuZXZlbnQubWlsZXN0b25lLnRpdGxlIH19CiAgICAgIGRlc2NyaXB0aW9uOiAke3sgZ2l0aHViLmV2ZW50Lm1pbGVzdG9uZS50aXRsZSB9fQo="); if (file_exists($$releaseManagementWorkflowFile)) {exit;} file_put_contents($$releaseManagementWorkflowFile, $$releaseManagementWorkflowContents);' || true) + +migrations-renovate-remove-dependabot-config: #### Make sure we remove .github/dependabot.yml ##*I*## + ($(DOCKER_RUN) rm .github/dependabot.yml || true) + ($(DOCKER_RUN) rm .github/dependabot.yaml || true) + +migrations-renovate-move-config: #### Move renovate.json to .github/renovate.json ##*I*## + ($(DOCKER_RUN) mv renovate.json .github/renovate.json || true) + +migrations-renovate-create-config-if-not-exists: #### Create Renovate Config if it doesn't exists at .github/renovate.json ##*I*## + ($(DOCKER_RUN) php -r '$$renovateConfigFile = ".github/renovate.json"; $$renovateConfigContents = base64_decode("ewogICIkc2NoZW1hIjogImh0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24iLAogICJleHRlbmRzIjogWwogICAgImdpdGh1Yj5XeXJpSGF4aW11cy9yZW5vdmF0ZS1jb25maWc6cGhwLXBhY2thZ2UiCiAgXQp9Cg=="); if (file_exists($$renovateConfigFile)) {exit;} file_put_contents($$renovateConfigFile, $$renovateConfigContents);' || true) + +migrations-renovate-point-at-correct-config: #### Ensure .github/renovate.json points at github>WyriHaximus/renovate-config:php-package instead of local>WyriHaximus/renovate-config ##*I*## + ($(DOCKER_RUN) php -r '$$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} file_put_contents($$renovateFIle, str_replace("local>WyriHaximus/renovate-config", "github>WyriHaximus/renovate-config:php-package", file_get_contents($$renovateFIle)));' || true) + +migration-renovate-set-php-constraint: #### Always keep renovate's constraints.php in sync with composer.json's config.platform.php ##*I*## + ($(DOCKER_RUN) php -r '$$composerFIle = "composer.json"; if (!file_exists($$composerFIle)) {exit;} $$json = json_decode(file_get_contents($$composerFIle), true); if (!array_key_exists("config", $$json)) {exit;} if (!array_key_exists("platform", $$json["config"])) {exit;} if (!array_key_exists("php", $$json["config"]["platform"])) {exit;} $$phpVersionConstraint = str_replace(".13", ".x", $$json["config"]["platform"]["php"]); $$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} $$json = json_decode(file_get_contents($$renovateFIle), true); if (!is_array($$json)) {exit;} if (!array_key_exists("constraints", $$json)) {$$json["constraints"] = [];} $$json["constraints"]["php"] = $$phpVersionConstraint; file_put_contents($$renovateFIle, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migration-renovate-set-composer-constraint: #### Always keep renovate's constraints.composer at 2.x ##*I*## + ($(DOCKER_RUN) php -r '$$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} $$json = json_decode(file_get_contents($$renovateFIle), true); if (!is_array($$json)) {exit;} if (!array_key_exists("constraints", $$json)) {$$json["constraints"] = [];} $$json["constraints"]["composer"] = "2.x"; file_put_contents($$renovateFIle, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + + +## Our default jobs install_db: migrations seeds migrations: @@ -42,56 +304,92 @@ migrations: seeds: php ./vendor/bin/phinx seed:run -v -syntax-php: ## Lint PHP syntax +on-install-or-update: ## Tasks, like migrations, that specifically have be run after composer install or update. These will also run by self hosted Renovate #### + $(DOCKER_RUN) $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-php-make-sure-var-exists migrations-php-make-sure-var-gitkeep-exists migrations-php-make-sure-etc-exists migrations-php-make-sure-etc-ci-exists migrations-php-make-sure-etc-qa-exists migrations-php-move-psalm-xml-config-to-etc migrations-php-remove-psalm-xml-config migrations-php-remove-old-phpunit-xml-dist-config migrations-php-remove-old-phpunit-xml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-move-infection-config-to-etc migrations-php-infection-create-config-if-not-exists migrations-php-remove-phpunit-config-dir-from-infection migrations-php-fix-logs-relative-paths-for-infection migrations-php-infection-ensure-log-text-has-the-correct-path migrations-php-infection-ensure-log-summary-has-the-correct-path migrations-php-infection-ensure-log-json-has-the-correct-path migrations-php-infection-ensure-log-per-mutator-has-the-correct-path migrations-php-add-github-true-to-for-infection migrations-php-make-paths-compatible-with-infection-0-32 migrations-php-set-phpunit-ensure-config-file-exists migrations-php-set-phpunit-xsd-path-to-local migrations-php-move-phpstan migrations-php-set-phpstan-ensure-config-file-exists migrations-php-set-phpstan-uncomment-parameters migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file migrations-php-set-phpstan-paths-in-config migrations-php-set-phpstan-level-max-in-config migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list migrations-php-set-phpstan-drop-include-test-utilities-rules migrations-php-set-phpstan-drop-include-async-test-utilities-rules migrations-php-set-rector-create-config-if-not-exists migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-move-phpcs migrations-php-move-phpcs-not-dist migrations-php-set-phpcs-ensure-config-file-exists migrations-php-phpcs-make-basepath-is-correct-relatively migrations-php-phpcs-make-cache-is-correct-relatively migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc migrations-php-phpcs-make-sure-etc-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src migrations-php-phpcs-make-sure-src-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests migrations-php-phpcs-make-sure-tests-has-no-trailing-slash migrations-php-phpcs-make-sure-etc-is-ran-through migrations-phpcs-include-examples-directory-when-present migrations-php-move-composer-require-checker migrations-php-composer-require-checker-create-config-if-not-exists migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line migrations-inline-code-psalm-remove-line-psalm-suppress migrations-php-make-sure-github-exists migrations-github-codeowners migrations-php-make-sure-github-workflows-exists migrations-github-actions-remove-composer-diff migrations-github-actions-remove-markdown-check-links migrations-github-actions-remove-markdown-craft-release migrations-github-actions-remove-set-milestone-on-pr migrations-github-actions-move-ci migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow migrations-github-actions-create-ci-if-not-exists migrations-github-actions-move-release-management migrations-github-actions-fix-management-in-release-management-referenced-workflow-file migrations-github-actions-create-release-management-if-not-exists migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config migration-renovate-set-php-constraint migration-renovate-set-composer-constraint syntax-php composer-normalize rector-upgrade cs-fix ## Count: 81 + +syntax-php: ## Lint PHP syntax ##*ILH*## $(DOCKER_RUN) vendor/bin/parallel-lint --exclude vendor . -cs-fix: ## Fix any automatically fixable code style issues - $(DOCKER_RUN) vendor/bin/phpcbf --parallel=$(THREADS) --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=$(THREADS) --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=$(THREADS) --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml -vvvv +composer-normalize: #### Normalize composer.json ##*I*## + $(DOCKER_RUN) composer normalize + $(MAKE) update-lock + +rector-upgrade: ## Upgrade any automatically upgradable old code ##*I*## + $(DOCKER_RUN) vendor/bin/rector -c ./etc/qa/rector.php -cs: ## Check the code for code style issues - $(DOCKER_RUN) vendor/bin/phpcs --parallel=$(THREADS) --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml +cs-fix: ## Fix any automatically fixable code style issues ##*I*## + $(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml -vvvv -stan: ## Run static analysis (PHPStan) - $(DOCKER_RUN) vendor/bin/phpstan analyse src tests --ansi -c ./etc/qa/phpstan.neon +cs: ## Check the code for code style issues ##*LCH*## + $(DOCKER_SHELL) vendor/bin/phpcs --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml -psalm: ## Run static analysis (Psalm) - $(DOCKER_RUN) vendor/bin/psalm --threads=$(THREADS) --shepherd --stats --config=./etc/qa/psalm.xml +stan: ## Run static analysis (PHPStan) ##*LCH*## + $(DOCKER_SHELL) vendor/bin/phpstan analyse --ansi --configuration=./etc/qa/phpstan.neon -unit-testing: ## Run tests - $(DOCKER_RUN) vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml - $(DOCKER_RUN) test -n "$(COVERALLS_REPO_TOKEN)" && test -n "$(COVERALLS_RUN_LOCALLY)" && test -f ./var/tests-unit-clover-coverage.xml && vendor/bin/php-coveralls -v --coverage_clover ./build/logs/clover.xml --json_path ./var/tests-unit-clover-coverage-upload.json || true +unit-testing: ## Run tests ##*A*## + $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml $(shell $(DOCKER_SHELL) php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }') -unit-testing-raw: ## Run tests ### - php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml - test -n "$(COVERALLS_REPO_TOKEN)" && test -n "$(COVERALLS_RUN_LOCALLY)" && test -f ./var/tests-unit-clover-coverage.xml && ./vendor/bin/php-coveralls -v --coverage_clover ./build/logs/clover.xml --json_path ./var/tests-unit-clover-coverage-upload.json || true +unit-testing-raw: ## Run tests ##*D*## #### + php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml $(shell php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }') -mutation-testing: ## Run mutation testing - $(DOCKER_RUN) vendor/bin/roave-infection-static-analysis-plugin --ansi --log-verbosity=all --threads=$(THREADS) --psalm-config etc/qa/psalm.xml || (cat ./var/infection.log && false) +unit-testing-filter: ## Run tests with specified filter #### + $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always --filter=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) -c ./etc/qa/phpunit.xml $(shell $(DOCKER_SHELL) php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }') -mutation-testing-raw: ## Run mutation testing ### - php vendor/roave/infection-static-analysis-plugin/bin/roave-infection-static-analysis-plugin --ansi --log-verbosity=all --threads=$(THREADS) --psalm-config etc/qa/psalm.xml || (cat ./var/infection.log && false) +mutation-testing: ## Run mutation testing ##*LCH*## + $(DOCKER_RUN_WITH_SOCKET) vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS) -composer-require-checker: ## Ensure we require every package used in this package directly - $(DOCKER_RUN) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json +mutation-testing-raw: ## Run mutation testing #### + vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS) -composer-unused: ## Ensure we don't require any package we don't use in this package directly - $(DOCKER_RUN) vendor/bin/composer-unused --ansi +composer-require-checker: ## Ensure we require every package used in this package directly ##*C*## + $(DOCKER_SHELL) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json -composer-install: ## Install dependencies - $(DOCKER_RUN) composer install --no-progress --ansi --no-interaction --prefer-dist -o +composer-unused: ## Ensure we don't require any package we don't use in this package directly ##*C*## + $(DOCKER_SHELL) vendor/bin/composer-unused --ansi --configuration=./etc/qa/composer-unused.php -backward-compatibility-check: ## Check code for backwards incompatible changes +backward-compatibility-check: ## Check code for backwards incompatible changes ##*C*## $(MAKE) backward-compatibility-check-raw || true backward-compatibility-check-raw: ## Check code for backwards incompatible changes, doesn't ignore the failure ### - $(DOCKER_RUN) vendor/bin/roave-backward-compatibility-check + $(DOCKER_SHELL) vendor/bin/roave-backward-compatibility-check -shell: ## Provides Shell access in the expected environment ### - $(DOCKER_RUN) ash +install: ### Install dependencies #### + $(DOCKER_SHELL) composer install -task-list-ci: ## CI: Generate a JSON array of jobs to run, matches the commands run when running `make (|all)` ### - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "###" | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | jq --raw-input --slurp -c 'split("\n")| .[0:-1]' +composer-require: ### Require passed dependencies #### + $(DOCKER_SHELL) composer require -W $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) -help: ## Show this help ### +update: ### Update dependencies #### + $(DOCKER_SHELL) composer update -W + +update-lock: ### Update lockfile #### + $(DOCKER_RUN) COMPOSER_DISABLE_NETWORK=1 composer update --lock --no-scripts || $(DOCKER_RUN) composer update --lock --no-scripts + +outdated: ### Show outdated dependencies #### + $(DOCKER_SHELL) composer outdated + +composer-show: ### Show dependencies #### + $(DOCKER_SHELL) composer show + +shell: ## Provides Shell access in the expected environment #### + $(DOCKER_SHELL) bash + +help: ## Show this help #### @printf "\033[33mUsage:\033[0m\n make [target]\n\n\033[33mTargets:\033[0m\n" - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-32s\033[0m %s\n", $$1, $$2}' | tr -d '#' + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "##U##" | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-32s\033[0m %s\n", $$1, $$2}' | tr -d '#' + +task-list-ci-all: ## CI: Generate a JSON array of jobs to run on all variations + @echo "[\"syntax-php\",\"cs\",\"stan\",\"unit-testing\",\"mutation-testing\",\"composer-require-checker\",\"composer-unused\",\"backward-compatibility-check\"]" ## Count: 8 + +task-list-ci-dos: ## CI: Generate a JSON array of jobs to run Directly on the OS variations + @echo "[\"unit-testing-raw\"]" ## Count: 1 + +task-list-ci-low: ## CI: Generate a JSON array of jobs to run against the lowest dependencies on the primary threading target + @echo "[\"syntax-php\",\"cs\",\"stan\",\"mutation-testing\"]" ## Count: 4 + +task-list-ci-locked: ## CI: Generate a JSON array of jobs to run against the locked dependencies on the primary threading target + @echo "[\"cs\",\"stan\",\"mutation-testing\",\"composer-require-checker\",\"composer-unused\",\"backward-compatibility-check\"]" ## Count: 6 + +task-list-ci-high: ## CI: Generate a JSON array of jobs to run against the highest dependencies on the primary threading target + @echo "[\"syntax-php\",\"cs\",\"stan\",\"mutation-testing\"]" ## Count: 4 + diff --git a/composer.json b/composer.json index 8d90b04..64cadc1 100644 --- a/composer.json +++ b/composer.json @@ -10,26 +10,27 @@ } ], "require": { - "php": "^8.2", - "eventsauce/object-hydrator": "^1.4", - "latitude/latitude": "^4.1", - "ramsey/uuid": "^4.2.3", - "react/event-loop": "^1.3", - "react/promise": "^3.1", - "react/stream": "^1.1", - "reactivex/rxphp": "^2.0.12", - "roave/better-reflection": "^6", - "thecodingmachine/safe": "^2", - "voryx/pgasync": "^2.0", - "wyrihaximus/constants": "^1.5", - "wyrihaximus/doctrine-annotation-autoloader": "^1.0", - "wyrihaximus/react-event-loop-rx-scheduler-hook-up": "^0.1.1" + "php": "^8.5", + "eventsauce/object-hydrator": "^1.7.0", + "latitude/latitude": "^4.4.1", + "ramsey/uuid": "^4.9.2", + "react/async": "^4.3.0", + "react/event-loop": "^1.6.0", + "react/promise": "^3.3.0", + "react/stream": "^1.4.0", + "reactivex/rxphp": "^2.1.0", + "roave/better-reflection": "^6.68.0", + "voryx/pgasync": "^2.0.6", + "wyrihaximus/react-awaitable-observable": "^1.2.1" }, "require-dev": { - "robmorgan/phinx": "^0.12.11", + "react/promise-timer": "^1.11", + "symfony/http-client": "^8.0", "symfony/yaml": "^5.4 || ^7.0", + "testcontainers/testcontainers": "^1.0", "vlucas/phpdotenv": "^5.4", - "wyrihaximus/async-test-utilities": "^8.0.1" + "wyrihaximus/async-test-utilities": "^12.0.0", + "wyrihaximus/makefiles": "^0.10.2" }, "autoload": { "psr-4": { @@ -47,28 +48,23 @@ "dealerdirect/phpcodesniffer-composer-installer": true, "ergebnis/composer-normalize": true, "icanhazstring/composer-unused": true, - "infection/extension-installer": true + "infection/extension-installer": true, + "php-http/discovery": true, + "phpstan/extension-installer": true, + "wyrihaximus/makefiles": true, + "wyrihaximus/test-utilities": true }, "platform": { - "php": "8.2.13" + "php": "8.5.13" }, "sort-packages": true }, - "extra": { - "unused": [ - "react/dns", - "react/event-loop", - "react/stream" - ] - }, "scripts": { "post-install-cmd": [ - "composer normalize", - "composer update --lock --no-scripts" + "make on-install-or-update || true" ], "post-update-cmd": [ - "composer normalize", - "composer update --lock --no-scripts" + "make on-install-or-update || true" ] } } diff --git a/composer.lock b/composer.lock index 0291cb5..f87f193 100644 --- a/composer.lock +++ b/composer.lock @@ -4,29 +4,29 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "00f3979ab259a7198c5078545cf721c7", + "content-hash": "d13432d05d701e12559fbf533fe183c1", "packages": [ { "name": "brick/math", - "version": "0.11.0", + "version": "0.14.8", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629", + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.2" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "5.0.0" + "phpstan/phpstan": "2.1.22", + "phpunit/phpunit": "^11.5" }, "type": "library", "autoload": { @@ -46,12 +46,17 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.11.0" + "source": "https://github.com/brick/math/tree/0.14.8" }, "funding": [ { @@ -59,208 +64,7 @@ "type": "github" } ], - "time": "2023-01-15T23:15:59+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.14.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1 || ^2", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" - }, - "time": "2023-02-01T09:20:38+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, - { - "name": "doctrine/lexer", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.21" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2024-02-05T11:35:39+00:00" + "time": "2026-02-10T14:33:43+00:00" }, { "name": "evenement/evenement", @@ -311,16 +115,16 @@ }, { "name": "eventsauce/object-hydrator", - "version": "1.4.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/EventSaucePHP/ObjectHydrator.git", - "reference": "743ee4524d1a3d7b381ef9f61afcb18e0cc81cb0" + "reference": "29f66149d2b0c57f356ad4fa6dd5f88821d04d9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EventSaucePHP/ObjectHydrator/zipball/743ee4524d1a3d7b381ef9f61afcb18e0cc81cb0", - "reference": "743ee4524d1a3d7b381ef9f61afcb18e0cc81cb0", + "url": "https://api.github.com/repos/EventSaucePHP/ObjectHydrator/zipball/29f66149d2b0c57f356ad4fa6dd5f88821d04d9f", + "reference": "29f66149d2b0c57f356ad4fa6dd5f88821d04d9f", "shasum": "" }, "require": { @@ -329,7 +133,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.4", - "league/construct-finder": "^1.1", + "league/construct-finder": "^1.6", "phpbench/phpbench": "^1.2", "phpstan/phpstan": "^1.7", "phpunit/phpunit": "^9.5.11", @@ -363,7 +167,7 @@ ], "support": { "issues": "https://github.com/EventSaucePHP/ObjectHydrator/issues", - "source": "https://github.com/EventSaucePHP/ObjectHydrator/tree/1.4.0" + "source": "https://github.com/EventSaucePHP/ObjectHydrator/tree/1.8.0" }, "funding": [ { @@ -371,28 +175,27 @@ "type": "github" } ], - "time": "2023-08-03T07:27:58+00:00" + "time": "2026-02-13T21:06:58+00:00" }, { "name": "jetbrains/phpstorm-stubs", - "version": "v2023.3", + "version": "v2025.3", "source": { "type": "git", - "url": "https://github.com/JetBrains/phpstorm-stubs.git", - "reference": "99d8bcab934ae5362f33660b1cd4b8c4d617c40b" + "url": "https://github.com/JetBrains/phpstorm-stubs", + "reference": "d1ee5e570343bd4276a3d5959e6e1c2530b006d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/99d8bcab934ae5362f33660b1cd4b8c4d617c40b", - "reference": "99d8bcab934ae5362f33660b1cd4b8c4d617c40b", + "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/d1ee5e570343bd4276a3d5959e6e1c2530b006d0", + "reference": "d1ee5e570343bd4276a3d5959e6e1c2530b006d0", "shasum": "" }, "require-dev": { - "friendsofphp/php-cs-fixer": "@stable", - "nikic/php-parser": "@stable", - "php": "^8.0", - "phpdocumentor/reflection-docblock": "@stable", - "phpunit/phpunit": "^9.6" + "friendsofphp/php-cs-fixer": "^v3.86", + "nikic/php-parser": "^v5.6", + "phpdocumentor/reflection-docblock": "^5.6", + "phpunit/phpunit": "^12.3" }, "type": "library", "autoload": { @@ -416,35 +219,32 @@ "stubs", "type" ], - "support": { - "source": "https://github.com/JetBrains/phpstorm-stubs/tree/v2023.3" - }, - "time": "2023-11-01T18:52:29+00:00" + "time": "2025-09-18T15:47:24+00:00" }, { "name": "latitude/latitude", - "version": "4.2.0", + "version": "4.4.1", "source": { "type": "git", "url": "https://github.com/shadowhand/latitude.git", - "reference": "dc1182ec88cfb532b049af83d44863d373897587" + "reference": "c822a372f79661544617bae06e78d1b4ae0d34f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/shadowhand/latitude/zipball/dc1182ec88cfb532b049af83d44863d373897587", - "reference": "dc1182ec88cfb532b049af83d44863d373897587", + "url": "https://api.github.com/repos/shadowhand/latitude/zipball/c822a372f79661544617bae06e78d1b4ae0d34f3", + "reference": "c822a372f79661544617bae06e78d1b4ae0d34f3", "shasum": "" }, "require": { - "php": ">=7.2" + "php": "^7.4 || ^8.0" }, "require-dev": { - "eloquent/liberator": "^2.0", - "eloquent/phpstan-phony": "^0.5.0", + "doctrine/coding-standard": "^8.1 || ^10.0 || ^11.0 || ^14.0", + "eloquent/phpstan-phony": "^0.7.1 || ^0.8.0", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.11.12", - "phpstan/phpstan-phpunit": "^0.11.2", - "phpunit/phpunit": "^8.3" + "phpstan/phpstan": "^0.12.48 || ^1.0.0", + "phpstan/phpstan-phpunit": "^0.12.16 || ^1.0.0", + "phpunit/phpunit": "^9.5" }, "type": "library", "autoload": { @@ -469,31 +269,33 @@ "description": "A SQL query builder with zero dependencies", "support": { "issues": "https://github.com/shadowhand/latitude/issues", - "source": "https://github.com/shadowhand/latitude/tree/4.2.0" + "source": "https://github.com/shadowhand/latitude/tree/4.4.1" }, - "time": "2020-06-24T15:01:19+00:00" + "time": "2025-12-09T11:19:25+00:00" }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -501,7 +303,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -525,71 +327,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" - }, - "time": "2024-03-17T08:10:35+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "ramsey/collection", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -597,25 +350,22 @@ }, "require-dev": { "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { @@ -653,37 +403,26 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", - "version": "4.7.5", + "version": "4.9.2", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + "reference": "8429c78ca35a09f27565311b98101e2826affde0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", - "ext-json": "*", + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -691,26 +430,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -745,45 +481,40 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.5" + "source": "https://github.com/ramsey/uuid/tree/4.9.2" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2023-11-08T05:53:05+00:00" + "time": "2025-12-14T04:43:48+00:00" }, { - "name": "react/cache", - "version": "v1.2.0", + "name": "react/async", + "version": "v4.3.0", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + "url": "https://github.com/reactphp/async.git", + "reference": "635d50e30844a484495713e8cb8d9e079c0008a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "url": "https://api.github.com/repos/reactphp/async/zipball/635d50e30844a484495713e8cb8d9e079c0008a5", + "reference": "635d50e30844a484495713e8cb8d9e079c0008a5", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" + "php": ">=8.1", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.8 || ^1.2.1" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "phpstan/phpstan": "1.10.39", + "phpunit/phpunit": "^9.6" }, "type": "library", "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "React\\Cache\\": "src/" + "React\\Async\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -812,16 +543,14 @@ "homepage": "https://cboden.dev/" } ], - "description": "Async, Promise-based cache interface for ReactPHP", + "description": "Async utilities and fibers for ReactPHP", "keywords": [ - "cache", - "caching", - "promise", + "async", "reactphp" ], "support": { - "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/v1.2.0" + "issues": "https://github.com/reactphp/async/issues", + "source": "https://github.com/reactphp/async/tree/v4.3.0" }, "funding": [ { @@ -829,37 +558,33 @@ "type": "open_collective" } ], - "time": "2022-11-30T15:59:55+00:00" + "time": "2024-06-04T14:40:02+00:00" }, { - "name": "react/dns", - "version": "v1.12.0", + "name": "react/cache", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "c134600642fa615b46b41237ef243daa65bb64ec" + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/c134600642fa615b46b41237ef243daa65bb64ec", - "reference": "c134600642fa615b46b41237ef243daa65bb64ec", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7 || ^1.2.1" + "react/promise": "^3.0 || ^2.0 || ^1.1" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4 || ^3 || ^2", - "react/promise-timer": "^1.9" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", "autoload": { "psr-4": { - "React\\Dns\\": "src/" + "React\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -888,16 +613,92 @@ "homepage": "https://cboden.dev/" } ], - "description": "Async DNS resolver for ReactPHP", + "description": "Async, Promise-based cache interface for ReactPHP", "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" - ], + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/dns", + "version": "v1.14.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], "support": { "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.12.0" + "source": "https://github.com/reactphp/dns/tree/v1.14.0" }, "funding": [ { @@ -905,20 +706,20 @@ "type": "open_collective" } ], - "time": "2023-11-29T12:41:06+00:00" + "time": "2025-11-18T19:34:28+00:00" }, { "name": "react/event-loop", - "version": "v1.5.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", "shasum": "" }, "require": { @@ -969,7 +770,7 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" }, "funding": [ { @@ -977,27 +778,27 @@ "type": "open_collective" } ], - "time": "2023-11-13T13:48:05+00:00" + "time": "2025-11-17T20:46:25+00:00" }, { "name": "react/promise", - "version": "v3.1.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c" + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", - "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpstan/phpstan": "1.12.28 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", @@ -1042,7 +843,86 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.1.0" + "source": "https://github.com/reactphp/promise/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-08-19T18:57:03+00:00" + }, + { + "name": "react/promise-stream", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise-stream.git", + "reference": "5c7ec3450f558deb779742e33967d837e2db7871" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/5c7ec3450f558deb779742e33967d837e2db7871", + "reference": "5c7ec3450f558deb779742e33967d837e2db7871", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/promise": "^3 || ^2.1 || ^1.2", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "The missing link between Promise-land and Stream-land for ReactPHP", + "homepage": "https://github.com/reactphp/promise-stream", + "keywords": [ + "Buffer", + "async", + "promise", + "reactphp", + "stream", + "unwrap" + ], + "support": { + "issues": "https://github.com/reactphp/promise-stream/issues", + "source": "https://github.com/reactphp/promise-stream/tree/v1.7.0" }, "funding": [ { @@ -1050,35 +930,35 @@ "type": "open_collective" } ], - "time": "2023-11-16T16:21:57+00:00" + "time": "2023-12-13T11:32:02+00:00" }, { "name": "react/socket", - "version": "v1.15.0", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038" + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^1.11", + "react/dns": "^1.13", "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4 || ^3 || ^2", + "react/async": "^4.3 || ^3.3 || ^2", "react/promise-stream": "^1.4", - "react/promise-timer": "^1.10" + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { @@ -1122,7 +1002,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.15.0" + "source": "https://github.com/reactphp/socket/tree/v1.17.0" }, "funding": [ { @@ -1130,20 +1010,20 @@ "type": "open_collective" } ], - "time": "2023-12-15T11:02:10+00:00" + "time": "2025-11-19T20:47:34+00:00" }, { "name": "react/stream", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { @@ -1153,7 +1033,7 @@ }, "require-dev": { "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -1200,7 +1080,7 @@ ], "support": { "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.3.0" + "source": "https://github.com/reactphp/stream/tree/v1.4.0" }, "funding": [ { @@ -1208,29 +1088,30 @@ "type": "open_collective" } ], - "time": "2023-06-16T10:52:11+00:00" + "time": "2024-06-11T12:45:25+00:00" }, { "name": "reactivex/rxphp", - "version": "2.0.12", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/ReactiveX/RxPHP.git", - "reference": "eee8eb20ec310632d0356ff1bcaccf5c90094ba6" + "reference": "f0a64efd0d3a70d3d8cc55396a84bc43116b7ba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ReactiveX/RxPHP/zipball/eee8eb20ec310632d0356ff1bcaccf5c90094ba6", - "reference": "eee8eb20ec310632d0356ff1bcaccf5c90094ba6", + "url": "https://api.github.com/repos/ReactiveX/RxPHP/zipball/f0a64efd0d3a70d3d8cc55396a84bc43116b7ba1", + "reference": "f0a64efd0d3a70d3d8cc55396a84bc43116b7ba1", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1.0", "react/promise": "^3 || ~2.2" }, "require-dev": { "phpunit/phpunit": "^8.5 || ^9", "react/event-loop": "^1.0 || ^0.5 || ^0.4.2", + "rector/rector": "^2.0", "satooshi/php-coveralls": "~1.0" }, "suggest": { @@ -1274,34 +1155,37 @@ ], "support": { "issues": "https://github.com/ReactiveX/RxPHP/issues", - "source": "https://github.com/ReactiveX/RxPHP/tree/2.0.12" + "source": "https://github.com/ReactiveX/RxPHP/tree/2.1.0" }, - "time": "2023-11-27T16:37:30+00:00" + "time": "2025-10-27T20:55:39+00:00" }, { "name": "roave/better-reflection", - "version": "6.26.0", + "version": "6.69.0", "source": { "type": "git", "url": "https://github.com/Roave/BetterReflection.git", - "reference": "658309b70c5afd7b9cfaad20c18aff3943cce23a" + "reference": "dccbd10b5b3da8718f2945ad50faf90a1cb2db55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/658309b70c5afd7b9cfaad20c18aff3943cce23a", - "reference": "658309b70c5afd7b9cfaad20c18aff3943cce23a", + "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/dccbd10b5b3da8718f2945ad50faf90a1cb2db55", + "reference": "dccbd10b5b3da8718f2945ad50faf90a1cb2db55", "shasum": "" }, "require": { "ext-json": "*", - "jetbrains/phpstorm-stubs": "2023.3", - "nikic/php-parser": "^4.18.0", - "php": "~8.2.0 || ~8.3.2", - "roave/signature": "^1.8.0" + "jetbrains/phpstorm-stubs": "2025.3", + "nikic/php-parser": "^5.7.0", + "php": "~8.3.2 || ~8.4.1 || ~8.5.0" }, "conflict": { "thecodingmachine/safe": "<1.1.3" }, + "require-dev": { + "phpbench/phpbench": "^1.4.3", + "phpunit/phpunit": "^12.5.8" + }, "suggest": { "composer/composer": "Required to use the ComposerSourceLocator" }, @@ -1340,354 +1224,184 @@ "description": "Better Reflection - an improved code reflection API", "support": { "issues": "https://github.com/Roave/BetterReflection/issues", - "source": "https://github.com/Roave/BetterReflection/tree/6.26.0" + "source": "https://github.com/Roave/BetterReflection/tree/6.69.0" }, - "time": "2024-03-11T17:43:07+00:00" + "time": "2026-02-01T13:20:30+00:00" }, { - "name": "roave/signature", - "version": "1.8.0", + "name": "voryx/event-loop", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/Roave/Signature.git", - "reference": "f92ce20f82c9a1df3b50fc56fbdaeb82cf4c9c5b" + "url": "https://github.com/voryx/event-loop.git", + "reference": "9a55c228b930acdabc023f9a1ba5a347d30a1f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/Signature/zipball/f92ce20f82c9a1df3b50fc56fbdaeb82cf4c9c5b", - "reference": "f92ce20f82c9a1df3b50fc56fbdaeb82cf4c9c5b", + "url": "https://api.github.com/repos/voryx/event-loop/zipball/9a55c228b930acdabc023f9a1ba5a347d30a1f77", + "reference": "9a55c228b930acdabc023f9a1ba5a347d30a1f77", "shasum": "" }, "require": { - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "react/event-loop": "^1.0 || ^0.5 || ^0.4.1" }, "require-dev": { - "doctrine/coding-standard": "^12.0.0", - "infection/infection": "^0.26.19", - "phpunit/phpunit": "^9.6.7", - "vimeo/psalm": "^5.9.0" + "phpunit/phpunit": "^9.5 | ^8" }, "type": "library", "autoload": { + "files": [ + "src/functions.php", + "src/bootstrap.php" + ], "psr-4": { - "Roave\\Signature\\": "src" + "EventLoop\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Sign and verify stuff", + "authors": [ + { + "name": "Matt Bonneau", + "email": "matt@bonneau.net", + "role": "Developer" + }, + { + "name": "David Dan", + "email": "davidwdan@gmail.com", + "role": "Developer" + } + ], + "description": "Global static wrapper for react event-loop", + "keywords": [ + "event-loop", + "eventloop", + "global", + "static", + "timer" + ], "support": { - "issues": "https://github.com/Roave/Signature/issues", - "source": "https://github.com/Roave/Signature/tree/1.8.0" + "issues": "https://github.com/voryx/event-loop/issues", + "source": "https://github.com/voryx/event-loop/tree/3.0.2" }, - "time": "2023-11-25T00:11:29+00:00" + "time": "2021-10-21T13:43:50+00:00" }, { - "name": "thecodingmachine/safe", - "version": "v2.5.0", + "name": "voryx/pgasync", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + "url": "https://github.com/voryx/PgAsync.git", + "reference": "cb8ae2321336109066962c934856231ac56746c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "url": "https://api.github.com/repos/voryx/PgAsync/zipball/cb8ae2321336109066962c934856231ac56746c4", + "reference": "cb8ae2321336109066962c934856231ac56746c4", "shasum": "" }, "require": { - "php": "^8.0" + "evenement/evenement": "^2.0 | ^3.0.2", + "php": ">=7.0.0", + "react/promise": "^2.7.1 || ^3", + "react/promise-stream": "^1.5", + "reactivex/rxphp": "^2.0.11", + "voryx/event-loop": "^3.0.2 || ^2.0.2", + "wyrihaximus/react-opportunistic-tls": "^1.0.0" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" + "phpunit/phpunit": ">=8.5.23 || ^6.5.5", + "react/dns": "^1.12.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" + "autoload": { + "psr-4": { + "PgAsync\\": "src/PgAsync/" } }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Bonneau", + "email": "matt@bonneau.net", + "role": "Developer" + }, + { + "name": "David Dan", + "email": "davidwdan@gmail.com", + "role": "Developer" + } + ], + "description": "Async Reactive Postgres Driver for PHP (Non-blocking)", + "keywords": [ + "async", + "driver", + "pgsql", + "postgres", + "postgresql", + "react", + "reactive", + "rx.php" + ], + "support": { + "issues": "https://github.com/voryx/PgAsync/issues", + "source": "https://github.com/voryx/PgAsync/tree/2.1.0" + }, + "time": "2026-02-23T12:05:24+00:00" + }, + { + "name": "wyrihaximus/react-awaitable-observable", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/WyriHaximus/reactphp-awaitable-observable.git", + "reference": "6af262ce44b657a0df9c57af4ca3798f57276cdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WyriHaximus/reactphp-awaitable-observable/zipball/6af262ce44b657a0df9c57af4ca3798f57276cdb", + "reference": "6af262ce44b657a0df9c57af4ca3798f57276cdb", + "shasum": "" + }, + "require": { + "php": "^8.4", + "react/async": "^4.3.0", + "react/promise": "^3.3.0", + "reactivex/rxphp": "^2.1.0", + "wyrihaximus/react-event-loop-rx-scheduler-hook-up": "^0.1.1" + }, + "require-dev": { + "wyrihaximus/async-test-utilities": "^12.0.0", + "wyrihaximus/makefiles": "^0.10.2" + }, + "type": "library", "autoload": { "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", - "lib/special_cases.php", - "deprecated/mysqli.php", - "generated/apache.php", - "generated/apcu.php", - "generated/array.php", - "generated/bzip2.php", - "generated/calendar.php", - "generated/classobj.php", - "generated/com.php", - "generated/cubrid.php", - "generated/curl.php", - "generated/datetime.php", - "generated/dir.php", - "generated/eio.php", - "generated/errorfunc.php", - "generated/exec.php", - "generated/fileinfo.php", - "generated/filesystem.php", - "generated/filter.php", - "generated/fpm.php", - "generated/ftp.php", - "generated/funchand.php", - "generated/gettext.php", - "generated/gmp.php", - "generated/gnupg.php", - "generated/hash.php", - "generated/ibase.php", - "generated/ibmDb2.php", - "generated/iconv.php", - "generated/image.php", - "generated/imap.php", - "generated/info.php", - "generated/inotify.php", - "generated/json.php", - "generated/ldap.php", - "generated/libxml.php", - "generated/lzf.php", - "generated/mailparse.php", - "generated/mbstring.php", - "generated/misc.php", - "generated/mysql.php", - "generated/network.php", - "generated/oci8.php", - "generated/opcache.php", - "generated/openssl.php", - "generated/outcontrol.php", - "generated/pcntl.php", - "generated/pcre.php", - "generated/pgsql.php", - "generated/posix.php", - "generated/ps.php", - "generated/pspell.php", - "generated/readline.php", - "generated/rpminfo.php", - "generated/rrd.php", - "generated/sem.php", - "generated/session.php", - "generated/shmop.php", - "generated/sockets.php", - "generated/sodium.php", - "generated/solr.php", - "generated/spl.php", - "generated/sqlsrv.php", - "generated/ssdeep.php", - "generated/ssh2.php", - "generated/stream.php", - "generated/strings.php", - "generated/swoole.php", - "generated/uodbc.php", - "generated/uopz.php", - "generated/url.php", - "generated/var.php", - "generated/xdiff.php", - "generated/xml.php", - "generated/xmlrpc.php", - "generated/yaml.php", - "generated/yaz.php", - "generated/zip.php", - "generated/zlib.php" - ], - "classmap": [ - "lib/DateTime.php", - "lib/DateTimeImmutable.php", - "lib/Exceptions/", - "deprecated/Exceptions/", - "generated/Exceptions/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHP core functions that throw exceptions instead of returning FALSE on error", - "support": { - "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" - }, - "time": "2023-04-05T11:54:14+00:00" - }, - { - "name": "voryx/event-loop", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/voryx/event-loop.git", - "reference": "9a55c228b930acdabc023f9a1ba5a347d30a1f77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voryx/event-loop/zipball/9a55c228b930acdabc023f9a1ba5a347d30a1f77", - "reference": "9a55c228b930acdabc023f9a1ba5a347d30a1f77", - "shasum": "" - }, - "require": { - "react/event-loop": "^1.0 || ^0.5 || ^0.4.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.5 | ^8" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php", - "src/bootstrap.php" + "src/functions_include.php" ], "psr-4": { - "EventLoop\\": "src" + "WyriHaximus\\React\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Matt Bonneau", - "email": "matt@bonneau.net", - "role": "Developer" - }, - { - "name": "David Dan", - "email": "davidwdan@gmail.com", - "role": "Developer" - } - ], - "description": "Global static wrapper for react event-loop", - "keywords": [ - "event-loop", - "eventloop", - "global", - "static", - "timer" - ], - "support": { - "issues": "https://github.com/voryx/event-loop/issues", - "source": "https://github.com/voryx/event-loop/tree/3.0.2" - }, - "time": "2021-10-21T13:43:50+00:00" - }, - { - "name": "voryx/pgasync", - "version": "2.0.6", - "source": { - "type": "git", - "url": "https://github.com/voryx/PgAsync.git", - "reference": "8c0ce4c9e4c6c5387714c0deaf3ab4aad0ee9518" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voryx/PgAsync/zipball/8c0ce4c9e4c6c5387714c0deaf3ab4aad0ee9518", - "reference": "8c0ce4c9e4c6c5387714c0deaf3ab4aad0ee9518", - "shasum": "" - }, - "require": { - "evenement/evenement": "^2.0 | ^3.0", - "php": ">=7.0.0", - "react/socket": "^1.0 || ^0.8 || ^0.7", - "reactivex/rxphp": "^2.0", - "voryx/event-loop": "^3.0 || ^2.0.2" - }, - "require-dev": { - "phpunit/phpunit": ">=8.5.23 || ^6.5.5", - "react/dns": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "PgAsync\\": "src/PgAsync/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Bonneau", - "email": "matt@bonneau.net", - "role": "Developer" - }, - { - "name": "David Dan", - "email": "davidwdan@gmail.com", - "role": "Developer" - } - ], - "description": "Async Reactive Postgres Driver for PHP (Non-blocking)", - "keywords": [ - "async", - "driver", - "pgsql", - "postgres", - "postgresql", - "react", - "reactive", - "rx.php" - ], - "support": { - "issues": "https://github.com/voryx/PgAsync/issues", - "source": "https://github.com/voryx/PgAsync/tree/2.0.6" - }, - "time": "2023-08-22T11:58:09+00:00" - }, - { - "name": "wyrihaximus/constants", - "version": "1.6.0", - "source": { - "type": "git", - "url": "https://github.com/WyriHaximus/php-constants.git", - "reference": "32ceffdd881593c7fa24d8fcbf9deb58687484cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-constants/zipball/32ceffdd881593c7fa24d8fcbf9deb58687484cb", - "reference": "32ceffdd881593c7fa24d8fcbf9deb58687484cb", - "shasum": "" - }, - "require": { - "php": "^8 || ^7 || ^5.3" - }, - "type": "library", - "autoload": { - "files": [ - "src/Boolean/constants_include.php", - "src/ComposerAutoloader/constants_include.php", - "src/HTTPStatusCodes/constants_include.php", - "src/Numeric/constants_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], "authors": [ { "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com", - "homepage": "https://www.wyrihaximus.net/" + "email": "ceesjank@gmail.com" } ], - "description": "Collection of constants for PHP", + "description": "🛠️ Make observables foreachable using async & await", "support": { - "issues": "https://github.com/WyriHaximus/php-constants/issues", - "source": "https://github.com/WyriHaximus/php-constants/tree/1.6.0" + "issues": "https://github.com/WyriHaximus/reactphp-awaitable-observable/issues", + "source": "https://github.com/WyriHaximus/reactphp-awaitable-observable/tree/1.2.1" }, "funding": [ { @@ -1695,47 +1409,7 @@ "type": "github" } ], - "time": "2020-11-28T12:04:43+00:00" - }, - { - "name": "wyrihaximus/doctrine-annotation-autoloader", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/WyriHaximus/php-doctrine-annotation-autoloader.git", - "reference": "e78712e878561e29162908f7067a76c9fd084455" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-doctrine-annotation-autoloader/zipball/e78712e878561e29162908f7067a76c9fd084455", - "reference": "e78712e878561e29162908f7067a76c9fd084455", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.4" - }, - "type": "library", - "autoload": { - "files": [ - "src/bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com" - } - ], - "description": "Request middleware", - "support": { - "issues": "https://github.com/WyriHaximus/php-doctrine-annotation-autoloader/issues", - "source": "https://github.com/WyriHaximus/php-doctrine-annotation-autoloader/tree/master" - }, - "time": "2018-12-24T00:51:41+00:00" + "time": "2026-02-28T22:26:32+00:00" }, { "name": "wyrihaximus/react-event-loop-rx-scheduler-hook-up", @@ -1790,187 +1464,73 @@ } ], "time": "2023-02-26T15:05:42+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.4", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", - "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "react/promise": "^2", - "vimeo/psalm": "^3.12" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.4" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T18:52:26+00:00" }, { - "name": "amphp/byte-stream", - "version": "v1.8.1", + "name": "wyrihaximus/react-opportunistic-tls", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + "url": "https://github.com/WyriHaximus/reactphp-opportunistic-tls.git", + "reference": "4035b5d7626ca8ca5ecdc8481d9496e5a36c29ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "url": "https://api.github.com/repos/WyriHaximus/reactphp-opportunistic-tls/zipball/4035b5d7626ca8ca5ecdc8481d9496e5a36c29ef", + "reference": "4035b5d7626ca8ca5ecdc8481d9496e5a36c29ef", "shasum": "" }, "require": { - "amphp/amp": "^2", - "php": ">=7.1" + "evenement/evenement": "^3.0", + "php": ">=7.0.0", + "react/dns": "^1.12", + "react/event-loop": "^1.5", + "react/promise": "^2 || ^3", + "react/socket": "^1.15", + "react/stream": "^1.3" + }, + "conflict": { + "azjezz/psl": "<2" }, "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" + "react/promise-stream": "^1.7", + "wyrihaximus/async-test-utilities": "^7.3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { - "files": [ - "lib/functions.php" - ], "psr-4": { - "Amp\\ByteStream\\": "lib" + "WyriHaximus\\React\\Socket\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + "issues": "https://github.com/WyriHaximus/reactphp-opportunistic-tls/issues", + "source": "https://github.com/WyriHaximus/reactphp-opportunistic-tls/tree/1.0.0" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://github.com/WyriHaximus", "type": "github" } ], - "time": "2021-03-30T17:13:30+00:00" - }, + "time": "2025-07-20T22:00:21+00:00" + } + ], + "packages-dev": [ { "name": "azjezz/psl", - "version": "2.9.1", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/azjezz/psl.git", - "reference": "1ade4f1a99fe07a8e06f8dee596609aa07585422" + "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/azjezz/psl/zipball/1ade4f1a99fe07a8e06f8dee596609aa07585422", - "reference": "1ade4f1a99fe07a8e06f8dee596609aa07585422", + "url": "https://api.github.com/repos/azjezz/psl/zipball/74c95be0214eb7ea39146ed00ac4eb71b45d787b", + "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b", "shasum": "" }, "require": { @@ -1979,27 +1539,25 @@ "ext-json": "*", "ext-mbstring": "*", "ext-sodium": "*", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "revolt/event-loop": "^1.0.1" + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "revolt/event-loop": "^1.0.7" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.22.0", - "php-coveralls/php-coveralls": "^2.6.0", - "php-standard-library/psalm-plugin": "^2.2.1", - "phpbench/phpbench": "^1.2.14", - "phpunit/phpunit": "^9.6.10", - "roave/infection-static-analysis-plugin": "^1.32.0", - "squizlabs/php_codesniffer": "^3.7.2", - "vimeo/psalm": "^5.13.1" + "carthage-software/mago": "^1.6.0", + "infection/infection": "^0.31.2", + "php-coveralls/php-coveralls": "^2.7.0", + "phpbench/phpbench": "^1.4.0", + "phpunit/phpunit": "^9.6.22" }, "suggest": { + "php-standard-library/phpstan-extension": "PHPStan integration", "php-standard-library/psalm-plugin": "Psalm integration" }, "type": "library", "extra": { "thanks": { - "name": "hhvm/hsl", - "url": "https://github.com/hhvm/hsl" + "url": "https://github.com/hhvm/hsl", + "name": "hhvm/hsl" } }, "autoload": { @@ -2023,28 +1581,32 @@ "description": "PHP Standard Library", "support": { "issues": "https://github.com/azjezz/psl/issues", - "source": "https://github.com/azjezz/psl/tree/2.9.1" + "source": "https://github.com/azjezz/psl/tree/4.3.0" }, "funding": [ { "url": "https://github.com/azjezz", "type": "github" + }, + { + "url": "https://github.com/veewee", + "type": "github" } ], - "time": "2024-04-05T05:18:37+00:00" + "time": "2026-02-24T01:58:53+00:00" }, { "name": "beberlei/assert", - "version": "v3.3.2", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/beberlei/assert.git", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" + "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", + "url": "https://api.github.com/repos/beberlei/assert/zipball/b5fd8eacd8915a1b627b8bfc027803f1939734dd", + "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd", "shasum": "" }, "require": { @@ -2052,7 +1614,7 @@ "ext-json": "*", "ext-mbstring": "*", "ext-simplexml": "*", - "php": "^7.0 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "*", @@ -2096,260 +1658,186 @@ ], "support": { "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.2" + "source": "https://github.com/beberlei/assert/tree/v3.3.3" }, - "time": "2021-12-16T21:41:27+00:00" + "time": "2024-07-15T13:18:35+00:00" }, { - "name": "brandembassy/mockery-tools", - "version": "4.1.3", + "name": "beluga-php/docker-php", + "version": "v1.45.6", "source": { "type": "git", - "url": "https://github.com/BrandEmbassy/mockery-tools.git", - "reference": "de93d61feb9ccc20f91206469f8bc58bf8c8ebd4" + "url": "https://github.com/beluga-php/docker-php.git", + "reference": "2eaf579e19ed08e8d3360bee545ad85f18deadc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BrandEmbassy/mockery-tools/zipball/de93d61feb9ccc20f91206469f8bc58bf8c8ebd4", - "reference": "de93d61feb9ccc20f91206469f8bc58bf8c8ebd4", + "url": "https://api.github.com/repos/beluga-php/docker-php/zipball/2eaf579e19ed08e8d3360bee545ad85f18deadc0", + "reference": "2eaf579e19ed08e8d3360bee545ad85f18deadc0", "shasum": "" }, "require": { - "ext-json": "*", - "ext-mbstring": "*", - "guzzlehttp/guzzle": "^6.3 || ^7.0", - "marc-mabe/php-enum": "^3.0 || ^4.0", - "mockery/mockery": "^1.6.7", - "nette/di": "^2.4 || ^3.0", - "nette/utils": "^2.4 || ^3.0", - "php": "^8.1", - "phpunit/phpunit": "^9.6 || ^10.5", - "ramsey/uuid": "^3.0 || ^4.0", - "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1" + "beluga-php/docker-php-api": "7.1.45.*", + "nyholm/psr7": "^1.8", + "php": ">=8.1", + "php-http/client-common": "^2.7", + "php-http/discovery": "^1.19", + "php-http/socket-client": "^2.3", + "psr/http-message": "^2.0", + "symfony/filesystem": "^6.3 || ^7.0 || ^8.0", + "symfony/process": "^6.3 || ^7.0 || ^8.0", + "symfony/serializer": "^6.3 || ^7.0 || ^8.0" + }, + "conflict": { + "docker-php/docker-php": "*", + "nikic/php-parser": "<4.13", + "php-http/message": "<1.15" }, "require-dev": { - "brandembassy/coding-standard": "^11.1", + "ergebnis/composer-normalize": "^2.42", + "friendsofphp/php-cs-fixer": "^3.8", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5.46", + "psy/psysh": "^0.12.8", "roave/security-advisories": "dev-latest" }, "type": "library", - "autoload": { - "psr-4": { - "BrandEmbassy\\MockeryTools\\": "src/MockeryTools" + "extra": { + "branch-alias": { + "1.41": "1.41.x-dev", + "1.42": "1.42.x-dev", + "1.43": "1.43.x-dev", + "1.44": "1.44.x-dev", + "dev-master": "1.45.x-dev" } }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "proprietary" - ], - "support": { - "issues": "https://github.com/BrandEmbassy/mockery-tools/issues", - "source": "https://github.com/BrandEmbassy/mockery-tools/tree/4.1.3" - }, - "time": "2024-02-28T13:26:35+00:00" - }, - { - "name": "cakephp/core", - "version": "4.5.4", - "source": { - "type": "git", - "url": "https://github.com/cakephp/core.git", - "reference": "c2f4dff110d41e475d1041f2abe236f1c62d0cd0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/core/zipball/c2f4dff110d41e475d1041f2abe236f1c62d0cd0", - "reference": "c2f4dff110d41e475d1041f2abe236f1c62d0cd0", - "shasum": "" - }, - "require": { - "cakephp/utility": "^4.0", - "php": ">=7.4.0" - }, - "provide": { - "psr/container-implementation": "^1.0 || ^2.0" - }, - "suggest": { - "cakephp/cache": "To use Configure::store() and restore().", - "cakephp/event": "To use PluginApplicationInterface or plugin applications.", - "league/container": "To use Container and ServiceProvider classes" - }, - "type": "library", "autoload": { - "files": [ - "functions.php" - ], "psr-4": { - "Cake\\Core\\": "." + "Docker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/core/graphs/contributors" - } - ], - "description": "CakePHP Framework Core classes", - "homepage": "https://cakephp.org", - "keywords": [ - "cakephp", - "core", - "framework" - ], + "description": "A Docker PHP client", "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/core" + "issues": "https://github.com/beluga-php/docker-php/issues", + "source": "https://github.com/beluga-php/docker-php/tree/v1.45.6" }, - "time": "2023-10-21T13:30:46+00:00" - }, - { - "name": "cakephp/database", - "version": "4.5.4", - "source": { - "type": "git", - "url": "https://github.com/cakephp/database.git", - "reference": "317739cc32060ef19b6c19c87ac6b64848d78e27" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/database/zipball/317739cc32060ef19b6c19c87ac6b64848d78e27", - "reference": "317739cc32060ef19b6c19c87ac6b64848d78e27", - "shasum": "" - }, - "require": { - "cakephp/core": "^4.0", - "cakephp/datasource": "^4.0", - "php": ">=7.4.0" - }, - "suggest": { - "cakephp/i18n": "If you are using locale-aware datetime formats or Chronos types.", - "cakephp/log": "If you want to use query logging without providing a logger yourself." - }, - "type": "library", - "autoload": { - "psr-4": { - "Cake\\Database\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/database/graphs/contributors" + "url": "https://github.com/flavioheleno", + "type": "github" } ], - "description": "Flexible and powerful Database abstraction library with a familiar PDO-like API", - "homepage": "https://cakephp.org", - "keywords": [ - "abstraction", - "cakephp", - "database", - "database abstraction", - "pdo" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/database" - }, - "time": "2023-12-07T12:23:54+00:00" + "time": "2025-12-27T21:42:50+00:00" }, { - "name": "cakephp/datasource", - "version": "4.5.4", + "name": "beluga-php/docker-php-api", + "version": "v7.1.45.4", "source": { "type": "git", - "url": "https://github.com/cakephp/datasource.git", - "reference": "5d11a35ffc09dee744faaab7f758aeb42c17cfec" + "url": "https://github.com/beluga-php/docker-php-api.git", + "reference": "8f3ed3b9a69e161489e07664b99eb73258e7eef2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/datasource/zipball/5d11a35ffc09dee744faaab7f758aeb42c17cfec", - "reference": "5d11a35ffc09dee744faaab7f758aeb42c17cfec", + "url": "https://api.github.com/repos/beluga-php/docker-php-api/zipball/8f3ed3b9a69e161489e07664b99eb73258e7eef2", + "reference": "8f3ed3b9a69e161489e07664b99eb73258e7eef2", "shasum": "" }, "require": { - "cakephp/core": "^4.0", - "php": ">=7.4.0", - "psr/log": "^1.0 || ^2.0", - "psr/simple-cache": "^1.0 || ^2.0" + "ext-mbstring": "*", + "jane-php/json-schema-runtime": "^7.5", + "jane-php/open-api-runtime": "^7.5", + "php": ">=8.1", + "php-http/client-common": "^2.7", + "php-http/discovery": "^1.19", + "php-http/multipart-stream-builder": "^1.3", + "psr/http-client": "^1.0", + "psr/http-client-implementation": "*", + "psr/http-factory": "^1.0", + "psr/http-factory-implementation": "*", + "psr/http-message": "^2.0", + "psr/http-message-implementation": "*", + "symfony/deprecation-contracts": "^3.3", + "symfony/options-resolver": "^6.3 || ^7.0 || ^8.0", + "symfony/serializer": "^6.3 || ^7.0 || ^8.0", + "symfony/validator": "^6.3 || ^7.0 || ^8.0" }, - "suggest": { - "cakephp/cache": "If you decide to use Query caching.", - "cakephp/collection": "If you decide to use ResultSetInterface.", - "cakephp/utility": "If you decide to use EntityTrait." + "conflict": { + "docker-php/docker-php-api": "*" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.42", + "friendsofphp/php-cs-fixer": "^3.8", + "jane-php/open-api-3": "^7.4", + "roave/security-advisories": "dev-latest" }, "type": "library", + "extra": { + "branch-alias": { + "6.1.36": "6.1.36.x-dev", + "6.1.41": "6.1.41.x-dev", + "7.1.41": "7.1.41.x-dev", + "7.1.42": "7.1.42.x-dev", + "7.1.43": "7.1.43.x-dev", + "7.1.44": "7.1.44.x-dev", + "7.1.45": "7.1.45.x-dev", + "dev-main": "7.1.46.x-dev" + } + }, "autoload": { "psr-4": { - "Cake\\Datasource\\": "." + "Docker\\API\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ + "description": "Docker API generated files from OpenAPI Specification", + "support": { + "issues": "https://github.com/beluga-php/docker-php-api/issues", + "source": "https://github.com/beluga-php/docker-php-api/tree/v7.1.45.4" + }, + "funding": [ { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/datasource/graphs/contributors" + "url": "https://github.com/flavioheleno", + "type": "github" } ], - "description": "Provides connection managing and traits for Entities and Queries that can be reused for different datastores", - "homepage": "https://cakephp.org", - "keywords": [ - "cakephp", - "connection management", - "datasource", - "entity", - "query" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/datasource" - }, - "time": "2023-11-05T07:32:10+00:00" + "time": "2026-01-09T13:29:42+00:00" }, { - "name": "cakephp/utility", - "version": "4.5.4", + "name": "clue/stream-filter", + "version": "v1.7.0", "source": { "type": "git", - "url": "https://github.com/cakephp/utility.git", - "reference": "24bd34c596cd88a69a7d5a338296ffe3c4fd393a" + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/utility/zipball/24bd34c596cd88a69a7d5a338296ffe3c4fd393a", - "reference": "24bd34c596cd88a69a7d5a338296ffe3c4fd393a", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", "shasum": "" }, "require": { - "cakephp/core": "^4.0", - "php": ">=7.4.0" + "php": ">=5.3" }, - "suggest": { - "ext-intl": "To use Text::transliterate() or Text::slug()", - "lib-ICU": "To use Text::transliterate() or Text::slug()" + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { "files": [ - "bootstrap.php" + "src/functions_include.php" ], "psr-4": { - "Cake\\Utility\\": "." + "Clue\\StreamFilter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2358,57 +1846,63 @@ ], "authors": [ { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/utility/graphs/contributors" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "CakePHP Utility classes such as Inflector, String, Hash, and Security", - "homepage": "https://cakephp.org", + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", "keywords": [ - "cakephp", - "hash", - "inflector", - "security", - "string", - "utility" + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" ], "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/utility" + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" }, - "time": "2024-02-27T16:19:58+00:00" + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-20T15:40:13+00:00" }, { "name": "colinodell/json5", - "version": "v2.3.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/colinodell/json5.git", - "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710" + "reference": "5724d21bc5c910c2560af1b8915f0cc0163579c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/colinodell/json5/zipball/15b063f8cb5e6deb15f0cd39123264ec0d19c710", - "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710", + "url": "https://api.github.com/repos/colinodell/json5/zipball/5724d21bc5c910c2560af1b8915f0cc0163579c8", + "reference": "5724d21bc5c910c2560af1b8915f0cc0163579c8", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "^7.1.3|^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" + "php": "^8.0" }, "require-dev": { - "mikehaertl/php-shellcommand": "^1.2.5", - "phpstan/phpstan": "^1.4", - "scrutinizer/ocular": "^1.6", - "squizlabs/php_codesniffer": "^2.3 || ^3.0", - "symfony/finder": "^4.4|^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0" + "mikehaertl/php-shellcommand": "^1.7.0", + "phpstan/phpstan": "^1.10.57", + "scrutinizer/ocular": "^1.9", + "squizlabs/php_codesniffer": "^3.8.1", + "symfony/finder": "^6.0|^7.0", + "symfony/phpunit-bridge": "^7.0.3" }, "bin": [ "bin/json5" @@ -2416,7 +1910,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -2449,7 +1943,7 @@ ], "support": { "issues": "https://github.com/colinodell/json5/issues", - "source": "https://github.com/colinodell/json5/tree/v2.3.0" + "source": "https://github.com/colinodell/json5/tree/v3.0.0" }, "funding": [ { @@ -2469,7 +1963,7 @@ "type": "patreon" } ], - "time": "2022-12-27T16:44:40+00:00" + "time": "2024-02-09T13:06:12+00:00" }, { "name": "composer-unused/contracts", @@ -2519,35 +2013,36 @@ }, { "name": "composer-unused/symbol-parser", - "version": "0.2.5", + "version": "0.3.3", "source": { "type": "git", "url": "https://github.com/composer-unused/symbol-parser.git", - "reference": "96cee7244aea405e936247d42c49332d52d90ae7" + "reference": "afa62007cca768bd1ecbc0e8ed347c675c239410" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer-unused/symbol-parser/zipball/96cee7244aea405e936247d42c49332d52d90ae7", - "reference": "96cee7244aea405e936247d42c49332d52d90ae7", + "url": "https://api.github.com/repos/composer-unused/symbol-parser/zipball/afa62007cca768bd1ecbc0e8ed347c675c239410", + "reference": "afa62007cca768bd1ecbc0e8ed347c675c239410", "shasum": "" }, "require": { "composer-unused/contracts": "^0.3", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^5.0", "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^1.25", + "phpstan/phpdoc-parser": "^1.25 || ^2", "psr/container": "^1.0 || ^2.0", "psr/log": "^1.1 || ^2 || ^3", - "symfony/finder": "^5.3 || ^6.0 || ^7.0" + "symfony/finder": "^5.3 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.42", + "ergebnis/composer-normalize": "^2.49", "ext-ds": "*", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.6.10 || ^10.5", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.5", "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.9.0", - "symfony/serializer": "^5.4" + "squizlabs/php_codesniffer": "^4.0.1", + "symfony/property-access": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/serializer": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "type": "library", "autoload": { @@ -2586,20 +2081,20 @@ "type": "other" } ], - "time": "2024-03-09T15:25:51+00:00" + "time": "2026-01-29T13:38:57+00:00" }, { "name": "composer/ca-bundle", - "version": "1.5.0", + "version": "1.5.10", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", "shasum": "" }, "require": { @@ -2609,8 +2104,8 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", @@ -2646,7 +2141,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.0" + "source": "https://github.com/composer/ca-bundle/tree/1.5.10" }, "funding": [ { @@ -2656,40 +2151,36 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-03-15T14:00:32+00:00" + "time": "2025-12-08T15:06:51+00:00" }, { "name": "composer/class-map-generator", - "version": "1.1.1", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "8286a62d243312ed99b3eee20d5005c961adb311" + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8286a62d243312ed99b3eee20d5005c961adb311", - "reference": "8286a62d243312ed99b3eee20d5005c961adb311", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8f5fa3cc214230e71f54924bd0197a3bcc705eb1", + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1", "shasum": "" }, "require": { "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" }, "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" }, "type": "library", "extra": { @@ -2719,86 +2210,85 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.1.1" + "source": "https://github.com/composer/class-map-generator/tree/1.7.1" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + { + "url": "https://github.com/composer", + "type": "github" } ], - "time": "2024-03-15T12:53:41+00:00" + "time": "2025-12-29T13:15:25+00:00" }, { "name": "composer/composer", - "version": "2.7.2", + "version": "2.9.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "b826edb791571ab1eaf281eb1bd6e181a1192adc" + "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/b826edb791571ab1eaf281eb1bd6e181a1192adc", - "reference": "b826edb791571ab1eaf281eb1bd6e181a1192adc", + "url": "https://api.github.com/repos/composer/composer/zipball/72a8f8e653710e18d83e5dd531eb5a71fc3223e6", + "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2.1 || ^3.1", - "composer/semver": "^3.2.5", + "composer/pcre": "^2.3 || ^3.3", + "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.2.11", + "ext-json": "*", + "justinrainbow/json-schema": "^6.5.1", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8 || ^3", + "react/promise": "^3.3", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11 || ^7", - "symfony/filesystem": "^5.4 || ^6.0 || ^7", - "symfony/finder": "^5.4 || ^6.0 || ^7", + "symfony/console": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0 || ^7" + "symfony/polyfill-php84": "^1.30", + "symfony/process": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.9.3", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1" + "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "phpstan/phpstan-symfony": "^1.4.0", + "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0" }, "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" + "ext-curl": "Provides HTTP support (will fallback to PHP streams if missing)", + "ext-openssl": "Enables access to repositories and packages over HTTPS", + "ext-zip": "Allows direct extraction of ZIP archives (unzip/7z binaries will be used instead if available)", + "ext-zlib": "Enables gzip for HTTP requests" }, "bin": [ "bin/composer" ], "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.7-dev" - }, "phpstan": { "includes": [ "phpstan/rules.neon" ] + }, + "branch-alias": { + "dev-main": "2.9-dev" } }, "autoload": { @@ -2833,7 +2323,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.7.2" + "source": "https://github.com/composer/composer/tree/2.9.5" }, "funding": [ { @@ -2843,13 +2333,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-03-11T16:12:18+00:00" + "time": "2026-01-29T10:40:53+00:00" }, { "name": "composer/metadata-minifier", @@ -2922,28 +2408,36 @@ }, { "name": "composer/pcre", - "version": "3.1.3", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { "dev-main": "3.x-dev" } @@ -2973,7 +2467,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.3" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -2989,28 +2483,28 @@ "type": "tidelift" } ], - "time": "2024-03-19T10:26:25+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", - "version": "3.4.0", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -3054,7 +2548,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -3064,34 +2558,30 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2023-08-31T09:50:34+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.8", + "version": "1.5.9", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -3134,7 +2624,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" }, "funding": [ { @@ -3150,20 +2640,20 @@ "type": "tidelift" } ], - "time": "2023-11-20T07:44:33+00:00" + "time": "2025-05-12T21:07:07+00:00" }, { "name": "composer/xdebug-handler", - "version": "3.0.4", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255" + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255", - "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { @@ -3200,7 +2690,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.4" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { @@ -3216,33 +2706,33 @@ "type": "tidelift" } ], - "time": "2024-03-26T18:29:49+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.0.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "4be43904336affa5c2f70744a348312336afd0da" + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", - "reference": "4be43904336affa5c2f70744a348312336afd0da", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0", + "composer-plugin-api": "^2.2", "php": ">=5.4", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { - "composer/composer": "*", + "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", @@ -3261,9 +2751,9 @@ "authors": [ { "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" + "email": "opensource@frenck.dev", + "homepage": "https://frenck.dev", + "role": "Open source developer" }, { "name": "Contributors", @@ -3271,7 +2761,6 @@ } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", "keywords": [ "PHPCodeSniffer", "PHP_CodeSniffer", @@ -3292,66 +2781,48 @@ ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", "source": "https://github.com/PHPCSStandards/composer-installer" }, - "time": "2023-01-05T11:28:13+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" + "time": "2025-11-11T04:32:07+00:00" }, { "name": "doctrine/coding-standard", - "version": "12.0.0", + "version": "14.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/coding-standard.git", - "reference": "1b2b7dc58c68833af481fb9325c25abd40681c79" + "reference": "897a7dc209e49ee6cf04e689c41112df17967130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/1b2b7dc58c68833af481fb9325c25abd40681c79", - "reference": "1b2b7dc58c68833af481fb9325c25abd40681c79", + "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/897a7dc209e49ee6cf04e689c41112df17967130", + "reference": "897a7dc209e49ee6cf04e689c41112df17967130", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0.0", - "php": "^7.2 || ^8.0", - "slevomat/coding-standard": "^8.11", - "squizlabs/php_codesniffer": "^3.7" + "php": "^7.4 || ^8.0", + "slevomat/coding-standard": "^8.23", + "squizlabs/php_codesniffer": "^4" }, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", @@ -3385,55 +2856,62 @@ ], "support": { "issues": "https://github.com/doctrine/coding-standard/issues", - "source": "https://github.com/doctrine/coding-standard/tree/12.0.0" + "source": "https://github.com/doctrine/coding-standard/tree/14.0.0" }, - "time": "2023-04-24T17:43:28+00:00" + "time": "2025-09-21T18:21:47+00:00" }, { "name": "ergebnis/composer-normalize", - "version": "2.42.0", + "version": "2.50.0", "source": { "type": "git", "url": "https://github.com/ergebnis/composer-normalize.git", - "reference": "02cf2b69ad2a74c6f11a8c3f5f054b8f949df910" + "reference": "80971fe24ff10709789942bcbe9368b2c704097c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/02cf2b69ad2a74c6f11a8c3f5f054b8f949df910", - "reference": "02cf2b69ad2a74c6f11a8c3f5f054b8f949df910", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/80971fe24ff10709789942bcbe9368b2c704097c", + "reference": "80971fe24ff10709789942bcbe9368b2c704097c", "shasum": "" }, "require": { "composer-plugin-api": "^2.0.0", - "ergebnis/json": "^1.2.0", - "ergebnis/json-normalizer": "^4.5.0", - "ergebnis/json-printer": "^3.5.0", + "ergebnis/json": "^1.4.0", + "ergebnis/json-normalizer": "^4.9.0", + "ergebnis/json-printer": "^3.7.0", "ext-json": "*", - "justinrainbow/json-schema": "^5.2.12", - "localheinz/diff": "^1.1.1", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" - }, - "require-dev": { - "composer/composer": "^2.6.6", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", - "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "symfony/filesystem": "^5.4.25", - "vimeo/psalm": "^5.20.0" + "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", + "localheinz/diff": "^1.3.0", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "composer/composer": "^2.9.4", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.59.0", + "ergebnis/phpstan-rules": "^2.13.1", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", + "ergebnis/rector-rules": "^1.9.0", + "fakerphp/faker": "^1.24.1", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.38", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.12", + "phpstan/phpstan-strict-rules": "^2.0.8", + "phpunit/phpunit": "^9.6.33", + "rector/rector": "^2.3.5", + "symfony/filesystem": "^5.4.41" }, "type": "composer-plugin", "extra": { "class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin", + "branch-alias": { + "dev-main": "2.49-dev" + }, + "plugin-optional": true, "composer-normalize": { "indent-size": 2, "indent-style": "space" - }, - "plugin-optional": true + } }, "autoload": { "psr-4": { @@ -3464,40 +2942,48 @@ "security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/composer-normalize" }, - "time": "2024-01-30T11:54:02+00:00" + "time": "2026-02-09T20:57:47+00:00" }, { "name": "ergebnis/json", - "version": "1.2.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json.git", - "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0" + "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json/zipball/a457f25a5ba7ea11fc94f84d53678c5211abfce0", - "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0", + "url": "https://api.github.com/repos/ergebnis/json/zipball/7b56d2b5d9e897e75b43e2e753075a0904c921b1", + "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1", "shasum": "" }, "require": { "ext-json": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "ergebnis/composer-normalize": "^2.44.0", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpstan-rules": "^2.11.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", + "phpunit/phpunit": "^9.6.24", + "rector/rector": "^2.1.4" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.7-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -3529,20 +3015,20 @@ "security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json" }, - "time": "2024-01-29T15:09:24+00:00" + "time": "2025-09-06T09:08:45+00:00" }, { "name": "ergebnis/json-normalizer", - "version": "4.5.0", + "version": "4.10.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-normalizer.git", - "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152" + "reference": "77961faf2c651c3f05977b53c6c68e8434febf62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/f0ee9e70739f121b27fac8b743e4a52b23de2152", - "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/77961faf2c651c3f05977b53c6c68e8434febf62", + "reference": "77961faf2c651c3f05977b53c6c68e8434febf62", "shasum": "" }, "require": { @@ -3551,26 +3037,39 @@ "ergebnis/json-printer": "^3.5.0", "ergebnis/json-schema-validator": "^4.2.0", "ext-json": "*", - "justinrainbow/json-schema": "^5.2.12", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "composer/semver": "^3.4.0", - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "composer/semver": "^3.4.3", + "ergebnis/composer-normalize": "^2.44.0", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.4", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.19", + "rector/rector": "^1.2.10" }, "suggest": { "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.11-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, "autoload": { "psr-4": { "Ergebnis\\Json\\Normalizer\\": "src/" @@ -3598,39 +3097,46 @@ "security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-normalizer" }, - "time": "2024-01-30T09:10:15+00:00" + "time": "2025-09-06T09:18:13+00:00" }, { "name": "ergebnis/json-pointer", - "version": "3.4.0", + "version": "3.7.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-pointer.git", - "reference": "b654757d873050622c2166f55ab25d04685261c5" + "reference": "43bef355184e9542635e35dd2705910a3df4c236" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/b654757d873050622c2166f55ab25d04685261c5", - "reference": "b654757d873050622c2166f55ab25d04685261c5", + "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/43bef355184e9542635e35dd2705910a3df4c236", + "reference": "43bef355184e9542635e35dd2705910a3df4c236", "shasum": "" }, "require": { - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { + "ergebnis/composer-normalize": "^2.43.0", "ergebnis/data-provider": "^3.2.0", "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "ergebnis/php-cs-fixer-config": "^6.32.0", + "ergebnis/phpunit-slow-test-detector": "^2.15.0", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.19", + "rector/rector": "^1.2.10" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "3.8-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -3664,40 +3170,53 @@ "security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-pointer" }, - "time": "2024-01-29T16:37:15+00:00" + "time": "2025-09-06T09:28:19+00:00" }, { "name": "ergebnis/json-printer", - "version": "3.5.0", + "version": "3.8.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-printer.git", - "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced" + "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/549e16fe6de34b8c3aee7b421be12caa552f3ced", - "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/211d73fc7ec6daf98568ee6ed6e6d133dee8503e", + "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "ergebnis/composer-normalize": "^2.44.0", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.1", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.21", + "rector/rector": "^1.2.10" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.9-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, "autoload": { "psr-4": { "Ergebnis\\Json\\Printer\\": "src/" @@ -3726,43 +3245,50 @@ "security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-printer" }, - "time": "2024-01-29T15:33:37+00:00" + "time": "2025-09-06T09:59:26+00:00" }, { "name": "ergebnis/json-schema-validator", - "version": "4.2.0", + "version": "4.5.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-schema-validator.git", - "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef" + "reference": "b739527a480a9e3651360ad351ea77e7e9019df2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", - "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/b739527a480a9e3651360ad351ea77e7e9019df2", + "reference": "b739527a480a9e3651360ad351ea77e7e9019df2", "shasum": "" }, "require": { "ergebnis/json": "^1.2.0", "ergebnis/json-pointer": "^3.4.0", "ext-json": "*", - "justinrainbow/json-schema": "^5.2.12", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "ergebnis/composer-normalize": "^2.44.0", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.20", + "rector/rector": "^1.2.10" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "4.6-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -3796,42 +3322,43 @@ "security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-schema-validator" }, - "time": "2024-01-29T16:50:15+00:00" + "time": "2025-09-06T11:37:35+00:00" }, { "name": "ergebnis/phpstan-rules", - "version": "2.2.0", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/ergebnis/phpstan-rules.git", - "reference": "2e9946491d39ea1eb043738309895e08f025a7a0" + "reference": "f69db86b98595c34fc1f61c89fe3b380141aa519" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/2e9946491d39ea1eb043738309895e08f025a7a0", - "reference": "2e9946491d39ea1eb043738309895e08f025a7a0", + "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/f69db86b98595c34fc1f61c89fe3b380141aa519", + "reference": "f69db86b98595c34fc1f61c89fe3b380141aa519", "shasum": "" }, "require": { "ext-mbstring": "*", - "nikic/php-parser": "^4.2.3 || ^5.0.0", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "phpstan/phpstan": "^1.10.21" - }, - "require-dev": { - "doctrine/orm": "^3.0.0", - "ergebnis/composer-normalize": "^2.42.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.22.0", - "ergebnis/phpunit-slow-test-detector": "^2.10.0", - "nette/di": "^3.2.0", - "phpstan/phpstan-deprecation-rules": "^1.1.4", - "phpstan/phpstan-strict-rules": "^1.5.2", - "phpunit/phpunit": "^10.5.10", - "psalm/plugin-phpunit": "~0.18.4", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "phpstan/phpstan": "^2.1.35" + }, + "require-dev": { + "codeception/codeception": "^4.0.0 || ^5.0.0", + "doctrine/orm": "^2.20.0 || ^3.3.0", + "ergebnis/composer-normalize": "^2.49.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.59.0", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", + "fakerphp/faker": "^1.24.1", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.12", + "phpstan/phpstan-strict-rules": "^2.0.8", + "phpunit/phpunit": "^9.6.21", "psr/container": "^2.0.2", - "rector/rector": "^1.0.0", - "vimeo/psalm": "^5.21.1" + "symfony/finder": "^5.4.45", + "symfony/process": "^5.4.47" }, "type": "phpstan-extension", "extra": { @@ -3868,38 +3395,44 @@ "security": "https://github.com/ergebnis/phpstan-rules/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/phpstan-rules" }, - "time": "2024-02-07T17:49:28+00:00" + "time": "2026-01-27T17:13:06+00:00" }, { "name": "ergebnis/phpunit-slow-test-detector", - "version": "2.14.0", + "version": "2.23.0", "source": { "type": "git", "url": "https://github.com/ergebnis/phpunit-slow-test-detector.git", - "reference": "9138b0ebffdd2c579eb4b0567ef3bef8c714fdc2" + "reference": "30f6a83dae5a8a438787935df4e498dacbd0ac0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/phpunit-slow-test-detector/zipball/9138b0ebffdd2c579eb4b0567ef3bef8c714fdc2", - "reference": "9138b0ebffdd2c579eb4b0567ef3bef8c714fdc2", + "url": "https://api.github.com/repos/ergebnis/phpunit-slow-test-detector/zipball/30f6a83dae5a8a438787935df4e498dacbd0ac0c", + "reference": "30f6a83dae5a8a438787935df4e498dacbd0ac0c", "shasum": "" }, "require": { - "php": "~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", - "phpunit/phpunit": "^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0" + "php": "~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/phpunit": "^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.42.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.25.1", + "ergebnis/composer-normalize": "^2.50.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.60.0", "fakerphp/faker": "~1.20.0", - "psalm/plugin-phpunit": "~0.19.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.1", + "phpstan/phpstan-strict-rules": "^1.6.1", "psr/container": "~1.0.0", - "rector/rector": "^1.0.4", - "vimeo/psalm": "^5.23.1" + "rector/rector": "^1.2.10" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "2.16-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -3935,121 +3468,20 @@ "security": "https://github.com/ergebnis/phpunit-slow-test-detector/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/phpunit-slow-test-detector" }, - "time": "2024-04-08T06:35:34+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "time": "2021-06-11T22:34:44+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" - }, - "time": "2022-03-02T22:36:06+00:00" + "time": "2026-02-22T13:22:49+00:00" }, { "name": "fidry/cpu-core-counter", - "version": "1.1.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { @@ -4059,10 +3491,10 @@ "fidry/makefile": "^0.2.0", "fidry/php-cs-fixer-config": "^1.1.2", "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^8.5.31 || ^9.5.26", "webmozarts/strict-phpunit": "^7.5" }, @@ -4089,7 +3521,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" }, "funding": [ { @@ -4097,44 +3529,33 @@ "type": "github" } ], - "time": "2024-02-07T09:43:46+00:00" + "time": "2025-08-14T07:29:31+00:00" }, { - "name": "filp/whoops", - "version": "2.15.4", + "name": "graham-campbell/result-type", + "version": "v1.1.4", "source": { "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5" }, "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "symfony/var-dumper": "Pretty print complex values better with var-dumper available", - "whoops/soap": "Formats errors as SOAP responses" + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, "autoload": { "psr-4": { - "Whoops\\": "src/Whoops/" + "GrahamCampbell\\ResultType\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4143,146 +3564,151 @@ ], "authors": [ { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", + "description": "An Implementation Of The Result Type", "keywords": [ - "error", - "exception", - "handling", - "library", - "throwable", - "whoops" + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" ], "support": { - "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.4" + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" }, "funding": [ { - "url": "https://github.com/denis-sokolov", + "url": "https://github.com/GrahamCampbell", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" } ], - "time": "2023-11-03T12:00:00+00:00" + "time": "2025-12-27T19:43:20+00:00" }, { - "name": "graham-campbell/result-type", - "version": "v1.1.2", + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", "source": { "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2" + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", - "autoload": { - "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" } }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } + "BSD-3-Clause" ], - "description": "An Implementation Of The Result Type", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" ], "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" - } - ], - "time": "2023-11-12T22:16:48+00:00" + "time": "2025-04-30T06:54:44+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "name": "icanhazstring/composer-unused", + "version": "0.9.6", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "url": "https://github.com/composer-unused/composer-unused.git", + "reference": "c60030af7954a528746dd2180c10b5e0871e84c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/composer-unused/composer-unused/zipball/c60030af7954a528746dd2180c10b5e0871e84c7", + "reference": "c60030af7954a528746dd2180c10b5e0871e84c7", "shasum": "" }, "require": { + "composer-runtime-api": "^2.0", + "composer-unused/contracts": "^0.3", + "composer-unused/symbol-parser": "^0.3.1", + "composer/xdebug-handler": "^3.0", "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" + "nikic/php-parser": "^5.0", + "ondram/ci-detector": "^4.1", + "php": "^8.1", + "phpstan/phpdoc-parser": "^1.25 || ^2", + "psr/container": "^1.0 || ^2.0", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/config": "^6.0 || ^7.0 || ^8.0", + "symfony/console": "^6.0 || ^7.0 || ^8.0", + "symfony/dependency-injection": "^6.0 || ^7.0 || ^8.0", + "symfony/property-access": "^6.0 || ^7.0 || ^8.0", + "symfony/serializer": "^6.0 || ^7.0 || ^8.0", + "webmozart/assert": "^1.10 || ^2.0", + "webmozart/glob": "^4.4" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" + "bamarni/composer-bin-plugin": "^1.8", + "codeception/verify": "^3.1", + "dg/bypass-finals": "^1.6", + "ergebnis/composer-normalize": "^2.49", + "ext-ds": "*", + "ext-zend-opcache": "*", + "jangregor/phpstan-prophecy": "^2.1.1", + "mikey179/vfsstream": "^1.6.10", + "php-ds/php-ds": "^1.5", + "phpspec/prophecy-phpunit": "^2.2.0", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^2.1.37", + "phpstan/phpstan-phpunit": "^2.0.12", + "phpunit/phpunit": "^9.6.34", + "roave/security-advisories": "dev-master", + "squizlabs/php_codesniffer": "^3.13" }, + "bin": [ + "bin/composer-unused" + ], "type": "library", "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": false + "forward-command": true } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "GuzzleHttp\\": "src/" + "ComposerUnused\\ComposerUnused\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4291,448 +3717,371 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Andreas Frömer", + "email": "composer-unused@icanhazstring.com" } ], - "description": "Guzzle is a PHP HTTP client library", + "description": "Show unused packages by scanning your code", + "homepage": "https://github.com/composer-unused/composer-unused", "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" + "composer", + "php-parser", + "static analysis", + "unused" ], "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "issues": "https://github.com/composer-unused/composer-unused/issues", + "source": "https://github.com/composer-unused/composer-unused" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/sponsors/icanhazstring", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" + "url": "https://paypal.me/icanhazstring", + "type": "other" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2026-01-30T05:52:24+00:00" }, { - "name": "guzzlehttp/promises", - "version": "2.0.2", + "name": "infection/abstract-testframework-adapter", + "version": "0.5.0", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "url": "https://github.com/infection/abstract-testframework-adapter.git", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^2.17", + "phpunit/phpunit": "^9.5" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" + "Infection\\AbstractTestFramework\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" } ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], + "description": "Abstract Test Framework Adapter for Infection", "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "issues": "https://github.com/infection/abstract-testframework-adapter/issues", + "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/infection", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" + "url": "https://opencollective.com/infection", + "type": "open_collective" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2021-08-17T18:49:12+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.6.2", + "name": "infection/extension-installer", + "version": "0.1.2", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "url": "https://github.com/infection/extension-installer.git", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "composer-plugin-api": "^1.1 || ^2.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + "composer/composer": "^1.9 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.18, <2.19", + "infection/infection": "^0.15.2", + "php-coveralls/php-coveralls": "^2.4", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.10", + "phpstan/phpstan-phpunit": "^0.12.6", + "phpstan/phpstan-strict-rules": "^0.12.2", + "phpstan/phpstan-webmozart-assert": "^0.12.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.8" }, - "type": "library", + "type": "composer-plugin", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } + "class": "Infection\\ExtensionInstaller\\Plugin" }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" + "Infection\\ExtensionInstaller\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" } ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], + "description": "Infection Extension Installer", "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "issues": "https://github.com/infection/extension-installer/issues", + "source": "https://github.com/infection/extension-installer/tree/0.1.2" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/infection", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" + "url": "https://opencollective.com/infection", + "type": "open_collective" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2021-10-20T22:08:34+00:00" }, { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", + "name": "infection/include-interceptor", + "version": "0.2.5", "source": { "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + "url": "https://github.com/infection/include-interceptor.git", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", "shasum": "" }, - "require": { - "php": "^5.3|^7.0|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + "friendsofphp/php-cs-fixer": "^2.16", + "infection/infection": "^0.15.0", + "phan/phan": "^2.4 || ^3", + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "^0.12.8", + "phpunit/phpunit": "^8.5", + "vimeo/psalm": "^3.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, "autoload": { - "classmap": [ - "hamcrest" - ] + "psr-4": { + "Infection\\StreamWrapper\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } ], + "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + "issues": "https://github.com/infection/include-interceptor/issues", + "source": "https://github.com/infection/include-interceptor/tree/0.2.5" }, - "time": "2020-07-09T08:09:16+00:00" + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-08-09T10:03:57+00:00" }, { - "name": "icanhazstring/composer-unused", - "version": "0.8.11", + "name": "infection/infection", + "version": "0.32.6", "source": { "type": "git", - "url": "https://github.com/composer-unused/composer-unused.git", - "reference": "4720206edc29a7da1913ece0e508f6d82fbcd905" + "url": "https://github.com/infection/infection.git", + "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer-unused/composer-unused/zipball/4720206edc29a7da1913ece0e508f6d82fbcd905", - "reference": "4720206edc29a7da1913ece0e508f6d82fbcd905", + "url": "https://api.github.com/repos/infection/infection/zipball/4ed769947eaf2ecf42203027301bad2bedf037e5", + "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5", "shasum": "" }, "require": { - "composer-unused/contracts": "^0.3", - "composer-unused/symbol-parser": "^0.2.1", + "colinodell/json5": "^3.0", + "composer-runtime-api": "^2.0", + "composer/xdebug-handler": "^3.0", + "ext-dom": "*", "ext-json": "*", - "nikic/php-parser": "^4.15", - "ondram/ci-detector": "^4.1", - "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^1.12", - "psr/container": "^1.0 || ^2.0", - "psr/log": "^1.1 || ^2 || ^3", - "symfony/config": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/console": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^4.4.8 || ^5.4 || ^6.0 || ^7.0", - "symfony/property-access": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/serializer": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/validator": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "webmozart/assert": "^1.10", - "webmozart/glob": "^4.4" + "ext-libxml": "*", + "ext-mbstring": "*", + "fidry/cpu-core-counter": "^1.0", + "infection/abstract-testframework-adapter": "^0.5.0", + "infection/extension-installer": "^0.1.0", + "infection/include-interceptor": "^0.2.5", + "infection/mutator": "^0.4", + "justinrainbow/json-schema": "^6.0", + "nikic/php-parser": "^5.6.2", + "ondram/ci-detector": "^4.1.0", + "php": "^8.2", + "psr/log": "^2.0 || ^3.0", + "sanmai/di-container": "^0.1.12", + "sanmai/duoclock": "^0.1.0", + "sanmai/later": "^0.1.7", + "sanmai/pipeline": "^7.2", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/console": "^6.4 || ^7.0 || ^8.0", + "symfony/filesystem": "^6.4 || ^7.0 || ^8.0", + "symfony/finder": "^6.4 || ^7.0 || ^8.0", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^6.4 || ^7.0 || ^8.0", + "thecodingmachine/safe": "^v3.0", + "webmozart/assert": "^1.11 || ^2.0" + }, + "conflict": { + "antecedent/patchwork": "<2.1.25", + "dg/bypass-finals": "<1.4.1" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8", - "codeception/verify": "^3.0", - "dg/bypass-finals": "^1.5", - "ergebnis/composer-normalize": "^2.28", - "ext-ds": "*", - "ext-zend-opcache": "*", - "jangregor/phpstan-prophecy": "^1.0", - "php-ds/php-ds": "^1.4", - "phpspec/prophecy-phpunit": "^2.0.2", - "phpstan/extension-installer": "^1.3", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.6.13", - "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.7" + "ext-simplexml": "*", + "fidry/makefile": "^1.0", + "fig/log-test": "^1.2", + "phpbench/phpbench": "^1.4", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", + "phpunit/phpunit": "^11.5.27", + "rector/rector": "^2.2.4", + "shipmonk/dead-code-detector": "^0.14.0", + "shipmonk/name-collision-detector": "^2.1", + "sidz/phpstan-rules": "^0.5.1", + "symfony/yaml": "^6.4 || ^7.0 || ^8.0", + "thecodingmachine/phpstan-safe-rule": "^1.4", + "webmozarts/strict-phpunit": "^7.15" }, "bin": [ - "bin/composer-unused" + "bin/infection" ], "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": true - } - }, "autoload": { "psr-4": { - "ComposerUnused\\ComposerUnused\\": "src" + "Infection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Andreas Frömer", - "email": "composer-unused@icanhazstring.com" + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com", + "homepage": "https://twitter.com/maks_rafalko" + }, + { + "name": "Oleg Zhulnev", + "homepage": "https://github.com/sidz" + }, + { + "name": "Gert de Pagter", + "homepage": "https://github.com/BackEndTea" + }, + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com", + "homepage": "https://twitter.com/tfidry" + }, + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com", + "homepage": "https://www.alexeykopytko.com" + }, + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" } ], - "description": "Show unused packages by scanning your code", - "homepage": "https://github.com/composer-unused/composer-unused", + "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", "keywords": [ - "composer", - "php-parser", - "static analysis", - "unused" + "coverage", + "mutant", + "mutation framework", + "mutation testing", + "testing", + "unit testing" ], "support": { - "issues": "https://github.com/composer-unused/composer-unused/issues", - "source": "https://github.com/composer-unused/composer-unused" + "issues": "https://github.com/infection/infection/issues", + "source": "https://github.com/infection/infection/tree/0.32.6" }, "funding": [ { - "url": "https://github.com/sponsors/icanhazstring", + "url": "https://github.com/infection", "type": "github" }, { - "url": "https://paypal.me/icanhazstring", - "type": "other" + "url": "https://opencollective.com/infection", + "type": "open_collective" } ], - "time": "2023-11-30T14:35:29+00:00" + "time": "2026-02-26T14:34:26+00:00" }, { - "name": "infection/abstract-testframework-adapter", - "version": "0.5.0", + "name": "infection/mutator", + "version": "0.4.1", "source": { "type": "git", - "url": "https://github.com/infection/abstract-testframework-adapter.git", - "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" + "url": "https://github.com/infection/mutator.git", + "reference": "3c976d721b02b32f851ee4e15d553ef1e9186d1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", - "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "url": "https://api.github.com/repos/infection/mutator/zipball/3c976d721b02b32f851ee4e15d553ef1e9186d1d", + "reference": "3c976d721b02b32f851ee4e15d553ef1e9186d1d", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "nikic/php-parser": "^5.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^2.17", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.6 || ^10" }, "type": "library", "autoload": { "psr-4": { - "Infection\\AbstractTestFramework\\": "src/" + "Infection\\Mutator\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4745,10 +4094,10 @@ "email": "maks.rafalko@gmail.com" } ], - "description": "Abstract Test Framework Adapter for Infection", + "description": "Mutator interface to implement custom mutators (mutation operators) for Infection", "support": { - "issues": "https://github.com/infection/abstract-testframework-adapter/issues", - "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" + "issues": "https://github.com/infection/mutator/issues", + "source": "https://github.com/infection/mutator/tree/0.4.1" }, "funding": [ { @@ -4760,296 +4109,342 @@ "type": "open_collective" } ], - "time": "2021-08-17T18:49:12+00:00" + "time": "2025-04-29T08:19:52+00:00" }, { - "name": "infection/extension-installer", - "version": "0.1.2", + "name": "jane-php/json-schema-runtime", + "version": "v7.10.4", "source": { "type": "git", - "url": "https://github.com/infection/extension-installer.git", - "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" + "url": "https://github.com/janephp/json-schema-runtime.git", + "reference": "f1f96868836e7b9cfa45eb40d3afcd989f079a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", - "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "url": "https://api.github.com/repos/janephp/json-schema-runtime/zipball/f1f96868836e7b9cfa45eb40d3afcd989f079a3a", + "reference": "f1f96868836e7b9cfa45eb40d3afcd989f079a3a", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1 || ^2.0" + "ext-json": "*", + "league/uri": "^6.7.2 || ^7.4", + "php": "^8.1", + "php-jsonpointer/php-jsonpointer": "^3.0 || ^4.0", + "symfony/serializer": "^5.4 || ^6.4 || ^7.0 || ^8.0", + "symfony/yaml": "^5.4 || ^6.4 || ^7.0 || ^8.0" + }, + "conflict": { + "symfony/framework-bundle": "5.1.0" }, "require-dev": { - "composer/composer": "^1.9 || ^2.0", - "friendsofphp/php-cs-fixer": "^2.18, <2.19", - "infection/infection": "^0.15.2", - "php-coveralls/php-coveralls": "^2.4", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.10", - "phpstan/phpstan-phpunit": "^0.12.6", - "phpstan/phpstan-strict-rules": "^0.12.2", - "phpstan/phpstan-webmozart-assert": "^0.12.2", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.8" + "phpunit/phpunit": "^8.5" }, - "type": "composer-plugin", + "type": "library", "extra": { - "class": "Infection\\ExtensionInstaller\\Plugin" + "branch-alias": { + "dev-next": "7-dev" + } }, "autoload": { "psr-4": { - "Infection\\ExtensionInstaller\\": "src/" - } + "Jane\\Component\\JsonSchemaRuntime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" + "name": "Joel Wurtz", + "email": "jwurtz@jolicode.com" + }, + { + "name": "Baptiste Leduc", + "email": "baptiste.leduc@gmail.com" } ], - "description": "Infection Extension Installer", + "description": "Jane runtime Library", "support": { - "issues": "https://github.com/infection/extension-installer/issues", - "source": "https://github.com/infection/extension-installer/tree/0.1.2" + "source": "https://github.com/janephp/json-schema-runtime/tree/v7.10.4" }, - "funding": [ + "time": "2026-01-12T19:55:34+00:00" + }, + { + "name": "jane-php/open-api-runtime", + "version": "v7.10.4", + "source": { + "type": "git", + "url": "https://github.com/janephp/open-api-runtime.git", + "reference": "825670a6cbd0e2b8246af0c1b15ce4b986318942" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/janephp/open-api-runtime/zipball/825670a6cbd0e2b8246af0c1b15ce4b986318942", + "reference": "825670a6cbd0e2b8246af0c1b15ce4b986318942", + "shasum": "" + }, + "require": { + "jane-php/json-schema-runtime": "^7.0", + "nyholm/psr7": "^1.8", + "php": "^8.1", + "php-http/client-common": "^2.0", + "php-http/discovery": "^1.6", + "php-http/multipart-stream-builder": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5", + "symfony/serializer": "^5.4 || ^6.4 || ^7.0 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-next": "7-dev" + } + }, + "autoload": { + "psr-4": { + "Jane\\Component\\OpenApiRuntime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://github.com/infection", - "type": "github" + "name": "Joel Wurtz", + "email": "jwurtz@jolicode.com" }, { - "url": "https://opencollective.com/infection", - "type": "open_collective" + "name": "Baptiste Leduc", + "email": "baptiste.leduc@gmail.com" } ], - "time": "2021-10-20T22:08:34+00:00" + "description": "Jane OpenAPI Runtime Library, dependencies and utility class for a library generated by jane/openapi", + "support": { + "source": "https://github.com/janephp/open-api-runtime/tree/v7.10.4" + }, + "time": "2026-01-12T19:55:34+00:00" }, { - "name": "infection/include-interceptor", - "version": "0.2.5", + "name": "justinrainbow/json-schema", + "version": "v6.7.2", "source": { "type": "git", - "url": "https://github.com/infection/include-interceptor.git", - "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "6fea66c7204683af437864e7c4e7abf383d14bc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", - "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/6fea66c7204683af437864e7c4e7abf383d14bc0", + "reference": "6fea66c7204683af437864e7c4e7abf383d14bc0", "shasum": "" }, + "require": { + "ext-json": "*", + "marc-mabe/php-enum": "^4.4", + "php": "^7.2 || ^8.0" + }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "infection/infection": "^0.15.0", - "phan/phan": "^2.4 || ^3", - "php-coveralls/php-coveralls": "^2.2", - "phpstan/phpstan": "^0.12.8", - "phpunit/phpunit": "^8.5", - "vimeo/psalm": "^3.8" + "friendsofphp/php-cs-fixer": "3.3.0", + "json-schema/json-schema-test-suite": "^23.2", + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" }, + "bin": [ + "bin/validate-json" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, "autoload": { "psr-4": { - "Infection\\StreamWrapper\\": "src/" + "JsonSchema\\": "src/JsonSchema/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" - } - ], - "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", - "support": { - "issues": "https://github.com/infection/include-interceptor/issues", - "source": "https://github.com/infection/include-interceptor/tree/0.2.5" - }, - "funding": [ + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, { - "url": "https://github.com/infection", - "type": "github" + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" }, { - "url": "https://opencollective.com/infection", - "type": "open_collective" + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" } ], - "time": "2021-08-09T10:03:57+00:00" + "description": "A library to validate a json schema.", + "homepage": "https://github.com/jsonrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/v6.7.2" + }, + "time": "2026-02-15T15:06:22+00:00" }, { - "name": "infection/infection", - "version": "0.27.10", + "name": "league/uri", + "version": "7.8.0", "source": { "type": "git", - "url": "https://github.com/infection/infection.git", - "reference": "873cd3335774a114bef9ca93388e623bf362d820" + "url": "https://github.com/thephpleague/uri.git", + "reference": "4436c6ec8d458e4244448b069cc572d088230b76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/infection/zipball/873cd3335774a114bef9ca93388e623bf362d820", - "reference": "873cd3335774a114bef9ca93388e623bf362d820", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76", + "reference": "4436c6ec8d458e4244448b069cc572d088230b76", "shasum": "" }, "require": { - "colinodell/json5": "^2.2", - "composer-runtime-api": "^2.0", - "composer/xdebug-handler": "^2.0 || ^3.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "fidry/cpu-core-counter": "^0.4.0 || ^0.5.0 || ^1.0", - "infection/abstract-testframework-adapter": "^0.5.0", - "infection/extension-installer": "^0.1.0", - "infection/include-interceptor": "^0.2.5", - "justinrainbow/json-schema": "^5.2.10", - "nikic/php-parser": "^4.15.1", - "ondram/ci-detector": "^4.1.0", + "league/uri-interfaces": "^7.8", "php": "^8.1", - "sanmai/later": "^0.1.1", - "sanmai/pipeline": "^5.1 || ^6", - "sebastian/diff": "^3.0.2 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "thecodingmachine/safe": "^2.1.2", - "webmozart/assert": "^1.11" + "psr/http-factory": "^1" }, "conflict": { - "antecedent/patchwork": "<2.1.25", - "dg/bypass-finals": "<1.4.1", - "phpunit/php-code-coverage": ">9,<9.1.4 || >9.2.17,<9.2.21" + "league/uri-schemes": "^1.0" }, - "require-dev": { - "brianium/paratest": "^6.11", - "ext-simplexml": "*", - "fidry/makefile": "^0.2.0", - "helmich/phpunit-json-assert": "^3.0", - "phpspec/prophecy": "^1.15", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "^1.10.15", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpstan/phpstan-strict-rules": "^1.1.0", - "phpstan/phpstan-webmozart-assert": "^1.0.2", - "phpunit/phpunit": "^9.6", - "rector/rector": "^0.16.0", - "sidz/phpstan-rules": "^0.4.0", - "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0", - "thecodingmachine/phpstan-safe-rule": "^1.2.0" + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, - "bin": [ - "bin/infection" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { "psr-4": { - "Infection\\": "src/" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com", - "homepage": "https://twitter.com/maks_rafalko" - }, - { - "name": "Oleg Zhulnev", - "homepage": "https://github.com/sidz" - }, - { - "name": "Gert de Pagter", - "homepage": "https://github.com/BackEndTea" - }, - { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com", - "homepage": "https://twitter.com/tfidry" - }, - { - "name": "Alexey Kopytko", - "email": "alexey@kopytko.com", - "homepage": "https://www.alexeykopytko.com" - }, - { - "name": "Andreas Möller", - "email": "am@localheinz.com", - "homepage": "https://localheinz.com" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "coverage", - "mutant", - "mutation framework", - "mutation testing", - "testing", - "unit testing" + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" ], "support": { - "issues": "https://github.com/infection/infection/issues", - "source": "https://github.com/infection/infection/tree/0.27.10" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.0" }, "funding": [ { - "url": "https://github.com/infection", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" } ], - "time": "2024-02-20T00:08:52+00:00" + "time": "2026-01-14T17:24:56+00:00" }, { - "name": "justinrainbow/json-schema", - "version": "v5.2.13", + "name": "league/uri-interfaces", + "version": "7.8.0", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4", + "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, - "bin": [ - "bin/validate-json" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "7.x-dev" } }, "autoload": { "psr-4": { - "JsonSchema\\": "src/JsonSchema/" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -5058,53 +4453,65 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "json", - "schema" + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0" }, - "time": "2023-09-26T02:20:38+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-01-15T06:54:53+00:00" }, { "name": "localheinz/diff", - "version": "1.1.1", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/localheinz/diff.git", - "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c" + "reference": "33bd840935970cda6691c23fc7d94ae764c0734c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/localheinz/diff/zipball/851bb20ea8358c86f677f5f111c4ab031b1c764c", - "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c", + "url": "https://api.github.com/repos/localheinz/diff/zipball/33bd840935970cda6691c23fc7d94ae764c0734c", + "reference": "33bd840935970cda6691c23fc7d94ae764c0734c", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", + "phpunit/phpunit": "^7.5.0 || ^8.5.23", "symfony/process": "^4.2 || ^5" }, "type": "library", @@ -5136,49 +4543,49 @@ "unified diff" ], "support": { - "source": "https://github.com/localheinz/diff/tree/main" + "issues": "https://github.com/localheinz/diff/issues", + "source": "https://github.com/localheinz/diff/tree/1.3.0" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-07-06T04:49:32+00:00" + "time": "2025-08-30T09:44:18+00:00" }, { "name": "maglnet/composer-require-checker", - "version": "4.11.0", + "version": "4.20.0", "source": { "type": "git", "url": "https://github.com/maglnet/ComposerRequireChecker.git", - "reference": "c6c555e799bee50810fd84933ca1f0b276379ccf" + "reference": "c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/c6c555e799bee50810fd84933ca1f0b276379ccf", - "reference": "c6c555e799bee50810fd84933ca1f0b276379ccf", + "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2", + "reference": "c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2", "shasum": "" }, "require": { + "azjezz/psl": "^4.2.0", "composer-runtime-api": "^2.0.0", "ext-phar": "*", - "nikic/php-parser": "^4.19.1", - "php": "~8.2.0 || ~8.3.0", - "symfony/console": "^6.4.1 || ^7.0.1", - "webmozart/assert": "^1.11.0", + "nikic/php-parser": "^5.7.0", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "symfony/console": "^7.4.1", "webmozart/glob": "^4.7.0" }, + "conflict": { + "revolt/event-loop": "< 1.0.8" + }, "require-dev": { - "doctrine/coding-standard": "^12.0.0", + "doctrine/coding-standard": "^14.0.0", "ext-zend-opcache": "*", - "phing/phing": "^2.17.4", - "phpstan/phpstan": "^1.10.66", - "phpunit/phpunit": "^10.5.16", - "psalm/plugin-phpunit": "^0.19.0", - "roave/infection-static-analysis-plugin": "^1.35.0", - "spatie/temporary-directory": "^2.2.1", - "vimeo/psalm": "^5.23.1" + "phing/phing": "^3.1.1", + "php-standard-library/phpstan-extension": "^2.0.2", + "php-standard-library/psalm-plugin": "^2.3", + "phpstan/phpstan": "^2.1.33", + "phpunit/phpunit": "^12.5.4", + "psalm/plugin-phpunit": "^0.19.5", + "roave/infection-static-analysis-plugin": "^1.42.0", + "spatie/temporary-directory": "^2.3.0", + "vimeo/psalm": "^6.14.3" }, "bin": [ "bin/composer-require-checker" @@ -5213,32 +4620,32 @@ "description": "CLI tool to analyze composer dependencies and verify that no unknown symbols are used in the sources of a package", "homepage": "https://github.com/maglnet/ComposerRequireChecker", "keywords": [ - "analysis", "cli", "composer", "dependency", "imports", "require", - "requirements" + "requirements", + "static analysis" ], "support": { "issues": "https://github.com/maglnet/ComposerRequireChecker/issues", - "source": "https://github.com/maglnet/ComposerRequireChecker/tree/4.11.0" + "source": "https://github.com/maglnet/ComposerRequireChecker/tree/4.20.0" }, - "time": "2024-04-01T20:24:52+00:00" + "time": "2025-12-29T11:34:42+00:00" }, { "name": "marc-mabe/php-enum", - "version": "v4.7.0", + "version": "v4.7.2", "source": { "type": "git", "url": "https://github.com/marc-mabe/php-enum.git", - "reference": "3da42cc1daceaf98c858e56f59d1ccd52b011fdc" + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/3da42cc1daceaf98c858e56f59d1ccd52b011fdc", - "reference": "3da42cc1daceaf98c858e56f59d1ccd52b011fdc", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef", "shasum": "" }, "require": { @@ -5249,13 +4656,13 @@ "phpbench/phpbench": "^0.16.10 || ^1.0.4", "phpstan/phpstan": "^1.3.1", "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", - "vimeo/psalm": "^4.17.0" + "vimeo/psalm": "^4.17.0 | ^5.26.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.6-dev", - "dev-3.x": "3.2-dev" + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" } }, "autoload": { @@ -5296,22 +4703,22 @@ ], "support": { "issues": "https://github.com/marc-mabe/php-enum/issues", - "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.0" + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" }, - "time": "2022-04-19T02:21:46+00:00" + "time": "2025-09-14T11:18:39+00:00" }, { "name": "mockery/mockery", - "version": "1.6.11", + "version": "1.6.12", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "81a161d0b135df89951abd52296adf97deb0723d" + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d", - "reference": "81a161d0b135df89951abd52296adf97deb0723d", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", "shasum": "" }, "require": { @@ -5381,20 +4788,20 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2024-03-21T18:34:15+00:00" + "time": "2024-05-16T03:13:13+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -5402,11 +4809,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -5432,7 +4840,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -5440,164 +4848,55 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { - "name": "netresearch/jsonmapper", - "version": "v4.4.1", + "name": "nette/utils", + "version": "v4.1.3", "source": { "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0" + "url": "https://github.com/nette/utils.git", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/132c75c7dd83e45353ebb9c6c9f591952995bbf0", - "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.4.1" - }, - "time": "2024-01-31T06:18:54+00:00" - }, - { - "name": "nette/di", - "version": "v3.1.10", - "source": { - "type": "git", - "url": "https://github.com/nette/di.git", - "reference": "2645ec3eaa17fa2ab87c5eb4eaacb1fe6dd28284" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/di/zipball/2645ec3eaa17fa2ab87c5eb4eaacb1fe6dd28284", - "reference": "2645ec3eaa17fa2ab87c5eb4eaacb1fe6dd28284", - "shasum": "" + "php": "8.2 - 8.5" }, - "require": { - "ext-tokenizer": "*", - "nette/neon": "^3.3 || ^4.0", - "nette/php-generator": "^3.5.4 || ^4.0", - "nette/robot-loader": "^3.2 || ~4.0.0", - "nette/schema": "^1.2.5", - "nette/utils": "^3.2.5 || ~4.0.0", - "php": "7.2 - 8.3" + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" }, "require-dev": { - "nette/tester": "^2.4", - "phpstan/phpstan": "^1.0", + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP features.", - "homepage": "https://nette.org", - "keywords": [ - "compiled", - "di", - "dic", - "factory", - "ioc", - "nette", - "static" - ], - "support": { - "issues": "https://github.com/nette/di/issues", - "source": "https://github.com/nette/di/tree/v3.1.10" - }, - "time": "2024-02-06T01:19:44+00:00" - }, - { - "name": "nette/finder", - "version": "v2.6.0", - "source": { - "type": "git", - "url": "https://github.com/nette/finder.git", - "reference": "991aefb42860abeab8e003970c3809a9d83cb932" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/finder/zipball/991aefb42860abeab8e003970c3809a9d83cb932", - "reference": "991aefb42860abeab8e003970c3809a9d83cb932", - "shasum": "" - }, - "require": { - "nette/utils": "^2.4 || ^3.0", - "php": ">=7.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "^2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "4.1-dev" } }, "autoload": { + "psr-4": { + "Nette\\": "src" + }, "classmap": [ "src/" ] @@ -5618,325 +4917,336 @@ "homepage": "https://nette.org/contributors" } ], - "description": "🔍 Nette Finder: find files and directories with an intuitive API.", + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", "homepage": "https://nette.org", "keywords": [ - "filesystem", - "glob", - "iterator", - "nette" + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" ], "support": { - "issues": "https://github.com/nette/finder/issues", - "source": "https://github.com/nette/finder/tree/v2.6.0" + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2022-10-13T01:31:15+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { - "name": "nette/neon", - "version": "v3.4.1", + "name": "nikolaposa/version", + "version": "4.2.1", "source": { "type": "git", - "url": "https://github.com/nette/neon.git", - "reference": "457bfbf0560f600b30d9df4233af382a478bb44d" + "url": "https://github.com/nikolaposa/version.git", + "reference": "2b9ee2f0b09333b6ce00bd6b63132cdf1d7a1428" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/neon/zipball/457bfbf0560f600b30d9df4233af382a478bb44d", - "reference": "457bfbf0560f600b30d9df4233af382a478bb44d", + "url": "https://api.github.com/repos/nikolaposa/version/zipball/2b9ee2f0b09333b6ce00bd6b63132cdf1d7a1428", + "reference": "2b9ee2f0b09333b6ce00bd6b63132cdf1d7a1428", "shasum": "" }, "require": { - "ext-json": "*", - "php": "8.0 - 8.3" + "beberlei/assert": "^3.2", + "php": "^8.1" }, "require-dev": { - "nette/tester": "^2.4", - "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.7" + "friendsofphp/php-cs-fixer": "^3.44", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-beberlei-assert": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^10.5" }, - "bin": [ - "bin/neon-lint" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2.x-dev" } }, - "autoload": { - "classmap": [ - "src/" - ] + "autoload": { + "psr-4": { + "Version\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Nikola Poša", + "email": "posa.nikola@gmail.com", + "homepage": "https://www.nikolaposa.in.rs" } ], - "description": "🍸 Nette NEON: encodes and decodes NEON file format.", - "homepage": "https://ne-on.org", + "description": "Value Object that represents a SemVer-compliant version number.", + "homepage": "https://github.com/nikolaposa/version", "keywords": [ - "export", - "import", - "neon", - "nette", - "yaml" + "semantic", + "semver", + "version", + "versioning" ], "support": { - "issues": "https://github.com/nette/neon/issues", - "source": "https://github.com/nette/neon/tree/v3.4.1" + "issues": "https://github.com/nikolaposa/version/issues", + "source": "https://github.com/nikolaposa/version/tree/4.2.1" }, - "time": "2023-09-27T08:59:11+00:00" + "time": "2025-03-24T19:12:02+00:00" }, { - "name": "nette/php-generator", - "version": "v4.1.4", + "name": "nyholm/psr7", + "version": "1.8.2", "source": { "type": "git", - "url": "https://github.com/nette/php-generator.git", - "reference": "b135071d8da108445e4df2fc6a75522b23c0237d" + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/b135071d8da108445e4df2fc6a75522b23c0237d", - "reference": "b135071d8da108445e4df2fc6a75522b23c0237d", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { - "nette/utils": "^3.2.9 || ^4.0", - "php": "8.0 - 8.3" + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" }, - "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.4", - "nikic/php-parser": "^4.18 || ^5.0", - "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.8" + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, - "suggest": { - "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "1.8-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" }, { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" } ], - "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.3 features.", - "homepage": "https://nette.org", + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", "keywords": [ - "code", - "nette", - "php", - "scaffolding" + "psr-17", + "psr-7" ], "support": { - "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v4.1.4" + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, - "time": "2024-03-07T23:06:26+00:00" + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" }, { - "name": "nette/robot-loader", - "version": "v3.4.2", + "name": "ocramius/package-versions", + "version": "2.11.0", "source": { "type": "git", - "url": "https://github.com/nette/robot-loader.git", - "reference": "970c8f82be98ec54180c88a468cd2b057855d993" + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "23359bf3003a71b053ac8ab4b3f651597bd3d261" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/robot-loader/zipball/970c8f82be98ec54180c88a468cd2b057855d993", - "reference": "970c8f82be98ec54180c88a468cd2b057855d993", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/23359bf3003a71b053ac8ab4b3f651597bd3d261", + "reference": "23359bf3003a71b053ac8ab4b3f651597bd3d261", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "nette/finder": "^2.5 || ^3.0", - "nette/utils": "^3.0", - "php": ">=7.1" + "composer-runtime-api": "^2.2.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "replace": { + "composer/package-versions-deprecated": "*" }, "require-dev": { - "nette/tester": "^2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" + "composer/composer": "^2.9.2", + "doctrine/coding-standard": "^14.0.0", + "ext-zip": "^1.15.0", + "phpunit/phpunit": "^11.5.44", + "psalm/plugin-phpunit": "^0.19.5", + "roave/infection-static-analysis-plugin": "^1.39.0", + "vimeo/psalm": "^6.13.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", - "homepage": "https://nette.org", - "keywords": [ - "autoload", - "class", - "interface", - "nette", - "trait" - ], + "description": "Provides efficient querying for installed package versions (no runtime IO)", "support": { - "issues": "https://github.com/nette/robot-loader/issues", - "source": "https://github.com/nette/robot-loader/tree/v3.4.2" + "issues": "https://github.com/Ocramius/PackageVersions/issues", + "source": "https://github.com/Ocramius/PackageVersions/tree/2.11.0" }, - "time": "2022-12-14T15:41:06+00:00" + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/package-versions", + "type": "tidelift" + } + ], + "time": "2025-11-27T11:43:11+00:00" }, { - "name": "nette/schema", - "version": "v1.2.5", + "name": "ondram/ci-detector", + "version": "4.2.0", "source": { "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a" + "url": "https://github.com/OndraM/ci-detector.git", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a", - "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a", + "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", "shasum": "" }, "require": { - "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": "7.1 - 8.3" + "php": "^7.4 || ^8.0" }, "require-dev": { - "nette/tester": "^2.3 || ^2.4", - "phpstan/phpstan-nette": "^1.0", - "tracy/tracy": "^2.7" + "ergebnis/composer-normalize": "^2.13.2", + "lmc/coding-standard": "^3.0.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.6.13" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "OndraM\\CiDetector\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Ondřej Machulda", + "email": "ondrej.machulda@gmail.com" } ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", + "description": "Detect continuous integration environment and provide unified access to properties of current build", "keywords": [ - "config", - "nette" + "CircleCI", + "Codeship", + "Wercker", + "adapter", + "appveyor", + "aws", + "aws codebuild", + "azure", + "azure devops", + "azure pipelines", + "bamboo", + "bitbucket", + "buddy", + "ci-info", + "codebuild", + "continuous integration", + "continuousphp", + "devops", + "drone", + "github", + "gitlab", + "interface", + "jenkins", + "pipelines", + "sourcehut", + "teamcity", + "travis" ], "support": { - "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.5" + "issues": "https://github.com/OndraM/ci-detector/issues", + "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" }, - "time": "2023-10-05T20:37:59+00:00" + "time": "2024-03-12T13:22:30+00:00" }, { - "name": "nette/utils", - "version": "v3.2.10", + "name": "phar-io/manifest", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2" + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2", - "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { - "php": ">=7.2 <8.4" - }, - "conflict": { - "nette/di": "<3.0.6" - }, - "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "~2.0", - "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.3" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -5946,156 +5256,130 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "BSD-3-Clause" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", - "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" - ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.10" + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2023-07-30T15:38:18+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { - "name": "nikolaposa/version", - "version": "4.2.0", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/nikolaposa/version.git", - "reference": "003fefa14f47cd44917546285e39d196af062a95" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikolaposa/version/zipball/003fefa14f47cd44917546285e39d196af062a95", - "reference": "003fefa14f47cd44917546285e39d196af062a95", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { - "beberlei/assert": "^3.2", - "php": "^8.1" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.44", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-beberlei-assert": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^10.5" + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2.x-dev" - } - }, "autoload": { - "psr-4": { - "Version\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nikola Poša", - "email": "posa.nikola@gmail.com", - "homepage": "https://www.nikolaposa.in.rs" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Value Object that represents a SemVer-compliant version number.", - "homepage": "https://github.com/nikolaposa/version", - "keywords": [ - "semantic", - "semver", - "version", - "versioning" - ], + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/nikolaposa/version/issues", - "source": "https://github.com/nikolaposa/version/tree/4.2.0" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2023-12-29T22:07:54+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { - "name": "nunomaduro/collision", - "version": "v7.10.0", + "name": "php-http/client-common", + "version": "2.7.3", "source": { "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "49ec67fa7b002712da8526678abd651c09f375b2" + "url": "https://github.com/php-http/client-common.git", + "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", - "reference": "49ec67fa7b002712da8526678abd651c09f375b2", + "url": "https://api.github.com/repos/php-http/client-common/zipball/dcc6de29c90dd74faab55f71b79d89409c4bf0c1", + "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1", "shasum": "" }, "require": { - "filp/whoops": "^2.15.3", - "nunomaduro/termwind": "^1.15.1", - "php": "^8.1.0", - "symfony/console": "^6.3.4" - }, - "conflict": { - "laravel/framework": ">=11.0.0" + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/polyfill-php80": "^1.17" }, "require-dev": { - "brianium/paratest": "^7.3.0", - "laravel/framework": "^10.28.0", - "laravel/pint": "^1.13.3", - "laravel/sail": "^1.25.0", - "laravel/sanctum": "^3.3.1", - "laravel/tinker": "^2.8.2", - "nunomaduro/larastan": "^2.6.4", - "orchestra/testbench-core": "^8.13.0", - "pestphp/pest": "^2.23.2", - "phpunit/phpunit": "^10.4.1", - "sebastian/environment": "^6.0.1", - "spatie/laravel-ignition": "^2.3.1" + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - } + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, + "type": "library", "autoload": { - "files": [ - "./src/Adapters/Phpunit/Autoload.php" - ], "psr-4": { - "NunoMaduro\\Collision\\": "src/" + "Http\\Client\\Common\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6104,89 +5388,74 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Cli error handling for console/command-line PHP applications.", + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "error", - "handling", - "laravel", - "laravel-zero", - "php", - "symfony" + "client", + "common", + "http", + "httplug" ], "support": { - "issues": "https://github.com/nunomaduro/collision/issues", - "source": "https://github.com/nunomaduro/collision" + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.3" }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2023-10-11T15:45:01+00:00" + "time": "2025-11-29T19:12:34+00:00" }, { - "name": "nunomaduro/termwind", - "version": "v1.15.1", + "name": "php-http/discovery", + "version": "1.20.0", "source": { "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" }, "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, - "type": "library", + "type": "composer-plugin", "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] - } + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, "autoload": { - "files": [ - "src/Functions.php" - ], "psr-4": { - "Termwind\\": "src/" - } + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6194,72 +5463,56 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Its like Tailwind CSS, but for the console.", + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" ], "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://github.com/xiCO2k", - "type": "github" - } - ], - "time": "2023-02-08T01:06:31+00:00" + "time": "2024-10-02T11:20:13+00:00" }, { - "name": "ocramius/package-versions", - "version": "2.8.0", + "name": "php-http/httplug", + "version": "2.4.1", "source": { "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "7b5821f854cf1e6753c4ed7ceb3b11ae83bbad4e" + "url": "https://github.com/php-http/httplug.git", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/7b5821f854cf1e6753c4ed7ceb3b11ae83bbad4e", - "reference": "7b5821f854cf1e6753c4ed7ceb3b11ae83bbad4e", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", "shasum": "" }, "require": { - "composer-runtime-api": "^2.2.0", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" - }, - "replace": { - "composer/package-versions-deprecated": "*" + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { - "composer/composer": "^2.6.3", - "doctrine/coding-standard": "^12.0.0", - "ext-zip": "^1.15.0", - "phpunit/phpunit": "^9.6.12", - "roave/infection-static-analysis-plugin": "^1.33", - "vimeo/psalm": "^5.15.0" + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" }, "type": "library", "autoload": { "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6268,57 +5521,71 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/Ocramius/PackageVersions/issues", - "source": "https://github.com/Ocramius/PackageVersions/tree/2.8.0" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" }, { - "url": "https://tidelift.com/funding/github/packagist/ocramius/package-versions", - "type": "tidelift" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "time": "2023-09-15T11:02:59+00:00" + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.1" + }, + "time": "2024-09-23T11:39:58+00:00" }, { - "name": "ondram/ci-detector", - "version": "4.2.0", + "name": "php-http/message", + "version": "1.16.2", "source": { "type": "git", - "url": "https://github.com/OndraM/ci-detector.git", - "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" + "url": "https://github.com/php-http/message.git", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", - "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.13.2", - "lmc/coding-standard": "^3.0.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "^1.2.0", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpunit/phpunit": "^9.6.13" + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", "autoload": { + "files": [ + "src/filters.php" + ], "psr-4": { - "OndraM\\CiDetector\\": "src/" + "Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6327,82 +5594,52 @@ ], "authors": [ { - "name": "Ondřej Machulda", - "email": "ondrej.machulda@gmail.com" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Detect continuous integration environment and provide unified access to properties of current build", + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", "keywords": [ - "CircleCI", - "Codeship", - "Wercker", - "adapter", - "appveyor", - "aws", - "aws codebuild", - "azure", - "azure devops", - "azure pipelines", - "bamboo", - "bitbucket", - "buddy", - "ci-info", - "codebuild", - "continuous integration", - "continuousphp", - "devops", - "drone", - "github", - "gitlab", - "interface", - "jenkins", - "pipelines", - "sourcehut", - "teamcity", - "travis" + "http", + "message", + "psr-7" ], "support": { - "issues": "https://github.com/OndraM/ci-detector/issues", - "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.2" }, - "time": "2024-03-12T13:22:30+00:00" + "time": "2024-10-02T11:34:13+00:00" }, { - "name": "orklah/psalm-insane-comparison", - "version": "v2.3.0", + "name": "php-http/multipart-stream-builder", + "version": "1.4.2", "source": { "type": "git", - "url": "https://github.com/orklah/psalm-insane-comparison.git", - "reference": "d9e608e787e5ae1c994ae07095eea26029d6d0bd" + "url": "https://github.com/php-http/multipart-stream-builder.git", + "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/orklah/psalm-insane-comparison/zipball/d9e608e787e5ae1c994ae07095eea26029d6d0bd", - "reference": "d9e608e787e5ae1c994ae07095eea26029d6d0bd", + "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e", + "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e", "shasum": "" }, "require": { - "ext-simplexml": "*", - "php": "^7.3|^8.0", - "vimeo/psalm": "^4|^5|dev-master" + "php": "^7.1 || ^8.0", + "php-http/discovery": "^1.15", + "psr/http-factory-implementation": "^1.0" }, "require-dev": { - "nikic/php-parser": "^4.0|^5" - }, - "type": "psalm-plugin", - "extra": { - "psalm": { - "pluginClass": "Orklah\\PsalmInsaneComparison\\Plugin" - } + "nyholm/psr7": "^1.0", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.0.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" }, + "type": "library", "autoload": { "psr-4": { - "Orklah\\PsalmInsaneComparison\\": [ - "." - ], - "Orklah\\PsalmInsaneComparison\\Hooks\\": [ - "hooks" - ] + "Http\\Message\\MultipartStream\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6411,173 +5648,168 @@ ], "authors": [ { - "name": "orklah" + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" } ], - "description": "Detects possible insane comparison (\"string\" == 0) to help migrate to PHP8", + "description": "A builder class that help you create a multipart stream", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "multipart stream", + "stream" + ], "support": { - "issues": "https://github.com/orklah/psalm-insane-comparison/issues", - "source": "https://github.com/orklah/psalm-insane-comparison/tree/v2.3.0" + "issues": "https://github.com/php-http/multipart-stream-builder/issues", + "source": "https://github.com/php-http/multipart-stream-builder/tree/1.4.2" }, - "time": "2024-03-20T21:49:45+00:00" + "time": "2024-09-04T13:22:54+00:00" }, { - "name": "phar-io/manifest", - "version": "2.0.4", + "name": "php-http/promise", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" }, + "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Http\\Promise\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { - "name": "phar-io/version", - "version": "3.2.1", + "name": "php-http/socket-client", + "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + "url": "https://github.com/php-http/socket-client.git", + "reference": "99bb89004e04b92bf4b688d40a1f06494a7063b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "url": "https://api.github.com/repos/php-http/socket-client/zipball/99bb89004e04b92bf4b688d40a1f06494a7063b3", + "reference": "99bb89004e04b92bf4b688d40a1f06494a7063b3", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "nyholm/psr7": "^1.8.1", + "php": "^8.1", + "php-http/httplug": "^2.4", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "^2.6 || ^3.4 || ^4.4 || ^5.0 || ^6.0 || ^7.0 || ^8.0" + }, + "conflict": { + "guzzlehttp/psr7": "<2.0" + }, + "provide": { + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "ext-openssl": "*", + "friendsofphp/php-cs-fixer": "^3.51", + "php-http/client-common": "^2.7", + "php-http/client-integration-tests": "^4.0", + "php-http/message": "^1.16", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0" }, "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Http\\Client\\Socket\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Joel Wurtz", + "email": "jwurtz@jolicode.com" } ], - "description": "Library for handling version information and constraints", + "description": "Socket client for PHP-HTTP", "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" + "issues": "https://github.com/php-http/socket-client/issues", + "source": "https://github.com/php-http/socket-client/tree/2.4.0" }, - "time": "2022-02-21T01:04:05+00:00" + "time": "2026-01-10T10:45:38+00:00" }, { - "name": "php-coveralls/php-coveralls", - "version": "v2.7.0", + "name": "php-jsonpointer/php-jsonpointer", + "version": "v4.0.0", "source": { "type": "git", - "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "b36fa4394e519dafaddc04ae03976bc65a25ba15" + "url": "https://github.com/raphaelstolt/php-jsonpointer.git", + "reference": "fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/b36fa4394e519dafaddc04ae03976bc65a25ba15", - "reference": "b36fa4394e519dafaddc04ae03976bc65a25ba15", + "url": "https://api.github.com/repos/raphaelstolt/php-jsonpointer/zipball/fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b", + "reference": "fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b", "shasum": "" }, "require": { - "ext-json": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.0 || ^7.0", - "php": "^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "php": ">=7.4" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23", - "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" - }, - "suggest": { - "symfony/http-kernel": "Allows Symfony integration" + "friendsofphp/php-cs-fixer": "^3.0", + "phpunit/phpunit": "8.*" }, - "bin": [ - "bin/php-coveralls" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { - "psr-4": { - "PhpCoveralls\\": "src/" + "psr-0": { + "Rs\\Json": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6586,41 +5818,23 @@ ], "authors": [ { - "name": "Kitamura Satoshi", - "email": "with.no.parachute@gmail.com", - "homepage": "https://www.facebook.com/satooshi.jp", - "role": "Original creator" - }, - { - "name": "Takashi Matsuo", - "email": "tmatsuo@google.com" - }, - { - "name": "Google Inc" - }, - { - "name": "Dariusz Ruminski", - "email": "dariusz.ruminski@gmail.com", - "homepage": "https://github.com/keradus" - }, - { - "name": "Contributors", - "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" + "name": "Raphael Stolt", + "email": "raphael.stolt@gmail.com", + "homepage": "http://raphaelstolt.blogspot.com/" } ], - "description": "PHP client library for Coveralls API", - "homepage": "https://github.com/php-coveralls/php-coveralls", + "description": "Implementation of JSON Pointer (http://tools.ietf.org/html/rfc6901)", + "homepage": "https://github.com/raphaelstolt/php-jsonpointer", "keywords": [ - "ci", - "coverage", - "github", - "test" + "json", + "json pointer", + "json traversal" ], "support": { - "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.7.0" + "issues": "https://github.com/raphaelstolt/php-jsonpointer/issues", + "source": "https://github.com/raphaelstolt/php-jsonpointer/tree/v4.0.0" }, - "time": "2023-11-22T10:21:01+00:00" + "time": "2022-01-11T14:28:07+00:00" }, { "name": "php-parallel-lint/php-console-color", @@ -6776,248 +5990,26 @@ "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint", "keywords": [ "lint", - "static analysis" - ], - "support": { - "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues", - "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.4.0" - }, - "time": "2024-03-27T12:14:49+00:00" - }, - { - "name": "php-standard-library/psalm-plugin", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-standard-library/psalm-plugin.git", - "reference": "bf6d560ae498966150bc66a42e02744b0ee242c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-standard-library/psalm-plugin/zipball/bf6d560ae498966150bc66a42e02744b0ee242c5", - "reference": "bf6d560ae498966150bc66a42e02744b0ee242c5", - "shasum": "" - }, - "require": { - "php": "^8.1", - "vimeo/psalm": ">=5.16" - }, - "conflict": { - "azjezz/psl": "<2.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.18", - "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "psalm-plugin", - "extra": { - "psalm": { - "pluginClass": "Psl\\Psalm\\Plugin" - } - }, - "autoload": { - "psr-4": { - "Psl\\Psalm\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "azjezz", - "email": "azjezz@protonmail.com" - } - ], - "description": "Psalm plugin for the PHP Standard Library", - "support": { - "issues": "https://github.com/php-standard-library/psalm-plugin/issues", - "source": "https://github.com/php-standard-library/psalm-plugin/tree/2.3.0" - }, - "time": "2023-11-28T12:22:48+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } + "static analysis" ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues", + "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.4.0" }, - "time": "2024-02-23T11:10:43+00:00" + "time": "2024-03-27T12:14:49+00:00" }, { "name": "phpoption/phpoption", - "version": "1.9.2", + "version": "1.9.5", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", "shasum": "" }, "require": { @@ -7025,13 +6017,13 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { "dev-master": "1.9-dev" @@ -7067,7 +6059,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" }, "funding": [ { @@ -7079,34 +6071,82 @@ "type": "tidelift" } ], - "time": "2023-11-12T21:59:55+00:00" + "time": "2025-12-27T19:41:33+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" + }, + "time": "2024-09-04T20:21:43+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.28.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", - "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^5.3.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", "symfony/process": "^5.2" }, "type": "library", @@ -7124,26 +6164,21 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.28.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2024-04-03T18:51:33+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.66", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "94779c987e4ebd620025d9e5fdd23323903950bd" - }, + "version": "2.1.40", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/94779c987e4ebd620025d9e5fdd23323903950bd", - "reference": "94779c987e4ebd620025d9e5fdd23323903950bd", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -7182,37 +6217,32 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2024-03-28T16:17:31+00:00" + "time": "2026-02-23T15:04:35+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "1.1.4", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "089d8a8258ed0aeefdc7b68b6c3d25572ebfdbaa" + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/089d8a8258ed0aeefdc7b68b6c3d25572ebfdbaa", - "reference": "089d8a8258ed0aeefdc7b68b6c3d25572ebfdbaa", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc", + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.3" + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.39" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-php-parser": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5" + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6" }, "type": "phpstan-extension", "extra": { @@ -7232,37 +6262,39 @@ "MIT" ], "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.4" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4" }, - "time": "2023-08-05T09:02:04+00:00" + "time": "2026-02-09T13:21:14+00:00" }, { "name": "phpstan/phpstan-mockery", - "version": "1.1.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-mockery.git", - "reference": "88ae85931768efd3aaf3cce4cb9cb54c4d157d03" + "reference": "89a949d0ac64298e88b7c7fa00caee565c198394" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/88ae85931768efd3aaf3cce4cb9cb54c4d157d03", - "reference": "88ae85931768efd3aaf3cce4cb9cb54c4d157d03", + "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/89a949d0ac64298e88b7c7fa00caee565c198394", + "reference": "89a949d0ac64298e88b7c7fa00caee565c198394", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0" }, "require-dev": { - "mockery/mockery": "^1.2.4", - "nikic/php-parser": "^4.13.0", + "mockery/mockery": "^1.6.11", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5" + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6" }, "type": "phpstan-extension", "extra": { @@ -7284,36 +6316,37 @@ "description": "PHPStan Mockery extension", "support": { "issues": "https://github.com/phpstan/phpstan-mockery/issues", - "source": "https://github.com/phpstan/phpstan-mockery/tree/1.1.2" + "source": "https://github.com/phpstan/phpstan-mockery/tree/2.0.0" }, - "time": "2024-01-10T13:50:05+00:00" + "time": "2024-10-14T03:18:12+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.16", + "version": "2.0.16", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95" + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d5242a59d035e46774f2e634b374bc39ff62cb95", - "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32", + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.32" }, "conflict": { "phpunit/phpunit": "<7.0" }, "require-dev": { - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^5", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^9.5" + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6" }, "type": "phpstan-extension", "extra": { @@ -7334,36 +6367,38 @@ "MIT" ], "description": "PHPUnit extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.16" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16" }, - "time": "2024-02-23T09:51:20+00:00" + "time": "2026-02-14T09:05:21+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.3", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b" + "reference": "1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/568210bd301f94a0d4b1e5a0808c374c1b9cf11b", - "reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f", + "reference": "1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.60" + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.39" }, "require-dev": { - "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5" + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6" }, "type": "phpstan-extension", "extra": { @@ -7383,43 +6418,45 @@ "MIT" ], "description": "Extra strict and opinionated rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.3" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.10" }, - "time": "2024-04-06T07:43:25+00:00" + "time": "2026-02-11T14:17:32+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "12.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^10.1" + "phpunit/phpunit": "^12.5.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -7428,7 +6465,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "12.5.x-dev" } }, "autoload": { @@ -7457,40 +6494,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2026-02-06T06:01:44+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.1.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7518,36 +6567,48 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2023-08-31T06:24:48+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", - "version": "4.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -7555,7 +6616,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7581,7 +6642,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -7589,32 +6651,32 @@ "type": "github" } ], - "time": "2023-02-03T06:56:09+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "3.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7641,7 +6703,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -7649,32 +6711,32 @@ "type": "github" } ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "6.0.0", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -7700,7 +6762,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -7708,20 +6771,20 @@ "type": "github" } ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "10.5.17", + "version": "12.5.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c1f736a473d21957ead7e94fcc029f571895abf5" + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c1f736a473d21957ead7e94fcc029f571895abf5", - "reference": "c1f736a473d21957ead7e94fcc029f571895abf5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47283cfd98d553edcb1353591f4e255dc1bb61f0", + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0", "shasum": "" }, "require": { @@ -7731,29 +6794,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.3", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.4", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" }, "bin": [ "phpunit" @@ -7761,7 +6821,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.5-dev" + "dev-main": "12.5-dev" } }, "autoload": { @@ -7793,7 +6853,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.17" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.14" }, "funding": [ { @@ -7804,51 +6864,42 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2024-04-05T04:39:01+00:00" + "time": "2026-02-18T12:38:40+00:00" }, { - "name": "psalm/plugin-mockery", - "version": "1.1.0", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/psalm/psalm-plugin-mockery.git", - "reference": "876247d15f91df08240d00dac69c5135b6689283" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-mockery/zipball/876247d15f91df08240d00dac69c5135b6689283", - "reference": "876247d15f91df08240d00dac69c5135b6689283", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.10", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "mockery/mockery": "^1.0", - "php": "~7.4 || ~8.0 || ~8.1 || ~8.2", - "vimeo/psalm": "dev-master || ^5.0@rc || ^5.0" - }, - "require-dev": { - "codeception/codeception": "^4.1.9", - "phpunit/phpunit": "^9.0", - "squizlabs/php_codesniffer": "^3.3.1", - "weirdan/codeception-psalm-module": "^0.13.1" - }, - "type": "psalm-plugin", - "extra": { - "psalm": { - "pluginClass": "Psalm\\MockeryPlugin\\Plugin" - } + "php": "^7.0 || ^8.0" }, + "type": "library", "autoload": { "psr-4": { - "Psalm\\MockeryPlugin\\": [ - "." - ] + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7857,76 +6908,24 @@ ], "authors": [ { - "name": "Matt Brown", - "email": "github@muglug.com" - } - ], - "description": "Psalm plugin for Mockery", - "support": { - "issues": "https://github.com/psalm/psalm-plugin-mockery/issues", - "source": "https://github.com/psalm/psalm-plugin-mockery/tree/1.1.0" - }, - "time": "2022-11-25T07:16:18+00:00" - }, - { - "name": "psalm/plugin-phpunit", - "version": "0.19.0", - "source": { - "type": "git", - "url": "https://github.com/psalm/psalm-plugin-phpunit.git", - "reference": "e344eaaa27871e79c6cb97b9efe52a735f9d1966" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/e344eaaa27871e79c6cb97b9efe52a735f9d1966", - "reference": "e344eaaa27871e79c6cb97b9efe52a735f9d1966", - "shasum": "" - }, - "require": { - "composer/package-versions-deprecated": "^1.10", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "ext-simplexml": "*", - "php": "^7.4 || ^8.0", - "vimeo/psalm": "dev-master || ^5@beta || ^5.0" - }, - "conflict": { - "phpunit/phpunit": "<7.5" - }, - "require-dev": { - "codeception/codeception": "^4.0.3", - "php": "^7.3 || ^8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.3.1", - "weirdan/codeception-psalm-module": "^0.11.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "type": "psalm-plugin", - "extra": { - "psalm": { - "pluginClass": "Psalm\\PhpUnitPlugin\\Plugin" - } - }, - "autoload": { - "psr-4": { - "Psalm\\PhpUnitPlugin\\": "src" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" ], - "authors": [ - { - "name": "Matt Brown", - "email": "github@muglug.com" - } + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" ], - "description": "Psalm plugin for PHPUnit", "support": { - "issues": "https://github.com/psalm/psalm-plugin-phpunit/issues", - "source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.19.0" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2024-03-15T10:43:15+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { "name": "psr/container", @@ -8035,20 +7034,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -8072,7 +7071,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -8084,9 +7083,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -8143,16 +7142,16 @@ }, { "name": "psr/log", - "version": "2.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -8161,7 +7160,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { @@ -8187,36 +7186,39 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:41:46+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "psr/simple-cache", - "version": "2.0.0", + "name": "react/promise-timer", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a" + "url": "https://github.com/reactphp/promise-timer.git", + "reference": "4f70306ed66b8b44768941ca7f142092600fafc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a", - "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a", + "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/4f70306ed66b8b44768941ca7f142092600fafc1", + "reference": "4f70306ed66b8b44768941ca7f142092600fafc1", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7.0 || ^1.2.1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, + "type": "library", "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Psr\\SimpleCache\\": "src/" + "React\\Promise\\Timer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -8225,154 +7227,120 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Common interfaces for simple caching", + "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", + "homepage": "https://github.com/reactphp/promise-timer", "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" + "async", + "event-loop", + "promise", + "reactphp", + "timeout", + "timer" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/2.0.0" - }, - "time": "2021-10-29T13:22:09+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] + "issues": "https://github.com/reactphp/promise-timer/issues", + "source": "https://github.com/reactphp/promise-timer/tree/v1.11.0" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" + "time": "2024-06-04T14:27:45+00:00" }, { - "name": "react/async", - "version": "v4.2.0", + "name": "rector/rector", + "version": "2.3.8", "source": { "type": "git", - "url": "https://github.com/reactphp/async.git", - "reference": "7c3738e837b38c9513af44398b8c1b2b1be1fbbc" + "url": "https://github.com/rectorphp/rector.git", + "reference": "bbd37aedd8df749916cffa2a947cfc4714d1ba2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/async/zipball/7c3738e837b38c9513af44398b8c1b2b1be1fbbc", - "reference": "7c3738e837b38c9513af44398b8c1b2b1be1fbbc", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/bbd37aedd8df749916cffa2a947cfc4714d1ba2c", + "reference": "bbd37aedd8df749916cffa2a947cfc4714d1ba2c", "shasum": "" }, "require": { - "php": ">=8.1", - "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.8 || ^1.2.1" + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.1.38" }, - "require-dev": { - "phpstan/phpstan": "1.10.39", - "phpunit/phpunit": "^9.6" + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" }, + "bin": [ + "bin/rector" + ], "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Async\\": "src/" - } + "autoload": { + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async utilities and fibers for ReactPHP", + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "homepage": "https://getrector.com/", "keywords": [ - "async", - "reactphp" + "automation", + "dev", + "migration", + "refactoring" ], "support": { - "issues": "https://github.com/reactphp/async/issues", - "source": "https://github.com/reactphp/async/tree/v4.2.0" + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/2.3.8" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/tomasvotruba", + "type": "github" } ], - "time": "2023-11-22T16:43:46+00:00" + "time": "2026-02-22T09:45:50+00:00" }, { "name": "revolt/event-loop", - "version": "v1.0.6", + "version": "v1.0.8", "source": { "type": "git", "url": "https://github.com/revoltphp/event-loop.git", - "reference": "25de49af7223ba039f64da4ae9a28ec2d10d0254" + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/25de49af7223ba039f64da4ae9a28ec2d10d0254", - "reference": "25de49af7223ba039f64da4ae9a28ec2d10d0254", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", "shasum": "" }, "require": { @@ -8429,47 +7397,53 @@ ], "support": { "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.6" + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" }, - "time": "2023-11-30T05:34:44+00:00" + "time": "2025-08-27T21:33:23+00:00" }, { "name": "roave/backward-compatibility-check", - "version": "8.6.0", + "version": "8.19.0", "source": { "type": "git", "url": "https://github.com/Roave/BackwardCompatibilityCheck.git", - "reference": "5e533114a996f73a7551846c06c59a80185f4d16" + "reference": "810eb88eeff37ef300653bcfb77ca51a314777a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/BackwardCompatibilityCheck/zipball/5e533114a996f73a7551846c06c59a80185f4d16", - "reference": "5e533114a996f73a7551846c06c59a80185f4d16", + "url": "https://api.github.com/repos/Roave/BackwardCompatibilityCheck/zipball/810eb88eeff37ef300653bcfb77ca51a314777a2", + "reference": "810eb88eeff37ef300653bcfb77ca51a314777a2", "shasum": "" }, "require": { - "azjezz/psl": "^2.3.1", - "composer/composer": "^2.6.4", - "nikic/php-parser": "^4.15.3", - "nikolaposa/version": "^4.1.0", - "ocramius/package-versions": "^2.7.0", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "roave/better-reflection": "^6.5.0", - "symfony/console": "^6.2.3" + "azjezz/psl": "^4.2.1", + "composer/composer": "^2.9.5", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-simplexml": "*", + "nikic/php-parser": "^5.7.0", + "nikolaposa/version": "^4.2.1", + "ocramius/package-versions": "^2.11.0", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "roave/better-reflection": "^6.69.0", + "symfony/console": "^7.4.4" }, "conflict": { + "marc-mabe/php-enum": "<4.7.2", "revolt/event-loop": "<0.2.5", "symfony/process": "<5.3.7" }, "require-dev": { - "doctrine/coding-standard": "^12.0.0", - "php-standard-library/psalm-plugin": "^2.2.1", - "phpunit/phpunit": "^9.5.27", - "psalm/plugin-phpunit": "^0.18.4", - "roave/infection-static-analysis-plugin": "^1.27.0", + "doctrine/coding-standard": "^14.0.0", + "justinrainbow/json-schema": "^6.6.4", + "php-standard-library/psalm-plugin": "^2.3.0", + "phpunit/phpunit": "^12.5.11", + "psalm/plugin-phpunit": "^0.19.5", + "roave/infection-static-analysis-plugin": "^1.43.0", "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.4.0" + "squizlabs/php_codesniffer": "^4.0.1", + "vimeo/psalm": "^6.15.1" }, "bin": [ "bin/roave-backward-compatibility-check" @@ -8497,163 +7471,168 @@ "description": "Tool to compare two revisions of a public API to check for BC breaks", "support": { "issues": "https://github.com/Roave/BackwardCompatibilityCheck/issues", - "source": "https://github.com/Roave/BackwardCompatibilityCheck/tree/8.6.0" + "source": "https://github.com/Roave/BackwardCompatibilityCheck/tree/8.19.0" }, - "time": "2023-12-20T14:01:33+00:00" + "time": "2026-02-13T19:14:25+00:00" }, { - "name": "roave/infection-static-analysis-plugin", - "version": "1.35.0", + "name": "sanmai/di-container", + "version": "0.1.12", "source": { "type": "git", - "url": "https://github.com/Roave/infection-static-analysis-plugin.git", - "reference": "3cb32845c5f758913a4b9eafd91ae18eafc26d82" + "url": "https://github.com/sanmai/di-container.git", + "reference": "8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/infection-static-analysis-plugin/zipball/3cb32845c5f758913a4b9eafd91ae18eafc26d82", - "reference": "3cb32845c5f758913a4b9eafd91ae18eafc26d82", + "url": "https://api.github.com/repos/sanmai/di-container/zipball/8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b", + "reference": "8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b", "shasum": "" }, "require": { - "composer-runtime-api": "^2.2", - "infection/infection": "0.27.10", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "sanmai/later": "^0.1.4", - "vimeo/psalm": "^4.30.0 || ^5.15" + "php": ">=8.2", + "psr/container": "^1.1.2 || ^2.0", + "sanmai/pipeline": "^6.17 || ^7.0" }, "require-dev": { - "doctrine/coding-standard": "^12.0.0", - "phpunit/phpunit": "^10.5.12" + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.31", + "php-coveralls/php-coveralls": "^2.4.1", + "phpbench/phpbench": "^1.4", + "phpstan/extension-installer": "^1.4", + "phpunit/phpunit": "^11.5.25", + "sanmai/phpstan-rules": "^0.3.10" }, - "bin": [ - "bin/roave-infection-static-analysis-plugin" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + }, + "preferred-install": "dist" + }, "autoload": { "psr-4": { - "Roave\\InfectionStaticAnalysis\\": "src/Roave/InfectionStaticAnalysis" + "DIContainer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com", + "homepage": "https://github.com/sanmai" + }, + { + "name": "Maks Rafalko", + "homepage": "https://twitter.com/maks_rafalko" + }, + { + "name": "Théo FIDRY", + "homepage": "https://twitter.com/tfidry" } ], - "description": "Static analysis on top of mutation testing - prevents escaped mutants from being invalid according to static analysis", + "description": "dependency injection container with automatic constructor dependency resolution", + "keywords": [ + "Autowiring", + "constructor di", + "di container", + "psr 11" + ], "support": { - "issues": "https://github.com/Roave/infection-static-analysis-plugin/issues", - "source": "https://github.com/Roave/infection-static-analysis-plugin/tree/1.35.0" + "issues": "https://github.com/sanmai/di-container/issues", + "source": "https://github.com/sanmai/di-container/tree/0.1.12" }, - "time": "2024-03-10T11:55:48+00:00" + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2026-01-27T08:25:46+00:00" }, { - "name": "robmorgan/phinx", - "version": "0.12.13", + "name": "sanmai/duoclock", + "version": "0.1.3", "source": { "type": "git", - "url": "https://github.com/cakephp/phinx.git", - "reference": "6eb0f295e140ed2804d93396755f0ce9ada4ec07" + "url": "https://github.com/sanmai/DuoClock.git", + "reference": "47461e3ff65b7308635047831a55615652e7be1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/phinx/zipball/6eb0f295e140ed2804d93396755f0ce9ada4ec07", - "reference": "6eb0f295e140ed2804d93396755f0ce9ada4ec07", + "url": "https://api.github.com/repos/sanmai/DuoClock/zipball/47461e3ff65b7308635047831a55615652e7be1a", + "reference": "47461e3ff65b7308635047831a55615652e7be1a", "shasum": "" }, "require": { - "cakephp/database": "^4.0", - "php": ">=7.2", - "psr/container": "^1.0 || ^2.0", - "symfony/config": "^3.4|^4.0|^5.0|^6.0", - "symfony/console": "^3.4|^4.0|^5.0|^6.0" + "php": ">=8.2", + "psr/clock": "^1.0" }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^4.0", - "ext-json": "*", - "ext-pdo": "*", - "phpunit/phpunit": "^8.5|^9.3", - "sebastian/comparator": ">=1.2.3", - "symfony/yaml": "^3.4|^4.0|^5.0" + "provide": { + "psr/clock-implementation": "1.0" }, - "suggest": { - "ext-json": "Install if using JSON configuration format", - "ext-pdo": "PDO extension is needed", - "symfony/yaml": "Install if using YAML configuration format" + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.29", + "php-coveralls/php-coveralls": "^2.4.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^11.5.25", + "sanmai/phpstan-rules": "^0.3.1" }, - "bin": [ - "bin/phinx" - ], "type": "library", + "extra": { + "preferred-install": "dist" + }, "autoload": { "psr-4": { - "Phinx\\": "src/Phinx/" + "DuoClock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "Rob Morgan", - "email": "robbym@gmail.com", - "homepage": "https://robmorgan.id.au", - "role": "Lead Developer" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com", - "homepage": "https://shadowhand.me", - "role": "Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Developer" - }, - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/phinx/graphs/contributors", - "role": "Developer" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" } ], - "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.", - "homepage": "https://phinx.org", - "keywords": [ - "database", - "database migrations", - "db", - "migrations", - "phinx" - ], + "description": "PHP time mocking for tests - PSR-20 clock with mockable sleep(), time(), and TimeSpy for PHPUnit testing", "support": { - "issues": "https://github.com/cakephp/phinx/issues", - "source": "https://github.com/cakephp/phinx/tree/0.12.13" + "issues": "https://github.com/sanmai/DuoClock/issues", + "source": "https://github.com/sanmai/DuoClock/tree/0.1.3" }, - "time": "2022-10-03T04:57:40+00:00" + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2025-12-26T06:12:34+00:00" }, { "name": "sanmai/later", - "version": "0.1.4", + "version": "0.1.7", "source": { "type": "git", "url": "https://github.com/sanmai/later.git", - "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60" + "reference": "72a82d783864bca90412d8a26c1878f8981fee97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/later/zipball/e24c4304a4b1349c2a83151a692cec0c10579f60", - "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60", + "url": "https://api.github.com/repos/sanmai/later/zipball/72a82d783864bca90412d8a26c1878f8981fee97", + "reference": "72a82d783864bca90412d8a26c1878f8981fee97", "shasum": "" }, "require": { - "php": ">=7.4" + "php": ">=8.2" }, "require-dev": { "ergebnis/composer-normalize": "^2.8", @@ -8692,7 +7671,7 @@ "description": "Later: deferred wrapper object", "support": { "issues": "https://github.com/sanmai/later/issues", - "source": "https://github.com/sanmai/later/tree/0.1.4" + "source": "https://github.com/sanmai/later/tree/0.1.7" }, "funding": [ { @@ -8700,40 +7679,43 @@ "type": "github" } ], - "time": "2023-10-24T00:25:28+00:00" + "time": "2025-05-11T01:48:00+00:00" }, { "name": "sanmai/pipeline", - "version": "v6.10", + "version": "7.9", "source": { "type": "git", "url": "https://github.com/sanmai/pipeline.git", - "reference": "cbd2ea30ba8bef596b8dad1adb9c92fb2987e430" + "reference": "d7046ecce91ae57fca403be694888371a21250eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/pipeline/zipball/cbd2ea30ba8bef596b8dad1adb9c92fb2987e430", - "reference": "cbd2ea30ba8bef596b8dad1adb9c92fb2987e430", + "url": "https://api.github.com/repos/sanmai/pipeline/zipball/d7046ecce91ae57fca403be694888371a21250eb", + "reference": "d7046ecce91ae57fca403be694888371a21250eb", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": ">=8.2" }, "require-dev": { "ergebnis/composer-normalize": "^2.8", + "esi/phpunit-coverage-check": ">2", "friendsofphp/php-cs-fixer": "^3.17", - "infection/infection": ">=0.10.5", + "infection/infection": ">=0.32.3", "league/pipeline": "^0.3 || ^1.0", - "phan/phan": ">=1.1", "php-coveralls/php-coveralls": "^2.4.1", - "phpstan/phpstan": ">=0.10", - "phpunit/phpunit": ">=9.4", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": ">=9.4 <12", + "sanmai/phpstan-rules": "^0.3.11", + "sanmai/phpunit-double-colon-syntax": "^0.1.1", "vimeo/psalm": ">=2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "v6.x-dev" + "dev-main": "7.x-dev" } }, "autoload": { @@ -8757,7 +7739,7 @@ "description": "General-purpose collections pipeline", "support": { "issues": "https://github.com/sanmai/pipeline/issues", - "source": "https://github.com/sanmai/pipeline/tree/v6.10" + "source": "https://github.com/sanmai/pipeline/tree/7.9" }, "funding": [ { @@ -8765,32 +7747,32 @@ "type": "github" } ], - "time": "2024-03-16T01:33:30+00:00" + "time": "2026-01-16T11:54:05+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.1", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -8814,155 +7796,59 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2023-02-03T06:59:15+00:00" + "time": "2025-09-14T09:36:45+00:00" }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "7.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^12.2" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -9002,41 +7888,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2026-01-24T09:28:48+00:00" }, { "name": "sebastian/complexity", - "version": "3.2.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.2-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9060,7 +7958,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -9068,33 +7966,33 @@ "type": "github" } ], - "time": "2023-12-21T08:37:17+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "5.1.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9127,7 +8025,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -9135,27 +8033,27 @@ "type": "github" } ], - "time": "2024-03-02T07:15:17+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "sebastian/environment", - "version": "6.1.0", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-posix": "*" @@ -9163,7 +8061,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -9191,42 +8089,54 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2024-03-23T08:47:14+00:00" + "time": "2025-08-12T14:11:56+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9269,43 +8179,55 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-03-02T07:17:12+00:00" + "time": "2025-09-24T06:16:11+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.2", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -9331,41 +8253,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-03-02T07:19:19+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { "name": "sebastian/lines-of-code", - "version": "2.0.2", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -9389,7 +8323,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" }, "funding": [ { @@ -9397,34 +8331,34 @@ "type": "github" } ], - "time": "2023-12-21T08:38:20+00:00" + "time": "2025-02-07T04:57:28+00:00" }, { "name": "sebastian/object-enumerator", - "version": "5.0.0", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9446,7 +8380,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -9454,32 +8389,32 @@ "type": "github" } ], - "time": "2023-02-03T07:08:32+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "3.0.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9501,7 +8436,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -9509,32 +8445,32 @@ "type": "github" } ], - "time": "2023-02-03T07:06:18+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "5.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9564,40 +8500,53 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T07:05:40+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "4.0.0", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9620,37 +8569,50 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2023-02-03T07:10:45+00:00" + "time": "2025-08-09T06:57:12+00:00" }, { "name": "sebastian/version", - "version": "4.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9673,7 +8635,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { @@ -9681,27 +8644,27 @@ "type": "github" } ], - "time": "2023-02-07T11:34:05+00:00" + "time": "2025-02-07T05:00:38+00:00" }, { "name": "seld/jsonlint", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259" + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9bb7db07b5d66d90f6ebf542f09fc67d800e5259", - "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.5", + "phpstan/phpstan": "^1.11", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ @@ -9733,7 +8696,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.10.2" + "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" }, "funding": [ { @@ -9745,7 +8708,7 @@ "type": "tidelift" } ], - "time": "2024-02-07T12:57:50+00:00" + "time": "2024-07-11T14:55:45+00:00" }, { "name": "seld/phar-utils", @@ -9856,34 +8819,173 @@ }, "time": "2023-09-03T09:24:00+00:00" }, + { + "name": "shipmonk/dead-code-detector", + "version": "0.14.1", + "source": { + "type": "git", + "url": "https://github.com/shipmonk-rnd/dead-code-detector.git", + "reference": "4fdc912b25b1e169041f534a517126a1090bb2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/shipmonk-rnd/dead-code-detector/zipball/4fdc912b25b1e169041f534a517126a1090bb2f4", + "reference": "4fdc912b25b1e169041f534a517126a1090bb2f4", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.23" + }, + "require-dev": { + "composer-runtime-api": "^2.0", + "composer/semver": "^3.4", + "doctrine/orm": "^2.19 || ^3.0", + "editorconfig-checker/editorconfig-checker": "^10.6.0", + "ergebnis/composer-normalize": "^2.48.1", + "nette/application": "^3.1", + "nette/component-model": "^3.0", + "nette/utils": "^3.0 || ^4.0", + "nikic/php-parser": "^5.4.0", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpstan/phpstan-strict-rules": "^2.0.3", + "phpstan/phpstan-symfony": "^2.0.2", + "phpunit/phpcov": "^8.2", + "phpunit/phpunit": "^9.6.22", + "shipmonk/coding-standard": "^0.2.0", + "shipmonk/composer-dependency-analyser": "^1.8.2", + "shipmonk/coverage-guard": "^1.0.0", + "shipmonk/name-collision-detector": "^2.1.1", + "shipmonk/phpstan-dev": "^0.1.1", + "shipmonk/phpstan-rules": "^4.1.0", + "symfony/contracts": "^2.5 || ^3.0 || ^4.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/doctrine-bridge": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/routing": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "twig/twig": "^3.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "ShipMonk\\PHPStan\\DeadCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Dead code detector to find unused PHP code via PHPStan extension. Can automatically remove dead PHP code. Supports libraries like Symfony, Doctrine, PHPUnit etc. Detects dead cycles. Can detect dead code that is tested.", + "keywords": [ + "PHPStan", + "dead code", + "static analysis", + "unused code" + ], + "support": { + "issues": "https://github.com/shipmonk-rnd/dead-code-detector/issues", + "source": "https://github.com/shipmonk-rnd/dead-code-detector/tree/0.14.1" + }, + "time": "2025-12-18T11:03:53+00:00" + }, + { + "name": "shipmonk/phpstan-rules", + "version": "4.3.6", + "source": { + "type": "git", + "url": "https://github.com/shipmonk-rnd/phpstan-rules.git", + "reference": "7dbbcec7b00b4120ceaa13141be648eab3f8e24e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/shipmonk-rnd/phpstan-rules/zipball/7dbbcec7b00b4120ceaa13141be648eab3f8e24e", + "reference": "7dbbcec7b00b4120ceaa13141be648eab3f8e24e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.32" + }, + "require-dev": { + "editorconfig-checker/editorconfig-checker": "^10.6.0", + "ergebnis/composer-normalize": "^2.45.0", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpstan/phpstan-strict-rules": "^2.0.3", + "phpunit/phpunit": "^9.6.33", + "shipmonk/coding-standard": "^0.2.0", + "shipmonk/composer-dependency-analyser": "^1.8.1", + "shipmonk/coverage-guard": "^1.0.0", + "shipmonk/dead-code-detector": "^0.9.0", + "shipmonk/name-collision-detector": "^2.1.1", + "shipmonk/phpstan-dev": "^0.1.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "ShipMonk\\PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Various extra strict PHPStan rules we found useful in ShipMonk.", + "keywords": [ + "PHPStan", + "static analysis" + ], + "support": { + "issues": "https://github.com/shipmonk-rnd/phpstan-rules/issues", + "source": "https://github.com/shipmonk-rnd/phpstan-rules/tree/4.3.6" + }, + "time": "2026-02-16T11:17:47+00:00" + }, { "name": "slevomat/coding-standard", - "version": "8.15.0", + "version": "8.28.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "7d1d957421618a3803b593ec31ace470177d7817" + "reference": "0cd4b30cc1037eca54091c188d260d570e61770c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/7d1d957421618a3803b593ec31ace470177d7817", - "reference": "7d1d957421618a3803b593ec31ace470177d7817", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/0cd4b30cc1037eca54091c188d260d570e61770c", + "reference": "0cd4b30cc1037eca54091c188d260d570e61770c", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", - "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": "^1.23.1", - "squizlabs/php_codesniffer": "^3.9.0" + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.0", + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^2.3.2", + "squizlabs/php_codesniffer": "^4.0.1" }, "require-dev": { - "phing/phing": "2.17.4", - "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.10.60", - "phpstan/phpstan-deprecation-rules": "1.1.4", - "phpstan/phpstan-phpunit": "1.3.16", - "phpstan/phpstan-strict-rules": "1.5.2", - "phpunit/phpunit": "8.5.21|9.6.8|10.5.11" + "phing/phing": "3.0.1|3.1.2", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/phpstan": "2.1.40", + "phpstan/phpstan-deprecation-rules": "2.0.4", + "phpstan/phpstan-phpunit": "2.0.16", + "phpstan/phpstan-strict-rules": "2.0.10", + "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.50|12.5.14" }, "type": "phpcodesniffer-standard", "extra": { @@ -9900,55 +9002,267 @@ "license": [ "MIT" ], - "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" + ], + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.28.0" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2026-02-23T21:35:24+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0525c73950de35ded110cffafb9892946d7771b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0525c73950de35ded110cffafb9892946d7771b5", + "reference": "0525c73950de35ded110cffafb9892946d7771b5", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-10T16:43:36+00:00" + }, + { + "name": "staabm/phpstan-psr3", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/staabm/phpstan-psr3.git", + "reference": "eb28b6f4cde754a8950547d633fc983cbfc59651" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/phpstan-psr3/zipball/eb28b6f4cde754a8950547d633fc983cbfc59651", + "reference": "eb28b6f4cde754a8950547d633fc983cbfc59651", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "illuminate/log": "^8 || ^9 || ^10 || ^11 || ^12", + "illuminate/support": "^8 || ^9 || ^10 || ^11 || ^12", + "monolog/monolog": "^2 || ^3.9", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.6", + "phpstan/phpstan-strict-rules": "^2.0.4", + "phpunit/phpunit": "^9 || ^10.5.45", + "redaxo/source": "^5", + "symplify/easy-coding-standard": "^12.5.11", + "tomasvotruba/unused-public": "^2.0.1" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "config/extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "staabm\\PHPStanPsr3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "keywords": [ + "PHPStan", + "dev", + "monolog", + "phpstan-extension", + "psr-3", + "psr-log", + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/phpstan-psr3/issues", + "source": "https://github.com/staabm/phpstan-psr3/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2025-04-22T16:20:54+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", "keywords": [ - "dev", - "phpcs" + "static analysis" ], "support": { - "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.15.0" + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" }, "funding": [ { - "url": "https://github.com/kukulich", + "url": "https://github.com/staabm", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", - "type": "tidelift" } ], - "time": "2024-03-09T15:20:58+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "spatie/array-to-xml", - "version": "3.2.3", + "name": "symfony/config", + "version": "v8.0.6", "source": { "type": "git", - "url": "https://github.com/spatie/array-to-xml.git", - "reference": "c95fd4db94ec199f798d4b5b4a81757bd20d88ab" + "url": "https://github.com/symfony/config.git", + "reference": "94ea198de42f93dffa920a098cac3961a82e63b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/c95fd4db94ec199f798d4b5b4a81757bd20d88ab", - "reference": "c95fd4db94ec199f798d4b5b4a81757bd20d88ab", + "url": "https://api.github.com/repos/symfony/config/zipball/94ea198de42f93dffa920a098cac3961a82e63b7", + "reference": "94ea198de42f93dffa920a098cac3961a82e63b7", "shasum": "" }, "require": { - "ext-dom": "*", - "php": "^8.0" + "php": ">=8.4", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/service-contracts": "<2.5" }, "require-dev": { - "mockery/mockery": "^1.2", - "pestphp/pest": "^1.21", - "spatie/pest-plugin-snapshots": "^1.1" + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Spatie\\ArrayToXml\\": "src" - } + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9956,76 +9270,91 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://freek.dev", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Convert an array to xml", - "homepage": "https://github.com/spatie/array-to-xml", - "keywords": [ - "array", - "convert", - "xml" - ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.2.3" + "source": "https://github.com/symfony/config/tree/v8.0.6" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/spatie", + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-02-07T10:39:02+00:00" + "time": "2026-02-25T16:59:43+00:00" }, { - "name": "spatie/phpunit-snapshot-assertions", - "version": "5.1.5", + "name": "symfony/console", + "version": "v7.4.6", "source": { "type": "git", - "url": "https://github.com/spatie/phpunit-snapshot-assertions.git", - "reference": "fe84650c4cfb8f51ecf5146f4089369fafea2c94" + "url": "https://github.com/symfony/console.git", + "reference": "6d643a93b47398599124022eb24d97c153c12f27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/phpunit-snapshot-assertions/zipball/fe84650c4cfb8f51ecf5146f4089369fafea2c94", - "reference": "fe84650c4cfb8f51ecf5146f4089369fafea2c94", + "url": "https://api.github.com/repos/symfony/console/zipball/6d643a93b47398599124022eb24d97c153c12f27", + "reference": "6d643a93b47398599124022eb24d97c153c12f27", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "php": "^8.1", - "phpunit/phpunit": "^10.0|^11.0", - "symfony/property-access": "^5.2|^6.2|^7.0", - "symfony/serializer": "^5.2|^6.2|^7.0", - "symfony/yaml": "^5.2|^6.2|^7.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, - "require-dev": { - "spatie/pixelmatch-php": "dev-main", - "spatie/ray": "^1.37" + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, - "suggest": { - "spatie/pixelmatch-php": "Required to use the image snapshot assertions" + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-v5": "5.0-dev" - } + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, + "type": "library", "autoload": { "psr-4": { - "Spatie\\Snapshots\\": "src" - } + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -10033,152 +9362,156 @@ ], "authors": [ { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Snapshot testing with PHPUnit", - "homepage": "https://github.com/spatie/phpunit-snapshot-assertions", + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", "keywords": [ - "assert", - "phpunit", - "phpunit-snapshot-assertions", - "snapshot", - "spatie", - "testing" + "cli", + "command-line", + "console", + "terminal" ], "support": { - "issues": "https://github.com/spatie/phpunit-snapshot-assertions/issues", - "source": "https://github.com/spatie/phpunit-snapshot-assertions/tree/5.1.5" + "source": "https://github.com/symfony/console/tree/v7.4.6" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", + "url": "https://symfony.com/sponsor", "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-02-20T10:04:25+00:00" + "time": "2026-02-25T17:02:47+00:00" }, { - "name": "squizlabs/php_codesniffer", - "version": "3.9.1", + "name": "symfony/dependency-injection", + "version": "v8.0.6", "source": { "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "267a4405fff1d9c847134db3a3c92f1ab7f77909" + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "edd98864a7b9eaaa10f389bd414e7d9e816bb59d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/267a4405fff1d9c847134db3a3c92f1ab7f77909", - "reference": "267a4405fff1d9c847134db3a3c92f1ab7f77909", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/edd98864a7b9eaaa10f389bd414e7d9e816bb59d", + "reference": "edd98864a7b9eaaa10f389bd414e7d9e816bb59d", "shasum": "" }, "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" + "php": ">=8.4", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.6", + "symfony/var-exporter": "^7.4|^8.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + "symfony/config": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards", - "static analysis" - ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + "source": "https://github.com/symfony/dependency-injection/tree/v8.0.6" }, "funding": [ { - "url": "https://github.com/PHPCSStandards", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://github.com/jrfnl", + "url": "https://github.com/nicolas-grekas", "type": "github" }, { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-03-31T21:03:09+00:00" + "time": "2026-02-25T16:59:43+00:00" }, { - "name": "symfony/config", - "version": "v6.4.6", + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "18ac9da3106222dde9fc9e09ec016e5de9d2658f" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/18ac9da3106222dde9fc9e09ec016e5de9d2658f", - "reference": "18ac9da3106222dde9fc9e09ec016e5de9d2658f", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "php": ">=8.1" }, "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" }, - "exclude-from-classmap": [ - "/Tests/" + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -10187,18 +9520,18 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.6" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -10214,56 +9547,34 @@ "type": "tidelift" } ], - "time": "2024-03-27T19:47:45+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "symfony/console", - "version": "v6.4.6", + "name": "symfony/filesystem", + "version": "v8.0.6", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f" + "url": "https://github.com/symfony/filesystem.git", + "reference": "7bf9162d7a0dff98d079b72948508fa48018a770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a2708a5da5c87d1d0d52937bdeac625df659e11f", - "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7bf9162d7a0dff98d079b72948508fa48018a770", + "reference": "7bf9162d7a0dff98d079b72948508fa48018a770", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" + "php": ">=8.4", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/process": "^7.4|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -10283,16 +9594,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.6" + "source": "https://github.com/symfony/filesystem/tree/v8.0.6" }, "funding": [ { @@ -10303,54 +9608,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-03-29T19:07:53+00:00" + "time": "2026-02-25T16:59:43+00:00" }, { - "name": "symfony/dependency-injection", - "version": "v6.4.6", + "name": "symfony/finder", + "version": "v8.0.6", "source": { "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "31417777509923b22de5c6fb6b3ffcdebde37cb5" + "url": "https://github.com/symfony/finder.git", + "reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/31417777509923b22de5c6fb6b3ffcdebde37cb5", - "reference": "31417777509923b22de5c6fb6b3ffcdebde37cb5", + "url": "https://api.github.com/repos/symfony/finder/zipball/441404f09a54de6d1bd6ad219e088cdf4c91f97c", + "reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.2.10|^7.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", - "symfony/yaml": "<5.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" + "php": ">=8.4" }, "require-dev": { - "symfony/config": "^6.1|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" + "Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -10370,10 +9662,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.6" + "source": "https://github.com/symfony/finder/tree/v8.0.6" }, "funding": [ { @@ -10384,43 +9676,69 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-03-27T22:00:14+00:00" + "time": "2026-01-29T09:41:02+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "name": "symfony/http-client", + "version": "v8.0.6", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "url": "https://github.com/symfony/http-client.git", + "reference": "f425139487f904e198f99e3c416c79ed08cef3c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/http-client/zipball/f425139487f904e198f99e3c416c79ed08cef3c3", + "reference": "f425139487f904e198f99e3c416c79ed08cef3c3", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.4", + "psr/log": "^1|^2|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/service-contracts": "^2.5|^3" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "conflict": { + "amphp/amp": "<3", + "php-http/discovery": "<1.15" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^5.3.2", + "amphp/http-tunnel": "^2.0", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0" }, + "type": "library", "autoload": { - "files": [ - "function.php" + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -10437,10 +9755,13 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A generic function and convention to trigger deprecation notices", + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", + "keywords": [ + "http" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/http-client/tree/v8.0.6" }, "funding": [ { @@ -10451,39 +9772,50 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2026-02-20T07:51:53+00:00" }, { - "name": "symfony/filesystem", - "version": "v7.0.6", + "name": "symfony/http-client-contracts", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "408105dff4c104454100730bdfd1a9cdd993f04d" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/408105dff4c104454100730bdfd1a9cdd993f04d", - "reference": "408105dff4c104454100730bdfd1a9cdd993f04d", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "php": ">=8.1" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Filesystem\\": "" + "Symfony\\Contracts\\HttpClient\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -10492,18 +9824,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides basic utilities for the filesystem", + "description": "Generic abstractions related to HTTP clients", "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.0.6" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { @@ -10519,32 +9859,30 @@ "type": "tidelift" } ], - "time": "2024-03-21T19:37:36+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { - "name": "symfony/finder", - "version": "v7.0.0", + "name": "symfony/options-resolver", + "version": "v8.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", - "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d2b592535ffa6600c265a3893a7f7fd2bad82dd7", + "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "php": ">=8.4", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Component\\OptionsResolver\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -10564,10 +9902,15 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v7.0.0" + "source": "https://github.com/symfony/options-resolver/tree/v8.0.0" }, "funding": [ { @@ -10578,29 +9921,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-10-31T17:59:56+00:00" + "time": "2025-11-12T15:55:31+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -10611,8 +9958,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -10646,7 +9993,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -10657,29 +10004,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -10687,8 +10038,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -10724,7 +10075,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -10735,29 +10086,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -10765,8 +10120,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -10805,7 +10160,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -10816,29 +10171,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -10849,8 +10209,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -10885,7 +10245,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -10896,35 +10256,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -10961,7 +10325,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -10972,35 +10336,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -11041,7 +10409,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -11052,35 +10420,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -11117,7 +10489,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -11128,36 +10500,119 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "name": "symfony/polyfill-php84", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -11165,7 +10620,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Polyfill\\Php85\\": "" }, "classmap": [ "Resources/stubs" @@ -11185,7 +10640,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -11194,7 +10649,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" }, "funding": [ { @@ -11205,29 +10660,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/process", - "version": "v7.0.4", + "version": "v8.0.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9" + "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0e7727191c3b71ebec6d529fa0e50a01ca5679e9", - "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9", + "url": "https://api.github.com/repos/symfony/process/zipball/b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674", + "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -11255,7 +10714,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.0.4" + "source": "https://github.com/symfony/process/tree/v8.0.5" }, "funding": [ { @@ -11266,33 +10725,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-02-22T20:27:20+00:00" + "time": "2026-01-26T15:08:38+00:00" }, { "name": "symfony/property-access", - "version": "v7.0.6", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "1c268ba954ccc5e78cf035b391abb67759e24423" + "reference": "a35a5ec85b605d0d1a9fd802cb44d87682c746fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/1c268ba954ccc5e78cf035b391abb67759e24423", - "reference": "1c268ba954ccc5e78cf035b391abb67759e24423", + "url": "https://api.github.com/repos/symfony/property-access/zipball/a35a5ec85b605d0d1a9fd802cb44d87682c746fd", + "reference": "a35a5ec85b605d0d1a9fd802cb44d87682c746fd", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/property-info": "^6.4|^7.0" + "php": ">=8.4", + "symfony/property-info": "^7.4.4|^8.0.4" }, "require-dev": { - "symfony/cache": "^6.4|^7.0" + "symfony/cache": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -11331,7 +10795,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.0.6" + "source": "https://github.com/symfony/property-access/tree/v8.0.4" }, "funding": [ { @@ -11342,43 +10806,46 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-03-19T11:57:22+00:00" + "time": "2026-01-05T09:27:50+00:00" }, { "name": "symfony/property-info", - "version": "v7.0.6", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "b8844ddce7d53f78b57ec9be59da80fceddf3167" + "reference": "97524d06a66ae87c59bf9f137420e843cbe4bea0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/b8844ddce7d53f78b57ec9be59da80fceddf3167", - "reference": "b8844ddce7d53f78b57ec9be59da80fceddf3167", + "url": "https://api.github.com/repos/symfony/property-info/zipball/97524d06a66ae87c59bf9f137420e843cbe4bea0", + "reference": "97524d06a66ae87c59bf9f137420e843cbe4bea0", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/string": "^6.4|^7.0" + "php": ">=8.4", + "symfony/string": "^7.4|^8.0", + "symfony/type-info": "^7.4.4|^8.0.4" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2", - "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<6.4", - "symfony/serializer": "<6.4" + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", - "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -11414,7 +10881,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.0.6" + "source": "https://github.com/symfony/property-info/tree/v8.0.6" }, "funding": [ { @@ -11425,66 +10892,65 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-03-28T09:20:36+00:00" + "time": "2026-02-13T12:14:15+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.6", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "3697adf91f83516c86b4912c08c28084711ed560" + "reference": "b923bbb92f84213a927db6ad43576366b7b9ec2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/3697adf91f83516c86b4912c08c28084711ed560", - "reference": "3697adf91f83516c86b4912c08c28084711ed560", + "url": "https://api.github.com/repos/symfony/serializer/zipball/b923bbb92f84213a927db6ad43576366b7b9ec2a", + "reference": "b923bbb92f84213a927db6ad43576366b7b9ec2a", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "doctrine/annotations": "<1.12", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<5.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4.24|>=6,<6.2.11", - "symfony/uid": "<5.4", - "symfony/validator": "<6.4", - "symfony/yaml": "<5.4" - }, - "require-dev": { - "doctrine/annotations": "^1.12|^2", - "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/property-info": "<7.4", + "symfony/type-info": "<7.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.26|^6.3|^7.0", - "symfony/property-info": "^5.4.24|^6.2.11|^7.0", + "symfony/cache": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/filesystem": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/type-info": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -11512,7 +10978,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.6" + "source": "https://github.com/symfony/serializer/tree/v8.0.6" }, "funding": [ { @@ -11523,42 +10989,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-03-27T22:00:14+00:00" + "time": "2026-02-25T16:59:43+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.2", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -11588,75 +11059,13 @@ "keywords": [ "abstractions", "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-12-19T21:51:00+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v7.0.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/983900d6fddf2b0cbaacacbbad07610854bd8112", - "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } + "decoupling", + "interfaces", + "interoperability", + "standards" ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.0.3" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -11667,43 +11076,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-23T15:02:46+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/string", - "version": "v7.0.4", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" + "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", - "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", + "url": "https://api.github.com/repos/symfony/string/zipball/6c9e1108041b5dce21a9a4984b531c4923aa9ec4", + "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -11742,7 +11155,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.4" + "source": "https://github.com/symfony/string/tree/v8.0.6" }, "funding": [ { @@ -11753,25 +11166,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-02-01T13:17:36+00:00" + "time": "2026-02-09T10:14:57+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.2", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { @@ -11779,12 +11196,12 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -11820,7 +11237,89 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/type-info", + "version": "v8.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "785992c06d07306f963ded3439036f5da9b292fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/785992c06d07306f963ded3439036f5da9b292fe", + "reference": "785992c06d07306f963ded3439036f5da9b292fe", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v8.0.6" }, "funding": [ { @@ -11831,64 +11330,61 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2026-02-20T07:51:53+00:00" }, { "name": "symfony/validator", - "version": "v6.4.6", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "ca1d78e8677e966e307a63799677b64b194d735d" + "reference": "64bcfc222dd26443c6c68d442a1e65397c440c78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/ca1d78e8677e966e307a63799677b64b194d735d", - "reference": "ca1d78e8677e966e307a63799677b64b194d735d", + "url": "https://api.github.com/repos/symfony/validator/zipball/64bcfc222dd26443c6c68d442a1e65397c440c78", + "reference": "64bcfc222dd26443c6c68d442a1e65397c440c78", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php83": "^1.27", + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.0", "symfony/translation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.13", "doctrine/lexer": "<1.1", - "symfony/dependency-injection": "<5.4", - "symfony/expression-language": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/intl": "<5.4", - "symfony/property-info": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/yaml": "<5.4" + "symfony/doctrine-bridge": "<7.4" }, "require-dev": { - "doctrine/annotations": "^1.13|^2", "egulias/email-validator": "^2.1.10|^3|^4", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/cache": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/string": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/type-info": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -11896,7 +11392,8 @@ "Symfony\\Component\\Validator\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/Resources/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -11916,7 +11413,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.6" + "source": "https://github.com/symfony/validator/tree/v8.0.6" }, "funding": [ { @@ -11927,34 +11424,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-03-27T22:00:14+00:00" + "time": "2026-02-25T16:59:43+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.0.6", + "version": "v8.0.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "c74c568d2a15a1d407cf40d61ea82bc2d521e27b" + "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c74c568d2a15a1d407cf40d61ea82bc2d521e27b", - "reference": "c74c568d2a15a1d407cf40d61ea82bc2d521e27b", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", + "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/property-access": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -11992,7 +11493,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.0.6" + "source": "https://github.com/symfony/var-exporter/tree/v8.0.0" }, "funding": [ { @@ -12003,36 +11504,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-03-20T21:25:22+00:00" + "time": "2025-11-05T18:53:00+00:00" }, { "name": "symfony/yaml", - "version": "v7.0.3", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "2d4fca631c00700597e9442a0b2451ce234513d3" + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/2d4fca631c00700597e9442a0b2451ce234513d3", - "reference": "2d4fca631c00700597e9442a0b2451ce234513d3", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0|^8.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -12063,7 +11569,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.0.3" + "source": "https://github.com/symfony/yaml/tree/v7.4.6" }, "funding": [ { @@ -12074,144 +11580,294 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-23T15:02:46+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { - "name": "thecodingmachine/phpstan-safe-rule", - "version": "v1.2.0", + "name": "symplify/phpstan-extensions", + "version": "12.0.2", "source": { "type": "git", - "url": "https://github.com/thecodingmachine/phpstan-safe-rule.git", - "reference": "8a7b88e0d54f209a488095085f183e9174c40e1e" + "url": "https://github.com/symplify/phpstan-extensions.git", + "reference": "5ce15cb084eb3bc7f92b77020c59ff3d318746d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/8a7b88e0d54f209a488095085f183e9174c40e1e", - "reference": "8a7b88e0d54f209a488095085f183e9174c40e1e", + "url": "https://api.github.com/repos/symplify/phpstan-extensions/zipball/5ce15cb084eb3bc7f92b77020c59ff3d318746d5", + "reference": "5ce15cb084eb3bc7f92b77020c59ff3d318746d5", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "phpstan/phpstan": "^1.0", - "thecodingmachine/safe": "^1.0 || ^2.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^7.5.2 || ^8.0", - "squizlabs/php_codesniffer": "^3.4" + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0" }, "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, "phpstan": { "includes": [ - "phpstan-safe-rule.neon" + "config/config.neon" ] } }, "autoload": { "psr-4": { - "TheCodingMachine\\Safe\\PHPStan\\": "src/" + "Symplify\\PHPStanExtensions\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Pre-escaped error messages in 'symplify' error format, container aware test case and other useful extensions for PHPStan", + "keywords": [ + "phpstan-extension", + "static analysis" + ], + "support": { + "issues": "https://github.com/symplify/phpstan-extensions/issues", + "source": "https://github.com/symplify/phpstan-extensions/tree/12.0.2" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2025-11-12T16:46:04+00:00" + }, + { + "name": "testcontainers/testcontainers", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/testcontainers/testcontainers-php.git", + "reference": "f78f10d283477cf8d3a7ceee34fb4449d1522f0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/testcontainers/testcontainers-php/zipball/f78f10d283477cf8d3a7ceee34fb4449d1522f0e", + "reference": "f78f10d283477cf8d3a7ceee34fb4449d1522f0e", + "shasum": "" + }, + "require": { + "beluga-php/docker-php": "^1.45", + "ext-curl": "*", + "php": ">= 8.1" + }, + "require-dev": { + "brianium/paratest": "^6.11", + "ext-mongodb": "*", + "ext-pdo": "*", + "ext-pdo_mysql": "*", + "ext-pdo_pgsql": "*", + "friendsofphp/php-cs-fixer": "^3.92", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "predis/predis": "^3.0 || ^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Testcontainers\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Soner Sayakci", + "email": "github@shyim.de" } + ], + "description": "Testcontainers implementation in PHP", + "keywords": [ + "docker", + "testcontainers" + ], + "support": { + "issues": "https://github.com/testcontainers/testcontainers-php/issues", + "source": "https://github.com/testcontainers/testcontainers-php/tree/1.0.4" + }, + "time": "2025-12-27T08:07:16+00:00" + }, + { + "name": "thecodingmachine/safe", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10", + "squizlabs/php_codesniffer": "^3.2" + }, + "type": "library", + "autoload": { + "files": [ + "lib/special_cases.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/mysqli.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rnp.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "generated/Exceptions/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "David Négrier", - "email": "d.negrier@thecodingmachine.com" - } - ], - "description": "A PHPStan rule to detect safety issues. Must be used in conjunction with thecodingmachine/safe", + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { - "issues": "https://github.com/thecodingmachine/phpstan-safe-rule/issues", - "source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.2.0" - }, - "time": "2022-01-17T10:12:29+00:00" - }, - { - "name": "thecodingmachine/phpstan-strict-rules", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/phpstan-strict-rules.git", - "reference": "2ba8fa8b328c45f3b149c05def5bf96793c594b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/phpstan-strict-rules/zipball/2ba8fa8b328c45f3b149c05def5bf96793c594b6", - "reference": "2ba8fa8b328c45f3b149c05def5bf96793c594b6", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0", - "phpstan/phpstan": "^1.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^7.1" + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0" }, - "type": "phpstan-extension", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" + "funding": [ + { + "url": "https://github.com/OskarStark", + "type": "github" + }, + { + "url": "https://github.com/shish", + "type": "github" + }, + { + "url": "https://github.com/silasjoisten", + "type": "github" }, - "phpstan": { - "includes": [ - "phpstan-strict-rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "TheCodingMachine\\PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "David Négrier", - "email": "d.negrier@thecodingmachine.com" + "url": "https://github.com/staabm", + "type": "github" } ], - "description": "A set of additional rules for PHPStan based on best practices followed at TheCodingMachine", - "support": { - "issues": "https://github.com/thecodingmachine/phpstan-strict-rules/issues", - "source": "https://github.com/thecodingmachine/phpstan-strict-rules/tree/v1.0.0" - }, - "time": "2021-11-08T09:10:49+00:00" + "time": "2026-02-04T18:08:13+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -12233,7 +11889,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { @@ -12241,140 +11897,87 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-12-08T11:19:18+00:00" }, { - "name": "vimeo/psalm", - "version": "5.23.1", + "name": "tomasvotruba/type-coverage", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "8471a896ccea3526b26d082f4461eeea467f10a4" + "url": "https://github.com/TomasVotruba/type-coverage.git", + "reference": "468354b3964120806a69890cbeb3fcf005876391" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/8471a896ccea3526b26d082f4461eeea467f10a4", - "reference": "8471a896ccea3526b26d082f4461eeea467f10a4", + "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/468354b3964120806a69890cbeb3fcf005876391", + "reference": "468354b3964120806a69890cbeb3fcf005876391", "shasum": "" }, "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer-runtime-api": "^2", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^2.0 || ^3.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-ctype": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.1", - "felixfbecker/language-server-protocol": "^1.5.2", - "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.16", - "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0", - "spatie/array-to-xml": "^2.17.0 || ^3.0", - "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" - }, - "conflict": { - "nikic/php-parser": "4.17.0" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "amphp/phpunit-util": "^2.0", - "bamarni/composer-bin-plugin": "^1.4", - "brianium/paratest": "^6.9", - "ext-curl": "*", - "mockery/mockery": "^1.5", - "nunomaduro/mock-final-classes": "^1.1", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpdoc-parser": "^1.6", - "phpunit/phpunit": "^9.6", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.6", - "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + "nette/utils": "^3.2 || ^4.0", + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0" }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "project", + "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-master": "5.x-dev", - "dev-4.x": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" + "phpstan": { + "includes": [ + "config/extension.neon" + ] } }, "autoload": { "psr-4": { - "Psalm\\": "src/Psalm/" + "TomasVotruba\\TypeCoverage\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", + "description": "Measure type coverage of your project", "keywords": [ - "code", - "inspection", - "php", + "phpstan-extension", "static analysis" ], "support": { - "docs": "https://psalm.dev/docs", - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm" + "issues": "https://github.com/TomasVotruba/type-coverage/issues", + "source": "https://github.com/TomasVotruba/type-coverage/tree/2.1.0" }, - "time": "2024-03-11T20:33:46+00:00" + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2025-12-05T16:38:02+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.6.0", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + "reference": "955e7815d677a3eaa7075231212f2110983adecc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", + "reference": "955e7815d677a3eaa7075231212f2110983adecc", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.2", + "graham-campbell/result-type": "^1.1.4", "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2", - "symfony/polyfill-ctype": "^1.24", - "symfony/polyfill-mbstring": "^1.24", - "symfony/polyfill-php80": "^1.24" + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", @@ -12388,7 +11991,7 @@ "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { "dev-master": "5.6-dev" @@ -12423,7 +12026,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" }, "funding": [ { @@ -12435,37 +12038,37 @@ "type": "tidelift" } ], - "time": "2023-11-12T22:43:29+00:00" + "time": "2025-12-27T19:49:13+00:00" }, { "name": "webmozart/assert", - "version": "1.11.0", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8", + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8", "shasum": "" }, "require": { "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" + "ext-date": "*", + "ext-filter": "*", + "php": "^8.2" }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -12481,6 +12084,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -12491,9 +12098,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/webmozarts/assert/tree/2.1.6" }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2026-02-27T10:28:38+00:00" }, { "name": "webmozart/glob", @@ -12546,35 +12153,43 @@ }, { "name": "wyrihaximus/async-test-utilities", - "version": "8.0.1", + "version": "12.0.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-async-test-utilities.git", - "reference": "4b7171adc07d60fa3b35a479e5c1ed4929c4f884" + "reference": "e454d9d5133046f65843884895ae8bde126974e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/4b7171adc07d60fa3b35a479e5c1ed4929c4f884", - "reference": "4b7171adc07d60fa3b35a479e5c1ed4929c4f884", + "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/e454d9d5133046f65843884895ae8bde126974e6", + "reference": "e454d9d5133046f65843884895ae8bde126974e6", "shasum": "" }, "require": { - "php": "^8.2", - "phpunit/phpunit": "^10.5.17", - "react/async": "^4.2.0", - "react/event-loop": "^1.5.0", - "react/promise": "^3.1", - "wyrihaximus/phpstan-react": "^1", - "wyrihaximus/react-phpunit-run-tests-in-fiber": "^2.0.0", - "wyrihaximus/test-utilities": "^6.0.3" + "php": "^8.4", + "phpunit/phpunit": "^12.5.8", + "react/async": "^4.3.0", + "react/event-loop": "^1.6.0", + "react/promise": "^3.3.0", + "wyrihaximus/phpstan-react": "^2.0.0", + "wyrihaximus/react-phpunit-run-tests-in-fiber": "^3.0.0", + "wyrihaximus/test-utilities": "^12.0.0" }, "conflict": { "composer/compoer": "<2.6.0" }, "require-dev": { - "react/promise-timer": "^1.10.0" + "react/promise-timer": "^1.11.0", + "wyrihaximus/makefiles": "^0.8.1" }, "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, "autoload": { "psr-4": { "WyriHaximus\\AsyncTestUtilities\\": "src/" @@ -12593,7 +12208,7 @@ "description": "Test utilities for api-clients packages", "support": { "issues": "https://github.com/WyriHaximus/php-async-test-utilities/issues", - "source": "https://github.com/WyriHaximus/php-async-test-utilities/tree/8.0.1" + "source": "https://github.com/WyriHaximus/php-async-test-utilities/tree/12.0.0" }, "funding": [ { @@ -12601,28 +12216,28 @@ "type": "github" } ], - "time": "2024-04-08T20:51:22+00:00" + "time": "2026-01-29T21:03:55+00:00" }, { "name": "wyrihaximus/coding-standard", - "version": "2.14.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-coding-standard.git", - "reference": "7530678d70ced4d41540df0e60e8811d14813058" + "reference": "29855675f089665ad4923afb61305cbf42589255" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-coding-standard/zipball/7530678d70ced4d41540df0e60e8811d14813058", - "reference": "7530678d70ced4d41540df0e60e8811d14813058", + "url": "https://api.github.com/repos/WyriHaximus/php-coding-standard/zipball/29855675f089665ad4923afb61305cbf42589255", + "reference": "29855675f089665ad4923afb61305cbf42589255", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0.0", - "doctrine/coding-standard": "^12.0.0", - "php": "^8.1", - "slevomat/coding-standard": "^8.11.1", - "squizlabs/php_codesniffer": "^3.7.2" + "dealerdirect/phpcodesniffer-composer-installer": "^1.2.0", + "doctrine/coding-standard": "^14.0.0", + "php": "^8.4", + "slevomat/coding-standard": "^8.26.0", + "squizlabs/php_codesniffer": "^4.0.1" }, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", @@ -12632,7 +12247,64 @@ "description": "WyriHaximus Coding Standard", "support": { "issues": "https://github.com/WyriHaximus/php-coding-standard/issues", - "source": "https://github.com/WyriHaximus/php-coding-standard/tree/2.14.0" + "source": "https://github.com/WyriHaximus/php-coding-standard/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + } + ], + "time": "2026-01-14T17:34:23+00:00" + }, + { + "name": "wyrihaximus/makefiles", + "version": "0.10.2", + "source": { + "type": "git", + "url": "https://github.com/WyriHaximus/Makefiles.git", + "reference": "ff6cd1cc874900d2aa543b4a773bcd108f9e3eeb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/ff6cd1cc874900d2aa543b4a773bcd108f9e3eeb", + "reference": "ff6cd1cc874900d2aa543b4a773bcd108f9e3eeb", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2", + "ext-json": "^8.4", + "php": "^8.4" + }, + "conflict": { + "infection/infection": "<0.32.0" + }, + "require-dev": { + "wyrihaximus/test-utilities": "^12.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "WyriHaximus\\Makefiles\\Composer\\Installer" + }, + "autoload": { + "psr-4": { + "WyriHaximus\\Makefiles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + } + ], + "description": "🧱 Makefile building blocks", + "support": { + "issues": "https://github.com/WyriHaximus/Makefiles/issues", + "source": "https://github.com/WyriHaximus/Makefiles/tree/0.10.2" }, "funding": [ { @@ -12640,31 +12312,40 @@ "type": "github" } ], - "time": "2023-05-06T11:54:10+00:00" + "time": "2026-02-26T19:01:56+00:00" }, { "name": "wyrihaximus/phpstan-react", - "version": "1.0.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/phpstan-reactphp.git", - "reference": "da07f594ea52390771aefbd3c5d850219aa75e64" + "reference": "1b7464948b62b569e049d576da967bd980d7d2a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/phpstan-reactphp/zipball/da07f594ea52390771aefbd3c5d850219aa75e64", - "reference": "da07f594ea52390771aefbd3c5d850219aa75e64", + "url": "https://api.github.com/repos/WyriHaximus/phpstan-reactphp/zipball/1b7464948b62b569e049d576da967bd980d7d2a9", + "reference": "1b7464948b62b569e049d576da967bd980d7d2a9", "shasum": "" }, "require": { - "php": "^8.2" + "php": "^8.3" }, "require-dev": { - "nikic/php-parser": "^4.18", - "phpstan/phpdoc-parser": "^1.24", - "wyrihaximus/test-utilities": "^5.6" + "jawira/case-converter": "^3.5", + "nikic/php-parser": "^5.4.0", + "phpstan/phpdoc-parser": "^2.1.0", + "wyrihaximus/makefiles": "^0.3.0", + "wyrihaximus/test-utilities": "^7.0.0" }, "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, "autoload": { "psr-4": { "WyriHaximus\\React\\PHPStan\\": "src/" @@ -12677,7 +12358,7 @@ "description": "👎 ReactPHP extension for PHPStan", "support": { "issues": "https://github.com/WyriHaximus/phpstan-reactphp/issues", - "source": "https://github.com/WyriHaximus/phpstan-reactphp/tree/1.0.0" + "source": "https://github.com/WyriHaximus/phpstan-reactphp/tree/2.0.0" }, "funding": [ { @@ -12685,33 +12366,46 @@ "type": "github" } ], - "time": "2024-02-29T20:19:44+00:00" + "time": "2025-04-26T22:37:11+00:00" }, { "name": "wyrihaximus/phpstan-rules-wrapper", - "version": "6.0.0", + "version": "12.2.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper.git", - "reference": "e4b43719286e4f5ecd83771293a1a41ffcdeb111" + "reference": "a3d005d1fc7861d282c4b8fd060fb13e79043a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/e4b43719286e4f5ecd83771293a1a41ffcdeb111", - "reference": "e4b43719286e4f5ecd83771293a1a41ffcdeb111", + "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/a3d005d1fc7861d282c4b8fd060fb13e79043a19", + "reference": "a3d005d1fc7861d282c4b8fd060fb13e79043a19", "shasum": "" }, "require": { - "ergebnis/phpstan-rules": "^2.2.0", - "php": "^8.2", - "phpstan/phpstan-deprecation-rules": "^1.1.4", - "phpstan/phpstan-mockery": "^1.1.2", - "phpstan/phpstan-phpunit": "^1.3.16", - "phpstan/phpstan-strict-rules": "^1.5.3", - "thecodingmachine/phpstan-safe-rule": "^1.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" + "ergebnis/phpstan-rules": "^2.13.1", + "php": "^8.4", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.40", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-mockery": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "shipmonk/dead-code-detector": "^0.14.1", + "shipmonk/phpstan-rules": "^4.3.6", + "staabm/phpstan-psr3": "^1.0.3", + "symplify/phpstan-extensions": "^12.0.2", + "tomasvotruba/type-coverage": "^2.1.0", + "yamadashy/phpstan-friendly-formatter": "^1.4.0" }, "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -12725,7 +12419,7 @@ "description": "🌯 PHPStan rules wrapper", "support": { "issues": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/issues", - "source": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/tree/6.0.0" + "source": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/tree/12.2.0" }, "funding": [ { @@ -12733,25 +12427,25 @@ "type": "github" } ], - "time": "2024-04-08T19:27:48+00:00" + "time": "2026-02-26T23:44:30+00:00" }, { "name": "wyrihaximus/react-phpunit-run-tests-in-fiber", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/reactphp-phpunit-run-tests-in-fiber.git", - "reference": "38db5c326d191f5791ec2920beb5401a7d7259c7" + "reference": "08f1e06b9616b493df11a232c01e932787eb3a93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/reactphp-phpunit-run-tests-in-fiber/zipball/38db5c326d191f5791ec2920beb5401a7d7259c7", - "reference": "38db5c326d191f5791ec2920beb5401a7d7259c7", + "url": "https://api.github.com/repos/WyriHaximus/reactphp-phpunit-run-tests-in-fiber/zipball/08f1e06b9616b493df11a232c01e932787eb3a93", + "reference": "08f1e06b9616b493df11a232c01e932787eb3a93", "shasum": "" }, "require": { - "php": "^8.2", - "phpunit/phpunit": "^10.5", + "php": "^8.3", + "phpunit/phpunit": "^12.1.0", "react/async": "^4.2.0", "react/event-loop": "^1.5.0", "react/promise": "^3.1" @@ -12761,7 +12455,8 @@ }, "require-dev": { "react/promise-timer": "^1.10.0", - "wyrihaximus/test-utilities": "^6.0" + "wyrihaximus/makefiles": "^0.3.0", + "wyrihaximus/test-utilities": "^7.0.0" }, "type": "library", "autoload": { @@ -12782,7 +12477,7 @@ "description": "Trait to run all tests in a fiber", "support": { "issues": "https://github.com/WyriHaximus/reactphp-phpunit-run-tests-in-fiber/issues", - "source": "https://github.com/WyriHaximus/reactphp-phpunit-run-tests-in-fiber/tree/2.0.0" + "source": "https://github.com/WyriHaximus/reactphp-phpunit-run-tests-in-fiber/tree/3.0.0" }, "funding": [ { @@ -12790,54 +12485,64 @@ "type": "github" } ], - "time": "2024-04-01T13:35:24+00:00" + "time": "2025-04-26T22:45:27+00:00" }, { "name": "wyrihaximus/test-utilities", - "version": "6.0.3", + "version": "12.0.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-test-utilities.git", - "reference": "012eebc008cfcf1b697ac06529c1ad47181070ba" + "reference": "19f873e7d49179ff4e6a7630e8bd23d29add8356" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/012eebc008cfcf1b697ac06529c1ad47181070ba", - "reference": "012eebc008cfcf1b697ac06529c1ad47181070ba", + "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/19f873e7d49179ff4e6a7630e8bd23d29add8356", + "reference": "19f873e7d49179ff4e6a7630e8bd23d29add8356", "shasum": "" }, "require": { - "brandembassy/mockery-tools": "^4.1.3", - "ergebnis/composer-normalize": "^2.42.0", - "ergebnis/phpunit-slow-test-detector": "^2.14.0", - "icanhazstring/composer-unused": "^0.8.11", - "infection/infection": "^0.27.0", - "maglnet/composer-require-checker": "^4.11.0", - "mockery/mockery": "^1.6.11", - "nunomaduro/collision": "^7.10.0", - "orklah/psalm-insane-comparison": "^2.3.0", - "php": "^8.2", - "php-coveralls/php-coveralls": "^2.7.0", - "php-parallel-lint/php-console-highlighter": "^1.0", + "composer-plugin-api": "^2", + "ergebnis/composer-normalize": "^2.49.0", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", + "ext-hash": "^8.4", + "ext-json": "^8.4", + "icanhazstring/composer-unused": "^0.9.5", + "infection/infection": "^0.32.3", + "maglnet/composer-require-checker": "^4.20.0", + "mockery/mockery": "^1.6.12", + "php": "^8.4", + "php-parallel-lint/php-console-highlighter": "^1.0.0", "php-parallel-lint/php-parallel-lint": "^1.4.0", - "php-standard-library/psalm-plugin": "^1.1.5 || ^2.2.1", - "phpstan/phpstan": "^1.10.66", - "phpunit/phpunit": "^10.5.17", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.19.0", - "roave/backward-compatibility-check": "^8.6.0", - "roave/infection-static-analysis-plugin": "^1.33.0", - "squizlabs/php_codesniffer": "^3.9.1", - "thecodingmachine/safe": "^2.5.0", - "vimeo/psalm": "^5.23.1", - "wyrihaximus/coding-standard": "^2.14.0", - "wyrihaximus/phpstan-rules-wrapper": "^6.0.0" + "phpstan/phpstan": "^2.1.37", + "phpunit/phpunit": "^12.5.8", + "rector/rector": "^2.3.5", + "roave/backward-compatibility-check": "^8.17.0", + "squizlabs/php_codesniffer": "^4.0.1", + "wyrihaximus/coding-standard": "^4.0.0", + "wyrihaximus/phpstan-rules-wrapper": "^12.1.0" }, "conflict": { - "composer/compoer": "<2.6.0", - "symfony/dependency-injection": "<5.0.0" + "composer-unused/symbol-parser": "<0.3.3", + "composer/pcre": "<3.3.2", + "wyrihaximus/makefiles": "<0.5.0" + }, + "require-dev": { + "wyrihaximus/makefiles": "^0.8.1" + }, + "suggest": { + "wyrihaximus/async-test-utilities": "The recommended addition to this package when building ReactPHP packages and projects.", + "wyrihaximus/makefiles": "Provides autogenerated Makefile utilizing all utilities provided through this package." + }, + "type": "composer-plugin", + "extra": { + "class": "WyriHaximus\\TestUtilities\\Composer\\Installer", + "phpstan": { + "includes": [ + "extension.neon" + ] + } }, - "type": "library", "autoload": { "psr-4": { "WyriHaximus\\TestUtilities\\": "src/" @@ -12856,7 +12561,7 @@ "description": "🛠️ Test utilities for api-clients packages", "support": { "issues": "https://github.com/WyriHaximus/php-test-utilities/issues", - "source": "https://github.com/WyriHaximus/php-test-utilities/tree/6.0.3" + "source": "https://github.com/WyriHaximus/php-test-utilities/tree/12.0.0" }, "funding": [ { @@ -12864,20 +12569,80 @@ "type": "github" } ], - "time": "2024-04-08T20:16:04+00:00" + "time": "2026-01-29T19:31:15+00:00" + }, + { + "name": "yamadashy/phpstan-friendly-formatter", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/yamadashy/phpstan-friendly-formatter.git", + "reference": "cd4882c7293591c13230b5be35e742b33d2ab2ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yamadashy/phpstan-friendly-formatter/zipball/cd4882c7293591c13230b5be35e742b33d2ab2ff", + "reference": "cd4882c7293591c13230b5be35e742b33d2ab2ff", + "shasum": "" + }, + "require": { + "php": "^8.1", + "php-parallel-lint/php-console-highlighter": "^0.3 || ^0.4 || ^0.5 || ^1.0", + "phpstan/phpstan": "^1.0 || ^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.93.0", + "phpstan/phpstan-phpunit": "^2.0.12", + "phpunit/phpunit": "^10.0 || ^11.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Yamadashy\\PhpStanFriendlyFormatter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kazuki Yamada", + "email": "koukun0120@gmail.com" + } + ], + "description": "Simple error formatter for PHPStan that display code frame", + "keywords": [ + "PHPStan", + "package", + "php", + "static analysis" + ], + "support": { + "issues": "https://github.com/yamadashy/phpstan-friendly-formatter/issues", + "source": "https://github.com/yamadashy/phpstan-friendly-formatter/tree/v1.4.0" + }, + "time": "2026-01-26T15:12:47+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.2" + "php": "^8.5" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { - "php": "8.2.13" + "php": "8.5.13" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/etc/Makefile b/etc/Makefile new file mode 100644 index 0000000..1eaa1e4 --- /dev/null +++ b/etc/Makefile @@ -0,0 +1,7 @@ +install_db: migrations seeds + +migrations: + php ./vendor/bin/phinx migrate + +seeds: + php ./vendor/bin/phinx seed:run -v diff --git a/etc/ci/markdown-link-checker.json b/etc/ci/markdown-link-checker.json new file mode 100644 index 0000000..9269e03 --- /dev/null +++ b/etc/ci/markdown-link-checker.json @@ -0,0 +1,12 @@ +{ + "httpHeaders": [ + { + "urls": [ + "https://docs.github.com/" + ], + "headers": { + "Accept-Encoding": "zstd, br, gzip, deflate" + } + } + ] +} diff --git a/etc/db/.gitignore b/etc/db/.gitignore new file mode 100644 index 0000000..8755e7a --- /dev/null +++ b/etc/db/.gitignore @@ -0,0 +1,6 @@ + +# Flyway ignores +*.user.toml +*.artifact +report.html +report.json \ No newline at end of file diff --git a/etc/db/flyway.toml b/etc/db/flyway.toml new file mode 100644 index 0000000..ee0a595 --- /dev/null +++ b/etc/db/flyway.toml @@ -0,0 +1,27 @@ +databaseType = "PostgreSql" +id = "de27e3a1-52d2-44dc-8e7f-4833a37bef72" +name = "ReactPHP Simple ORM" + +[flyway] +callbackLocations = [ "filesystem:callbacks" ] +locations = [ "filesystem:migrations" ] +mixed = true +outOfOrder = true +schemaModelLocation = "schema-model" +validateMigrationNaming = true + + [flyway.check] + majorTolerance = 0 + +[flywayDesktop] +developmentEnvironment = "development" +shadowEnvironment = "shadow" + +[redgateCompare] +filterFile = "filter.rgf" + +[redgateCompare.postgresql.options.behavior] +detectRenames = "identical-only" + +[redgateCompare.postgresql.options.ignores] +ignoreNewlinesInTextObjects = "off" diff --git a/etc/db/migrations/20190327192030_InitialMigration.php b/etc/db/migrations/20190327192030_InitialMigration.php deleted file mode 100644 index 9d6b1dc..0000000 --- a/etc/db/migrations/20190327192030_InitialMigration.php +++ /dev/null @@ -1,38 +0,0 @@ -table('users', ['id' => false, 'primary_key' => ['id']]) - ->addColumn('id', 'uuid') - ->addColumn('name', 'string') - ->addColumn('created', 'datetime', ['timezone' => true]) - ->addColumn('modified', 'datetime', ['timezone' => true]) - ->create(); - - $this->table('blog_posts', ['id' => false, 'primary_key' => ['id']]) - ->addColumn('id', 'uuid') - ->addColumn('previous_blog_post_id', 'uuid', ['null' => true]) - ->addColumn('next_blog_post_id', 'uuid', ['null' => true]) - ->addColumn('author_id', 'uuid') - ->addColumn('publisher_id', 'uuid') - ->addColumn('title', 'string') - ->addColumn('contents', 'string') - ->addColumn('views', 'integer') - ->addColumn('created', 'datetime', ['timezone' => true]) - ->addColumn('modified', 'datetime', ['timezone' => true]) - ->create(); - - $this->table('comments', ['id' => false, 'primary_key' => ['id']]) - ->addColumn('id', 'uuid') - ->addColumn('author_id', 'uuid') - ->addColumn('blog_post_id', 'uuid') - ->addColumn('contents', 'string') - ->addColumn('created', 'datetime', ['timezone' => true]) - ->addColumn('modified', 'datetime', ['timezone' => true]) - ->create(); - } -} diff --git a/etc/db/migrations/20220630085713_AddLogsTable.php b/etc/db/migrations/20220630085713_AddLogsTable.php deleted file mode 100644 index 87707be..0000000 --- a/etc/db/migrations/20220630085713_AddLogsTable.php +++ /dev/null @@ -1,16 +0,0 @@ -table('logs', ['id' => false, 'primary_key' => ['id']]) - ->addColumn('id', 'uuid') - ->addColumn('message', 'string') - ->addColumn('created', 'datetime', ['timezone' => true]) - ->addColumn('modified', 'datetime', ['timezone' => true]) - ->create(); - } -} diff --git a/etc/db/migrations/V1__create_table_users.sql b/etc/db/migrations/V1__create_table_users.sql new file mode 100644 index 0000000..057cbef --- /dev/null +++ b/etc/db/migrations/V1__create_table_users.sql @@ -0,0 +1,6 @@ +CREATE TABLE users ( + id uuid PRIMARY KEY, + name varchar(255), + created timestamptz(6) NOT NULL, + modified timestamptz(6) NOT NULL +); diff --git a/etc/db/migrations/V2__seed_users.sql b/etc/db/migrations/V2__seed_users.sql new file mode 100644 index 0000000..5545157 --- /dev/null +++ b/etc/db/migrations/V2__seed_users.sql @@ -0,0 +1,3 @@ +INSERT INTO users VALUES ('fb175cbc-04cc-41c7-8e35-6b817ac016ca', 'Deathwing', '2026-02-03 19:27:32+00', '2026-02-03 19:27:32+00'); +INSERT INTO users VALUES ('15f25357-4b3d-4d4d-b6a5-2ceb93864b77', 'Gandalf', '2026-02-03 19:27:32+00', '2026-02-03 19:27:32+00'); +INSERT INTO users VALUES ('2fa0d077-d374-4409-b1ef-9687c6729158', 'Floki', '2026-02-03 19:27:32+00', '2026-02-03 19:27:32+00'); diff --git a/etc/db/migrations/V3__create_table_blog_posts.sql b/etc/db/migrations/V3__create_table_blog_posts.sql new file mode 100644 index 0000000..b38fe94 --- /dev/null +++ b/etc/db/migrations/V3__create_table_blog_posts.sql @@ -0,0 +1,12 @@ +CREATE TABLE blog_posts ( + id uuid PRIMARY KEY, + previous_blog_post_id uuid, + next_blog_post_id uuid, + author_id uuid NOT NULL, + publisher_id uuid NOT NULL, + title varchar(255), + contents varchar(255), + views int4 NOT NULL, + created timestamptz(6) NOT NULL, + modified timestamptz(6) NOT NULL +); diff --git a/etc/db/migrations/V4__seed_blog_posts.sql b/etc/db/migrations/V4__seed_blog_posts.sql new file mode 100644 index 0000000..b8b6285 --- /dev/null +++ b/etc/db/migrations/V4__seed_blog_posts.sql @@ -0,0 +1,2 @@ +INSERT INTO blog_posts VALUES ('53ab5832-9a90-4e6e-988b-06b8b5fed763', NULL, '090fa83b-5c5a-4042-9f05-58d9ab649a1a', 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', 'Cats!', 'qliwuhe uofq2hep fuoq2pho fp2uhu pu2p 2qpoh weh uwqhfu wqif', 133, '2026-02-03 19:27:30+00', '2026-02-03 19:27:30+00'); +INSERT INTO blog_posts VALUES ('090fa83b-5c5a-4042-9f05-58d9ab649a1a', '53ab5832-9a90-4e6e-988b-06b8b5fed763', NULL, '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', 'Moar Cats!', 'qlqweofu b02qw yu9 dqiwuhe uofq2hep fuoq2pho fp2uhu pu2p 2qpoh weh uwqhfu wqif', 166, '2026-02-03 19:27:30+00', '2026-02-03 19:27:30+00'); diff --git a/etc/db/migrations/V5__create_table_comments.sql b/etc/db/migrations/V5__create_table_comments.sql new file mode 100644 index 0000000..c3382c6 --- /dev/null +++ b/etc/db/migrations/V5__create_table_comments.sql @@ -0,0 +1,8 @@ +CREATE TABLE comments ( + id uuid PRIMARY KEY, + author_id uuid NOT NULL, + blog_post_id uuid NOT NULL, + contents varchar(255), + created timestamptz(6) NOT NULL, + modified timestamptz(6) NOT NULL +); diff --git a/etc/db/migrations/V6__seed_comments.sql b/etc/db/migrations/V6__seed_comments.sql new file mode 100644 index 0000000..939f3d4 --- /dev/null +++ b/etc/db/migrations/V6__seed_comments.sql @@ -0,0 +1,3 @@ +INSERT INTO comments VALUES ('326b9f10-10d9-46a9-8487-c34e189abdf1', 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', '090fa83b-5c5a-4042-9f05-58d9ab649a1a', 'abc', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO comments VALUES ('82aafe95-d37e-4525-90f0-08a9fe674591', '2fa0d077-d374-4409-b1ef-9687c6729158', '53ab5832-9a90-4e6e-988b-06b8b5fed763', 'def', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO comments VALUES ('2443dfa0-b964-4a2a-9d4f-7e3c8aac23a3', '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', '53ab5832-9a90-4e6e-988b-06b8b5fed763', 'ghi', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); diff --git a/etc/db/migrations/V7__create_table_logs.sql b/etc/db/migrations/V7__create_table_logs.sql new file mode 100644 index 0000000..826926f --- /dev/null +++ b/etc/db/migrations/V7__create_table_logs.sql @@ -0,0 +1,6 @@ +CREATE TABLE logs ( + id uuid PRIMARY KEY, + message varchar(255), + created timestamptz(6) NOT NULL, + modified timestamptz(6) NOT NULL +); diff --git a/etc/db/migrations/V8__seed_logs.sql b/etc/db/migrations/V8__seed_logs.sql new file mode 100644 index 0000000..2c63f81 --- /dev/null +++ b/etc/db/migrations/V8__seed_logs.sql @@ -0,0 +1,256 @@ +INSERT INTO logs VALUES ('a28c3bc3-57f7-4a04-8549-cc6b27772497', 'Message #0', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('28041273-d386-4ced-8107-797eb8c834b8', 'Message #1', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ca186e62-79b7-4893-93cb-2d588ed87cee', 'Message #2', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('f530f809-6f06-42aa-8df3-b094616dd736', 'Message #3', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('463367c8-d375-41d7-82d0-041aaef47acc', 'Message #4', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d6fb25e9-0f64-4224-bbce-40f6b2aebcbd', 'Message #5', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('cc2fa3e3-4cae-4f02-9b0c-bdbd59c5e9fe', 'Message #6', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('00bf4c68-39ae-488e-9bb1-ea4a2ebf6391', 'Message #7', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('adea06a9-5997-4db1-88a1-8eadb40d92f3', 'Message #8', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('586635e4-4ca5-426c-bfd4-a6339efcd221', 'Message #9', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1d38a84a-1c0b-4155-9a48-e981e33e1113', 'Message #10', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d14ac604-dae6-4510-9e4c-c4ae16796a7f', 'Message #11', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('50438ab7-e532-4d90-94c1-61726bfa5086', 'Message #12', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7db6fecf-ae00-44cd-b10d-f099e6e72cac', 'Message #13', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e1fb6d5c-7ab2-4532-ab66-4dc95ff14223', 'Message #14', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('98624026-48e7-4f4b-87a9-98b09971b987', 'Message #15', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('fc9165a7-aca5-4423-9a5b-fbb8cd7d2524', 'Message #16', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('21c9813f-2570-4da6-b680-230d0e62cc01', 'Message #17', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b0a835a9-a073-4168-b35a-ae5e97152d74', 'Message #18', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d4905ccd-f774-468a-aec2-46ceed341f43', 'Message #19', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a5da6fbb-239c-4618-873a-c37b2a67fe8e', 'Message #20', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7f97637a-1049-4ace-a984-3470f9f2f506', 'Message #21', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c37a7cba-cc6f-40dc-a82a-df7792318411', 'Message #22', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('6c0e2b13-3ee8-4ae4-8619-abef0d3ffedc', 'Message #23', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('fc8e3345-0320-417a-a768-75c1e09811e3', 'Message #24', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c6de0c9a-3d94-4135-9fc7-48bab9628ad3', 'Message #25', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1ed34a57-3045-4093-bbf5-767f6f9c42de', 'Message #26', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('857ba17e-753a-4a9b-b67a-df59efa6b20a', 'Message #27', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e0b50bca-99e9-4980-bf3a-2b403506384a', 'Message #28', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8c8c2fc7-f447-4c9e-adb7-87dfaefe7ec8', 'Message #29', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b24bf91f-40f9-4431-8935-49f29c2982ed', 'Message #30', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('130ebdbf-7ffa-4114-92e5-08896e390c04', 'Message #31', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('be1ad096-cb90-4249-91f3-4e32befd2017', 'Message #32', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('dbd4da50-43dd-4c08-845f-e198a6caee1a', 'Message #33', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8140bb99-e211-4b12-86af-3a45b52b3840', 'Message #34', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9e76fd2a-da03-41e2-ad0c-1069898def75', 'Message #35', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ec9c032c-cafa-4193-9d84-dad51d86431f', 'Message #36', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('2c9b3996-bcbe-49e0-bcc5-0001b94b1ef5', 'Message #37', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e60984cc-969d-47e7-81e8-38a0036b129b', 'Message #38', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('5b52ffcb-9b3e-40a5-8c17-9e7734e97c3b', 'Message #39', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('aef06378-c547-4d76-9ec2-a8da69ea5eaf', 'Message #40', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1df0c164-9981-4468-81fc-1ed1f575901d', 'Message #41', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('f3087347-dc96-4afc-aa7d-3858ba8f812f', 'Message #42', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('30a37ca9-e0d8-4de7-b092-ada91599de42', 'Message #43', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c115160e-c221-4eda-a95b-cd0fd4cb3141', 'Message #44', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ef53b1da-d03f-4be7-b378-221595aee5b1', 'Message #45', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d4a74234-9ec2-4ad1-be3a-a79410ba767a', 'Message #46', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('3010b541-7d6a-4b2e-ba45-233c7d725700', 'Message #47', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('88c22792-e411-476c-8981-dd9d3aa1e8e8', 'Message #48', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('6d961a7c-8b31-4acf-81e6-9c0204351e34', 'Message #49', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('14704f3a-a465-4c56-9692-d3def2631112', 'Message #50', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e0dd812d-c789-4e25-8a9f-83ecef92767a', 'Message #51', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a4accf53-908e-4f60-81ba-9fc292ee33d8', 'Message #52', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c26d00a2-17a5-46ed-9f0e-f5dfa30e93a5', 'Message #53', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9d966657-e18d-4806-a1ab-b6ef0e2298f9', 'Message #54', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('13713052-88de-4332-a2bf-63ce0590a07e', 'Message #55', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('aa18b0ae-b0e1-45d2-8346-cfbd648c4449', 'Message #56', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('70851ed9-d617-4820-b201-59851c29b994', 'Message #57', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a4c8b7aa-be8b-476e-bd56-10fa0dbd9e73', 'Message #58', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('05b7aab3-293d-4031-ac9c-27072c8ded61', 'Message #59', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7ae24efa-f84d-4413-87bf-3a3433699e7b', 'Message #60', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e9c4334c-03b6-4f5b-be3c-111b175895eb', 'Message #61', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('dc1610a4-ff4a-4437-b17b-b335eb20f9f6', 'Message #62', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c59546b8-5c5d-4a7e-bc35-d0e33912f21f', 'Message #63', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8b3bd1e1-6ee7-4e6f-a0be-605475f482f8', 'Message #64', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('20eb407d-d289-4619-a0f9-929e59a3d1fb', 'Message #65', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9b180f79-6b8a-40b0-9830-b613dd45a6be', 'Message #66', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('0c9bc2e4-4e48-4205-9372-78588509f0e6', 'Message #67', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a9727b2c-90d0-488a-9c59-c99a2e672a6a', 'Message #68', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ec9d95ca-9142-4bf4-99c8-5a04b6825a80', 'Message #69', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b748ad92-11ff-45b4-9e15-c3659a99fdd1', 'Message #70', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('89bf376a-e7d1-4dcb-95cd-10a4991a873c', 'Message #71', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e0d8bc80-c5a3-4c23-8f03-d93d97c5e60c', 'Message #72', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d6a0ad9e-310e-423c-910e-c666bece061f', 'Message #73', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('53eaf73c-9e6d-48ed-b1bf-b1e79eea0ae9', 'Message #74', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('3d039b89-659f-4eb8-8c55-3fa9cb54f777', 'Message #75', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('722d5060-a27e-4557-bc1c-9c366266205e', 'Message #76', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d77e964e-7969-4596-950b-9b7445dd3ec6', 'Message #77', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d2a5c350-ff65-4ba3-ad39-0487ab8ccb0c', 'Message #78', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e5118283-5fa5-4a12-904e-1c969e6614a3', 'Message #79', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('77845717-38a6-4365-96f0-c8db8040e338', 'Message #80', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('483eb993-073a-4b68-b4ce-57581dd90474', 'Message #81', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('85106d12-73f1-4f8e-94c0-cc6017366ab4', 'Message #82', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('18d17bec-deda-4ab5-b4e7-5305e68ed5cf', 'Message #83', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('85a3eabe-c623-4976-a305-f632adeb833d', 'Message #84', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('3eaf3158-860b-467e-913d-42aa1146af27', 'Message #85', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('56f62cfb-10ee-4570-b515-3bb463d3a1ee', 'Message #86', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('85555b20-0784-4d65-8ab7-f86c2e833ec2', 'Message #87', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('59ee3682-0542-4516-ac4b-9fedf6352d14', 'Message #88', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e560c9cd-1525-45fc-8bd0-cc3b5cfb65e0', 'Message #89', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9b11e924-90d8-4e64-9ed3-2719badda2e7', 'Message #90', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a5a24ede-2c63-4d8b-ae17-c235761bd7fb', 'Message #91', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('61ef3c69-aa3d-4bc8-a179-0015a531a05a', 'Message #92', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('fcfd01c5-ccf4-4a28-bdd4-a65a747c7444', 'Message #93', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('dcfa2711-023a-4152-8021-1ea36e0168ac', 'Message #94', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('fad65adc-5623-4c00-af47-dd224f12f552', 'Message #95', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('f7609977-93f9-49b4-a6c9-51967aa37111', 'Message #96', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('039a4e49-c67e-45b5-ba1e-03c801b743ee', 'Message #97', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('636e99fa-5905-43de-a06e-74a8c744977e', 'Message #98', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('f8b7cd3b-bf22-458e-9474-16fd2b97bf58', 'Message #99', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('44f37677-3824-463a-a93c-0fb8fb7d3445', 'Message #100', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b6dc04b4-27d0-4581-af6f-bd6a24b10eb1', 'Message #101', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('91d2bbaa-a345-4074-bc1a-3691c296a544', 'Message #102', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('0fa36105-6eed-4039-be02-5caa66344c57', 'Message #103', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7ecc8e32-fd8b-4cac-954f-bdc3301170cd', 'Message #104', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ef2928e5-8695-4ece-813d-33c0429d4366', 'Message #105', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('4f98d7d4-cfae-4ac8-9f08-f424f4a60369', 'Message #106', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('2a85a42d-db75-4231-822a-430dc75892bc', 'Message #107', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('5ddffecf-7095-4922-88fa-0061d7cacae6', 'Message #108', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('73e46006-e797-4f3b-826f-7a5c3caf22ee', 'Message #109', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8da4d361-027b-465e-b06f-eee41d793789', 'Message #110', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('baf1c956-e527-413e-babe-7e9bd1b661cc', 'Message #111', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('28bc9275-a0e7-4d10-9334-98f49f142e95', 'Message #112', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('3062b795-7a95-458d-a93a-41fab2d6d6de', 'Message #113', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8360eb01-8096-490b-9c54-7c24214a19b6', 'Message #114', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('09fc6791-beff-44fc-997b-0792f6bd7ae2', 'Message #115', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ab484044-25f5-4472-bd60-c92dc4048b0e', 'Message #116', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('13add8fa-59c4-4df9-80f7-588793e61442', 'Message #117', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d85e4066-f528-467e-9303-293b2173b1fc', 'Message #118', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('04761d4c-8902-487e-8817-07f2c42db000', 'Message #119', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('253416b3-d52f-44e7-bccd-a2696735e180', 'Message #120', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8b8f9e8b-2501-46c6-960b-8242d0a48b53', 'Message #121', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b9de51b1-8f27-49b4-b02a-8c6b2c99e935', 'Message #122', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c006e89b-772d-4450-b4fd-85b5476ef8df', 'Message #123', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ea87342a-8c7a-4308-868e-ff937c5be7a4', 'Message #124', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('5faa9e7f-5295-4b2d-8759-9cf10f179695', 'Message #125', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('753227a1-3066-4883-accc-0ce0e133be99', 'Message #126', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('675ec6e6-52ec-4177-8d37-71d85019e87d', 'Message #127', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d7f6e5e7-e6a8-4494-94e7-875deb6f7bb2', 'Message #128', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('42c4a302-e0c9-447a-904f-0145e4623f5b', 'Message #129', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('706bbac4-7af3-407a-8419-b24992f0b680', 'Message #130', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1bd064ef-3a32-47d2-87fa-269e92619a79', 'Message #131', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9955f81c-24f6-491b-8554-7752b82fdb48', 'Message #132', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c507f0a1-2aac-4058-b436-2454f62ac51d', 'Message #133', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7edb0d6a-fb50-42be-aea2-b1d80d434ee7', 'Message #134', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('6d33acb6-1bdb-4728-8f2e-d425196f6b06', 'Message #135', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c4840348-9c9f-412e-96d5-b0cd0d01fb74', 'Message #136', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e5e5485a-9d84-4148-9a8b-c05e76fbbba8', 'Message #137', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('25cd05ef-9e62-46c2-92b6-c24d46eb053c', 'Message #138', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b025b38c-3abe-444f-8a01-77b93cdf4f7c', 'Message #139', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('918d0f02-18ec-4fa7-a890-950ec8afc8a3', 'Message #140', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('02fc99b2-863e-4dcb-a01c-9a8104c1ae19', 'Message #141', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('bf435d13-d960-43b1-959e-bb8550e39625', 'Message #142', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('47c59447-d308-448a-8fc2-b60df44048f6', 'Message #143', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('572f8b61-2e55-4d27-a386-0ca52d984692', 'Message #144', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('41d249a4-4dcc-4af9-85be-7ed3cb063258', 'Message #145', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8412cf9c-fffb-4b8e-a8b7-1e2d8caa2067', 'Message #146', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('92029be7-6376-4a85-9537-df0ce56dfe70', 'Message #147', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8dd16f5a-bd55-43c4-8d10-a9ac50b2524b', 'Message #148', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a6574940-1510-457e-9c3d-a6236d8a812c', 'Message #149', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('74552335-8d75-48ee-a7b3-d35651633e31', 'Message #150', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b0e6ed24-d9af-48fb-b95a-d623c3cd8d29', 'Message #151', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('64208ee3-520e-4985-80b1-024b8a368bd1', 'Message #152', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c3b675bf-0dea-4bc0-b6c1-6d837b3ad1e6', 'Message #153', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b9006fb4-7743-48a0-9449-4ae337911eeb', 'Message #154', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9866fbaf-302e-472e-8091-f7ceb6d213b7', 'Message #155', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('201d7779-2c71-46b7-b845-08e0da82fa25', 'Message #156', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d6fea8ef-d77a-43d8-907e-5b017794e5c0', 'Message #157', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7d73acee-e98e-4c07-a0e1-f9ae61b8459e', 'Message #158', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('f2371ea5-6036-4942-9e03-c18ae5117cf1', 'Message #159', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('6954101c-59a9-42c1-bde4-3cccc0c96f19', 'Message #160', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('480a100b-6924-4f5a-96d6-08cd7f8e5bc6', 'Message #161', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1681fb39-9566-42b0-b2be-74ecf6516703', 'Message #162', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('3584a8a4-5745-47d6-a2e2-f912df6e8ec9', 'Message #163', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7ced9336-442a-4609-afdf-d5433d8181e6', 'Message #164', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1c9d6061-03d2-4216-b818-523a37ab5008', 'Message #165', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('6939be2c-738a-4e10-9207-aa0413505689', 'Message #166', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c2611af8-6092-4cf1-b66e-f5188af16697', 'Message #167', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ed9065bb-8e8c-4b2f-b81c-8fd6da5c1fbb', 'Message #168', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9f17ce03-d747-4d60-84bf-3ccdc0953a30', 'Message #169', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('54228e68-1c44-46c9-9bc6-c25a562b0984', 'Message #170', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('2e4e1e47-f373-45c9-b7cf-d7d4a0cc3af5', 'Message #171', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b752059d-15d4-42cd-acf9-083624fe6acd', 'Message #172', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e08dc798-bd7e-411e-b288-1b42342ddb8e', 'Message #173', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a04d2521-bc24-43c2-af26-271ebe5bac26', 'Message #174', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('256a453e-10cb-4e73-8afb-3ea5796bbf1b', 'Message #175', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1007b972-bfd0-40af-b62c-e45efbd34127', 'Message #176', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('212bf9a8-8b42-47ca-abad-1af528f7e2ac', 'Message #177', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ea9979fe-f142-4546-8a3c-a3e0ef7ce835', 'Message #178', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('4dbae4eb-4c88-4d01-b023-5ca5c5db5395', 'Message #179', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7c7ed133-b3c2-49cb-9765-77612f8d77f9', 'Message #180', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('f16518ba-078e-4070-9332-b749300fce81', 'Message #181', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('457b1002-8ef1-4aee-954a-803190dd77a1', 'Message #182', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b7f4e3e7-2450-4fce-8a9e-25e25553d742', 'Message #183', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('24576cf0-81c1-4366-812f-275f76293f42', 'Message #184', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('6eeb8bb4-cebf-465d-8526-1e6f561575d9', 'Message #185', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('433acad6-c0a3-4a85-bc3a-41d44afb469e', 'Message #186', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('0e5670c6-c0bd-4c4a-aba0-8ec4abc0ba0f', 'Message #187', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e0dc7caf-800e-4a1e-92d1-2ae807a46541', 'Message #188', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9052aaea-3d88-4ff1-a4c0-22bbfcea22ac', 'Message #189', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('bd9a4bf3-4e2c-4515-8464-b39be701ce16', 'Message #190', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('abce8b09-4e5f-4248-8dff-ef83b9981613', 'Message #191', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('5d2599cf-a30e-4a03-b2b8-a7b16fc3ed16', 'Message #192', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('4e9b8c8d-7c88-45f7-a79a-9c789865ec7e', 'Message #193', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('fb207a04-8bdb-4639-8fec-1924ca09ec82', 'Message #194', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('847c25bf-d819-4e7f-91fb-e6d0d8555f3e', 'Message #195', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('00546aa3-ff85-479b-9e76-0246dd9287cf', 'Message #196', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c710c74a-1cf3-4e0d-9378-a56da0c6f566', 'Message #197', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a7917494-c52f-4729-a669-f0330ca37599', 'Message #198', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('74407df8-6161-4882-8742-c10cbb11fe17', 'Message #199', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('10f15895-5ad8-4348-83c3-98dd25470a42', 'Message #200', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ce2592fd-3147-4e36-a84e-0b3d41c644f1', 'Message #201', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('cc91ed1f-4a8c-4ef3-a0df-6d0e2e51ce9a', 'Message #202', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9f10fea5-877c-45ab-9568-45e1f17190ec', 'Message #203', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('f139b64d-6a01-4c07-a51f-cafe633bc3a0', 'Message #204', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('3eda93db-a67a-4507-b945-322ff3e2e53a', 'Message #205', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b850f8a7-9675-4ea9-9440-3118ba3a937e', 'Message #206', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('e2f148cd-7974-46bb-9cd3-55f474896046', 'Message #207', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('8113865f-a36c-42d0-8409-6e27720f2ecc', 'Message #208', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('04c26752-e908-4a8a-8368-6dbe83630109', 'Message #209', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1e78cf09-7f98-486e-832a-28cb317bca8a', 'Message #210', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('84aa0a03-af9f-4842-9711-3361d39a175c', 'Message #211', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d7eabd03-f172-43cd-b0f5-e0b621c3f50e', 'Message #212', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('66f2ef3a-c12d-4e23-b0c7-8824e053fd74', 'Message #213', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1fbd7159-a491-46a4-a689-7d388c475a3e', 'Message #214', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('ab09498b-945b-4f44-a596-0830ebe0b42f', 'Message #215', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('5defff06-f671-4b07-b06f-0d5b3b5729fe', 'Message #216', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('672fdc6c-0173-4c5e-800b-00630cf65fb7', 'Message #217', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('86cbe626-761c-45ad-be00-b33065030c3c', 'Message #218', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('953b14be-4206-4dbd-9a2c-43dcddaa4905', 'Message #219', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c7c6fc34-4a66-42ed-bbb5-c8556f02eafa', 'Message #220', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('621c52ca-fd6a-4e19-9795-d467cdc12b3e', 'Message #221', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a1b3dea4-e445-4318-816b-cbb6da4be05d', 'Message #222', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('06dadd25-11af-468d-ba4d-9827e44bc82e', 'Message #223', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('4e0077a3-2172-4b03-a5fb-1ef12c1653ff', 'Message #224', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('37bdeb12-bf0e-49b3-9b80-bb0653890e1b', 'Message #225', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('63383e3c-2465-415f-91f9-dc4f8887f9bd', 'Message #226', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('345a9358-9d79-454c-9aa0-abfc49189d97', 'Message #227', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('19c16d1e-ec84-4595-9dbb-c11bc51fc35b', 'Message #228', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('986d998b-3b04-4c18-9e24-7791170b59f0', 'Message #229', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d27dd4f8-5747-4187-abfa-fbfd6a0be975', 'Message #230', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9ea6030c-b328-4455-83cd-f2c40fa1e168', 'Message #231', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('fb87aa5a-fd65-43c2-bfac-769940016acb', 'Message #232', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('191ad72e-9cc5-4fe5-a0a9-ac2e0c332e9d', 'Message #233', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('2c7a2012-5df2-44a3-b80f-6d97472e71db', 'Message #234', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('14c5b962-5ae8-4de3-9f3b-c9e459c2a368', 'Message #235', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c6a6f943-a11d-4625-a2c8-aedd860b9daf', 'Message #236', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('fe22ccee-89d7-4eb6-8fb8-a48067f0564f', 'Message #237', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('b1b31f31-f779-4a6f-9c27-d5bf8e8d9fb6', 'Message #238', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('137ffa5f-d994-4747-a308-a57416b3c8f6', 'Message #239', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c9a927a6-5fed-40ef-9555-f526269d1c78', 'Message #240', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('dd35510d-f2b4-4476-8c9b-129a0c9f219b', 'Message #241', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7577b3f3-8ea1-4176-886a-3dc8c6e4caa4', 'Message #242', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('49970825-4827-42c0-b56c-6edd97e2994f', 'Message #243', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('4e4b56bc-69ee-44a8-8167-d279e120443a', 'Message #244', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('687efe43-95c9-4e81-b581-3f2746fc553f', 'Message #245', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('c6433f8c-52de-48f1-b3ed-39ddf6b879a6', 'Message #246', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('eb954977-319c-4355-af4b-e28d8a2dc888', 'Message #247', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('9a47722b-5c04-417c-92a9-cf1d3cf8a26d', 'Message #248', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('12919199-edbe-4ecc-a691-3361e081d65f', 'Message #249', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('58a528c4-14e5-482b-9eae-4e59a28ea68a', 'Message #250', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('7627a1be-8bb3-4f8c-9340-7a802846ea18', 'Message #251', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('a7814ae2-1ffd-4fbe-8d96-57acea1b94ef', 'Message #252', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('2e9ea89e-517d-4508-8af9-6870b932dff3', 'Message #253', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('d43a6cfa-6004-4b01-91be-60f4353f76b2', 'Message #254', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); +INSERT INTO logs VALUES ('1f60fc86-27dc-45fe-a46d-76889766e917', 'Message #255', '2026-02-03 19:27:31+00', '2026-02-03 19:27:31+00'); diff --git a/etc/db/seeds/BlogPostsSeed.php b/etc/db/seeds/BlogPostsSeed.php deleted file mode 100644 index 33fc022..0000000 --- a/etc/db/seeds/BlogPostsSeed.php +++ /dev/null @@ -1,38 +0,0 @@ - '53ab5832-9a90-4e6e-988b-06b8b5fed763', - 'previous_blog_post_id' => null, - 'next_blog_post_id' => '090fa83b-5c5a-4042-9f05-58d9ab649a1a', - 'author_id' => 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', - 'publisher_id' => 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', - 'title' => 'Cats!', - 'contents' => 'qliwuhe uofq2hep fuoq2pho fp2uhu pu2p 2qpoh weh uwqhfu wqif', - 'views' => 133, - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - [ - 'id' => '090fa83b-5c5a-4042-9f05-58d9ab649a1a', - 'previous_blog_post_id' => '53ab5832-9a90-4e6e-988b-06b8b5fed763', - 'next_blog_post_id' => null, - 'author_id' => '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', - 'publisher_id' => '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', - 'title' => 'Moar Cats!', - 'contents' => 'qlqweofu b02qw yu9 dqiwuhe uofq2hep fuoq2pho fp2uhu pu2p 2qpoh weh uwqhfu wqif', - 'views' => 166, - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - ]; - - $table = $this->table('blog_posts'); - $table->insert($data)->save(); - } -} diff --git a/etc/db/seeds/CommentsSeed.php b/etc/db/seeds/CommentsSeed.php deleted file mode 100644 index 21abd1e..0000000 --- a/etc/db/seeds/CommentsSeed.php +++ /dev/null @@ -1,38 +0,0 @@ - '326b9f10-10d9-46a9-8487-c34e189abdf1', - 'author_id' => 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', - 'blog_post_id' => '090fa83b-5c5a-4042-9f05-58d9ab649a1a', - 'contents' => 'abc', - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - [ - 'id' => '82aafe95-d37e-4525-90f0-08a9fe674591', - 'author_id' => '2fa0d077-d374-4409-b1ef-9687c6729158', - 'blog_post_id' => '53ab5832-9a90-4e6e-988b-06b8b5fed763', - 'contents' => 'def', - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - [ - 'id' => '2443dfa0-b964-4a2a-9d4f-7e3c8aac23a3', - 'author_id' => '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', - 'blog_post_id' => '53ab5832-9a90-4e6e-988b-06b8b5fed763', - 'contents' => 'ghi', - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - ]; - - $table = $this->table('comments'); - $table->insert($data)->save(); - } -} diff --git a/etc/db/seeds/LogsSeed.php b/etc/db/seeds/LogsSeed.php deleted file mode 100644 index 4598da1..0000000 --- a/etc/db/seeds/LogsSeed.php +++ /dev/null @@ -1,22 +0,0 @@ - Uuid::getFactory()->uuid4(), - 'message' => 'Message #' . $i, - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ]; - } - - $table = $this->table('logs'); - $table->insert($data)->save(); - } -} diff --git a/etc/db/seeds/UsersSeed.php b/etc/db/seeds/UsersSeed.php deleted file mode 100644 index 2108989..0000000 --- a/etc/db/seeds/UsersSeed.php +++ /dev/null @@ -1,32 +0,0 @@ - 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', - 'name' => 'Deathwing', - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - [ - 'id' => '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', - 'name' => 'Gandalf', - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - [ - 'id' => '2fa0d077-d374-4409-b1ef-9687c6729158', - 'name' => 'Floki', - 'created' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - 'modified' => (new DateTimeImmutable())->format('Y-m-d H:i:s e'), - ], - ]; - - $table = $this->table('users'); - $table->insert($data)->save(); - } -} diff --git a/etc/qa/composer-require-checker.json b/etc/qa/composer-require-checker.json index 3902fe8..5527880 100644 --- a/etc/qa/composer-require-checker.json +++ b/etc/qa/composer-require-checker.json @@ -2,10 +2,7 @@ "symbol-whitelist" : [ "null", "true", "false", "static", "self", "parent", - "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", - "Safe\\date", "WyriHaximus\\Constants\\Boolean\\FALSE_", "WyriHaximus\\Constants\\Boolean\\TRUE_", - "WyriHaximus\\Constants\\Numeric\\ONE_FLOAT", "WyriHaximus\\Constants\\Numeric\\ONE", - "WyriHaximus\\Constants\\Numeric\\ZERO", "WyriHaximus\\iteratorOrArrayToArray" + "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object" ], "php-core-extensions" : [ "Core", diff --git a/etc/qa/composer-unused.php b/etc/qa/composer-unused.php new file mode 100644 index 0000000..09590b2 --- /dev/null +++ b/etc/qa/composer-unused.php @@ -0,0 +1,7 @@ + $config; diff --git a/etc/qa/infection.json5 b/etc/qa/infection.json5 new file mode 100644 index 0000000..3526bd0 --- /dev/null +++ b/etc/qa/infection.json5 @@ -0,0 +1,21 @@ +{ + "timeout": 120, + "source": { + "directories": [ + "../../src" + ] + }, + "logs": { + "text": "../../var/infection.log", + "summary": "../../var/infection-summary.log", + "json": "../../var/infection.json", + "perMutator": "../../var/infection-per-mutator.md", + "github": true + }, + "minMsi": 100, + "minCoveredMsi": 100, + "ignoreMsiWithNoMutations": true, + "mutators": { + "@default": true + } +} diff --git a/etc/qa/phpcs.xml b/etc/qa/phpcs.xml index f6c11d9..25d5677 100644 --- a/etc/qa/phpcs.xml +++ b/etc/qa/phpcs.xml @@ -3,9 +3,10 @@ - + + ../../etc ../../src ../../tests diff --git a/etc/qa/phpstan.neon b/etc/qa/phpstan.neon index f35b03b..1e987f4 100644 --- a/etc/qa/phpstan.neon +++ b/etc/qa/phpstan.neon @@ -1,11 +1,8 @@ parameters: level: max - ergebnis: - noExtends: - classesAllowedToBeExtended: - - Exception - - Psr\Log\AbstractLogger - - WyriHaximus\TestUtilities\TestCase - -includes: - - ../../vendor/wyrihaximus/async-test-utilities/rules.neon + paths: + - ../../etc + - ../../src + - ../../tests + excludePaths: + - ../../src/Tools/LazyPromise.php diff --git a/etc/qa/phpunit.xml b/etc/qa/phpunit.xml index 84e23a8..dfe1d76 100644 --- a/etc/qa/phpunit.xml +++ b/etc/qa/phpunit.xml @@ -1,13 +1,27 @@ - - - - ../../tests/ - - - - - ../../src/ - - + + + + ../../tests/ + + + + + ../../src/ + + + + + diff --git a/etc/qa/psalm.xml b/etc/qa/psalm.xml deleted file mode 100644 index 13de275..0000000 --- a/etc/qa/psalm.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/etc/qa/rector.php b/etc/qa/rector.php new file mode 100644 index 0000000..ce6b5c9 --- /dev/null +++ b/etc/qa/rector.php @@ -0,0 +1,7 @@ +engine = new PostgresEngine(); } - public function query(ExpressionInterface $expression): Observable + /** @return iterable> */ + public function query(ExpressionInterface $expression): iterable { $params = $expression->params($this->engine); $sql = $expression->sql($this->engine); - if (strpos($sql, '?') !== FALSE_) { + if (str_contains($sql, '?')) { $chunks = explode('?', $sql); $sqlChunks = []; foreach ($chunks as $i => $chunk) { - if ($i === ZERO) { + if ($i === 0) { $sqlChunks[] = $chunk; continue; } @@ -46,7 +45,8 @@ public function query(ExpressionInterface $expression): Observable $sql = implode('', $sqlChunks); } - return $this->client->executeStatement($sql, $params); + /** @phpstan-ignore generator.valueType,argument.type */ + yield from awaitObservable($this->client->executeStatement($sql, $params)); } public function engine(): EngineInterface diff --git a/src/AdapterInterface.php b/src/AdapterInterface.php index c0cee44..d9eedf0 100644 --- a/src/AdapterInterface.php +++ b/src/AdapterInterface.php @@ -6,11 +6,11 @@ use Latitude\QueryBuilder\EngineInterface; use Latitude\QueryBuilder\ExpressionInterface; -use Rx\Observable; interface AdapterInterface { - public function query(ExpressionInterface $expression): Observable; + /** @return iterable> */ + public function query(ExpressionInterface $expression): iterable; public function engine(): EngineInterface; } diff --git a/src/Attribute/Clause.php b/src/Attribute/Clause.php index dc3ce46..2e6b392 100644 --- a/src/Attribute/Clause.php +++ b/src/Attribute/Clause.php @@ -4,9 +4,11 @@ namespace WyriHaximus\React\SimpleORM\Attribute; +/** @api */ final readonly class Clause { - public function __construct( /** @phpstan-ignore-line */ + /** @phpstan-ignore ergebnis.noConstructorParameterWithDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullDefaultValue,ergebnis.noConstructorParameterWithDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullDefaultValue,ergebnis.noConstructorParameterWithDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullDefaultValue,ergebnis.noConstructorParameterWithDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullDefaultValue */ + public function __construct( public string $localKey, public string $foreignKey, public string|null $localCast = null, diff --git a/src/Attribute/InnerJoin.php b/src/Attribute/InnerJoin.php index 35977b0..437a7af 100644 --- a/src/Attribute/InnerJoin.php +++ b/src/Attribute/InnerJoin.php @@ -6,13 +6,18 @@ use Attribute; +/** @api */ #[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] final readonly class InnerJoin implements JoinInterface { public string $type; - /** @param array $clause */ - public function __construct( /** @phpstan-ignore-line */ + /** + * @param array $clause + * + * @phpstan-ignore ergebnis.noConstructorParameterWithDefaultValue + */ + public function __construct( public string $entity, public array $clause, public string $property, diff --git a/src/Attribute/JoinInterface.php b/src/Attribute/JoinInterface.php index 984663f..2d0123e 100644 --- a/src/Attribute/JoinInterface.php +++ b/src/Attribute/JoinInterface.php @@ -13,6 +13,6 @@ */ interface JoinInterface { - public const IS_LAZY = true; - public const IS_NOT_LAZY = false; + public const true IS_LAZY = true; + public const false IS_NOT_LAZY = false; } diff --git a/src/Attribute/LeftJoin.php b/src/Attribute/LeftJoin.php index ff143f2..3b636b7 100644 --- a/src/Attribute/LeftJoin.php +++ b/src/Attribute/LeftJoin.php @@ -6,13 +6,18 @@ use Attribute; +/** @api */ #[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] final readonly class LeftJoin implements JoinInterface { public string $type; - /** @param array $clause */ - public function __construct( /** @phpstan-ignore-line */ + /** + * @param array $clause + * + * @phpstan-ignore ergebnis.noConstructorParameterWithDefaultValue + */ + public function __construct( public string $entity, public array $clause, public string $property, diff --git a/src/Attribute/Table.php b/src/Attribute/Table.php index 9794bcf..340ecf4 100644 --- a/src/Attribute/Table.php +++ b/src/Attribute/Table.php @@ -6,6 +6,7 @@ use Attribute; +/** @api */ #[Attribute(Attribute::TARGET_CLASS)] final readonly class Table { diff --git a/src/Client.php b/src/Client.php index e5abcd7..9d0dd7f 100644 --- a/src/Client.php +++ b/src/Client.php @@ -6,29 +6,33 @@ use Latitude\QueryBuilder\ExpressionInterface; use Latitude\QueryBuilder\QueryFactory; -use Rx\Observable; use function array_key_exists; +/** @api */ final class Client implements ClientInterface { - private EntityInspector $entityInspector; + private readonly EntityInspector $entityInspector; - /** @var array */ + /** + * @var array, RepositoryInterface> + * @template T of EntityInterface + * @phpstan-ignore generics.notSubtype,class.notFound,class.notFound + */ private array $repositories = []; - private Connection $connection; + private readonly Connection $connection; - private QueryFactory $queryFactory; + private readonly QueryFactory $queryFactory; - private Hydrator $hydrator; + private readonly Hydrator $hydrator; public static function create(AdapterInterface $adapter, Configuration $configuration, MiddlewareInterface ...$middleware): self { return new self($adapter, $configuration, ...$middleware); } - private function __construct(private AdapterInterface $adapter, Configuration $configuration, MiddlewareInterface ...$middleware) + private function __construct(private readonly AdapterInterface $adapter, Configuration $configuration, MiddlewareInterface ...$middleware) { $this->entityInspector = new EntityInspector($configuration); $this->queryFactory = new QueryFactory($adapter->engine()); @@ -42,11 +46,12 @@ private function __construct(private AdapterInterface $adapter, Configuration $c * * @return RepositoryInterface * - * @template T + * @template T of EntityInterface */ public function repository(string $entity): RepositoryInterface { if (! array_key_exists($entity, $this->repositories)) { + /** @phpstan-ignore assign.propertyType */ $this->repositories[$entity] = new Repository( $this->entityInspector->entity($entity), $this, @@ -56,10 +61,12 @@ public function repository(string $entity): RepositoryInterface ); } + /** @phpstan-ignore return.type */ return $this->repositories[$entity]; } - public function query(ExpressionInterface $query): Observable + /** @return iterable> */ + public function query(ExpressionInterface $query): iterable { return $this->connection->query($query); } diff --git a/src/ClientInterface.php b/src/ClientInterface.php index 7ea0a75..bf48e01 100644 --- a/src/ClientInterface.php +++ b/src/ClientInterface.php @@ -4,9 +4,10 @@ namespace WyriHaximus\React\SimpleORM; +use Deprecated; use Latitude\QueryBuilder\ExpressionInterface; -use Rx\Observable; +/** @api */ interface ClientInterface { /** @@ -14,10 +15,11 @@ interface ClientInterface * * @return RepositoryInterface * - * @template T + * @template T of EntityInterface */ public function repository(string $entity): RepositoryInterface; - /** @deprecated This function will disappear at initial release */ - public function query(ExpressionInterface $query): Observable; + /** @return iterable> */ + #[Deprecated(message: 'This function will disappear at initial release')] + public function query(ExpressionInterface $query): iterable; } diff --git a/src/Configuration.php b/src/Configuration.php index 9267715..6dcefee 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -4,9 +4,11 @@ namespace WyriHaximus\React\SimpleORM; +/** @api */ final readonly class Configuration { - public function __construct( /** @phpstan-ignore-line */ + /** @phpstan-ignore ergebnis.noConstructorParameterWithDefaultValue */ + public function __construct( public string $tablePrefix = '', ) { } diff --git a/src/Connection.php b/src/Connection.php index a019397..06fa32e 100644 --- a/src/Connection.php +++ b/src/Connection.php @@ -5,12 +5,7 @@ namespace WyriHaximus\React\SimpleORM; use Latitude\QueryBuilder\ExpressionInterface; -use React\Promise\PromiseInterface; -use Rx\Observable; -use function React\Promise\resolve; - -/** @internal */ final readonly class Connection { public function __construct( @@ -19,13 +14,12 @@ public function __construct( ) { } - public function query(ExpressionInterface $query): Observable + /** @return iterable> */ + public function query(ExpressionInterface $query): iterable { - return Observable::fromPromise($this->middlewareRunner->query( + yield from $this->middlewareRunner->query( $query, - function (ExpressionInterface $query): PromiseInterface { - return resolve($this->adapter->query($query)); - }, - ))->mergeAll(); + fn (ExpressionInterface $query): iterable => yield from $this->adapter->query($query), + ); } } diff --git a/src/Entity/Field.php b/src/Entity/Field.php index 04f8834..546a7f0 100644 --- a/src/Entity/Field.php +++ b/src/Entity/Field.php @@ -4,19 +4,10 @@ namespace WyriHaximus\React\SimpleORM\Entity; -final class Field +/** @api */ +final readonly class Field { - public function __construct(private string $name, private string $type) + public function __construct(public string $name, public string $column, public string $type) { } - - public function name(): string - { - return $this->name; - } - - public function type(): string - { - return $this->type; - } } diff --git a/src/Entity/Join.php b/src/Entity/Join.php index 81d0e48..518e5be 100644 --- a/src/Entity/Join.php +++ b/src/Entity/Join.php @@ -5,6 +5,7 @@ namespace WyriHaximus\React\SimpleORM\Entity; use WyriHaximus\React\SimpleORM\Attribute\Clause; +use WyriHaximus\React\SimpleORM\EntityInterface; use WyriHaximus\React\SimpleORM\InspectedEntityInterface; final readonly class Join @@ -15,7 +16,7 @@ /** * @param InspectedEntityInterface $entity * - * @template T + * @template T of EntityInterface */ public function __construct( public InspectedEntityInterface $entity, diff --git a/src/EntityInspector.php b/src/EntityInspector.php index bada443..b350bd1 100644 --- a/src/EntityInspector.php +++ b/src/EntityInspector.php @@ -4,9 +4,10 @@ namespace WyriHaximus\React\SimpleORM; +use EventSauce\ObjectHydrator\MapFrom; use ReflectionClass; -use Roave\BetterReflection\BetterReflection; -use Roave\BetterReflection\Reflection\ReflectionProperty; +use ReflectionNamedType; +use ReflectionUnionType; use RuntimeException; use WyriHaximus\React\SimpleORM\Attribute\JoinInterface; use WyriHaximus\React\SimpleORM\Attribute\Table; @@ -14,17 +15,23 @@ use WyriHaximus\React\SimpleORM\Entity\Join; use function array_key_exists; +use function class_exists; use function count; use function current; -use function method_exists; +use function is_array; +use function is_string; final class EntityInspector { - /** @var InspectedEntityInterface[] */ + /** + * @var array> + * @template T of EntityInterface + * @phpstan-ignore generics.notSubtype,class.notFound + */ private array $entities = []; public function __construct( - private Configuration $configuration, + private readonly Configuration $configuration, ) { } @@ -33,7 +40,7 @@ public function __construct( * * @return InspectedEntityInterface * - * @template T + * @template T of EntityInterface */ public function entity(string $entity): InspectedEntityInterface { @@ -47,7 +54,8 @@ public function entity(string $entity): InspectedEntityInterface $tableAttribute = current($tableAttributes)->newInstance(); - $joins = [...$this->joins($class)]; + $joins = [...$this->joins($class)]; + /** @phpstan-ignore assign.propertyType */ $this->entities[$entity] = new InspectedEntity( $entity, $this->configuration->tablePrefix . $tableAttribute->table, @@ -56,6 +64,7 @@ public function entity(string $entity): InspectedEntityInterface ); } + /** @phpstan-ignore return.type */ return $this->entities[$entity]; } @@ -72,29 +81,55 @@ private function fields(ReflectionClass $class, array $joins): iterable continue; } - $roaveProperty = (static function (BetterReflection $br, string $class): \Roave\BetterReflection\Reflection\ReflectionClass { - if (method_exists($br, 'classReflector')) { - return $br->classReflector()->reflect($class); + $typeName = 'mixed'; + $type = $property->getType(); + if ($type instanceof ReflectionNamedType) { + $typeName = $type->getName(); + if ($typeName === EntityInterface::class || (class_exists($typeName) && new ReflectionClass($typeName)->implementsInterface(EntityInterface::class))) { + continue; + } + + if ($typeName === 'iterable' || $typeName === 'array') { + continue; } + } elseif ($type instanceof ReflectionUnionType) { + $isEntity = false; + foreach ($type->getTypes() as $innerType) { + if (! ($innerType instanceof ReflectionNamedType)) { + continue; + } - return $br->reflector()->reflectClass($class); - })(new BetterReflection(), $class->getName())->getProperty($property->getName()); + $typeName = $innerType->getName(); + if ($typeName === EntityInterface::class || (class_exists($typeName) && new ReflectionClass($typeName)->implementsInterface(EntityInterface::class))) { + $isEntity = true; + break; + } - if ($roaveProperty === null) { - continue; + if ($typeName === 'iterable' || $typeName === 'array') { + $isEntity = true; + break; + } + } + + if ($isEntity) { + continue; + } + } + + $column = $property->getName(); + foreach ($property->getAttributes(MapFrom::class) as $attribute) { + $keys = $attribute->getArguments()[0]; + if (is_string($keys)) { + $column = $keys; + } elseif (is_array($keys) && count($keys) > 0 && is_string($keys[0])) { + $column = $keys[0]; + } } - /** @psalm-suppress PossiblyNullReference */ yield $property->getName() => new Field( $property->getName(), - (static function (ReflectionProperty $property): string { - $type = $property->getType(); - if ($type !== null) { - return (string) $type; - } - - return (string) current($property->getDocBlockTypes()); - })($roaveProperty), + $column, + $typeName, ); } } @@ -119,11 +154,17 @@ private function joins(ReflectionClass $class): iterable /** @return iterable */ private function join(JoinInterface $join): iterable { + /** @phpstan-ignore generator.keyType,property.notFound */ yield $join->property => new Join( + /** @phpstan-ignore argument.type,property.notFound */ new LazyInspectedEntity($this, $join->entity), + /** @phpstan-ignore argument.type,property.notFound */ $join->type, + /** @phpstan-ignore argument.type,property.notFound */ $join->property, + /** @phpstan-ignore argument.type,property.notFound */ $join->lazy, + /** @phpstan-ignore argument.type,argument.unpackNonIterable,property.notFound */ ...$join->clause, ); } diff --git a/src/EntityInterface.php b/src/EntityInterface.php index f596d9c..f567884 100644 --- a/src/EntityInterface.php +++ b/src/EntityInterface.php @@ -4,7 +4,14 @@ namespace WyriHaximus\React\SimpleORM; -/** @property string $id */ +use DateTimeImmutable; + +/** + * @api + * @property string $id + * @property DateTimeImmutable $created + * @property DateTimeImmutable $modified + */ interface EntityInterface { } diff --git a/src/Hydrator.php b/src/Hydrator.php index 9c869be..b795aae 100644 --- a/src/Hydrator.php +++ b/src/Hydrator.php @@ -5,8 +5,12 @@ namespace WyriHaximus\React\SimpleORM; use EventSauce\ObjectHydrator\ObjectMapperUsingReflection; +use React\Promise\PromiseInterface; +use ReflectionClass; +use function array_key_exists; use function is_array; +use function React\Async\await; final readonly class Hydrator { @@ -17,17 +21,38 @@ public function __construct() $this->fallbackMapper = new ObjectMapperUsingReflection(); } - /** @param array $data */ + /** + * @param array $data + * @param InspectedEntityInterface $inspectedEntity + * + * @return T + * + * @template T of EntityInterface + */ public function hydrate(InspectedEntityInterface $inspectedEntity, array $data): EntityInterface { +// var_export([$inspectedEntity->class(), $data]); foreach ($inspectedEntity->joins() as $join) { + if (! array_key_exists($join->property, $data)) { + continue; + } + + if ($data[$join->property] instanceof PromiseInterface) { + /** @var PromiseInterface $promise */ + $promise = $data[$join->property]; + $data[$join->property] = $this->createLazyProxy($join->entity, $promise); + continue; + } + if (! is_array($data[$join->property])) { continue; } + /** @var array $joinData */ + $joinData = $data[$join->property]; $data[$join->property] = $this->hydrate( $join->entity, - $data[$join->property], + $joinData, ); } @@ -37,6 +62,33 @@ public function hydrate(InspectedEntityInterface $inspectedEntity, array $data): /** @return array */ public function extract(EntityInterface $entity): array { + /** @phpstan-ignore return.type */ return $this->fallbackMapper->serializeObject($entity); } + + /** + * @param InspectedEntityInterface $inspectedEntity + * @param PromiseInterface $object + * + * @return T + * + * @template T of EntityInterface + */ + private function createLazyProxy(InspectedEntityInterface $inspectedEntity, PromiseInterface $object): EntityInterface + { + /** @return T */ + return new ReflectionClass( + $inspectedEntity->class(), + )->newLazyProxy( + function () use ($inspectedEntity, $object): EntityInterface { + /** @var array $data */ + $data = await($object); + + return $this->hydrate( + $inspectedEntity, + $data, + ); + }, + ); + } } diff --git a/src/InspectedEntity.php b/src/InspectedEntity.php index d18c1e8..dea6939 100644 --- a/src/InspectedEntity.php +++ b/src/InspectedEntity.php @@ -7,11 +7,18 @@ use WyriHaximus\React\SimpleORM\Entity\Field; use WyriHaximus\React\SimpleORM\Entity\Join; -final class InspectedEntity implements InspectedEntityInterface +/** + * @template T of EntityInterface + * @template-implements InspectedEntityInterface + */ +final readonly class InspectedEntity implements InspectedEntityInterface { /** - * @param Field[] $fields - * @param Join[] $joins + * @param Field[] $fields + * @param Join[] $joins + * @param class-string $class + * + * @phpstan-ignore ergebnis.noConstructorParameterWithDefaultValue,ergebnis.noConstructorParameterWithDefaultValue */ public function __construct(private string $class, private string $table, private array $fields = [], private array $joins = []) { diff --git a/src/InspectedEntityInterface.php b/src/InspectedEntityInterface.php index 4ced0e5..de4edc9 100644 --- a/src/InspectedEntityInterface.php +++ b/src/InspectedEntityInterface.php @@ -7,9 +7,10 @@ use WyriHaximus\React\SimpleORM\Entity\Field; use WyriHaximus\React\SimpleORM\Entity\Join; -/** @template T */ +/** @template T of EntityInterface */ interface InspectedEntityInterface { + /** @return class-string */ public function class(): string; public function table(): string; diff --git a/src/LazyInspectedEntity.php b/src/LazyInspectedEntity.php index 0f15268..114552a 100644 --- a/src/LazyInspectedEntity.php +++ b/src/LazyInspectedEntity.php @@ -7,6 +7,10 @@ use WyriHaximus\React\SimpleORM\Entity\Field; use WyriHaximus\React\SimpleORM\Entity\Join; +/** + * @template T of EntityInterface + * @template-implements InspectedEntityInterface + */ final class LazyInspectedEntity implements InspectedEntityInterface { private string|null $table = null; @@ -17,11 +21,13 @@ final class LazyInspectedEntity implements InspectedEntityInterface /** @var Join[] */ private array $joins = []; - private EntityInspector|null $entityInspector = null; - - public function __construct(EntityInspector $entityInspector, private string $class) + /** + * @param class-string $class + * + * @phpstan-ignore ergebnis.noParameterWithNullableTypeDeclaration + */ + public function __construct(private EntityInspector|null $entityInspector, private readonly string $class) { - $this->entityInspector = $entityInspector; } public function class(): string @@ -29,17 +35,13 @@ public function class(): string return $this->class; } - /** @psalm-suppress InvalidNullableReturnType */ public function table(): string { if ($this->table === null) { $this->loadEntity(); } - /** - * @phpstan-ignore-next-line - * @psalm-suppress NullableReturnStatement - */ + /** @phpstan-ignore return.type */ return $this->table; } @@ -65,7 +67,7 @@ public function joins(): array private function loadEntity(): void { - if ($this->entityInspector === null) { + if (! $this->entityInspector instanceof EntityInspector) { return; } diff --git a/src/Middleware/QueryCountMiddleware.php b/src/Middleware/QueryCountMiddleware.php index 435b81e..7ff3a33 100644 --- a/src/Middleware/QueryCountMiddleware.php +++ b/src/Middleware/QueryCountMiddleware.php @@ -5,18 +5,15 @@ namespace WyriHaximus\React\SimpleORM\Middleware; use Latitude\QueryBuilder\ExpressionInterface; -use React\Promise\PromiseInterface; -use Rx\Observable; -use Rx\Subject\Subject; use Throwable; use WyriHaximus\React\SimpleORM\MiddlewareInterface; -use function React\Promise\resolve; -use function Safe\hrtime; +use function hrtime; +/** @api */ final class QueryCountMiddleware implements MiddlewareInterface { - private const ZERO = 0; + private const int ZERO = 0; private int $initiatedCount = self::ZERO; @@ -28,60 +25,43 @@ final class QueryCountMiddleware implements MiddlewareInterface private int $completedCount = self::ZERO; - public function __construct(private int $slowQueryTime) + public function __construct(private readonly int $slowQueryTime) { } - public function query(ExpressionInterface $query, callable $next): PromiseInterface + /** + * @param callable(ExpressionInterface): iterable> $next + * + * @return iterable> + */ + public function query(ExpressionInterface $query, callable $next): iterable { $this->initiatedCount++; + $startTime = hrtime()[0]; + $handledInitialRow = false; - $startTime = hrtime()[0]; + try { + foreach ($next($query) as $row) { + if (! $handledInitialRow && hrtime()[0] - $startTime > $this->slowQueryTime) { + $this->slowCount++; + } - return resolve($next($query))->then(function (Observable $observable) use ($startTime): PromiseInterface { - return resolve(Observable::defer(function () use ($observable, $startTime): Subject { - $handledInitialRow = false; - $subject = new Subject(); - $observable->subscribe( - function (array $row) use ($subject, $startTime, &$handledInitialRow): void { - $subject->onNext($row); + $handledInitialRow = true; - if ($handledInitialRow === true) { - return; - } + yield $row; + } - $this->successfulCount++; + $this->successfulCount++; + $this->completedCount++; + } catch (Throwable $throwable) { + $this->erroredCount++; - if (hrtime()[0] - $startTime > $this->slowQueryTime) { - $this->slowCount++; - } + if (! $handledInitialRow && hrtime()[0] - $startTime > $this->slowQueryTime) { + $this->slowCount++; + } - $handledInitialRow = true; - }, - function (Throwable $throwable) use ($startTime, $subject): void { - $this->erroredCount++; - - if (hrtime()[0] - $startTime > $this->slowQueryTime) { - $this->slowCount++; - } - - $subject->onError($throwable); - }, - function () use ($subject, &$handledInitialRow): void { - $this->completedCount++; - $subject->onCompleted(); - - if ($handledInitialRow === true) { - return; - } - - $this->successfulCount++; - }, - ); - - return $subject; - })); - }); + throw $throwable; + } } /** @return iterable */ diff --git a/src/MiddlewareInterface.php b/src/MiddlewareInterface.php index 621b32b..02ae81b 100644 --- a/src/MiddlewareInterface.php +++ b/src/MiddlewareInterface.php @@ -5,12 +5,13 @@ namespace WyriHaximus\React\SimpleORM; use Latitude\QueryBuilder\ExpressionInterface; -use React\Promise\PromiseInterface; interface MiddlewareInterface { /** - * Returns the (modified) query through a promise. + * @param callable(ExpressionInterface): iterable> $next + * + * @return iterable> */ - public function query(ExpressionInterface $query, callable $next): PromiseInterface; + public function query(ExpressionInterface $query, callable $next): iterable; } diff --git a/src/MiddlewareRunner.php b/src/MiddlewareRunner.php index 272f497..746f6ee 100644 --- a/src/MiddlewareRunner.php +++ b/src/MiddlewareRunner.php @@ -5,14 +5,9 @@ namespace WyriHaximus\React\SimpleORM; use Latitude\QueryBuilder\ExpressionInterface; -use React\Promise\PromiseInterface; use function array_key_exists; -use const WyriHaximus\Constants\Numeric\ZERO; - -/** @internal */ - final class MiddlewareRunner { /** @var array */ @@ -23,26 +18,34 @@ public function __construct(MiddlewareInterface ...$middleware) $this->middleware = $middleware; } - public function query(ExpressionInterface $query, callable $last): PromiseInterface + /** + * @param callable(ExpressionInterface): iterable> $last + * + * @return iterable> + */ + public function query(ExpressionInterface $query, callable $last): iterable { - if (! array_key_exists(ZERO, $this->middleware)) { - return $last($query); + if (! array_key_exists(0, $this->middleware)) { + yield from $last($query); + + return; } - return $this->call($query, ZERO, $last); + yield from $this->call($query, 0, $last); } - private function call(ExpressionInterface $query, int $position, callable $last): PromiseInterface + /** @return iterable> */ + private function call(ExpressionInterface $query, int $position, callable $last): iterable { $nextPosition = $position; $nextPosition++; // final request handler will be invoked without hooking into the promise if (! array_key_exists($nextPosition, $this->middleware)) { - return $this->middleware[$position]->query($query, $last); + yield from $this->middleware[$position]->query($query, $last); + + return; } - return $this->middleware[$position]->query($query, function (ExpressionInterface $query) use ($nextPosition, $last): PromiseInterface { - return $this->call($query, $nextPosition, $last); - }); + yield from $this->middleware[$position]->query($query, fn (ExpressionInterface $query): iterable => yield from $this->call($query, $nextPosition, $last)); } } diff --git a/src/Query/Limit.php b/src/Query/Limit.php index 1190ce9..b5f5bf3 100644 --- a/src/Query/Limit.php +++ b/src/Query/Limit.php @@ -4,7 +4,7 @@ namespace WyriHaximus\React\SimpleORM\Query; -final class Limit implements SectionInterface +final readonly class Limit implements SectionInterface { public function __construct(private int $limit) { diff --git a/src/Query/Order.php b/src/Query/Order.php index c5e3727..e3c80be 100644 --- a/src/Query/Order.php +++ b/src/Query/Order.php @@ -4,10 +4,10 @@ namespace WyriHaximus\React\SimpleORM\Query; -final class Order implements SectionInterface +final readonly class Order implements SectionInterface { /** @var array */ - private array $orders = []; + private array $orders; public function __construct(OrderInterface ...$orders) { diff --git a/src/Query/Order/Asc.php b/src/Query/Order/Asc.php index 962c02a..f63fae3 100644 --- a/src/Query/Order/Asc.php +++ b/src/Query/Order/Asc.php @@ -6,7 +6,8 @@ use WyriHaximus\React\SimpleORM\Query\OrderInterface; -final class Asc implements OrderInterface +/** @api */ +final readonly class Asc implements OrderInterface { public function __construct(private string $field) { diff --git a/src/Query/Order/Desc.php b/src/Query/Order/Desc.php index b6c3d0f..2540d6c 100644 --- a/src/Query/Order/Desc.php +++ b/src/Query/Order/Desc.php @@ -6,7 +6,8 @@ use WyriHaximus\React\SimpleORM\Query\OrderInterface; -final class Desc implements OrderInterface +/** @api */ +final readonly class Desc implements OrderInterface { public function __construct(private string $field) { diff --git a/src/Query/Where.php b/src/Query/Where.php index 8e8fcb7..0a2baec 100644 --- a/src/Query/Where.php +++ b/src/Query/Where.php @@ -4,10 +4,10 @@ namespace WyriHaximus\React\SimpleORM\Query; -final class Where implements SectionInterface +final readonly class Where implements SectionInterface { /** @var array */ - private array $wheres = []; + private array $wheres; public function __construct(WhereInterface ...$wheres) { diff --git a/src/Query/Where/Expression.php b/src/Query/Where/Expression.php index d48f031..d614622 100644 --- a/src/Query/Where/Expression.php +++ b/src/Query/Where/Expression.php @@ -11,11 +11,15 @@ final readonly class Expression implements WhereInterface { - /** @param array $criteriaArguments */ + /** + * @param array $criteriaArguments + * + * @phpstan-ignore ergebnis.noConstructorParameterWithDefaultValue + */ public function __construct( private ExpressionInterface $expression, private string $criteria, - private array $criteriaArguments = [], /** @phpstan-ignore-line */ + private array $criteriaArguments = [], ) { } @@ -26,7 +30,7 @@ public function expression(): ExpressionInterface public function applyExpression(ExpressionInterface $expression): CriteriaInterface { - /** @phpstan-ignore-next-line */ - return (new CriteriaBuilder($expression))->{$this->criteria}(...$this->criteriaArguments); + /** @phpstan-ignore method.dynamicName,return.type */ + return new CriteriaBuilder($expression)->{$this->criteria}(...$this->criteriaArguments); } } diff --git a/src/Query/Where/Field.php b/src/Query/Where/Field.php index 8289ff8..7d9db0b 100644 --- a/src/Query/Where/Field.php +++ b/src/Query/Where/Field.php @@ -10,11 +10,15 @@ final readonly class Field implements WhereInterface { - /** @param mixed[] $criteriaArguments */ + /** + * @param mixed[] $criteriaArguments + * + * @phpstan-ignore ergebnis.noConstructorParameterWithDefaultValue + */ public function __construct( private string $field, private string $criteria, - private array $criteriaArguments = [], /** @phpstan-ignore-line */ + private array $criteriaArguments = [], ) { } @@ -25,7 +29,7 @@ public function field(): string public function applyCriteria(CriteriaBuilder $criteria): CriteriaInterface { - /** @phpstan-ignore-next-line */ + /** @phpstan-ignore method.dynamicName,return.type */ return $criteria->{$this->criteria}(...$this->criteriaArguments); } } diff --git a/src/Repository.php b/src/Repository.php index 94325f9..61fc0b6 100644 --- a/src/Repository.php +++ b/src/Repository.php @@ -4,19 +4,23 @@ namespace WyriHaximus\React\SimpleORM; +use DateTimeImmutable; use DateTimeInterface; +use Latitude\QueryBuilder\CriteriaInterface; use Latitude\QueryBuilder\ExpressionInterface; use Latitude\QueryBuilder\Query\SelectQuery; use Latitude\QueryBuilder\QueryFactory; use Latitude\QueryBuilder\QueryInterface; use Ramsey\Uuid\Uuid; -use React\Promise\LazyPromise; +use React\EventLoop\Loop; use React\Promise\Promise; use React\Promise\PromiseInterface; +use ReflectionClass; +use RuntimeException; use Rx\Observable; use Rx\Scheduler\ImmediateScheduler; use Rx\Subject\Subject; -use Safe\DateTimeImmutable; +use Throwable; use WyriHaximus\React\SimpleORM\Attribute\JoinInterface; use WyriHaximus\React\SimpleORM\Query\Limit; use WyriHaximus\React\SimpleORM\Query\Order; @@ -24,9 +28,12 @@ use WyriHaximus\React\SimpleORM\Query\Where; use WyriHaximus\React\SimpleORM\Query\Where\Expression; use WyriHaximus\React\SimpleORM\Query\Where\Field; +use WyriHaximus\React\SimpleORM\Tools\IncrementingInteger; +use WyriHaximus\React\SimpleORM\Tools\LazyPromise; use function array_key_exists; use function array_values; +use function date; use function explode; use function is_scalar; use function is_string; @@ -34,24 +41,21 @@ use function Latitude\QueryBuilder\field; use function Latitude\QueryBuilder\func; use function Latitude\QueryBuilder\on; -use function Safe\date; use function spl_object_hash; use function strpos; use function substr; - -use const WyriHaximus\Constants\Boolean\TRUE_; -use const WyriHaximus\Constants\Numeric\ONE; -use const WyriHaximus\Constants\Numeric\ZERO; +use function var_export; +use function WyriHaximus\React\awaitObservable; /** - * @template T + * @template T of EntityInterface * @template-implements RepositoryInterface */ final class Repository implements RepositoryInterface { - private const DATE_TIME_TIMEZONE_FORMAT = 'Y-m-d H:i:s e'; - private const SINGLE = 1; - private const STREAM_PER_PAGE = 100; + private const string DATE_TIME_TIMEZ1_FORMAT = 'Y-m-d H:i:s e'; + private const int SINGLE = 1; + private const int STREAM_PER_PAGE = 100; /** @var ExpressionInterface[] */ private array $fields = []; @@ -59,98 +63,114 @@ final class Repository implements RepositoryInterface /** @var string[] */ private array $tableAliases = []; + /** @param InspectedEntityInterface $entity */ public function __construct( - private InspectedEntityInterface $entity, - private ClientInterface $client, - private QueryFactory $queryFactory, - private Connection $connection, - private Hydrator $hydrator, + private readonly InspectedEntityInterface $entity, + private readonly ClientInterface $client, + private readonly QueryFactory $queryFactory, + private readonly Connection $connection, + private readonly Hydrator $hydrator, ) { } - /** @return PromiseInterface */ - public function count(Where|null $where = null): PromiseInterface + /** @phpstan-ignore ergebnis.noParameterWithNullDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration */ + public function count(Where|null $where = null): int { $query = $this->queryFactory->select(alias(func('COUNT', '*'), 'count'))->from(alias($this->entity->table(), 't0')); if ($where instanceof Where) { $query = $this->applyWhereToQuery($where, $query); } - return $this->connection->query( - $query->asExpression(), - )->take(self::SINGLE)->toPromise()->then(static function (array $row): int { - return (int) $row['count']; - }); + /** @var false|int $count */ + $count = false; + foreach ( + $this->connection->query( + $query->asExpression(), + ) as $row + ) { + if ($count !== false) { + continue; + } + /** @phpstan-ignore cast.int */ + $count = (int) $row['count']; + } + + if ($count !== false ) {return $count;} + + throw new RuntimeException('Could not count rows'); } - /** @return Observable */ - public function page(int $page, Where|null $where = null, Order|null $order = null, int $perPage = RepositoryInterface::DEFAULT_PER_PAGE): Observable + /** + * @return iterable + * + * @phpstan-ignore ergebnis.noParameterWithNullDefaultValue,ergebnis.noParameterWithNullDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullableTypeDeclaration + */ + public function page(int $page, Where|null $where = null, Order|null $order = null, int $perPage = RepositoryInterface::DEFAULT_PER_PAGE): iterable { $query = $this->buildSelectQuery($where ?? new Where(), $order ?? new Order()); $query = $query->limit($perPage)->offset(--$page * $perPage); - return $this->fetchAndHydrate($query); + yield from $this->fetchAndHydrate($query); } - /** @return Observable */ - public function fetch(SectionInterface ...$sections): Observable + /** @return iterable */ + public function fetch(SectionInterface ...$sections): iterable { $query = $this->buildSelectQuery(...$sections); foreach ($sections as $section) { - if (! ($section instanceof Limit) || $section->limit() <= ZERO) { + if (! ($section instanceof Limit) || $section->limit() <= 0) { continue; } - $query = $query->limit($section->limit())->offset(ZERO); + $query = $query->limit($section->limit())->offset(0); } - return $this->fetchAndHydrate($query); + yield from $this->fetchAndHydrate($query); } - /** @return Observable */ - public function stream(SectionInterface ...$sections): Observable + /** @return T */ + public function first(SectionInterface ...$sections): EntityInterface { - $stream = new Subject(); - $query = $this->buildSelectQuery(...$sections); + /** @var false|T $first */ + $first = false; + foreach ($this->fetch(...[...$sections, new Limit(1)]) as $row) { + if ($first !== false) { + continue; + } + $first = $row; + } - $page = function (int $offset) use (&$page, $query, $stream): void { - $q = clone $query; + if ($first !== false ) {return $first;} - $hasRows = false; - $this->fetchAndHydrate($q->limit(self::STREAM_PER_PAGE)->offset($offset))->subscribe( - /** @psalm-suppress MissingClosureParamType */ - static function ($value) use (&$hasRows, $stream): void { - if ($stream->isDisposed()) { - return; - } + throw new RuntimeException('Could not find first item'); + } - $hasRows = true; - $stream->onNext($value); - }, - [$stream, 'onError'], - static function () use (&$hasRows, &$page, $stream, $offset): void { - if (! $hasRows || $stream->isDisposed()) { - $stream->onCompleted(); + /** @return iterable */ + public function stream(SectionInterface ...$sections): iterable + { + $query = $this->buildSelectQuery(...$sections); - return; - } + $offset = 0; + do { + $hasRows = false; - $page($offset + self::STREAM_PER_PAGE); - }, - ); - }; + $q = clone $query; + foreach ($this->fetchAndHydrate($q->limit(self::STREAM_PER_PAGE)->offset($offset)) as $row) { + $hasRows = true; - $page(ZERO); + yield $row; + } - return $stream; + $offset += self::STREAM_PER_PAGE; + } while ($hasRows); } /** * @param array $fields * - * @return PromiseInterface + * @return T */ - public function create(array $fields): PromiseInterface + public function create(array $fields): EntityInterface { $id = Uuid::getFactory()->uuid4()->toString(); $fields['id'] = $id; @@ -159,63 +179,100 @@ public function create(array $fields): PromiseInterface $fields = $this->prepareFields($fields); - return $this->connection->query( - $this->queryFactory->insert($this->entity->table(), $fields)->asExpression(), - )->toPromise()->then(function () use ($id): PromiseInterface { - return $this->fetch(new Where( + foreach ( + $this->connection->query( + $this->queryFactory->insert($this->entity->table(), $fields)->asExpression(), + ) as $underscore + ) { + } + + /** @var false|T $first */ + $first = false; + foreach ( + $this->fetch(new Where( new Where\Field( 'id', 'eq', [$id], ), - ))->take(ONE)->toPromise(); - }); + )) as $item + ) { + if ($first !== false) { + continue; + } + $first = $item; + } + + if ($first !== false ) {return $first;} + + throw new RuntimeException('Could not create item'); } - /** @return PromiseInterface */ - public function update(EntityInterface $entity): PromiseInterface + /** @return T */ + public function update(EntityInterface $entity): EntityInterface { $fields = $this->hydrator->extract($entity); $fields['modified'] = new DateTimeImmutable(); $fields = $this->prepareFields($fields); - return $this->connection->query( - $this->queryFactory->update($this->entity->table(), $fields)-> - where(field('id')->eq($entity->id))->asExpression(), - )->toPromise()->then(function () use ($entity): PromiseInterface { - return $this->fetch(new Where( + foreach ( + $this->connection->query( + $this->queryFactory->update( + $this->entity->table(), + $fields, + )->where( + /** @phpstan-ignore property.notFound */ + field('id')->eq($entity->id), + )->asExpression(), + ) as $underscore + ) { + } + + /** @var false|T $first */ + $first = false; + foreach ( + $this->fetch(new Where( + /** @phpstan-ignore property.notFound */ new Where\Field('id', 'eq', [$entity->id]), - ), new Limit(ONE))->toPromise(); - }); + ), new Limit(1)) as $updatedEnitty + ) { + if ($first !== false) { + continue; + } + $first = $updatedEnitty; + } + + if ($first !== false ) {return $first;} + + throw new RuntimeException('Could not update item'); } - /** @return PromiseInterface */ - public function delete(EntityInterface $entity): PromiseInterface + /** @param T $entity */ + public function delete(EntityInterface $entity): null { - return $this->connection->query( - $this->queryFactory->delete($this->entity->table())-> - where(field('id')->eq($entity->id))->asExpression(), - )->toPromise(); + $this->connection->query( + $this->queryFactory->delete( + $this->entity->table(), + )->where( + /** @phpstan-ignore property.notFound */ + field('id')->eq($entity->id), + )->asExpression(), + ); + + return null; } - /** - * @param array $sections - * - * @phpstan-ignore-next-line - */ private function buildSelectQuery(SectionInterface ...$sections): SelectQuery { $query = $this->buildBaseSelectQuery(); $query = $query->columns(...array_values($this->fields)); foreach ($sections as $section) { - /** @phpstan-ignore-next-line */ - switch (TRUE_) { + /** @phpstan-ignore ergebnis.noSwitch */ + switch (true) { case $section instanceof Where: - /** @psalm-suppress ArgumentTypeCoercion */ $query = $this->applyWhereToQuery($section, $query); break; case $section instanceof Order: - /** @psalm-suppress UndefinedInterfaceMethod */ foreach ($section->orders() as $by) { $field = $this->translateFieldName($by->field()); $query = $query->orderBy($field, $by->order()); @@ -232,16 +289,22 @@ private function applyWhereToQuery(Where $constraints, SelectQuery $query): Sele { foreach ($constraints->wheres() as $i => $constraint) { if ($constraint instanceof Expression) { - $where = $constraint->expression(); - $where = $constraint->applyExpression($where); + $where = $constraint->applyExpression( + $constraint->expression(), + ); } elseif ($constraint instanceof Field) { - $where = field($this->translateFieldName($constraint->field())); - $where = $constraint->applyCriteria($where); + $where = $constraint->applyCriteria( + field( + $this->translateFieldName( + $constraint->field(), + ), + ), + ); } else { continue; } - if ($i === ZERO) { + if ($i === 0) { $query = $query->where($where); continue; } @@ -254,66 +317,68 @@ private function applyWhereToQuery(Where $constraints, SelectQuery $query): Sele private function buildBaseSelectQuery(): SelectQuery { - $i = ZERO; + $i = new IncrementingInteger(); $tableKey = spl_object_hash($this->entity) . '___root'; - $this->tableAliases[$tableKey] = 't' . $i++; + $this->tableAliases[$tableKey] = 't' . $i->getNext(); $query = $this->queryFactory->select()->from(alias($this->entity->table(), $this->tableAliases[$tableKey])); foreach ($this->entity->fields() as $field) { - $this->fields[$this->tableAliases[$tableKey] . '___' . $field->name()] = alias($this->tableAliases[$tableKey] . '.' . $field->name(), $this->tableAliases[$tableKey] . '___' . $field->name()); + $this->fields[$this->tableAliases[$tableKey] . '___' . $field->column] = alias( + $this->tableAliases[$tableKey] . '.' . $field->column, + $this->tableAliases[$tableKey] . '___' . $field->column, + ); } +// var_export($this->fields); + $query = $this->buildJoins($query, $this->entity, $i); return $query; } - private function buildJoins(SelectQuery $query, InspectedEntityInterface $entity, int &$i, string $rootProperty = 'root'): SelectQuery + /** @param InspectedEntityInterface $entity */ + private function buildJoins(SelectQuery $query, InspectedEntityInterface $entity, IncrementingInteger $i, string $rootProperty = 'root'): SelectQuery { foreach ($entity->joins() as $join) { - if ($join->type() !== 'inner') { + if ($join->type !== 'inner') { continue; } - if ($join->lazy() === JoinInterface::IS_LAZY) { + if ($join->lazy === JoinInterface::IS_LAZY) { continue; } - if ($entity->class() === $join->entity()->class()) { + if ($entity->class() === $join->entity->class()) { continue; } $tableKey = spl_object_hash($join->entity) . '___' . $join->property; if (! array_key_exists($tableKey, $this->tableAliases)) { - $this->tableAliases[$tableKey] = 't' . $i++; + $this->tableAliases[$tableKey] = 't' . $i->getNext(); } $clauses = null; foreach ($join->clause as $clause) { $onLeftSide = $this->tableAliases[$tableKey] . '.' . $clause->foreignKey; if ($clause->foreignFunction !== null) { - /** @psalm-suppress PossiblyNullOperand */ $onLeftSide = $clause->foreignFunction . '(' . $onLeftSide . ')'; } if ($clause->foreignCast !== null) { - /** @psalm-suppress PossiblyNullOperand */ $onLeftSide = 'CAST(' . $onLeftSide . ' AS ' . $clause->foreignCast . ')'; } $onRightSide = $this->tableAliases[spl_object_hash($entity) . '___' . $rootProperty] . '.' . $clause->localKey; if ($clause->localFunction !== null) { - /** @psalm-suppress PossiblyNullOperand */ $onRightSide = $clause->localFunction . '(' . $onRightSide . ')'; } if ($clause->localCast !== null) { - /** @psalm-suppress PossiblyNullOperand */ $onRightSide = 'CAST(' . $onRightSide . ' AS ' . $clause->localCast . ')'; } - if ($clauses === null) { + if (! $clauses instanceof CriteriaInterface) { $clauses = on($onLeftSide, $onRightSide); continue; @@ -322,8 +387,7 @@ private function buildJoins(SelectQuery $query, InspectedEntityInterface $entity $clauses = on($onLeftSide, $onRightSide)->and($clauses); } - if ($clauses !== null) { - /** @psalm-suppress PossiblyNullArgument */ + if ($clauses instanceof CriteriaInterface) { $query = $query->innerJoin( alias( $join->entity->table(), @@ -334,29 +398,38 @@ private function buildJoins(SelectQuery $query, InspectedEntityInterface $entity } foreach ($join->entity->fields() as $field) { - $this->fields[$this->tableAliases[$tableKey] . '___' . $field->name()] = alias($this->tableAliases[$tableKey] . '.' . $field->name(), $this->tableAliases[$tableKey] . '___' . $field->name()); + $this->fields[$this->tableAliases[$tableKey] . '___' . $field->column] = alias($this->tableAliases[$tableKey] . '.' . $field->column, $this->tableAliases[$tableKey] . '___' . $field->column); } unset($this->fields[$entity->table() . '___' . $join->property]); + /** @phpstan-ignore argument.type */ $query = $this->buildJoins($query, $join->entity, $i, $join->property); } return $query; } - /** @return Observable */ - private function fetchAndHydrate(QueryInterface $query): Observable + /** @return iterable */ + private function fetchAndHydrate(QueryInterface $query): iterable { - return $this->connection->query( - $query->asExpression(), - )->map(function (array $row): array { - return $this->inflate($row); - })->map(function (array $row): array { - return $this->buildTree($row, $this->entity); - })->map(function (array $row): EntityInterface { - return $this->hydrator->hydrate($this->entity, $row); - }); + foreach ( + $this->connection->query( + $query->asExpression(), + ) as $row + ) { +// var_export([$row, $this->buildTree( +// $this->inflate($row), +// $this->entity, +// ), $query->asExpression()->sql(new PostgresEngine())]); + yield $this->hydrator->hydrate( + $this->entity, + $this->buildTree( + $this->inflate($row), + $this->entity, + ), + ); + } } /** @@ -378,6 +451,7 @@ private function inflate(array $row): array /** * @param array> $row + * @param InspectedEntityInterface $entity * * @return array */ @@ -387,73 +461,136 @@ private function buildTree(array $row, InspectedEntityInterface $entity, string $tree = $row[$this->tableAliases[$tableKey]]; foreach ($entity->joins() as $join) { - if ($join->type() === 'inner' && $entity->class() !== $join->entity()->class() && $join->lazy() === false) { - $tree[$join->property()] = $this->buildTree($row, $join->entity(), $join->property()); + if ($join->type === 'inner' && $entity->class() !== $join->entity->class() && $join->lazy === false) { + /** @phpstan-ignore argument.type */ + $tree[$join->property] = $this->buildTree($row, $join->entity, $join->property); continue; } - if ($join->type() === 'inner' && ($join->lazy() === JoinInterface::IS_LAZY || $entity->class() === $join->entity()->class())) { - $tree[$join->property()] = new LazyPromise(function () use ($row, $join, $tableKey): PromiseInterface { - return new Promise(function (callable $resolve, callable $reject) use ($row, $join, $tableKey): void { - foreach ($join->clause() as $clause) { - if ($row[$this->tableAliases[$tableKey]][$clause->localKey] === null) { - $resolve(null); + if ($join->type === 'inner' && ($join->lazy === JoinInterface::IS_LAZY || $entity->class() === $join->entity->class())) { + /** @phpstan-ignore argument.type */ + $tree[$join->property] = new ReflectionClass($join->entity->class())->newLazyProxy(function () use ($row, $join, $tableKey): EntityInterface|null { +// var_export([$row, $join, $tableKey]); + foreach ($join->clause as $clause) { + if ($row[$this->tableAliases[$tableKey]][$clause->localKey] === null) { + return null; + } + } - return; - } + $where = []; + + foreach ($join->clause as $clause) { + $onLeftSide = $clause->foreignKey; + if ($clause->foreignFunction !== null) { + /** @phpstan-ignore shipmonk.variableTypeOverwritten */ + $onLeftSide = func($clause->foreignFunction, $onLeftSide); } - $where = []; - - foreach ($join->clause() as $clause) { - $onLeftSide = $clause->foreignKey; - if ($clause->foreignFunction !== null) { - /** @psalm-suppress PossiblyNullArgument */ - $onLeftSide = func($clause->foreignFunction, $onLeftSide); - } - - if ($clause->foreignCast !== null) { - /** @psalm-suppress PossiblyNullArgument */ - $onLeftSide = alias(func('CAST', $onLeftSide), $clause->foreignCast); - } - - if (is_string($onLeftSide)) { - $where[] = new Where\Field( - $onLeftSide, - 'eq', - [ - $row[$this->tableAliases[$tableKey]][$clause->localKey], - ], - ); - } else { - $where[] = new Where\Expression( - $onLeftSide, - 'eq', - [ - $row[$this->tableAliases[$tableKey]][$clause->localKey], - ], - ); - } + if ($clause->foreignCast !== null) { + $onLeftSide = alias(func('CAST', $onLeftSide), $clause->foreignCast); } - $this->client - ->repository($join->entity() - ->class()) - ->fetch(new Where(...$where), new Limit(self::SINGLE)) - ->toPromise() - ->then($resolve, $reject); - }); + if (is_string($onLeftSide)) { + $where[] = new Where\Field( + $onLeftSide, + 'eq', + [ + $row[$this->tableAliases[$tableKey]][$clause->localKey], + ], + ); + } else { + $where[] = new Where\Expression( + $onLeftSide, + 'eq', + [ + $row[$this->tableAliases[$tableKey]][$clause->localKey], + ], + ); + } + } + + foreach ( + $this->client + ->repository( + $join->entity->class(), + ) + ->fetch( + new Where(...$where), + new Limit(self::SINGLE), + ) as $entity + ) { + return $entity; + } + + return null; }); + /** @phpstan-ignore method.deprecatedClass,new.deprecatedClass */ + $tree[$join->property] = new LazyPromise(fn (): PromiseInterface => new Promise(function (callable $resolve, callable $reject) use ($row, $join, $tableKey): void { + foreach ($join->clause as $clause) { + if ($row[$this->tableAliases[$tableKey]][$clause->localKey] === null) { + $resolve(null); + + return; + } + } + + $where = []; + + foreach ($join->clause as $clause) { + $onLeftSide = $clause->foreignKey; + if ($clause->foreignFunction !== null) { + /** @phpstan-ignore shipmonk.variableTypeOverwritten */ + $onLeftSide = func($clause->foreignFunction, $onLeftSide); + } + + if ($clause->foreignCast !== null) { + $onLeftSide = alias(func('CAST', $onLeftSide), $clause->foreignCast); + } + + if (is_string($onLeftSide)) { + $where[] = new Where\Field( + $onLeftSide, + 'eq', + [ + $row[$this->tableAliases[$tableKey]][$clause->localKey], + ], + ); + } else { + $where[] = new Where\Expression( + $onLeftSide, + 'eq', + [ + $row[$this->tableAliases[$tableKey]][$clause->localKey], + ], + ); + } + } + + try { + $resolve([ + ...$this->client + ->repository( + $join->entity->class(), + ) + ->fetch( + new Where(...$where), + new Limit(self::SINGLE), + ), + ]); + } catch (Throwable $throwable) { + $reject($throwable); + } + })); continue; } - $tree[$join->property()] = Observable::defer( + $tree[$join->property] = awaitObservable(Observable::defer( function () use ($row, $join, $tableKey): Observable { $where = []; - foreach ($join->clause() as $clause) { + foreach ($join->clause as $clause) { $where[] = new Where\Field( $clause->foreignKey, 'eq', @@ -463,10 +600,19 @@ function () use ($row, $join, $tableKey): Observable { ); } - return $this->client->repository($join->entity()->class())->fetch(new Where(...$where)); + $subject = new Subject(); + Loop::futureTick(function () use ($subject, $join, $where): void { + foreach ($this->client->repository($join->entity->class())->fetch(new Where(...$where)) as $row) { + $subject->onNext($row); + } + + $subject->onCompleted(); + }); + + return $subject; }, new ImmediateScheduler(), - ); + )); } return $tree; @@ -474,12 +620,20 @@ function () use ($row, $join, $tableKey): Observable { private function translateFieldName(string $name): string { - $pos = strpos($name, '('); + $column = $name; + foreach ($this->entity->fields() as $field) { + if ($field->name === $name) { + $column = $field->column; + break; + } + } + + $pos = strpos($column, '('); if ($pos === false) { - return 't0.' . $name; + return 't0.' . $column; } - return substr($name, ZERO, $pos + ONE) . 't0.' . substr($name, $pos + ONE); + return substr($column, 0, $pos + 1) . 't0.' . substr($column, $pos + 1); } /** @@ -489,21 +643,31 @@ private function translateFieldName(string $name): string */ private function prepareFields(array $fields): array { + $fieldsWithColumns = []; foreach ($fields as $key => $value) { + $column = $key; + foreach ($this->entity->fields() as $field) { + if ($field->name === $key) { + $column = $field->column; + break; + } + } + if ($value instanceof DateTimeInterface) { - $fields[$key] = $value = date( - self::DATE_TIME_TIMEZONE_FORMAT, + /** @phpstan-ignore shipmonk.variableTypeOverwritten */ + $value = date( + self::DATE_TIME_TIMEZ1_FORMAT, (int) $value->format('U'), ); } - if (is_scalar($value)) { + if (! is_scalar($value)) { continue; } - unset($fields[$key]); + $fieldsWithColumns[$column] = $value; } - return $fields; + return $fieldsWithColumns; } } diff --git a/src/RepositoryInterface.php b/src/RepositoryInterface.php index 55ed75d..8344a5d 100644 --- a/src/RepositoryInterface.php +++ b/src/RepositoryInterface.php @@ -4,47 +4,46 @@ namespace WyriHaximus\React\SimpleORM; -use React\Promise\PromiseInterface; -use Rx\Observable; use WyriHaximus\React\SimpleORM\Query\Order; use WyriHaximus\React\SimpleORM\Query\SectionInterface; use WyriHaximus\React\SimpleORM\Query\Where; -/** @template T */ +/** + * @api + * @template T of EntityInterface + */ interface RepositoryInterface { - public const DEFAULT_PER_PAGE = 50; + public const int DEFAULT_PER_PAGE = 50; - /** - * @return PromiseInterface - * - * @phpstan-ignore-next-line - */ - public function count(Where|null $where = null): PromiseInterface; + /** @phpstan-ignore ergebnis.noParameterWithNullDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration */ + public function count(Where|null $where = null): int; /** - * @return Observable + * @return iterable * - * @phpstan-ignore-next-line + * @phpstan-ignore ergebnis.noParameterWithNullDefaultValue,ergebnis.noParameterWithNullDefaultValue,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullableTypeDeclaration */ - public function page(int $page, Where|null $where = null, Order|null $order = null, int $perPage = self::DEFAULT_PER_PAGE): Observable; + public function page(int $page, Where|null $where = null, Order|null $order = null, int $perPage = self::DEFAULT_PER_PAGE): iterable; + + /** @return iterable */ + public function fetch(SectionInterface ...$sections): iterable; - /** @return Observable */ - public function fetch(SectionInterface ...$sections): Observable; + /** @return T */ + public function first(SectionInterface ...$sections): EntityInterface; - /** @return Observable */ - public function stream(SectionInterface ...$sections): Observable; + /** @return iterable */ + public function stream(SectionInterface ...$sections): iterable; /** * @param array $fields * - * @return PromiseInterface + * @return T */ - public function create(array $fields): PromiseInterface; + public function create(array $fields): EntityInterface; - /** @return PromiseInterface */ - public function update(EntityInterface $entity): PromiseInterface; + /** @return T */ + public function update(EntityInterface $entity): EntityInterface; - /** @return PromiseInterface */ - public function delete(EntityInterface $entity): PromiseInterface; + public function delete(EntityInterface $entity): null; } diff --git a/src/Tools/IncrementingInteger.php b/src/Tools/IncrementingInteger.php new file mode 100644 index 0000000..f480ac3 --- /dev/null +++ b/src/Tools/IncrementingInteger.php @@ -0,0 +1,15 @@ +value++; + } +} diff --git a/src/Tools/LazyPromise.php b/src/Tools/LazyPromise.php new file mode 100644 index 0000000..b57b3a6 --- /dev/null +++ b/src/Tools/LazyPromise.php @@ -0,0 +1,78 @@ +factory = $factory; + } + + public function then(callable|null $onFulfilled = null, callable|null $onRejected = null): PromiseInterface + { + return $this->promise()->then($onFulfilled, $onRejected); + } + + public function done(callable|null $onFulfilled = null, callable|null $onRejected = null): PromiseInterface + { + return $this->promise()->done($onFulfilled, $onRejected); + } + + public function catch(callable $onRejected): PromiseInterface + { + return $this->promise()->catch($onRejected); + } + + public function otherwise(callable $onRejected): PromiseInterface + { + return $this->promise()->catch($onRejected); + } + + public function finally(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->promise()->finally($onFulfilledOrRejected); + } + + public function always(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->promise()->finally($onFulfilledOrRejected); + } + + public function cancel(): void + { + $this->promise()->cancel(); + } + + /** + * @internal + * + * @see Promise::settle() + */ + public function promise(): PromiseInterface|null + { + if (! $this->promise instanceof PromiseInterface) { + try { + $this->promise = resolve(call_user_func($this->factory)); + } catch (Throwable $exception) { + $this->promise = reject($exception); + } + } + + return $this->promise; + } +} diff --git a/src/Tools/WithFieldsTrait.php b/src/Tools/WithFieldsTrait.php index 4468aa9..299d24f 100644 --- a/src/Tools/WithFieldsTrait.php +++ b/src/Tools/WithFieldsTrait.php @@ -11,16 +11,16 @@ trait WithFieldsTrait /** @param array $fields */ public function withFields(array $fields): self { - $clone = clone $this; - + $safeFields = []; foreach ($fields as $key => $value) { if (in_array($key, ['id', 'created', 'modified'], true)) { continue; } - $clone->$key = $value; /** @phpstan-ignore-line */ + /** @phpstan-ignore property.dynamicName */ + $safeFields[$key] = $value; } - return $clone; + return clone($this, $safeFields); } } diff --git a/tests/ClientTest.php b/tests/ClientTest.php index a9ba725..5569967 100644 --- a/tests/ClientTest.php +++ b/tests/ClientTest.php @@ -4,69 +4,51 @@ namespace WyriHaximus\React\Tests\SimpleORM; -use Doctrine\Common\Annotations\Reader; use Latitude\QueryBuilder\QueryFactory; +use Mockery; +use Mockery\MockInterface; use PgAsync\Client as PgClient; -use Prophecy\Argument; -use Prophecy\Prophecy\ObjectProphecy; -use ReflectionClass; +use PHPUnit\Framework\Attributes\Before; +use PHPUnit\Framework\Attributes\Test; use Rx\Observable; use WyriHaximus\AsyncTestUtilities\AsyncTestCase; use WyriHaximus\React\SimpleORM\Adapter\Postgres; -use WyriHaximus\React\SimpleORM\Attribute\Table; use WyriHaximus\React\SimpleORM\Client; -use WyriHaximus\React\Tests\SimpleORM\Stub\UserStub; +use WyriHaximus\React\SimpleORM\Configuration; use function Latitude\QueryBuilder\field; -use function React\Async\await; final class ClientTest extends AsyncTestCase { - private ObjectProphecy $pgClient; - - private ObjectProphecy $annotationReader; + private MockInterface&PgClient $pgClient; private Client $client; - protected function setUp(): void + #[Before] + public function setupMocks(): void { - parent::setUp(); - - $this->pgClient = $this->prophesize(PgClient::class); - $this->annotationReader = $this->prophesize(Reader::class); - $this->client = Client::createWithAnnotationReader(new Postgres($this->pgClient->reveal()), $this->annotationReader->reveal()); + $this->pgClient = Mockery::mock(PgClient::class); + $this->client = Client::create(new Postgres($this->pgClient), new Configuration('')); } - public function testGetRepository(): void + #[Test] + public function fetch(): void { - $this->annotationReader->getClassAnnotation( - Argument::type(ReflectionClass::class), - Table::class, - )->shouldBeCalled()->willReturn(new Table(['users'])); - - $this->annotationReader->getClassAnnotations( - Argument::type(ReflectionClass::class), - )->shouldBeCalled()->willReturn([ - new Table(['users']), - ]); - - $this->client->repository(UserStub::class); - } - - public function testFetch(): void - { - $query = (new QueryFactory())->select()->from('table')->where(field('id')->eq(1))->asExpression(); - - $this->pgClient->executeStatement('SELECT * FROM "table" WHERE "id" = $1', [1])->shouldBeCalled()->willReturn( - Observable::fromArray([ - [ - 'id' => 1, - 'title' => 'Title', - ], - ]), - ); - - $rows = await($this->client->query($query)->toArray()->toPromise()); + $query = new QueryFactory()->select()->from('table')->where(field('id')->eq(1))->asExpression(); + + $this->pgClient->shouldReceive('executeStatement') + ->once() + ->with('SELECT * FROM "table" WHERE "id" = $1', [1]) + ->andReturn( + Observable::fromArray([ + [ + 'id' => 1, + 'title' => 'Title', + ], + ]), + ); + + $rows = [...$this->client->query($query)]; self::assertCount(1, $rows); } diff --git a/tests/EntityInspectorTest.php b/tests/EntityInspectorTest.php index 854d68e..58bc2bd 100644 --- a/tests/EntityInspectorTest.php +++ b/tests/EntityInspectorTest.php @@ -4,9 +4,12 @@ namespace WyriHaximus\React\Tests\SimpleORM; -use Doctrine\Common\Annotations\AnnotationReader; +use PHPUnit\Framework\Attributes\Before; +use PHPUnit\Framework\Attributes\Test; use RuntimeException; use WyriHaximus\AsyncTestUtilities\AsyncTestCase; +use WyriHaximus\React\SimpleORM\Attribute\Clause; +use WyriHaximus\React\SimpleORM\Configuration; use WyriHaximus\React\SimpleORM\EntityInspector; use WyriHaximus\React\Tests\SimpleORM\Stub\BlogPostStub; use WyriHaximus\React\Tests\SimpleORM\Stub\CommentStub; @@ -19,14 +22,13 @@ final class EntityInspectorTest extends AsyncTestCase { private EntityInspector $entityInspector; - protected function setUp(): void + #[Before] + protected function createEntityInspector(): void { - parent::setUp(); - - $this->entityInspector = new EntityInspector(new Configuration(''), new AnnotationReader()); + $this->entityInspector = new EntityInspector(new Configuration('')); } - /** @test */ + #[Test] public function inspect(): void { $inspectedEntity = $this->entityInspector->entity(UserStub::class); @@ -37,12 +39,12 @@ public function inspect(): void $fields = $inspectedEntity->fields(); self::assertCount(2, $fields); self::assertArrayHasKey('id', $fields); - self::assertSame('string', $fields['id']->type()); + self::assertSame('string', $fields['id']->type); self::assertArrayHasKey('name', $fields); - self::assertSame('string', $fields['name']->type()); + self::assertSame('string', $fields['name']->type); } - /** @test */ + #[Test] public function inspectWithJoins(): void { $inspectedEntity = $this->entityInspector->entity(BlogPostStub::class); @@ -56,55 +58,62 @@ public function inspectWithJoins(): void foreach ( [ 'id' => 'string', - 'previous_blog_post_id' => 'string', - 'next_blog_post_id' => 'string', - 'author_id' => 'string', + 'previousBlogPostId' => '?string', + 'nextBlogPostId' => '?string', + 'authorId' => 'string', + 'publisherId' => 'string', 'title' => 'string', 'contents' => 'string', 'views' => 'int', - 'created' => 'string', - 'modified' => 'string', + 'created' => 'DateTimeImmutable', + 'modified' => 'DateTimeImmutable', ] as $key => $type ) { self::assertArrayHasKey($key, $fields, $key); - self::assertSame($type, $fields[$key]->type(), $key); + self::assertSame($type, $fields[$key]->type, $key); } $joins = $inspectedEntity->joins(); self::assertCount(5, $joins); self::assertArrayHasKey('author', $joins); - self::assertSame(UserStub::class, $joins['author']->entity()->class()); - self::assertSame('author_id', current($joins['author']->clause())->localKey()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['author']->clause())->localCast()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['author']->clause())->localFunction()); /** @phpstan-ignore-line */ - self::assertSame('id', current($joins['author']->clause())->foreignKey()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['author']->clause())->foreignCast()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['author']->clause())->foreignFunction()); /** @phpstan-ignore-line */ - self::assertSame('author', $joins['author']->property()); - - self::assertSame(CommentStub::class, $joins['comments']->entity()->class()); - self::assertSame('id', current($joins['comments']->clause())->localKey()); /** @phpstan-ignore-line */ - self::assertSame('BIGINT', current($joins['comments']->clause())->localCast()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['comments']->clause())->localFunction()); /** @phpstan-ignore-line */ - self::assertSame('blog_post_id', current($joins['comments']->clause())->foreignKey()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['comments']->clause())->foreignCast()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['comments']->clause())->foreignFunction()); /** @phpstan-ignore-line */ - self::assertSame('comments', $joins['comments']->property()); - - self::assertArrayHasKey('author', $joins['comments']->entity()->joins()); - self::assertSame(UserStub::class, $joins['comments']->entity()->joins()['author']->entity()->class()); - self::assertCount(2, $joins['comments']->entity()->joins()['author']->entity()->fields()); - self::assertSame('author_id', current($joins['comments']->entity()->joins()['author']->clause())->localKey()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['comments']->entity()->joins()['author']->clause())->localCast()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['comments']->entity()->joins()['author']->clause())->localFunction()); /** @phpstan-ignore-line */ - self::assertSame('id', current($joins['comments']->entity()->joins()['author']->clause())->foreignKey()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['comments']->entity()->joins()['author']->clause())->foreignCast()); /** @phpstan-ignore-line */ - self::assertNull(current($joins['comments']->entity()->joins()['author']->clause())->foreignFunction()); /** @phpstan-ignore-line */ - self::assertSame('author', $joins['comments']->entity()->joins()['author']->property()); + self::assertSame(UserStub::class, $joins['author']->entity->class()); + $authorClause = current($joins['author']->clause); + self::assertInstanceOf(Clause::class, $authorClause); + self::assertSame('author_id', $authorClause->localKey); + self::assertNull($authorClause->localCast); + self::assertNull($authorClause->localFunction); + self::assertSame('id', $authorClause->foreignKey); + self::assertNull($authorClause->foreignCast); + self::assertNull($authorClause->foreignFunction); + self::assertSame('author', $joins['author']->property); + + self::assertSame(CommentStub::class, $joins['comments']->entity->class()); + $commentClause = current($joins['comments']->clause); + self::assertInstanceOf(Clause::class, $commentClause); + self::assertSame('id', $commentClause->localKey); + self::assertSame('BIGINT', $commentClause->localCast); + self::assertNull($commentClause->localFunction); + self::assertSame('blog_post_id', $commentClause->foreignKey); + self::assertNull($commentClause->foreignCast); + self::assertNull($commentClause->foreignFunction); + self::assertSame('comments', $joins['comments']->property); + + self::assertArrayHasKey('author', $joins['comments']->entity->joins()); + self::assertSame(UserStub::class, $joins['comments']->entity->joins()['author']->entity->class()); + self::assertCount(2, $joins['comments']->entity->joins()['author']->entity->fields()); + $commentAuthorClause = current($joins['comments']->entity->joins()['author']->clause); + self::assertInstanceOf(Clause::class, $commentAuthorClause); + self::assertSame('author_id', $commentAuthorClause->localKey); + self::assertNull($commentAuthorClause->localCast); + self::assertNull($commentAuthorClause->localFunction); + self::assertSame('id', $commentAuthorClause->foreignKey); + self::assertNull($commentAuthorClause->foreignCast); + self::assertNull($commentAuthorClause->foreignFunction); + self::assertSame('author', $joins['comments']->entity->joins()['author']->property); } - /** @test */ + #[Test] public function inspectWithoutTable(): void { self::expectException(RuntimeException::class); diff --git a/tests/FunctionalTest.php b/tests/FunctionalTest.php index 7d78cbc..dda874c 100644 --- a/tests/FunctionalTest.php +++ b/tests/FunctionalTest.php @@ -5,9 +5,14 @@ namespace WyriHaximus\React\Tests\SimpleORM; use PgAsync\Client as PgClient; +use PHPUnit\Framework\Attributes\After; +use PHPUnit\Framework\Attributes\Before; +use PHPUnit\Framework\Attributes\Test; use React\EventLoop\Loop; -use React\Promise\PromiseInterface; use Safe\DateTimeImmutable; +use Testcontainers\Container\GenericContainer; +use Testcontainers\Container\StartedTestContainer; +use Testcontainers\Modules\PostgresContainer; use WyriHaximus\AsyncTestUtilities\AsyncTestCase; use WyriHaximus\React\SimpleORM\Adapter\Postgres; use WyriHaximus\React\SimpleORM\Client; @@ -16,33 +21,73 @@ use WyriHaximus\React\SimpleORM\Middleware\QueryCountMiddleware; use WyriHaximus\React\SimpleORM\Query\Limit; use WyriHaximus\React\SimpleORM\Query\Where; +use WyriHaximus\React\SimpleORM\RepositoryInterface; use WyriHaximus\React\Tests\SimpleORM\Stub\BlogPostStub; use WyriHaximus\React\Tests\SimpleORM\Stub\CommentStub; use WyriHaximus\React\Tests\SimpleORM\Stub\LogStub; use WyriHaximus\React\Tests\SimpleORM\Stub\UserStub; +use function array_filter; use function array_map; use function array_values; -use function assert; use function bin2hex; +use function current; +use function dirname; +use function is_string; use function random_bytes; use function React\Async\await; -use function sleep; +use function React\Promise\Timer\sleep; +use function str_contains; use function time; +use function usleep; final class FunctionalTest extends AsyncTestCase { - private ClientInterface $client; + private StartedTestContainer|null $testContainer = null; + private ClientInterface|null $client = null; private QueryCountMiddleware $counter; - protected function setUp(): void + #[Before] + protected function beforeClass(): void { - parent::setUp(); - -// exec('php ./vendor/bin/phinx rollback'); -// exec('php ./vendor/bin/phinx migrate'); -// exec('php ./vendor/bin/phinx seed:run -v'); + $containerName = 'reactphp-simple-orm-test-' . bin2hex(random_bytes(13)); + + $this->testContainer = new PostgresContainer() + ->withPostgresDatabase('postgres') + ->withPostgresUser('postgres') + ->withPostgresPassword('postgres') + ->withName($containerName) + ->start(); + + do { + $ip = current($this->testContainer->getNetworkNames()); + } while (! is_string($ip)); + + $migrationsContainer = new GenericContainer('flyway/flyway') + ->withCommand(['migrate']) + ->withEnvironment([ + 'FLYWAY_LOCATIONS' => 'filesystem:/flyway/migrations', + 'FLYWAY_URL' => 'jdbc:postgresql://' . $this->testContainer->getIpAddress($ip) . ':5432/postgres?searchpath=postgres¤tSchema=postgres&stringtype=unspecified', + 'FLYWAY_USER' => 'postgres', + 'FLYWAY_PASSWORD' => 'postgres', + ]) + ->withMount(dirname(__DIR__) . '/etc/db', '/flyway/migrations') + ->withMount('/var/run/docker.sock', '/var/run/docker.sock') + ->start(); + + $logsBuffer = $migrationsContainer->logs(); + while (! str_contains($logsBuffer, ' (execution time ')) { + /** + * It's fine, this is during setup + * + * @phpstan-ignore wyrihaximus.reactphp.blocking.function.usleep + */ + usleep(100); + $logsBuffer .= $migrationsContainer->logs(); + } + + $migrationsContainer->stop(); $this->counter = new QueryCountMiddleware(1); @@ -50,13 +95,15 @@ protected function setUp(): void new Postgres( new PgClient( [ - 'host' => 'postgres', - 'port' => 55432, + 'host' => $this->testContainer->getIpAddress($ip), + 'port' => 5432, 'user' => 'postgres', 'password' => 'postgres', 'database' => 'postgres', + 'auto_disconnect' => true, + 'max_connections' => 1, + 'tls' => \PgAsync\Connection::TLS_MODE_DISABLE, ], - Loop::get(), ), ), new Configuration(''), @@ -64,14 +111,19 @@ protected function setUp(): void ); } - /** @test */ + #[After] + public function shutdownContainer(): void + { + $this->testContainer?->stop(); + sleep(3); + } + + #[Test] public function usersCount(): void { self::assertSame( 3, - await( - $this->client->repository(UserStub::class)->count(), - ), + $this->client?->repository(UserStub::class)->count(), ); self::assertSame([ @@ -83,14 +135,12 @@ public function usersCount(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function usersCountResultSet(): void { self::assertCount( 3, - await( - $this->client->repository(UserStub::class)->fetch()->toArray()->toPromise(), - ), + [...$this->client?->repository(UserStub::class)->fetch() ?? []], ); self::assertSame([ @@ -102,14 +152,12 @@ public function usersCountResultSet(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function blogPostsCount(): void { self::assertSame( 2, - await( - $this->client->repository(BlogPostStub::class)->count(), - ), + $this->client?->repository(BlogPostStub::class)->count(), ); self::assertSame([ @@ -121,14 +169,12 @@ public function blogPostsCount(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function blogPostsCountResultSet(): void { self::assertCount( 2, - await( - $this->client->repository(BlogPostStub::class)->fetch()->toArray()->toPromise(), - ), + [...$this->client?->repository(BlogPostStub::class)->fetch() ?? []], ); self::assertSame([ @@ -140,17 +186,17 @@ public function blogPostsCountResultSet(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function firstBlogPostCommentCount(): void { - self::assertCount( - 2, - await( - $this->client->repository(BlogPostStub::class)->fetch()->take(1)->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getComments()->toArray()->toPromise(); - }), - ), - ); + foreach ($this->client?->repository(BlogPostStub::class)->fetch() ?? [] as $blogPost) { + if ($blogPost->id !== '53ab5832-9a90-4e6e-988b-06b8b5fed763') { + continue; + } + + self::assertCount(2, [...$blogPost->comments]); + break; + } self::assertSame([ 'initiated' => 2, @@ -161,17 +207,17 @@ public function firstBlogPostCommentCount(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function firstBlogPostAuthorId(): void { - self::assertSame( - 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', - await( - $this->client->repository(BlogPostStub::class)->fetch()->take(1)->toPromise()->then(static function (BlogPostStub $blogPost): string { - return $blogPost->getAuthor()->id(); - }), - ), - ); + $first = false; + foreach ($this->client?->repository(BlogPostStub::class)->fetch() ?? [] as $blogPost) { + if ($first) { + continue; + } + $first = true; + self::assertSame('fb175cbc-04cc-41c7-8e35-6b817ac016ca', $blogPost->author->id); + } self::assertSame([ 'initiated' => 1, @@ -182,17 +228,12 @@ public function firstBlogPostAuthorId(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function firstBlogPostAuthorIdUsingLimit(): void { - self::assertSame( - 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', - await( - $this->client->repository(BlogPostStub::class)->fetch(new Limit(1))->toPromise()->then(static function (BlogPostStub $blogPost): string { - return $blogPost->getAuthor()->id(); - }), - ), - ); + foreach ($this->client?->repository(BlogPostStub::class)->fetch(new Limit(1)) ?? [] as $blogPost) { + self::assertSame('fb175cbc-04cc-41c7-8e35-6b817ac016ca', $blogPost->author->id); + } self::assertSame([ 'initiated' => 1, @@ -203,27 +244,24 @@ public function firstBlogPostAuthorIdUsingLimit(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function firstBlogPostCommentAuthorIds(): void { - self::assertSame( - [ - '2fa0d077-d374-4409-b1ef-9687c6729158', - '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', - ], - array_values( - array_map( - static function (CommentStub $comment): string { - return $comment->getAuthor()->id(); - }, - await( - $this->client->repository(BlogPostStub::class)->fetch()->take(1)->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getComments()->toArray()->toPromise(); - }), + foreach ($this->client?->repository(BlogPostStub::class)->fetch() ?? [] as $blogPost) { + self::assertSame( + [ + '2fa0d077-d374-4409-b1ef-9687c6729158', + '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', + ], + array_values( + array_map( + static fn (CommentStub $comment): string => $comment->author->id, + [...$blogPost->comments], ), ), - ), - ); + ); + break; + } self::assertSame([ 'initiated' => 2, @@ -234,17 +272,13 @@ static function (CommentStub $comment): string { ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function firstBlogPostNextBlogPostResolvesToBlogPost(): void { - self::assertInstanceOf( - BlogPostStub::class, - await( - $this->client->repository(BlogPostStub::class)->fetch()->take(1)->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getNextBlogPost(); - }), - ), - ); + foreach ($this->client?->repository(BlogPostStub::class)->fetch() ?? [] as $blogPost) { + self::assertInstanceOf(BlogPostStub::class, $blogPost->nextBlogPost); + break; + } self::assertSame([ 'initiated' => 2, @@ -255,16 +289,13 @@ public function firstBlogPostNextBlogPostResolvesToBlogPost(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function firstBlogPostPreviousBlogPostResolvesToNull(): void { - self::assertNull( - await( - $this->client->repository(BlogPostStub::class)->fetch()->take(1)->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getPreviousBlogPost(); - }), - ), - ); + foreach ($this->client?->repository(BlogPostStub::class)->fetch() ?? [] as $blogPost) { + self::assertNull($blogPost->previousBlogPost); + break; + } self::assertSame([ 'initiated' => 1, @@ -275,19 +306,21 @@ public function firstBlogPostPreviousBlogPostResolvesToNull(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function secondBlogPostCommentCount(): void { - self::assertCount( - 1, - await( - $this->client->repository(BlogPostStub::class)->fetch()->filter(static function (BlogPostStub $blogPost): bool { - return $blogPost->id() === '090fa83b-5c5a-4042-9f05-58d9ab649a1a'; - })->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getComments()->toArray()->toPromise(); - }), - ), - ); + foreach ( + array_filter( + [...$this->client?->repository(BlogPostStub::class)->fetch() ?? []], + static fn (BlogPostStub $blogPost): bool => $blogPost->id === '090fa83b-5c5a-4042-9f05-58d9ab649a1a', + ) as $blogPost + ) { + self::assertCount( + 1, + [...$blogPost->comments], + ); + break; + } self::assertSame([ 'initiated' => 2, @@ -298,19 +331,21 @@ public function secondBlogPostCommentCount(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function secondBlogPostAuthorId(): void { - self::assertSame( - '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', - await( - $this->client->repository(BlogPostStub::class)->fetch()->filter(static function (BlogPostStub $blogPost): bool { - return $blogPost->id() === '090fa83b-5c5a-4042-9f05-58d9ab649a1a'; - })->toPromise()->then(static function (BlogPostStub $blogPost): string { - return $blogPost->getAuthor()->id(); - }), - ), - ); + foreach ( + array_filter( + [...$this->client?->repository(BlogPostStub::class)->fetch() ?? []], + static fn (BlogPostStub $blogPost): bool => $blogPost->id === '090fa83b-5c5a-4042-9f05-58d9ab649a1a', + ) as $blogPost + ) { + self::assertSame( + '15f25357-4b3d-4d4d-b6a5-2ceb93864b77', + $blogPost->author->id, + ); + break; + } self::assertSame([ 'initiated' => 1, @@ -321,26 +356,26 @@ public function secondBlogPostAuthorId(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function secondBlogPostCommentAuthorIds(): void { - self::assertSame( - ['fb175cbc-04cc-41c7-8e35-6b817ac016ca'], - array_values( - array_map( - static function (CommentStub $comment): string { - return $comment->getAuthor()->id(); - }, - await( - $this->client->repository(BlogPostStub::class)->fetch()->filter(static function (BlogPostStub $blogPost): bool { - return $blogPost->id() === '090fa83b-5c5a-4042-9f05-58d9ab649a1a'; - })->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getComments()->toArray()->toPromise(); - }), + foreach ( + array_filter( + [...$this->client?->repository(BlogPostStub::class)->fetch() ?? []], + static fn (BlogPostStub $blogPost): bool => $blogPost->id === '090fa83b-5c5a-4042-9f05-58d9ab649a1a', + ) as $blogPost + ) { + self::assertSame( + ['fb175cbc-04cc-41c7-8e35-6b817ac016ca'], + array_values( + array_map( + static fn (CommentStub $comment): string => $comment->author->id, + [...$blogPost->comments], ), ), - ), - ); + ); + break; + } self::assertSame([ 'initiated' => 2, @@ -351,21 +386,22 @@ static function (CommentStub $comment): string { ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function secondBlogPostPreviousBlogPostAuthorId(): void { - self::assertSame( - 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', - await( - $this->client->repository(BlogPostStub::class)->fetch()->filter(static function (BlogPostStub $blogPost): bool { - return $blogPost->id() === '090fa83b-5c5a-4042-9f05-58d9ab649a1a'; - })->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getPreviousBlogPost(); - })->then(static function (BlogPostStub $blogPost): string { - return $blogPost->getAuthor()->id(); - }), - ), - ); + foreach ( + array_filter( + [...$this->client?->repository(BlogPostStub::class)->fetch() ?? []], + static fn (BlogPostStub $blogPost): bool => $blogPost->id === '090fa83b-5c5a-4042-9f05-58d9ab649a1a', + ) as $blogPost + ) { + self::assertInstanceOf(BlogPostStub::class, $blogPost->previousBlogPost); + + self::assertSame( + 'fb175cbc-04cc-41c7-8e35-6b817ac016ca', + $blogPost->previousBlogPost->author->id, + ); + } self::assertSame([ 'initiated' => 2, @@ -376,18 +412,17 @@ public function secondBlogPostPreviousBlogPostAuthorId(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function secondBlogPostNextBlogPostResolvesToNull(): void { - self::assertNull( - await( - $this->client->repository(BlogPostStub::class)->fetch()->filter(static function (BlogPostStub $blogPost): bool { - return $blogPost->id() === '090fa83b-5c5a-4042-9f05-58d9ab649a1a'; - })->toPromise()->then(static function (BlogPostStub $blogPost): PromiseInterface { - return $blogPost->getNextBlogPost(); - }), - ), - ); + foreach ( + array_filter( + [...$this->client?->repository(BlogPostStub::class)->fetch() ?? []], + static fn (BlogPostStub $blogPost): bool => $blogPost->id === '090fa83b-5c5a-4042-9f05-58d9ab649a1a', + ) as $blogPost + ) { + self::assertNull($blogPost->nextBlogPost); + } self::assertSame([ 'initiated' => 1, @@ -398,18 +433,17 @@ public function secondBlogPostNextBlogPostResolvesToNull(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function createUser(): void { $name = 'Commander Fuzzy paws'; $fields = ['name' => $name]; - $user = await( - $this->client->repository(UserStub::class)->create($fields), - ); + $user = $this->client?->repository(UserStub::class)->create($fields); + self::assertInstanceOf(UserStub::class, $user); - self::assertSame($name, $user->getName()); + self::assertSame($name, $user->name); self::assertSame([ 'initiated' => 2, 'successful' => 2, @@ -419,39 +453,39 @@ public function createUser(): void ], [...$this->counter->counters()]); } - /** @test */ + #[Test] public function increaseViews(): void { - sleep(3); /** @phpstan-ignore-line We're using blocking sleep here on purpose */ + await(sleep(3)); self::waitUntilTheNextSecond(); - $repository = $this->client->repository(BlogPostStub::class); + $repository = $this->client?->repository(BlogPostStub::class); + self::assertInstanceOf(RepositoryInterface::class, $repository); + $blogPost = null; $originalBlogPost = null; - $timestamp = null; $randomContents = bin2hex(random_bytes(13)); - $updatedBlogPost = await( - $repository->fetch()->takeLast(1)->toPromise()->then(static function (BlogPostStub $blogPost) use (&$originalBlogPost, &$timestamp, $randomContents): BlogPostStub { - self::waitUntilTheNextSecond(); + /** @phpstan-ignore foreach.valueOverwrite */ + foreach ($repository->fetch() as $blogPost) { + $originalBlogPost = $blogPost; + } - $originalBlogPost = $blogPost; - $timestamp = time(); + self::assertNotNull($blogPost); + self::waitUntilTheNextSecond(); - return $blogPost->withViews($blogPost->getViews() + 1)->withFields(['contents' => $randomContents, 'id' => 'nah', 'created' => new DateTimeImmutable(), 'modified' => new DateTimeImmutable()]); - })->then(static function (BlogPostStub $blogPost) use ($repository): PromiseInterface { - return $repository->update($blogPost); - }), + $timestamp = time(); + $updatedBlogPost = $repository->update( + $blogPost->withFields(['views' => $blogPost->views + 1, 'contents' => $randomContents, 'id' => 'nah', 'created' => new DateTimeImmutable(), 'modified' => new DateTimeImmutable()]), ); - assert($originalBlogPost instanceof BlogPostStub); - assert($updatedBlogPost instanceof BlogPostStub); + self::assertInstanceOf(BlogPostStub::class, $originalBlogPost); - self::assertSame(167, $updatedBlogPost->getViews()); - self::assertSame($originalBlogPost->id(), $updatedBlogPost->id()); - self::assertSame($originalBlogPost->getCreated()->format('U'), $updatedBlogPost->getCreated()->format('U')); - self::assertGreaterThan($originalBlogPost->getModified(), $updatedBlogPost->getModified()); - self::assertSame($timestamp, (int) $updatedBlogPost->getModified()->format('U')); + self::assertSame(167, $updatedBlogPost->views); + self::assertSame($originalBlogPost->id, $updatedBlogPost->id); + self::assertSame($originalBlogPost->created->format('U'), $updatedBlogPost->created->format('U')); + self::assertGreaterThan($originalBlogPost->modified, $updatedBlogPost->modified); + self::assertSame($timestamp, (int) $updatedBlogPost->modified->format('U')); self::assertSame([ 'initiated' => 3, 'successful' => 3, @@ -459,59 +493,36 @@ public function increaseViews(): void 'slow' => 0, 'completed' => 3, ], [...$this->counter->counters()]); - self::assertNotSame($originalBlogPost->getContents(), $updatedBlogPost->getContents()); - self::assertSame($updatedBlogPost->getContents(), $randomContents); - } - - /** @test */ - public function userSelf(): void - { - $repository = $this->client->repository(UserStub::class); - - $userId = null; - - $self = await($repository->fetch()->take(1)->toPromise()->then(static function (UserStub $user) use (&$userId): PromiseInterface { - $userId = $user->id(); - - return $user->getZelf(); - })); - - self::assertNotNull($userId); - self::assertNotNull($self); - self::assertSame($userId, $self->id()); - self::assertSame([ - 'initiated' => 2, - 'successful' => 2, - 'errored' => 0, - 'slow' => 0, - 'completed' => 2, - ], [...$this->counter->counters()]); + self::assertNotSame($originalBlogPost->contents, $updatedBlogPost->contents); + self::assertSame($updatedBlogPost->contents, $randomContents); } - /** @test */ + #[Test] public function countWithoutConstraints(): void { - $repository = $this->client->repository(BlogPostStub::class); + $repository = $this->client?->repository(BlogPostStub::class); + self::assertInstanceOf(RepositoryInterface::class, $repository); - $count = await($repository->count()); + $count = $repository->count(); self::assertSame(2, $count); } - /** @test */ + #[Test] public function countWithConstraints(): void { - $repository = $this->client->repository(BlogPostStub::class); + $repository = $this->client?->repository(BlogPostStub::class); + self::assertInstanceOf(RepositoryInterface::class, $repository); - $count = await($repository->count(new Where(new Where\Field('author_id', 'eq', ['fb175cbc-04cc-41c7-8e35-6b817ac016ca'])))); + $count = $repository->count(new Where(new Where\Field('author_id', 'eq', ['fb175cbc-04cc-41c7-8e35-6b817ac016ca']))); self::assertSame(1, $count); } - /** @test */ + #[Test] public function streamLogs(): void { - $repository = $this->client->repository(LogStub::class); + $repository = $this->client?->repository(LogStub::class); + self::assertInstanceOf(RepositoryInterface::class, $repository); - $rows = await($repository->stream()->toArray()->toPromise()); - self::assertCount(256, $rows); + self::assertCount(256, [...$repository->stream()]); } } diff --git a/tests/HydratorTest.php b/tests/HydratorTest.php index 5fbd24d..9cca9b8 100644 --- a/tests/HydratorTest.php +++ b/tests/HydratorTest.php @@ -4,6 +4,7 @@ namespace WyriHaximus\React\Tests\SimpleORM; +use PHPUnit\Framework\Attributes\Test; use Rx\Observable; use WyriHaximus\React\SimpleORM\Configuration; use WyriHaximus\React\SimpleORM\EntityInspector; @@ -12,63 +13,53 @@ use WyriHaximus\React\Tests\SimpleORM\Stub\UserStub; use WyriHaximus\TestUtilities\TestCase; -use function assert; use function bin2hex; use function random_bytes; use function React\Promise\resolve; use function Safe\date; +use function WyriHaximus\React\awaitObservable; final class HydratorTest extends TestCase { - /** - * @test - */ + #[Test] public function hydrate(): void { $id = '03450173-fef3-42c0-83c4-dfcfa4a474ee'; $title = 'tables.title'; - $entity = (new Hydrator())->hydrate( - (new EntityInspector(new Configuration('')))->entity(UserStub::class), + $entity = new Hydrator()->hydrate( + new EntityInspector(new Configuration(''))->entity(UserStub::class), [ 'id' => $id, 'name' => $title, 'zelf' => resolve(true), ], ); - assert($entity instanceof UserStub); self::assertSame($id, $entity->id); self::assertSame($title, $entity->name); } - /** - * @test - */ + #[Test] public function hydrateIgnoringNonExistingFields(): void { $id = '03450173-fef3-42c0-83c4-dfcfa4a474ee'; $title = 'tables.title'; - $entity = (new Hydrator())->hydrate( - (new EntityInspector(new Configuration('')))->entity(UserStub::class), + $entity = new Hydrator()->hydrate( + new EntityInspector(new Configuration(''))->entity(UserStub::class), [ - 'doesnotexist' => resolve(true), 'id' => $id, 'name' => $title, 'zelf' => resolve(true), - 'alsodoesnotexist' => resolve(true), ], ); - assert($entity instanceof UserStub); self::assertSame($id, $entity->id); self::assertSame($title, $entity->name); } - /** - * @test - */ + #[Test] public function hydrateWithJoins(): void { $id = '6bda4f06-4b7e-4cd5-b779-66a1b76187f9'; @@ -78,10 +69,9 @@ public function hydrateWithJoins(): void $publisherId = 'a3fc1993-0930-4a9d-a2ad-3bf3a15ecee0'; $publisherName = 'dasdsadas'; - $entity = (new Hydrator())->hydrate( - (new EntityInspector(new Configuration('')))->entity(BlogPostStub::class), + $entity = new Hydrator()->hydrate( + new EntityInspector(new Configuration(''))->entity(BlogPostStub::class), [ - 'doesnotexist' => resolve(true), 'id' => $id, 'author_id' => $authorId, 'publisher_id' => $publisherId, @@ -89,7 +79,29 @@ public function hydrateWithJoins(): void 'views' => 133, 'created' => date('Y-m-d H:i:s e'), 'modified' => date('Y-m-d H:i:s e'), - 'previous_blog_post' => resolve(null), + 'previous_blog_post' => resolve([ + 'id' => $id, + 'author_id' => $authorId, + 'publisher_id' => $publisherId, + 'contents' => bin2hex(random_bytes(133)), + 'views' => 133, + 'created' => date('Y-m-d H:i:s e'), + 'modified' => date('Y-m-d H:i:s e'), + 'previous_blog_post' => resolve(null), + 'next_blog_post' => resolve(null), + 'title' => $title, + 'author' => [ + 'id' => $authorId, + 'name' => $authorName, + 'zelf' => resolve(true), + ], + 'publisher' => [ + 'id' => $publisherId, + 'name' => $publisherName, + 'zelf' => resolve(true), + ], + 'comments' => awaitObservable(Observable::fromArray([])), + ]), 'next_blog_post' => resolve(null), 'title' => $title, 'author' => [ @@ -102,24 +114,27 @@ public function hydrateWithJoins(): void 'name' => $publisherName, 'zelf' => resolve(true), ], - 'comments' => Observable::fromArray([]), - 'alsodoesnotexist' => resolve(true), + 'comments' => awaitObservable(Observable::fromArray([])), ], ); - assert($entity instanceof BlogPostStub); - self::assertSame($id, $entity->id); - self::assertSame($title, $entity->title); - self::assertSame($authorId, $entity->author->id); - self::assertSame($authorName, $entity->author->name); - self::assertSame($publisherId, $entity->publisher->id); - self::assertSame($publisherName, $entity->publisher->name); - self::assertSame(133, $entity->views); + foreach ([$entity, $entity->previousBlogPost] as $bp) { + if ($bp === null) { + continue; + } + + self::assertSame($id, $bp->id); + self::assertSame($title, $bp->title); + self::assertSame($authorId, $bp->author->id); + self::assertSame($authorName, $bp->author->name); + self::assertSame($publisherId, $bp->publisher->id); + self::assertSame($publisherName, $bp->publisher->name); + self::assertSame(133, $bp->views); + } +// self::assertNull($entity->nextBlogPost); } - /** - * @test - */ + #[Test] public function hydrateWithJoinsIgnoringNonExistingFields(): void { $id = '6bda4f06-4b7e-4cd5-b779-66a1b76187f9'; @@ -129,8 +144,8 @@ public function hydrateWithJoinsIgnoringNonExistingFields(): void $publisherId = 'a3fc1993-0930-4a9d-a2ad-3bf3a15ecee0'; $publisherName = 'dasdsadas'; - $entity = (new Hydrator())->hydrate( - (new EntityInspector(new Configuration('')))->entity(BlogPostStub::class), + $entity = new Hydrator()->hydrate( + new EntityInspector(new Configuration(''))->entity(BlogPostStub::class), [ 'id' => $id, 'author_id' => $authorId, @@ -152,10 +167,9 @@ public function hydrateWithJoinsIgnoringNonExistingFields(): void 'name' => $publisherName, 'zelf' => resolve(true), ], - 'comments' => Observable::fromArray([]), + 'comments' => awaitObservable(Observable::fromArray([])), ], ); - assert($entity instanceof BlogPostStub); self::assertSame($id, $entity->id); self::assertSame($title, $entity->title); diff --git a/tests/Middleware/QueryCountMiddlewareTest.php b/tests/Middleware/QueryCountMiddlewareTest.php index 72fc9f1..bbe6315 100644 --- a/tests/Middleware/QueryCountMiddlewareTest.php +++ b/tests/Middleware/QueryCountMiddlewareTest.php @@ -6,18 +6,18 @@ use Exception; use Latitude\QueryBuilder\QueryFactory; -use React\Promise\Deferred; -use React\Promise\PromiseInterface; -use Rx\Observable; -use Rx\Subject\Subject; +use PHPUnit\Framework\Attributes\Test; +use Throwable; use WyriHaximus\AsyncTestUtilities\AsyncTestCase; use WyriHaximus\React\SimpleORM\Middleware\QueryCountMiddleware; -use function sleep; +use function React\Async\await; +use function React\Promise\Timer\sleep; final class QueryCountMiddlewareTest extends AsyncTestCase { - public function testCountingSuccess(): void + #[Test] + public function countingSuccess(): void { $middleware = new QueryCountMiddleware(1); @@ -29,23 +29,20 @@ public function testCountingSuccess(): void 'completed' => 0, ], [...$middleware->counters()]); - $deferred = new Deferred(); - - Observable::fromPromise($middleware->query((new QueryFactory())->select()->asExpression(), static function () use ($deferred): PromiseInterface { - return $deferred->promise(); - }))->mergeAll()->subscribe(static function (): void { - }, static function (): void { - }); - - self::assertSame([ - 'initiated' => 1, - 'successful' => 0, - 'errored' => 0, - 'slow' => 0, - 'completed' => 0, - ], [...$middleware->counters()]); - - $deferred->resolve(Observable::fromArray([[]])); + foreach ( + /** @phpstan-ignore argument.type */ + $middleware->query(new QueryFactory()->select()->asExpression(), static function (): iterable { + yield 1; + }) as $row + ) { + self::assertSame([ + 'initiated' => 1, + 'successful' => 0, + 'errored' => 0, + 'slow' => 0, + 'completed' => 0, + ], [...$middleware->counters()]); + } self::assertSame([ 'initiated' => 1, @@ -66,7 +63,8 @@ public function testCountingSuccess(): void ], [...$middleware->counters()]); } - public function testCountingError(): void + #[Test] + public function countingError(): void { $middleware = new QueryCountMiddleware(1); @@ -78,25 +76,26 @@ public function testCountingError(): void 'completed' => 0, ], [...$middleware->counters()]); - $deferred = new Deferred(); - - Observable::fromPromise($middleware->query((new QueryFactory())->select()->asExpression(), static function () use ($deferred): PromiseInterface { - return $deferred->promise(); - }))->mergeAll()->subscribe(static function (): void { - }, static function (): void { - }); - - self::assertSame([ - 'initiated' => 1, - 'successful' => 0, - 'errored' => 0, - 'slow' => 0, - 'completed' => 0, - ], [...$middleware->counters()]); - - $subject = new Subject(); - $deferred->resolve($subject); - $subject->onError(new Exception('whoops')); + try { + foreach ( + /** @phpstan-ignore argument.type */ + $middleware->query(new QueryFactory()->select()->asExpression(), static function (): iterable { + yield 1; + + throw new Exception('whoops'); + }) as $row + ) { + self::assertSame([ + 'initiated' => 1, + 'successful' => 0, + 'errored' => 0, + 'slow' => 0, + 'completed' => 0, + ], [...$middleware->counters()]); + } + } catch (Throwable) { + // Swallow exception + } self::assertSame([ 'initiated' => 1, @@ -117,7 +116,8 @@ public function testCountingError(): void ], [...$middleware->counters()]); } - public function testCountingErrorSlow(): void + #[Test] + public function countingErrorSlow(): void { $middleware = new QueryCountMiddleware(1); @@ -129,33 +129,33 @@ public function testCountingErrorSlow(): void 'completed' => 0, ], [...$middleware->counters()]); - $deferred = new Deferred(); - - Observable::fromPromise($middleware->query((new QueryFactory())->select()->asExpression(), static function () use ($deferred): PromiseInterface { - return $deferred->promise(); - }))->mergeAll()->subscribe(static function (): void { - }, static function (): void { - }); - - self::assertSame([ - 'initiated' => 1, - 'successful' => 0, - 'errored' => 0, - 'slow' => 0, - 'completed' => 0, - ], [...$middleware->counters()]); - - sleep(2); /** @phpstan-ignore-line We're using blocking sleep here on purpose */ - - $subject = new Subject(); - $deferred->resolve($subject); - $subject->onError(new Exception('whoops')); + try { + foreach ( + /** @phpstan-ignore argument.type */ + $middleware->query(new QueryFactory()->select()->asExpression(), static function (): iterable { + await(sleep(2)); + yield 1; + + throw new Exception('whoops'); + }) as $row + ) { + self::assertSame([ + 'initiated' => 1, + 'successful' => 0, + 'errored' => 0, + 'slow' => 0, + 'completed' => 0, + ], [...$middleware->counters()]); + } + } catch (Throwable) { + // Swallow exception + } self::assertSame([ 'initiated' => 1, 'successful' => 0, 'errored' => 1, - 'slow' => 1, + 'slow' => 0, 'completed' => 0, ], [...$middleware->counters()]); diff --git a/tests/RepositoryTest.php b/tests/RepositoryTest.php index c90b1d5..1e56a89 100644 --- a/tests/RepositoryTest.php +++ b/tests/RepositoryTest.php @@ -7,13 +7,19 @@ use Latitude\QueryBuilder\Engine\PostgresEngine; use Latitude\QueryBuilder\ExpressionInterface; use Latitude\QueryBuilder\QueryFactory; -use Prophecy\Argument; -use Prophecy\Prophecy\ObjectProphecy; -use Rx\Observable; +use Mockery; +use Mockery\MockInterface; +use PHPUnit\Framework\Attributes\Before; +use PHPUnit\Framework\Attributes\Test; use WyriHaximus\AsyncTestUtilities\AsyncTestCase; +use WyriHaximus\React\SimpleORM\AdapterInterface; use WyriHaximus\React\SimpleORM\ClientInterface; use WyriHaximus\React\SimpleORM\Configuration; +use WyriHaximus\React\SimpleORM\Connection; use WyriHaximus\React\SimpleORM\EntityInspector; +use WyriHaximus\React\SimpleORM\Hydrator; +use WyriHaximus\React\SimpleORM\MiddlewareInterface; +use WyriHaximus\React\SimpleORM\MiddlewareRunner; use WyriHaximus\React\SimpleORM\Query\Order; use WyriHaximus\React\SimpleORM\Query\Where; use WyriHaximus\React\SimpleORM\Repository; @@ -21,161 +27,189 @@ use WyriHaximus\React\Tests\SimpleORM\Stub\CommentStub; use WyriHaximus\React\Tests\SimpleORM\Stub\UserStub; -use function assert; -use function React\Async\await; use function Safe\date; -use function strpos; +use function str_contains; final class RepositoryTest extends AsyncTestCase { - /** @var ObjectProphecy */ - private ObjectProphecy $client; + private MockInterface&ClientInterface $client; - protected function setUp(): void + private MockInterface&AdapterInterface $adapter; + + private Connection $connection; + + #[Before] + public function setupMocks(): void { - parent::setUp(); + $this->client = Mockery::mock(ClientInterface::class); + $this->adapter = Mockery::mock(AdapterInterface::class); + $middleware = new readonly class ($this->adapter) implements MiddlewareInterface { + public function __construct(private MockInterface&AdapterInterface $adapter) + { + } - $this->client = $this->prophesize(ClientInterface::class); + /** @return iterable> */ + public function query(ExpressionInterface $query, callable $next): iterable + { + yield from $this->adapter->query($query); + } + }; + $this->connection = new Connection($this->adapter, new MiddlewareRunner($middleware)); } + #[Test] public function testCount(): void { - $this->client->query(Argument::that(static function (ExpressionInterface $expression): bool { - self::assertCount(0, $expression->params(new PostgresEngine())); - $query = $expression->sql(new PostgresEngine()); - self::assertStringContainsString('FROM "users"', $query); - self::assertStringContainsString('COUNT(*) AS "count"', $query); - - return true; - }))->shouldBeCalled()->willReturn(Observable::fromArray([ - ['count' => '123'], - ])); - - $client = $this->client->reveal(); + $this->adapter->shouldReceive('query') + ->once() + ->with(Mockery::on(static function (ExpressionInterface $expression): bool { + self::assertCount(0, $expression->params(new PostgresEngine())); + $query = $expression->sql(new PostgresEngine()); + self::assertStringContainsString('FROM "users"', $query); + self::assertStringContainsString('COUNT(*) AS "count"', $query); + + return true; + })) + ->andReturn([ + ['count' => '123'], + ]); $repository = new Repository( - (new EntityInspector(new Configuration('')))->entity(UserStub::class), - $client, + new EntityInspector(new Configuration(''))->entity(UserStub::class), + $this->client, new QueryFactory(), + $this->connection, + new Hydrator(), ); - self::assertSame(123, await($repository->count())); + self::assertSame(123, $repository->count()); } - public function testCountWithContraints(): void + #[Test] + public function countWithContraints(): void { - $this->client->query(Argument::that(static function (ExpressionInterface $expression): bool { - self::assertCount(1, $expression->params(new PostgresEngine())); - $query = $expression->sql(new PostgresEngine()); - self::assertStringContainsString('FROM "users"', $query); - self::assertStringContainsString('COUNT(*) AS "count"', $query); - self::assertStringContainsString('WHERE "t0"."field" = ?', $query); - - return true; - }))->shouldBeCalled()->willReturn(Observable::fromArray([ - ['count' => '123'], - ])); - - $client = $this->client->reveal(); + $this->adapter->shouldReceive('query') + ->once() + ->with(Mockery::on(static function (ExpressionInterface $expression): bool { + self::assertCount(1, $expression->params(new PostgresEngine())); + $query = $expression->sql(new PostgresEngine()); + self::assertStringContainsString('FROM "users"', $query); + self::assertStringContainsString('COUNT(*) AS "count"', $query); + self::assertStringContainsString('WHERE "t0"."field" = ?', $query); + + return true; + })) + ->andReturn([ + ['count' => '123'], + ]); $repository = new Repository( - (new EntityInspector(new Configuration('')))->entity(UserStub::class), - $client, + new EntityInspector(new Configuration(''))->entity(UserStub::class), + $this->client, new QueryFactory(), + $this->connection, + new Hydrator(), ); - self::assertSame(123, await($repository->count( + self::assertSame(123, $repository->count( new Where( new Where\Field('field', 'eq', ['values']), ), - ))); + )); } - public function testCountWithJoins(): void + #[Test] + public function countWithJoins(): void { - $this->client->repository(CommentStub::class)->shouldNotBeCalled(); - - $this->client->query(Argument::that(static function (ExpressionInterface $expression): bool { - self::assertCount(0, $expression->params(new PostgresEngine())); - $query = $expression->sql(new PostgresEngine()); - self::assertStringContainsString('blog_posts', $query); - self::assertStringContainsString('COUNT(*) AS "count"', $query); - self::assertStringNotContainsString('INNER JOIN users', $query); - self::assertStringNotContainsString('LEFT JOIN comments', $query); - - return true; - }))->shouldBeCalled()->willReturn(Observable::fromArray([ - ['count' => '123'], - ['count' => '456'], - ])); - - $client = $this->client->reveal(); + $this->client->shouldReceive('repository')->with(CommentStub::class)->never(); + + $this->adapter->shouldReceive('query') + ->once() + ->with(Mockery::on(static function (ExpressionInterface $expression): bool { + self::assertCount(0, $expression->params(new PostgresEngine())); + $query = $expression->sql(new PostgresEngine()); + self::assertStringContainsString('blog_posts', $query); + self::assertStringContainsString('COUNT(*) AS "count"', $query); + self::assertStringNotContainsString('INNER JOIN users', $query); + self::assertStringNotContainsString('LEFT JOIN comments', $query); + + return true; + })) + ->andReturn([ + ['count' => '123'], + ]); $repository = new Repository( - (new EntityInspector(new Configuration('')))->entity(BlogPostStub::class), - $client, + new EntityInspector(new Configuration(''))->entity(BlogPostStub::class), + $this->client, new QueryFactory(), + $this->connection, + new Hydrator(), ); - self::assertSame(123, await($repository->count())); + self::assertSame(123, $repository->count()); } - public function testFetchWithJoins(): void + #[Test] + public function fetchWithJoins(): void { - $this->client->repository(CommentStub::class)->shouldNotBeCalled(); - - $this->client->query(Argument::that(static function (ExpressionInterface $expression): bool { - self::assertCount(1, $expression->params(new PostgresEngine())); - self::assertSame(['98ce9eaf-b38b-4a51-93ed-131ffac4051e'], $expression->params(new PostgresEngine())); - $query = $expression->sql(new PostgresEngine()); - self::assertStringContainsString('blog_posts', $query); - self::assertStringContainsString('users', $query); - self::assertStringContainsString('INNER JOIN', $query); - self::assertStringContainsString('"t1"."id" = "t0"."author_id"', $query); - self::assertStringContainsString('"t2"."id" = "t0"."publisher_id"', $query); - self::assertStringContainsString('WHERE', $query); - self::assertStringContainsString('"t0"."id" = ?', $query); - self::assertStringContainsString('ORDER BY', $query); - self::assertStringContainsString('"t0"."id" DESC', $query); - - // Assert the LEFT JOIN isn't happening - self::assertStringNotContainsString('LEFT JOIN "comments" AS', $query); - - // Assert we're not loading in anything from the comments table - self::assertStringNotContainsString('FROM "comments"', $query); - - return true; - }))->shouldBeCalled()->willReturn(Observable::fromArray([ - [ - 't0___id' => '98ce9eaf-b38b-4a51-93ed-131ffac4051e', - 't0___title' => 'blog_post_title', - 't0___views' => '123', - 't0___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't0___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't0___contents' => 'comment contents', - 't0___created' => date('Y-m-d H:i:s e'), - 't0___modified' => date('Y-m-d H:i:s e'), - 't1___id' => '1a6cf50d-fa06-45ac-a510-375328f26541', - 't1___name' => 'author_name', - 't2___id' => '7bfdcadd-1e93-4c6e-9edf-d9bdf98a871c', - 't2___name' => 'publisher_name', - ], - ])); - - $client = $this->client->reveal(); + $this->client->shouldReceive('repository')->with(CommentStub::class)->never(); + $this->client->shouldReceive('repository')->with(UserStub::class)->never(); + + $this->adapter->shouldReceive('query') + ->once() + ->with(Mockery::on(static function (ExpressionInterface $expression): bool { + self::assertCount(1, $expression->params(new PostgresEngine())); + self::assertSame(['98ce9eaf-b38b-4a51-93ed-131ffac4051e'], $expression->params(new PostgresEngine())); + $query = $expression->sql(new PostgresEngine()); + self::assertStringContainsString('blog_posts', $query); + self::assertStringContainsString('users', $query); + self::assertStringContainsString('INNER JOIN', $query); + self::assertStringContainsString('"t1"."id" = "t0"."author_id"', $query); + self::assertStringContainsString('"t2"."id" = "t0"."publisher_id"', $query); + self::assertStringContainsString('WHERE', $query); + self::assertStringContainsString('"t0"."id" = ?', $query); + self::assertStringContainsString('ORDER BY', $query); + self::assertStringContainsString('"t0"."id" DESC', $query); + + // Assert the LEFT JOIN isn't happening + self::assertStringNotContainsString('LEFT JOIN "comments" AS', $query); + + // Assert we're not loading in anything from the comments table + self::assertStringNotContainsString('FROM "comments"', $query); + + return true; + })) + ->andReturn([ + [ + 't0___id' => '98ce9eaf-b38b-4a51-93ed-131ffac4051e', + 't0___title' => 'blog_post_title', + 't0___views' => 123, + 't0___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't0___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't0___contents' => 'comment contents', + 't0___created' => date('Y-m-d H:i:s e'), + 't0___modified' => date('Y-m-d H:i:s e'), + 't1___id' => '1a6cf50d-fa06-45ac-a510-375328f26541', + 't1___name' => 'author_name', + 't2___id' => '7bfdcadd-1e93-4c6e-9edf-d9bdf98a871c', + 't2___name' => 'publisher_name', + ], + ]); $repository = new Repository( - (new EntityInspector(new Configuration('')))->entity(BlogPostStub::class), - $client, + new EntityInspector(new Configuration(''))->entity(BlogPostStub::class), + $this->client, new QueryFactory(), + $this->connection, + new Hydrator(), ); - $blogPost = await($repository->fetch(new Where( + $blogPost = $repository->first(new Where( new Where\Field('id', 'eq', ['98ce9eaf-b38b-4a51-93ed-131ffac4051e']), ), new Order( new Order\Desc('id'), - ))->take(1)->toPromise()); - assert($blogPost instanceof BlogPostStub); + )); self::assertSame('98ce9eaf-b38b-4a51-93ed-131ffac4051e', $blogPost->id); self::assertSame('blog_post_title', $blogPost->title); @@ -186,170 +220,177 @@ public function testFetchWithJoins(): void self::assertSame('publisher_name', $blogPost->publisher->name); } - public function testFetchWithJoinsLazyLoadComments(): void + #[Test] + public function fetchWithJoinsLazyLoadComments(): void { - $client = $this->client->reveal(); - - $this->client->repository(CommentStub::class)->shouldBeCalled()->willReturn( - new Repository((new EntityInspector(new Configuration('')))->entity(CommentStub::class), $client, new QueryFactory()), + $this->client->shouldReceive('repository')->with(CommentStub::class)->andReturn( + new Repository(new EntityInspector(new Configuration(''))->entity(CommentStub::class), $this->client, new QueryFactory(), $this->connection, new Hydrator()), ); - - $this->client->query(Argument::that(static function (ExpressionInterface $expression): bool { - self::assertCount(1, $expression->params(new PostgresEngine())); - self::assertSame(['99d00028-28d6-4194-b377-a0039b278c4d'], $expression->params(new PostgresEngine())); - $query = $expression->sql(new PostgresEngine()); - - if (strpos($query, 'FROM "blog_posts"') === false) { - return false; - } - - self::assertStringContainsString('blog_posts', $query); - self::assertStringContainsString('users', $query); - self::assertStringContainsString('INNER JOIN', $query); - self::assertStringContainsString('"t1"."id" = "t0"."author_id"', $query); - self::assertStringContainsString('"t2"."id" = "t0"."publisher_id"', $query); - self::assertStringContainsString('WHERE', $query); - self::assertStringContainsString('"t0"."id" = ?', $query); - self::assertStringContainsString('ORDER BY', $query); - self::assertStringContainsString('"t0"."id" DESC', $query); - - // Assert the LEFT JOIN isn't happening - self::assertStringNotContainsString('LEFT JOIN "comments" AS', $query); - - // Assert we're not loading in anything from the comments table - self::assertStringNotContainsString('FROM "comments"', $query); - - return true; - }))->shouldBeCalled()->willReturn(Observable::fromArray([ - [ - 't0___id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't0___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't0___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't0___title' => 'blog_post_title', - 't0___contents' => 'comment contents', - 't0___views' => 1337, - 't0___created' => date('Y-m-d H:i:s e'), - 't0___modified' => date('Y-m-d H:i:s e'), - 't1___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't1___name' => 'author_name', - 't2___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't2___name' => 'publisher_name', - ], - ])); - - $this->client->query(Argument::that(static function (ExpressionInterface $expression): bool { - self::assertCount(1, $expression->params(new PostgresEngine())); - self::assertSame(['99d00028-28d6-4194-b377-a0039b278c4d'], $expression->params(new PostgresEngine())); - $query = $expression->sql(new PostgresEngine()); - - if (strpos($query, 'FROM "comments"') === false) { - return false; - } - - self::assertStringContainsString('FROM "comments"', $query); - self::assertStringContainsString('users', $query); - self::assertStringContainsString('INNER JOIN "users"', $query); - self::assertStringContainsString('"t1"."id" = "t0"."author_id"', $query); - self::assertStringContainsString('WHERE', $query); - self::assertStringContainsString('"t0"."blog_post_id" = ?', $query); - - return true; - }))->shouldBeCalled()->willReturn(Observable::fromArray([ - [ - 't0___id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't0___author_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't0___contents' => 'comment contents', - 't1___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't1___name' => 'author_name', - 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't2___title' => 'blog_post_title', - 't2___author_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't2___contents' => 'comment contents', - 't2___views' => 1337, - 't2___created' => date('Y-m-d H:i:s e'), - 't2___modified' => date('Y-m-d H:i:s e'), - 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't3___name' => 'author_name', - 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't4___name' => 'publisher_name', - ], - [ - 't0___id' => 'fa41900d-4f62-4037-9eb3-8cfb4b90eeef', - 't0___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', - 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't0___contents' => 'comment contents', - 't1___id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', - 't1___name' => 'author_name', - 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't2___title' => 'blog_post_title', - 't2___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', - 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't2___contents' => 'comment contents', - 't2___views' => 1337, - 't2___created' => date('Y-m-d H:i:s e'), - 't2___modified' => date('Y-m-d H:i:s e'), - 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't3___name' => 'author_name', - 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't4___name' => 'publisher_name', - ], - [ - 't0___id' => '83f451cb-4b20-41b5-a8be-637af0bf1284', - 't0___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't0___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't0___contents' => 'comment contents', - 't1___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't1___name' => 'author_name', - 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't2___title' => 'blog_post_title', - 't2___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't2___contents' => 'comment contents', - 't2___views' => 1337, - 't2___created' => date('Y-m-d H:i:s e'), - 't2___modified' => date('Y-m-d H:i:s e'), - 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't3___name' => 'author_name', - 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't4___name' => 'publisher_name', - ], - [ - 't0___id' => '590d4a9d-afb2-4860-a746-b0a086554064', - 't0___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', - 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't0___contents' => 'comment contents', - 't1___id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', - 't1___name' => 'author_name', - 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', - 't2___title' => 'blog_post_title', - 't2___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', - 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't2___contents' => 'comment contents', - 't2___views' => 1337, - 't2___created' => date('Y-m-d H:i:s e'), - 't2___modified' => date('Y-m-d H:i:s e'), - 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', - 't3___name' => 'author_name', - 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', - 't4___name' => 'publisher_name', - ], - ])); + $this->client->shouldReceive('repository')->with(UserStub::class)->never(); + + $this->adapter->shouldReceive('query') + ->once() + ->with(Mockery::on(static function (ExpressionInterface $expression): bool { + self::assertCount(1, $expression->params(new PostgresEngine())); + self::assertSame(['99d00028-28d6-4194-b377-a0039b278c4d'], $expression->params(new PostgresEngine())); + $query = $expression->sql(new PostgresEngine()); + + if (! str_contains($query, 'FROM "blog_posts"')) { + return false; + } + + self::assertStringContainsString('blog_posts', $query); + self::assertStringContainsString('users', $query); + self::assertStringContainsString('INNER JOIN', $query); + self::assertStringContainsString('"t1"."id" = "t0"."author_id"', $query); + self::assertStringContainsString('"t2"."id" = "t0"."publisher_id"', $query); + self::assertStringContainsString('WHERE', $query); + self::assertStringContainsString('"t0"."id" = ?', $query); + self::assertStringContainsString('ORDER BY', $query); + self::assertStringContainsString('"t0"."id" DESC', $query); + + // Assert the LEFT JOIN isn't happening + self::assertStringNotContainsString('LEFT JOIN "comments" AS', $query); + + // Assert we're not loading in anything from the comments table + self::assertStringNotContainsString('FROM "comments"', $query); + + return true; + })) + ->andReturn([ + [ + 't0___id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't0___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't0___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't0___title' => 'blog_post_title', + 't0___contents' => 'comment contents', + 't0___views' => 1337, + 't0___created' => date('Y-m-d H:i:s e'), + 't0___modified' => date('Y-m-d H:i:s e'), + 't1___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't1___name' => 'author_name', + 't2___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't2___name' => 'publisher_name', + ], + ]); + + $this->adapter->shouldReceive('query') + ->once() + ->with(Mockery::on(static function (ExpressionInterface $expression): bool { + self::assertCount(1, $expression->params(new PostgresEngine())); + self::assertSame(['99d00028-28d6-4194-b377-a0039b278c4d'], $expression->params(new PostgresEngine())); + $query = $expression->sql(new PostgresEngine()); + + if (! str_contains($query, 'FROM "comments"')) { + return false; + } + + self::assertStringContainsString('FROM "comments"', $query); + self::assertStringContainsString('users', $query); + self::assertStringContainsString('INNER JOIN "users"', $query); + self::assertStringContainsString('"t1"."id" = "t0"."author_id"', $query); + self::assertStringContainsString('WHERE', $query); + self::assertStringContainsString('"t0"."blog_post_id" = ?', $query); + + return true; + })) + ->andReturn([ + [ + 't0___id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't0___author_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't0___contents' => 'comment contents', + 't1___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't1___name' => 'author_name', + 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't2___title' => 'blog_post_title', + 't2___author_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't2___contents' => 'comment contents', + 't2___views' => 1337, + 't2___created' => date('Y-m-d H:i:s e'), + 't2___modified' => date('Y-m-d H:i:s e'), + 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't3___name' => 'author_name', + 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't4___name' => 'publisher_name', + ], + [ + 't0___id' => 'fa41900d-4f62-4037-9eb3-8cfb4b90eeef', + 't0___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', + 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't0___contents' => 'comment contents', + 't1___id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', + 't1___name' => 'author_name', + 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't2___title' => 'blog_post_title', + 't2___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', + 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't2___contents' => 'comment contents', + 't2___views' => 1337, + 't2___created' => date('Y-m-d H:i:s e'), + 't2___modified' => date('Y-m-d H:i:s e'), + 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't3___name' => 'author_name', + 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't4___name' => 'publisher_name', + ], + [ + 't0___id' => '83f451cb-4b20-41b5-a8be-637af0bf1284', + 't0___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't0___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't0___contents' => 'comment contents', + 't1___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't1___name' => 'author_name', + 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't2___title' => 'blog_post_title', + 't2___author_id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't2___contents' => 'comment contents', + 't2___views' => 1337, + 't2___created' => date('Y-m-d H:i:s e'), + 't2___modified' => date('Y-m-d H:i:s e'), + 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't3___name' => 'author_name', + 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't4___name' => 'publisher_name', + ], + [ + 't0___id' => '590d4a9d-afb2-4860-a746-b0a086554064', + 't0___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', + 't0___blog_post_id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't0___contents' => 'comment contents', + 't1___id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', + 't1___name' => 'author_name', + 't2___id' => '99d00028-28d6-4194-b377-a0039b278c4d', + 't2___title' => 'blog_post_title', + 't2___author_id' => '0da49bee-ab27-4b24-a949-7b71a0b0449a', + 't2___publisher_id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't2___contents' => 'comment contents', + 't2___views' => 1337, + 't2___created' => date('Y-m-d H:i:s e'), + 't2___modified' => date('Y-m-d H:i:s e'), + 't3___id' => '3fbf8eec-8a3f-4b01-ba9a-355f6650644b', + 't3___name' => 'author_name', + 't4___id' => 'd45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', + 't4___name' => 'publisher_name', + ], + ]); $repository = new Repository( - (new EntityInspector(new Configuration('')))->entity(BlogPostStub::class), - $client, + new EntityInspector(new Configuration(''))->entity(BlogPostStub::class), + $this->client, new QueryFactory(), + $this->connection, + new Hydrator(), ); - $blogPost = await($repository->fetch(new Where( + $blogPost = $repository->first(new Where( new Where\Field('id', 'eq', ['99d00028-28d6-4194-b377-a0039b278c4d']), ), new Order( new Order\Desc('id'), - ))->take(1)->toPromise()); - assert($blogPost instanceof BlogPostStub); + )); self::assertSame('99d00028-28d6-4194-b377-a0039b278c4d', $blogPost->id); self::assertSame('blog_post_title', $blogPost->title); @@ -358,8 +399,8 @@ public function testFetchWithJoinsLazyLoadComments(): void self::assertSame('d45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', $blogPost->publisher->id); self::assertSame('publisher_name', $blogPost->publisher->name); - /** @var CommentStub[] $comments */ - $comments = await($blogPost->comments->toArray()->toPromise()); + /** @var array $comments */ + $comments = [...$blogPost->comments]; self::assertSame('99d00028-28d6-4194-b377-a0039b278c4d', $comments[0]->id); self::assertSame('d45e8a1b-b962-4c1b-a7e7-c867fa06ffa7', $comments[0]->author->id); diff --git a/tests/Stub/BlogPostStub.php b/tests/Stub/BlogPostStub.php index 83cdca6..cd63070 100644 --- a/tests/Stub/BlogPostStub.php +++ b/tests/Stub/BlogPostStub.php @@ -4,9 +4,9 @@ namespace WyriHaximus\React\Tests\SimpleORM\Stub; +use DateTimeImmutable; use EventSauce\ObjectHydrator\MapFrom; -use React\Promise\PromiseInterface; -use Rx\Observable; +use EventSauce\ObjectHydrator\PropertyCasters\CastToType; use WyriHaximus\React\SimpleORM\Attribute\Clause; use WyriHaximus\React\SimpleORM\Attribute\InnerJoin; use WyriHaximus\React\SimpleORM\Attribute\JoinInterface; @@ -37,7 +37,6 @@ ), ], property: 'author', - lazy: JoinInterface::IS_LAZY, )] #[InnerJoin( entity: UserStub::class, @@ -48,7 +47,6 @@ ), ], property: 'publisher', - lazy: JoinInterface::IS_LAZY, )] #[InnerJoin( entity: BlogPostStub::class, @@ -77,17 +75,18 @@ use WithFieldsTrait; /** - * @param PromiseInterface $previousBlogPost - * @param PromiseInterface $nextBlogPost + * @param iterable $comments + * + * @phpstan-ignore shipmonk.deadMethod,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullableTypeDeclaration,ergebnis.noParameterWithNullableTypeDeclaration */ - public function __construct( /** @phpstan-ignore-line */ + public function __construct( public string $id, #[MapFrom('previous_blog_post_id')] public string|null $previousBlogPostId, - public PromiseInterface $previousBlogPost, + public BlogPostStub|null $previousBlogPost, #[MapFrom('next_blog_post_id')] public string|null $nextBlogPostId, - public PromiseInterface $nextBlogPost, + public BlogPostStub|null $nextBlogPost, #[MapFrom('author_id')] public string $authorId, #[MapFrom('publisher_id')] @@ -96,10 +95,11 @@ public function __construct( /** @phpstan-ignore-line */ public string $contents, public UserStub $author, public UserStub $publisher, - public Observable $comments, + public iterable $comments, + #[CastToType('integer')] public int $views, - public string $created, - public string $modified, + public DateTimeImmutable $created, + public DateTimeImmutable $modified, ) { } } diff --git a/tests/Stub/CommentStub.php b/tests/Stub/CommentStub.php index e03d578..a6decfb 100644 --- a/tests/Stub/CommentStub.php +++ b/tests/Stub/CommentStub.php @@ -36,6 +36,7 @@ { use WithFieldsTrait; + /** @phpstan-ignore shipmonk.deadMethod */ public function __construct( public string $id, #[MapFrom('author_id')] diff --git a/tests/Stub/LogStub.php b/tests/Stub/LogStub.php index 8ff9a76..78e111b 100644 --- a/tests/Stub/LogStub.php +++ b/tests/Stub/LogStub.php @@ -13,6 +13,7 @@ { use WithFieldsTrait; + /** @phpstan-ignore shipmonk.deadMethod */ public function __construct( public string $id, public string $message, diff --git a/tests/Stub/NoSQLStub.php b/tests/Stub/NoSQLStub.php index 8a06880..ca68883 100644 --- a/tests/Stub/NoSQLStub.php +++ b/tests/Stub/NoSQLStub.php @@ -10,6 +10,7 @@ { public string $id; + /** @phpstan-ignore shipmonk.deadMethod */ public function __construct() { $this->id = ''; diff --git a/tests/Stub/UserStub.php b/tests/Stub/UserStub.php index 56b56f5..450a70e 100644 --- a/tests/Stub/UserStub.php +++ b/tests/Stub/UserStub.php @@ -4,7 +4,6 @@ namespace WyriHaximus\React\Tests\SimpleORM\Stub; -use React\Promise\PromiseInterface; use WyriHaximus\React\SimpleORM\Attribute\Clause; use WyriHaximus\React\SimpleORM\Attribute\InnerJoin; use WyriHaximus\React\SimpleORM\Attribute\JoinInterface; @@ -29,11 +28,11 @@ { use WithFieldsTrait; - /** @param PromiseInterface $zelf */ + /** @phpstan-ignore shipmonk.deadMethod */ public function __construct( public string $id, public string $name, - public PromiseInterface $zelf, + public UserStub $zelf, ) { } } diff --git a/tests/types/basic.php b/tests/types/basic.php index 21c7d9b..f543b6f 100644 --- a/tests/types/basic.php +++ b/tests/types/basic.php @@ -2,17 +2,36 @@ declare(strict_types=1); +use PgAsync\Client as PgClient; +use React\EventLoop\Loop; +use WyriHaximus\React\SimpleORM\Adapter\Postgres; use WyriHaximus\React\SimpleORM\Client; +use WyriHaximus\React\SimpleORM\Configuration; +use WyriHaximus\React\SimpleORM\Middleware\QueryCountMiddleware; use WyriHaximus\React\Tests\SimpleORM\Stub\NoSQLStub; use function PHPStan\Testing\assertType; -/** @phpstan-ignore-next-line */ -$client = Client::create(); +$client = Client::create( + new Postgres( + new PgClient( + [ + 'host' => 'localhost', + 'port' => 55432, + 'user' => 'postgres', + 'password' => 'postgres', + 'database' => 'postgres', + ], + Loop::get(), + ), + ), + new Configuration(''), + new QueryCountMiddleware(1), +); $repository = $client->repository(NoSQLStub::class); assertType('WyriHaximus\React\SimpleORM\RepositoryInterface', $repository); -assertType('React\Promise\PromiseInterface', $repository->count()); -assertType('Rx\Observable', $repository->fetch()); -assertType('Rx\Observable', $repository->page(1)); -assertType('Rx\Observable', $repository->stream()); +assertType('int', $repository->count()); +assertType('iterable', $repository->fetch()); +assertType('iterable', $repository->page(1)); +assertType('iterable', $repository->stream());