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());