diff --git a/.editorconfig b/.editorconfig
index 95b2348..845baae 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -19,5 +19,8 @@ indent_size = 2
[Makefile]
indent_style = tab
+[*.mk]
+indent_style = tab
+
[*.neon]
indent_style = tab
diff --git a/.gitattributes b/.gitattributes
index 86e122e..672fc22 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -18,6 +18,7 @@
.github/ export-ignore
etc/ci/ export-ignore
etc/dev-app/ export-ignore
+etc/state/ export-ignore
etc/qa/ export-ignore
examples/ export-ignore
tests/ export-ignore
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index cd15956..e2041ba 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -14,4 +14,4 @@ permissions:
jobs:
ci:
name: Continuous Integration
- uses: WyriHaximus/github-workflows/.github/workflows/package.yaml@main
+ uses: WyriHaximus/github-workflows/.github/workflows/package.yaml@5343944be2a6ef963186b5f413121fcf36980b33 # v1.0.0
diff --git a/.github/workflows/release-management.yaml b/.github/workflows/release-management.yaml
index e472b26..9b1dd08 100644
--- a/.github/workflows/release-management.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-management.yaml@main
+ uses: WyriHaximus/github-workflows/.github/workflows/package-release-management.yaml@5343944be2a6ef963186b5f413121fcf36980b33 # v1.0.0
with:
milestone: ${{ github.event.milestone.title }}
description: ${{ github.event.milestone.title }}
diff --git a/.gitignore b/.gitignore
index 03ad991..3d2afd8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,9 @@ var/*
!var/.gitkeep
vendor/
etc/qa/.phpunit.result.cache
+etc/qa/vale/**
+!etc/qa/vale/styles/
+!etc/qa/vale/styles/config/
+!etc/qa/vale/styles/config/vocabularies/
+!etc/qa/vale/styles/config/vocabularies/WyriHaximus/
+!etc/qa/vale/styles/config/vocabularies/WyriHaximus/accept.txt
diff --git a/Makefile b/Makefile
index e7b1c7a..4414982 100644
--- a/Makefile
+++ b/Makefile
@@ -3,17 +3,27 @@ SHELL=bash
.PHONY: *
+ifneq (,$(findstring icrosoft,$(shell cat /proc/version)))
+ THREADS?=1
+else
+ THREADS?=$(shell nproc)
+endif
DOCKER_AVAILABLE=$(shell ((command -v docker >/dev/null 2>&1) && echo 0 || echo 1))
+TTY_AVAILABLE=$(shell (test -t 1 && echo 0) || echo 1)
CONTAINER_REGISTRY_REPO="ghcr.io/wyrihaximusnet/php"
SLIM_DOCKER_IMAGE="-slim"
NTS_OR_ZTS_DOCKER_IMAGE="zts"
-OTEL_PHP_FIBERS_ENABLED=false
+OTEL_PHP_FIBERS_ENABLED?=false
NEEDS_DOCKER_SOCKET=FALSE
+HAS_EXTRA_SERVICES=FALSE
+ALL_HAS_DIRECT_DOCKER_TASKS=FALSE
+CONTRIB_HAS_DIRECT_DOCKER_TASKS=TRUE
+ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS=FALSE
PHP_VERSION="8.4"
CONTAINER_NAME=$(shell echo "${CONTAINER_REGISTRY_REPO}:${PHP_VERSION}-${NTS_OR_ZTS_DOCKER_IMAGE}-alpine${SLIM_DOCKER_IMAGE}-dev")
CONTAINER_NAME_INTERACTIVE_SHELL=$(shell echo "${CONTAINER_REGISTRY_REPO}:${PHP_VERSION}-zts-alpine-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)
+COMPOSER_CONTAINER_CACHE_DIR=$(shell ((command -v docker >/dev/null 2>&1) && docker run --rm $(if $(filter 0,$(TTY_AVAILABLE)),-it,-i) ${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
@@ -21,15 +31,34 @@ else
IN_DOCKER=FALSE
endif
+ifeq ("$(GITHUB_ACTIONS)","true")
+ IN_CI=TRUE
+else
+ IN_CI=FALSE
+endif
+
+ifeq ("$(IN_CI)","TRUE")
+ MUTATION_THREADS?=1
+else
+ MUTATION_THREADS?=$(THREADS)
+endif
+
ifeq ("$(IN_DOCKER)","TRUE")
DOCKER_RUN:=
+ DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER:=
DOCKER_RUN_WITH_SOCKET:=
DOCKER_SHELL:=
DOCKER_INTERACTIVE_SHELL:=
+ DOCKER_DEFAULT_SECURITY_OPS=
+ DOCKER_WORKSPACE_BIND_OPS=--volumes-from $$(cat /etc/hostname) -w "`pwd`"
else
ifeq ($(DOCKER_AVAILABLE),0)
DOCKER_DEFAULT_SECURITY_OPS=--cap-drop=ALL --security-opt="no-new-privileges=true" --user="`id -u`:`id -g`"
- DOCKER_COMMON_OPS:=-v "`pwd`:`pwd`" -w "`pwd`" -v "`pwd`/.git:`pwd`/.git:ro" -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" --ulimit nofile=1000000
+ DOCKER_WORKSPACE_BIND_OPS=-v "`pwd`:`pwd`" -w "`pwd`"
+ DOCKER_COMMON_OPS:=-v "`pwd`:`pwd`" -w "`pwd`" -v "`pwd`/.git:`pwd`/.git:ro" -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" --ulimit nofile=1000000 -e THREADS="${THREADS}" -e MUTATION_THREADS="${MUTATION_THREADS}" -e OTEL_PHP_DISABLED_INSTRUMENTATIONS="all"
+ ifneq ("$(wildcard etc/qa/zzz_disable_otel_attr_hooks.ini)","")
+ DOCKER_COMMON_OPS:=${DOCKER_COMMON_OPS} -v "`pwd`/etc/qa/zzz_disable_otel_attr_hooks.ini:/usr/local/etc/php/conf.d/zzz_disable_otel_attr_hooks.ini:ro"
+ endif
DOCKER_COMMON_NON_INTERACTIVE_OPS:=-e OTEL_PHP_FIBERS_ENABLED="${OTEL_PHP_FIBERS_ENABLED}"
DOCKER_COMMON_INTERACTIVE_OPS:=-e OTEL_PHP_FIBERS_ENABLED="false"
ifeq ("$(NEEDS_DOCKER_SOCKET)","TRUE")
@@ -48,43 +77,69 @@ else
DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:=
endif
DOCKER_RUN:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}"
+ DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} -e COMPOSER_DISABLE_NETWORK="1" ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}"
DOCKER_RUN_WITH_SOCKET:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} ${DOCKER_SOCKET_OPS} "${CONTAINER_NAME}${DOCKER_SOCKET_CONTAINER_NAME_SUFFIX}"
- DOCKER_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}"
- DOCKER_INTERACTIVE_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME_INTERACTIVE_SHELL}"
+ ifeq ($(TTY_AVAILABLE),0)
+ DOCKER_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}"
+ DOCKER_INTERACTIVE_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME_INTERACTIVE_SHELL}"
+ else
+ DOCKER_SHELL:=$(DOCKER_RUN)
+ DOCKER_INTERACTIVE_SHELL:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME_INTERACTIVE_SHELL}"
+ endif
else
DOCKER_RUN:=
+ DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER:=
DOCKER_RUN_WITH_SOCKET:=
DOCKER_SHELL:=
DOCKER_INTERACTIVE_SHELL:=
+ DOCKER_DEFAULT_SECURITY_OPS=
+ DOCKER_WORKSPACE_BIND_OPS=
endif
endif
-ifneq (,$(findstring icrosoft,$(shell cat /proc/version)))
- THREADS=1
-else
- THREADS=$(shell nproc)
-endif
+DOCKER_RUN_DOCUMENTATION=docker run --rm -i $(DOCKER_DEFAULT_SECURITY_OPS) $(DOCKER_WORKSPACE_BIND_OPS)
-## Run everything extra point
+## Run everything extra points
all: ## Runs everything ####
+ifeq ("$(ALL_HAS_DIRECT_DOCKER_TASKS)","TRUE")
+ $(MAKE) all-raw
+else
$(DOCKER_RUN_WITH_SOCKET) make all-raw
+endif
all-raw: ## The real runs everything, but due to sponge it has to be ran inside DOCKER_RUN ##U##
- $(MAKE) composer-validate syntax-php backward-compatibility-check ## Count: 3
+ $(MAKE) composer-validate syntax-php composer-normalize backward-compatibility-check ## Count: 4
+
+
+## Run a subset of everything for those that find everything intimidating
+contrib: ## Runs a subset of everything (all) ####
+ifeq ("$(CONTRIB_HAS_DIRECT_DOCKER_TASKS)","TRUE")
+ $(MAKE) contrib-raw
+else
+ $(DOCKER_RUN_WITH_SOCKET) make contrib-raw
+endif
+contrib-raw: ## The real runs everything, but due to sponge it has to be ran inside DOCKER_RUN ##U##
+ $(MAKE) documentation-qa ## Count: 1
## 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("IyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGNhc2UgcGVvcGxlIGRvbid0IGhhdmUgY29yZS5hdXRvY3JsZiBzZXQuCiogdGV4dCBlb2w9bGYKCiMgVGhlc2UgZmlsZXMgYXJlIGJpbmFyeSBhbmQgc2hvdWxkIGJlIGxlZnQgdW50b3VjaGVkCiMgKGJpbmFyeSBpcyBhIG1hY3JvIGZvciAtdGV4dCAtZGlmZikKKi5wbmcgYmluYXJ5CiouanBnIGJpbmFyeQoqLmpwZWcgYmluYXJ5CiouZ2lmIGJpbmFyeQoqLmljbyBiaW5hcnkKKi53ZWJwIGJpbmFyeQoqLmJtcCBiaW5hcnkKKi50dGYgYmluYXJ5CiouYmxwIGJpbmFyeQoqLmRiMiBiaW5hcnkKCiMgSWdub3JpbmcgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbiBhcmNoaWV2ZXMKLmdpdGh1Yi8gZXhwb3J0LWlnbm9yZQpldGMvY2kvIGV4cG9ydC1pZ25vcmUKZXRjL2Rldi1hcHAvIGV4cG9ydC1pZ25vcmUKZXRjL3FhLyBleHBvcnQtaWdub3JlCmV4YW1wbGVzLyBleHBvcnQtaWdub3JlCnRlc3RzLyBleHBvcnQtaWdub3JlCnZhci8gZXhwb3J0LWlnbm9yZQouZGV2Y29udGFpbmVyLmpzb24gZXhwb3J0LWlnbm9yZQouZWRpdG9yY29uZmlnIGV4cG9ydC1pZ25vcmUKLmdpdGF0dHJpYnV0ZXMgZXhwb3J0LWlnbm9yZQouZ2l0aWdub3JlIGV4cG9ydC1pZ25vcmUKQ09OVFJJQlVUSU5HLm1kIGV4cG9ydC1pZ25vcmUKY29tcG9zZXIubG9jayBleHBvcnQtaWdub3JlCk1ha2VmaWxlIGV4cG9ydC1pZ25vcmUKUkVBRE1FLm1kIGV4cG9ydC1pZ25vcmUKCiMgRGlmZmluZwoqLnBocCBkaWZmPXBocAo="));' || true)
+migrations-git-enforce-gitattributes-contents: #### Enforce `.gitattributes` contents ##*I*##
+ ($(DOCKER_RUN) php -r 'file_put_contents(".gitattributes", base64_decode("IyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGNhc2UgcGVvcGxlIGRvbid0IGhhdmUgY29yZS5hdXRvY3JsZiBzZXQuCiogdGV4dCBlb2w9bGYKCiMgVGhlc2UgZmlsZXMgYXJlIGJpbmFyeSBhbmQgc2hvdWxkIGJlIGxlZnQgdW50b3VjaGVkCiMgKGJpbmFyeSBpcyBhIG1hY3JvIGZvciAtdGV4dCAtZGlmZikKKi5wbmcgYmluYXJ5CiouanBnIGJpbmFyeQoqLmpwZWcgYmluYXJ5CiouZ2lmIGJpbmFyeQoqLmljbyBiaW5hcnkKKi53ZWJwIGJpbmFyeQoqLmJtcCBiaW5hcnkKKi50dGYgYmluYXJ5CiouYmxwIGJpbmFyeQoqLmRiMiBiaW5hcnkKCiMgSWdub3JpbmcgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbiBhcmNoaWV2ZXMKLmdpdGh1Yi8gZXhwb3J0LWlnbm9yZQpldGMvY2kvIGV4cG9ydC1pZ25vcmUKZXRjL2Rldi1hcHAvIGV4cG9ydC1pZ25vcmUKZXRjL3N0YXRlLyBleHBvcnQtaWdub3JlCmV0Yy9xYS8gZXhwb3J0LWlnbm9yZQpleGFtcGxlcy8gZXhwb3J0LWlnbm9yZQp0ZXN0cy8gZXhwb3J0LWlnbm9yZQp2YXIvIGV4cG9ydC1pZ25vcmUKLmRldmNvbnRhaW5lci5qc29uIGV4cG9ydC1pZ25vcmUKLmVkaXRvcmNvbmZpZyBleHBvcnQtaWdub3JlCi5naXRhdHRyaWJ1dGVzIGV4cG9ydC1pZ25vcmUKLmdpdGlnbm9yZSBleHBvcnQtaWdub3JlCkNPTlRSSUJVVElORy5tZCBleHBvcnQtaWdub3JlCmNvbXBvc2VyLmxvY2sgZXhwb3J0LWlnbm9yZQpNYWtlZmlsZSBleHBvcnQtaWdub3JlClJFQURNRS5tZCBleHBvcnQtaWdub3JlCgojIERpZmZpbmcKKi5waHAgZGlmZj1waHAK"));' || true)
+
+migrations-git-enforce-editorconfig-contents: #### Enforce `.editorconfig` contents ##*I*##
+ ($(DOCKER_RUN) php -r 'file_put_contents(".editorconfig", base64_decode("cm9vdCA9IHRydWUKClsqXQpjaGFyc2V0ID0gdXRmLTgKaW5kZW50X3N0eWxlID0gc3BhY2UKaW5kZW50X3NpemUgPSA0Cmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQp0cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlCgpbKi5qc29uXQppbmRlbnRfc2l6ZSA9IDIKClsqLnltbF0KaW5kZW50X3NpemUgPSAyCgpbKi55YW1sXQppbmRlbnRfc2l6ZSA9IDIKCltNYWtlZmlsZV0KaW5kZW50X3N0eWxlID0gdGFiCgpbKi5ta10KaW5kZW50X3N0eWxlID0gdGFiCgpbKi5uZW9uXQppbmRlbnRfc3R5bGUgPSB0YWIK"));' || true)
-migrations-git-make-sure-gitignore-exists: #### Make sure .gitignore exists ##*I*##
+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*##
+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*##
+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-git-make-sure-gitignore-ignores-vale-styles-except-vocab: #### Ignore Vale styles except WyriHaximus vocab symlink ##*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, "etc/qa/vale/**") !== false) {exit;} file_put_contents($$gitignoreFile, "etc/qa/vale/**\n!etc/qa/vale/styles/\n!etc/qa/vale/styles/config/\n!etc/qa/vale/styles/config/vocabularies/\n!etc/qa/vale/styles/config/vocabularies/WyriHaximus/\n!etc/qa/vale/styles/config/vocabularies/WyriHaximus/accept.txt\n", FILE_APPEND);' || true)
+
migrations-docs-update-readme-copyright-c-year-to-current: #### Update readme copyright year to current ##*I*##
($(DOCKER_RUN) php -r '$$readmeFile = "README.md"; $$copyRight = "Copyright (c) "; $$currentYear = date("Y"); if (!file_exists($$readmeFile)) {exit;} $$readmeContents = file_get_contents($$readmeFile); foreach (range(2000, 2100) as $$year) { $$readmeContents = str_replace($$copyRight . $$year, $$copyRight . $$currentYear, $$readmeContents); } file_put_contents($$readmeFile, $$readmeContents); ' || true)
@@ -106,6 +161,30 @@ migrations-docs-update-license-copyright-c-year-to-current: #### Update license
migrations-docs-update-license-copyright-year-to-current: #### Update license copyright year to current ##*I*##
($(DOCKER_RUN) php -r '$$licenseFile = "LICENSE"; $$copyRight = "Copyright "; $$currentYear = date("Y"); if (!file_exists($$licenseFile)) {exit;} $$licenseContents = file_get_contents($$licenseFile); foreach (range(2000, 2100) as $$year) { $$licenseContents = str_replace($$copyRight . $$year, $$copyRight . $$currentYear, $$licenseContents); } file_put_contents($$licenseFile, $$licenseContents); ' || true)
+migrations-docs-enforce-contributing-md-contents: #### Enforce CONTRIBUTING.md contents ##*I*##
+ ($(DOCKER_RUN) php -r '$$contributingFile = "CONTRIBUTING.md"; $$contributingContents = base64_decode("IyBDb250cmlidXRpbmcKClB1bGwgcmVxdWVzdHMgYXJlIGhpZ2hseSBhcHByZWNpYXRlZC4gSGVyZSdzIGEgcXVpY2sgZ3VpZGUuCgpGb3JrLCB0aGVuIGNsb25lIHRoZSByZXBvOgoKICAgIGdpdCBjbG9uZSBnaXRAZ2l0aHViLmNvbTp5b3VyLXVzZXJuYW1lL1tyZXBvXS5naXQKCkluc3RhbGwgZGVwZW5kZW5jaWVzOgoKICAgIG1ha2UgaW5zdGFsbAoKV29yayBvbiB0aGUgY29udHJpYnV0aW9uIGFuZCBjaGVjayBpZiBpdCBwYXNzZXMgYWxsIFFBIGNoZWNrcyB3aXRoOgoKICAgIG1ha2UKCklmIHNvbWUgb2YgdGhlIFBIUFN0YW4gb3Igb3RoZXIgY2hlY2tzIGFyZSB0byBzdHJpY3Qgb3IgaW50aW1pZGF0aW5nIHRoYXQgaXMgZmluZSwgZmluaXNoIHdoYXQgeW91IHdhbnQgdG8gY29udHJpYnV0ZSBhbmQgSSdsbCBoZWxwIHlvdSB3aXRoIHRob3NlLCBidXQgcGxlYXNlIG1ha2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIHBhc3Nlcy4gSXQgcnVucyBhIHN1YnNldCBvZiBldmVyeXRoaW5nOgoKICAgIG1ha2UgY29udHJpYgoKWW91IGNhbiBsaXN0IGFsbCB0aGUgY29udHJpYiBjb21tYW5kcyB3aXRoOgoKICAgIG1ha2UgaGVscC1jb250cmliCgpQdXNoIHRvIHlvdXIgZm9yayBhbmQgW3N1Ym1pdCBhIHB1bGwgcmVxdWVzdF1bcHJdLgoKW3ByXTogaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vcHVsbC1yZXF1ZXN0cy9jb2xsYWJvcmF0aW5nLXdpdGgtcHVsbC1yZXF1ZXN0cy9wcm9wb3NpbmctY2hhbmdlcy10by15b3VyLXdvcmstd2l0aC1wdWxsLXJlcXVlc3RzL2NyZWF0aW5nLWEtcHVsbC1yZXF1ZXN0CgpDb250cmlidXRpbmcgd2l0aCBhbiBMTE0/IFRoaXMgcmVwbyBpbmNsdWRlcyBhbiBbYEFHRU5UUy5tZGBdKEFHRU5UUy5tZCkgd2l0aCBndWlkYW5jZSBmb3IgY29kaW5nIGFnZW50czsgcG9pbnRpbmcgeW91ciBhZ2VudCBhdCBpdCBoZWxwcyBhIGxvdC4gQmVmb3JlIHlvdSBvcGVuIGEgUFIsIHNraW0gdGhyb3VnaCB5b3VyIGNoYW5nZXMgc28geW91IGZlZWwgY29tZm9ydGFibGUgd2l0aCBldmVyeXRoaW5nIHlvdSdyZSBzdWJtaXR0aW5nLgo="); file_put_contents($$contributingFile, str_replace(["[repo]"], [basename(__DIR__)], $$contributingContents)); ' || true)
+
+migrations-docs-create-documentation-markdownlint-config-if-not-exists: #### Create `etc/qa/documentation.markdownlint-cli2.yaml` when missing ##*I*##
+ ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/documentation.markdownlint-cli2.yaml"; if (file_exists($$configFile)) {exit;} if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("Z2l0aWdub3JlOiB0cnVlCm5vUHJvZ3Jlc3M6IHRydWUKbm9CYW5uZXI6IHRydWUKZ2xvYnM6CiAgLSAiKiovKi5tZCIKaWdub3JlczoKICAtICJ2YXIvKioiCiAgLSAidmVuZG9yLyoqIgogIC0gIi5naXQvKioiCmNvbmZpZzoKICBNRDAwNDogZmFsc2UKICBNRDAwNzogZmFsc2UKICBNRDAxMjogZmFsc2UKICBNRDAxMzogZmFsc2UKICBNRDAyMjogZmFsc2UKICBNRDAyNTogZmFsc2UKICBNRDAyNjogZmFsc2UKICBNRDAzMjogZmFsc2UKICBNRDAzMzogZmFsc2UKICBNRDA0MDogZmFsc2UKICBNRDA0MTogZmFsc2UK"));' || true)
+
+migrations-docs-create-lychee-config-if-not-exists: #### Create `etc/qa/lychee.toml` when missing ##*I*##
+ ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/lychee.toml"; if (file_exists($$configFile)) {exit;} if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("dmVyYm9zZSA9ICJ3YXJuIgpub19wcm9ncmVzcyA9IHRydWUKZXhjbHVkZV9wYXRoID0gWyJedmFyLyIsICJedmVuZG9yLyIsICJeXFwuZ2l0LyJdCgpbaG9zdHMuImRvY3MuZ2l0aHViLmNvbSJdCmhlYWRlcnMgPSB7IEFjY2VwdC1FbmNvZGluZyA9ICJ6c3RkLCBiciwgZ3ppcCwgZGVmbGF0ZSIgfQo="));' || true)
+
+migrations-docs-enforce-cspell-config-contents: #### Enforce `etc/qa/cspell.json` contents ##*I*##
+ ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/cspell.json"; if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("ewogICAgInZlcnNpb24iOiAiMC4yIiwKICAgICJsYW5ndWFnZSI6ICJlbiIsCiAgICAiYWxsb3dDb21wb3VuZFdvcmRzIjogdHJ1ZSwKICAgICJpZ25vcmVQYXRocyI6IFsKICAgICAgICAidmFyLyoqIiwKICAgICAgICAidmVuZG9yLyoqIiwKICAgICAgICAiLmdpdC8qKiIsCiAgICAgICAgIi5pZGVhLyoqIgogICAgXSwKICAgICJ3b3JkcyI6IFsKICAgICAgICAiQWlUZWxscyIsCiAgICAgICAgIkFzeW5jIiwKICAgICAgICAiQ1NwZWxsIiwKICAgICAgICAiQ2Vlcy1KYW4iLAogICAgICAgICJDb21wb3NlciIsCiAgICAgICAgIkRpYXRheGlzIiwKICAgICAgICAiRmlnbGV0IiwKICAgICAgICAiR0hBIiwKICAgICAgICAiR2l0SHViIiwKICAgICAgICAiSW5mZWN0aW9uUEhQIiwKICAgICAgICAiS2lld2lldCIsCiAgICAgICAgIk1TSSIsCiAgICAgICAgIk1ha2VmaWxlIiwKICAgICAgICAiTWFrZWZpbGVzIiwKICAgICAgICAiTWFtbWF0dXMiLAogICAgICAgICJNYW1tYXR1c1BIUCIsCiAgICAgICAgIk1vbm9sb2ciLAogICAgICAgICJOVFMiLAogICAgICAgICJPVEVMIiwKICAgICAgICAiUEhQQ1MiLAogICAgICAgICJQSFBTdGFuIiwKICAgICAgICAiUEhQVW5pdCIsCiAgICAgICAgIlBTUiIsCiAgICAgICAgIlBhY2thZ2lzdCIsCiAgICAgICAgIlJlbm92YXRlIiwKICAgICAgICAiUmV0cmlhYmxlIiwKICAgICAgICAiUm9hdmUiLAogICAgICAgICJSeFBIUCIsCiAgICAgICAgIlZhbGUiLAogICAgICAgICJXU0wiLAogICAgICAgICJXeXJpSGF4aW11cyIsCiAgICAgICAgIlpUUyIsCiAgICAgICAgImJhY2t0aWNrIiwKICAgICAgICAiYm95c2NvdXQiLAogICAgICAgICJjb2Rlc3BlbGwiLAogICAgICAgICJjb25maWciLAogICAgICAgICJjb25maWdzIiwKICAgICAgICAiZGF0YXByb3ZpZGVyIiwKICAgICAgICAiZGF0YXByb3ZpZGVycyIsCiAgICAgICAgImZyb250bWF0dGVyIiwKICAgICAgICAiZ2hjciIsCiAgICAgICAgImhlYWx0aHoiLAogICAgICAgICJseWNoZWUiLAogICAgICAgICJseWNoZWV2ZXJzZSIsCiAgICAgICAgIm1ha2VmaWxlcyIsCiAgICAgICAgIm1hcmtkb3dubGludCIsCiAgICAgICAgInBocHN0YW4iLAogICAgICAgICJwaHB1bml0IiwKICAgICAgICAicmVwbyIsCiAgICAgICAgInN1YmFnZW50IiwKICAgICAgICAic3ViYWdlbnRzIiwKICAgICAgICAic3VibGljZW5zZSIsCiAgICAgICAgInZob3N0cyIsCiAgICAgICAgInd5cmloYXhpbXVzIiwKICAgICAgICAid3lyaWhheGltdXNuZXQiCiAgICBdCn0K"));' || true)
+
+migrations-docs-enforce-vale-config-contents: #### Enforce `etc/qa/vale.ini` contents ##*I*##
+ ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/vale.ini"; if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("U3R5bGVzUGF0aCA9IHZhbGUvc3R5bGVzCk1pbkFsZXJ0TGV2ZWwgPSB3YXJuaW5nClZvY2FiID0gV3lyaUhheGltdXMKUGFja2FnZXMgPSBodHRwczovL2dpdGh1Yi5jb20vamRrYXRvL2RpYXRheGlzL3JlbGVhc2VzL2Rvd25sb2FkL3YwLjEuMC9EaWF0YXhpcy56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vdmFsZS1jbGkvd3JpdGUtZ29vZC9yZWxlYXNlcy9kb3dubG9hZC92MC40LjEvd3JpdGUtZ29vZC56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vdmFsZS1jbGkvcmVhZGFiaWxpdHkvcmVsZWFzZXMvZG93bmxvYWQvdjAuMi4wL1JlYWRhYmlsaXR5LnppcCwgXAogICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxlLWNsaS9wcm9zZWxpbnQvcmVsZWFzZXMvZG93bmxvYWQvdjAuMy40L3Byb3NlbGludC56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vdmFsZS1jbGkvYWxleC9yZWxlYXNlcy9kb3dubG9hZC92MC4yLjMvYWxleC56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYTExeWZyZWQvbmVpZ2hib3IvcmVsZWFzZXMvZG93bmxvYWQvdjIuMi4wL25laWdoYm9yLnppcCwgXAogICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qZGthdG8vYTExeS9yZWxlYXNlcy9kb3dubG9hZC92MC4xLjAvQTExeS56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20va3Jpc2huYXN1bmthbS92YWxlLWFpLXRlbGxzL3JlbGVhc2VzL2Rvd25sb2FkL3YxLjAuMC9BaVRlbGxzLnppcAoKWypdCkJhc2VkT25TdHlsZXMgPSBWYWxlLCB3cml0ZS1nb29kLCBSZWFkYWJpbGl0eSwgcHJvc2VsaW50LCBhbGV4LCBuZWlnaGJvciwgQTExeSwgQWlUZWxscwoKVmFsZS5TcGVsbGluZyA9IE5PClZhbGUuVGVybXMgPSBOTwoKd3JpdGUtZ29vZC5FLVByaW1lID0gTk8Kd3JpdGUtZ29vZC5XZWFzZWwgPSBZRVMKd3JpdGUtZ29vZC5QYXNzaXZlID0gWUVTCndyaXRlLWdvb2QuVG9vV29yZHkgPSBZRVMKClJlYWRhYmlsaXR5ID0gc3VnZ2VzdGlvbgpuZWlnaGJvci5BbGxDYXBzUHJvc2UgPSBOTwpBMTF5LkxpbmtVUkwgPSBOTwp3cml0ZS1nb29kLlBhc3NpdmUgPSBOTwp3cml0ZS1nb29kLlRvb1dvcmR5ID0gTk8Kd3JpdGUtZ29vZC5XZWFzZWwgPSBOTwpwcm9zZWxpbnQuQW5ub3RhdGlvbnMgPSBOTwpwcm9zZWxpbnQuVHlwb2dyYXBoeSA9IE5PCnByb3NlbGludC5IeXBlcmJvbGUgPSBOTwpBaVRlbGxzLkRhc2ggPSBOTwphbGV4LkNvbmRlc2NlbmRpbmcgPSBOTwphbGV4LlByb2Zhbml0eVVubGlrZWx5ID0gTk8KSG93VG8uU3RlcHMgPSBzdWdnZXN0aW9uCkhvd1RvLk9wZW5pbmcgPSBzdWdnZXN0aW9uCgpbUkVBRE1FLm1kXQpCYXNlZE9uU3R5bGVzID0gVmFsZSwgd3JpdGUtZ29vZCwgUmVhZGFiaWxpdHksIHByb3NlbGludCwgYWxleCwgbmVpZ2hib3IsIEExMXksIEFpVGVsbHMsIEV4cGxhbmF0aW9uCgpbQ09OVFJJQlVUSU5HLm1kXQpCYXNlZE9uU3R5bGVzID0gVmFsZSwgd3JpdGUtZ29vZCwgUmVhZGFiaWxpdHksIHByb3NlbGludCwgYWxleCwgbmVpZ2hib3IsIEExMXksIEFpVGVsbHMsIEhvd1RvCgpbZXRjL2FpLyoqLm1kXQpCYXNlZE9uU3R5bGVzID0gVmFsZSwgd3JpdGUtZ29vZCwgUmVhZGFiaWxpdHksIHByb3NlbGludCwgYWxleCwgbmVpZ2hib3IsIEExMXksIEFpVGVsbHMsIFJlZmVyZW5jZQo="));' || true)
+
+migrations-docs-enforce-vale-vocab-contents: #### Enforce `etc/qa/vale-vocab.txt` contents ##*I*##
+ ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/vale-vocab.txt"; if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("QWlUZWxscwpBc3luYwpDU3BlbGwKQ2Vlcy1KYW4KQ29tcG9zZXIKRGlhdGF4aXMKRmlnbGV0CkdIQQpHaXRIdWIKSW5mZWN0aW9uUEhQCktpZXdpZXQKTVNJCk1ha2VmaWxlCk1ha2VmaWxlcwpNYW1tYXR1cwpNYW1tYXR1c1BIUApNb25vbG9nCk5UUwpPVEVMClBIUENTClBIUFN0YW4KUEhQVW5pdApQU1IKUGFja2FnaXN0ClJlbm92YXRlClJldHJpYWJsZQpSb2F2ZQpSeFBIUApWYWxlCldTTApXeXJpSGF4aW11cwpaVFMKYmFja3RpY2sKYm95c2NvdXQKY29kZXNwZWxsCmNvbmZpZwpjb25maWdzCmRhdGFwcm92aWRlcgpkYXRhcHJvdmlkZXJzCmZyb250bWF0dGVyCmdoY3IKaGVhbHRoegpseWNoZWUKbHljaGVldmVyc2UKbWFrZWZpbGVzCm1hcmtkb3dubGludApwaHBzdGFuCnBocHVuaXQKcmVwbwpzdWJhZ2VudApzdWJhZ2VudHMKc3VibGljZW5zZQp2aG9zdHMKd3lyaWhheGltdXMKd3lyaWhheGltdXNuZXQK"));' || true)
+
+migrations-docs-enrich-qa-wordlists-with-php-symbols: #### Merge PHP symbol names into etc/qa documentation wordlists ##*I*##
+ ($(DOCKER_RUN) php -r '$$autoload = getcwd() . "/vendor/autoload.php"; if (!is_file($$autoload)) {exit;} require $$autoload; \WyriHaximus\Makefiles\Documentation\WordlistDocumentationConfigSync::enrichQaWordlistsWithPhpSymbols(getcwd());' || true)
+
+migrations-docs-create-vale-vocab-symlink-if-not-exists: #### Create WyriHaximus Vale vocab symlink when missing ##*I*##
+ ($(DOCKER_RUN) php -r '$$link = "etc/qa/vale/styles/config/vocabularies/WyriHaximus/accept.txt"; if (is_link($$link)) {exit;} if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} if (!is_dir(dirname($$link))) {mkdir(dirname($$link), 0777, true);} symlink("../../../../../vale-vocab.txt", $$link);' || true)
+
migrations-php-make-sure-var-exists: #### Make sure `var/` exists ##*I*##
($(DOCKER_RUN) mkdir var || true)
@@ -142,19 +221,28 @@ migrations-php-remove-old-scrutinizer-yml-config: #### Make sure we remove `.scr
migrations-php-remove-old-appveyor-yml-config: #### Make sure we remove `appveyor.yml` ##*I*##
($(DOCKER_RUN) rm appveyor.yml || true)
-migrations-php-ensure-etc-ci-markdown-link-checker-json-exists: #### Make sure we have etc/ci/markdown-link-checker.json ##*I*##
+migrations-php-remove-old-travis-yml-config: #### Make sure we remove `.travis.yml` ##*I*##
+ ($(DOCKER_RUN) rm .travis.yml || 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*##
+migrations-php-ensure-etc-qa-coverage-guard-php-exists: #### Make sure we have `etc/qa/coverage-guard.php` ##*I*##
+ ($(DOCKER_RUN) php -r '$$coverageGuardFile = "etc/qa/coverage-guard.php"; $$coverageGuardConfig = base64_decode("PD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKdXNlIFNoaXBNb25rXENvdmVyYWdlR3VhcmRcQ29uZmlnOwp1c2UgU2hpcE1vbmtcQ292ZXJhZ2VHdWFyZFxFeGNsdWRlclxJZ25vcmVUaHJvd05ld0V4Y2VwdGlvbkxpbmVFeGNsdWRlcjsKdXNlIFNoaXBNb25rXENvdmVyYWdlR3VhcmRcUnVsZVxFbmZvcmNlQ292ZXJhZ2VGb3JNZXRob2RzUnVsZTsKCnJldHVybiAoc3RhdGljIGZ1bmN0aW9uICgpOiBDb25maWcgewogICAgJGNvbmZpZyA9IG5ldyBDb25maWcoKTsKCiAgICAkY29uZmlnLT5hZGRSdWxlKG5ldyBFbmZvcmNlQ292ZXJhZ2VGb3JNZXRob2RzUnVsZSgKICAgICAgICByZXF1aXJlZENvdmVyYWdlUGVyY2VudGFnZTogODAsCiAgICAgICAgbWluRXhlY3V0YWJsZUxpbmVzOiAxLAogICAgKSk7CgogICAgJGNvbmZpZy0+YWRkRXhlY3V0YWJsZUxpbmVFeGNsdWRlcihuZXcgSWdub3JlVGhyb3dOZXdFeGNlcHRpb25MaW5lRXhjbHVkZXIoWwogICAgICAgIFJ1bnRpbWVFeGNlcHRpb246OmNsYXNzLAogICAgXSkpOwoKICAgIHJldHVybiAkY29uZmlnOwp9KSgpOwo="); if (file_exists($$coverageGuardFile)) {exit;} file_put_contents($$coverageGuardFile, $$coverageGuardConfig);' || true)
+
+migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-exists: #### Make sure we have `etc/qa/zzz_disable_otel_attr_hooks.ini` ##*I*##
+ ($(DOCKER_RUN) php -r 'if (in_array("opentelemetry-instrumentation", ["linux","zts"])) {exit;} $$otelAttrHooksIniFile = "etc/qa/zzz_disable_otel_attr_hooks.ini"; $$otelAttrHooksIniContents = base64_decode("OyBBdm9pZCB6ZW5kX21tX2hlYXAgY29ycnVwdGlvbiB3aXRoICNbV2l0aFNwYW5dIChtYW1tYXR1cyB1c2VzIGhvb2soKSBpbnN0ZWFkKS4KOyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LXBocC1pbnN0cnVtZW50YXRpb24vcHVsbC8zMjEKOyBBbHJlYWR5IHNvbHZlZDogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktcGhwLWluc3RydW1lbnRhdGlvbi9wdWxsLzMxMwpvcGVudGVsZW1ldHJ5LmF0dHJfaG9va3NfZW5hYmxlZD1PZmYK"); if (file_exists($$otelAttrHooksIniFile)) {exit;} file_put_contents($$otelAttrHooksIniFile, $$otelAttrHooksIniContents);' || 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-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("ewogICAgInRocmVhZHMiOiA2NCwKICAgICJ0aW1lb3V0IjogMTIwLAogICAgInNvdXJjZSI6IHsKICAgICAgICAiZGlyZWN0b3JpZXMiOiBbCiAgICAgICAgICAgICJzcmMiCiAgICAgICAgXQogICAgfSwKICAgICJsb2dzIjogewogICAgICAgICJ0ZXh0IjogIi4uLy4uL3Zhci9pbmZlY3Rpb24ubG9nIiwKICAgICAgICAic3VtbWFyeSI6ICIuLi8uLi92YXIvaW5mZWN0aW9uLXN1bW1hcnkubG9nIiwKICAgICAgICAianNvbiI6ICIuLi8uLi92YXIvaW5mZWN0aW9uLmpzb24iLAogICAgICAgICJwZXJNdXRhdG9yIjogIi4uLy4uL3Zhci9pbmZlY3Rpb24tcGVyLW11dGF0b3IubWQiLAogICAgICAgICJnaXRodWIiOiB0cnVlCiAgICB9LAogICAgIm1pbk1zaSI6IDEwMCwKICAgICJtaW5Db3ZlcmVkTXNpIjogMTAwLAogICAgImlnbm9yZU1zaVdpdGhOb011dGF0aW9ucyI6IHRydWUsCiAgICAibXV0YXRvcnMiOiB7CiAgICAgICAgIkBkZWZhdWx0IjogdHJ1ZQogICAgfQp9Cg=="); 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*##
+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*##
+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*##
@@ -169,37 +257,40 @@ migrations-php-infection-ensure-log-json-has-the-correct-path: #### Ensure infec
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*##
+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*##
+migrations-php-infection-add-threads-64-to-config: #### Ensure `threads` is set to `64` 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("threads", $$json)) {exit;} $$json["threads"] = 64; 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("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4KICAgIDx0ZXN0c3VpdGVzPgogICAgICAgIDx0ZXN0c3VpdGUgbmFtZT0iVGVzdCBTdWl0ZSI+CiAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vdGVzdHMvPC9kaXJlY3Rvcnk+CiAgICAgICAgPC90ZXN0c3VpdGU+CiAgICA8L3Rlc3RzdWl0ZXM+CiAgICA8c291cmNlPgogICAgICAgIDxpbmNsdWRlPgogICAgICAgICAgICA8ZGlyZWN0b3J5IHN1ZmZpeD0iLnBocCI+Li4vLi4vc3JjLzwvZGlyZWN0b3J5PgogICAgICAgIDwvaW5jbHVkZT4KICAgIDwvc291cmNlPgogICAgPGV4dGVuc2lvbnM+CiAgICAgICAgPGJvb3RzdHJhcCBjbGFzcz0iRXJnZWJuaXNcUEhQVW5pdFxTbG93VGVzdERldGVjdG9yXEV4dGVuc2lvbiIvPgogICAgPC9leHRlbnNpb25zPgo8L3BocHVuaXQ+Cg=="));' || 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("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4KICAgIDx0ZXN0c3VpdGVzPgogICAgICAgIDx0ZXN0c3VpdGUgbmFtZT0iVGVzdCBTdWl0ZSI+CiAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vdGVzdHMvPC9kaXJlY3Rvcnk+CiAgICAgICAgPC90ZXN0c3VpdGU+CiAgICA8L3Rlc3RzdWl0ZXM+CiAgICA8c291cmNlPgogICAgICAgIDxpbmNsdWRlPgogICAgICAgICAgICA8ZGlyZWN0b3J5IHN1ZmZpeD0iLnBocCI+Li4vLi4vc3JjLzwvZGlyZWN0b3J5PgogICAgICAgIDwvaW5jbHVkZT4KICAgIDwvc291cmNlPgogICAgPGNvdmVyYWdlPgogICAgICAgIDxyZXBvcnQ+CiAgICAgICAgICAgIDxjbG92ZXIgb3V0cHV0RmlsZT0iLi4vLi4vdmFyL3Rlc3RzL3VuaXQvY2xvdmVyLWNvdmVyYWdlLnhtbCIvPgogICAgICAgICAgICA8aHRtbCBvdXRwdXREaXJlY3Rvcnk9Ii4uLy4uL3Zhci90ZXN0cy91bml0L2NvdmVyYWdlLWh0bWwiLz4KICAgICAgICA8L3JlcG9ydD4KICAgIDwvY292ZXJhZ2U+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*##
+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-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit: #### Make sure we see all the warnings, deprecations, etc etc that will make PHPunit do a non-happy exit ##*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;} $$xml = str_replace(base64_decode("PHBocHVuaXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgYm9vdHN0cmFwPSIuLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwIiBjb2xvcnM9InRydWUiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi92ZW5kb3IvcGhwdW5pdC9waHB1bml0L3BocHVuaXQueHNkIiBjYWNoZURpcmVjdG9yeT0iLi4vLi4vdmFyL3BocHVuaXQvY2FjaGUiPg=="), base64_decode("PHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4="), $$xml); file_put_contents($$phpUnitConfigFIle, $$xml);' || true)
+ ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (!file_exists($$phpUnitConfigFIle)) {exit;} $$xml = file_get_contents($$phpUnitConfigFIle); if (!is_string($$xml)) {exit;} $$xml = str_replace(base64_decode("PHBocHVuaXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgYm9vdHN0cmFwPSIuLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwIiBjb2xvcnM9InRydWUiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi92ZW5kb3IvcGhwdW5pdC9waHB1bml0L3BocHVuaXQueHNkIiBjYWNoZURpcmVjdG9yeT0iLi4vLi4vdmFyL3BocHVuaXQvY2FjaGUiPgo="), base64_decode("PHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4K"), $$xml); file_put_contents($$phpUnitConfigFIle, $$xml);' || true)
-migrations-php-move-phpstan: #### Move phpstan.neon to etc/qa/phpstan.neon ##*I*##
+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*##
+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*##
+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*##
+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 (optionally) tests paths set in etc/qa/phpstan.neon ##*I*##
+migrations-php-set-phpstan-paths-in-config: #### Ensure PHPStan config has the `etc`, `src`, and (optionally) `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"; $$pathsStringWithoutTests = "\n\tpaths:\n\t\t- ../../etc\n\t\t- ../../src"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (strpos($$neon, $$pathsString) !== false || strpos($$neon, $$pathsStringWithoutTests) !== 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*##
+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*##
@@ -208,70 +299,73 @@ migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended
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*##
+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*##
+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*##
+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", "", $$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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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*##
@@ -286,6 +380,12 @@ migrations-inline-code-psalm-remove-line-psalm-suppress: #### Remove all lines t
migrations-inline-code-remove-line-internal: #### Remove all lines that contain @internal ##*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, "@internal")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true)
+migrations-inline-code-remove-line-infection-ignore-all: #### Remove all lines that contain @infection-ignore-all ##*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, "@infection-ignore-all")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true)
+
+migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains: #### Replace self::expectExceptionMessage with self::expectExceptionMessageIsOrContains in all PHPUnit tests ##*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 = file_get_contents($$i->key()); if (str_contains($$fileContents, "#[Test]") && str_contains($$fileContents, "use PHPUnit\Framework\Attributes\Test;")) { $$fileContents = str_replace("self::expectExceptionMessage(", "self::expectExceptionMessageIsOrContains(", $$fileContents); file_put_contents($$i->key(), $$fileContents); } $$i->next(); } }' || true)
+
migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled: #### Ensure we only cs check/fix tests/ if unit-tests is enabled ##*I*##
($(DOCKER_RUN) php -r 'if (in_array("unit-tests", ["linux","zts"])) {exit;} $$phpCSCongifFIle = "etc/qa/phpcs.xml"; $$fileContents = explode("\n", file_get_contents($$phpCSCongifFIle)); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "../../tests")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$phpCSCongifFIle, implode("\n", $$fileContents));' || true)
@@ -304,69 +404,94 @@ migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-c
migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled: #### Ensure we remove the PHPCSS config file when code-style isn't enabled ##*I*##
($(DOCKER_RUN) php -r 'if (in_array("code-style", ["linux","zts"])) {exit;} @unlink("etc/qa/phpcs.xml");' || true)
-migrations-php-make-sure-github-exists: #### Make sure .github/ exists ##*I*##
+migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled: #### Ensure we remove the Composer Require Checker config file when composer-dependency-checkers aren't enabled ##*I*##
+ ($(DOCKER_RUN) php -r 'if (in_array("composer-dependency-checkers", ["linux","zts"])) {exit;} @unlink("etc/qa/composer-require-checker.json");' || true)
+
+migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled: #### Ensure we remove the Composer Unused config file when composer-dependency-checkers aren't enabled ##*I*##
+ ($(DOCKER_RUN) php -r 'if (in_array("composer-dependency-checkers", ["linux","zts"])) {exit;} @unlink("etc/qa/composer-unused.php");' || true)
+
+migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled: #### Ensure we remove `etc/qa/zzz_disable_otel_attr_hooks.ini` when opentelemetry-instrumentation is enabled ##*I*##
+ ($(DOCKER_RUN) php -r 'if (!in_array("opentelemetry-instrumentation", ["linux","zts"])) {exit;} @unlink("etc/qa/zzz_disable_otel_attr_hooks.ini");' || 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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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*##
+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)
+ ($(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, trim(base64_decode("aWY6IG1hdHJpeC5jaGVjayA9PSAnYmFja3dhcmQtY29tcGF0aWJpbGl0eS1jaGVjaycK"))) !== 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-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("bmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgpvbjoKICBwdXNoOgogICAgYnJhbmNoZXM6CiAgICAgIC0gJ21haW4nCiAgICAgIC0gJ21hc3RlcicKICAgICAgLSAncmVmcy9oZWFkcy92WzAtOV0rLlswLTldKy5bMC05XSsnCiAgcHVsbF9yZXF1ZXN0OgojIyBUaGlzIHdvcmtmbG93IG5lZWRzIHRoZSBgcHVsbC1yZXF1ZXN0YCBwZXJtaXNzaW9ucyB0byB3b3JrIGZvciB0aGUgcGFja2FnZSBkaWZmaW5nCiMjIFJlZnM6IGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvcmVmZXJlbmNlL3dvcmtmbG93LXN5bnRheC1mb3ItZ2l0aHViLWFjdGlvbnMjcGVybWlzc2lvbnMKcGVybWlzc2lvbnM6CiAgcHVsbC1yZXF1ZXN0czogd3JpdGUKICBjb250ZW50czogcmVhZApqb2JzOgogIGNpOgogICAgbmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgogICAgdXNlczogV3lyaUhheGltdXMvZ2l0aHViLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9wYWNrYWdlLnlhbWxANTM0Mzk0NGJlMmE2ZWY5NjMxODZiNWY0MTMxMjFmY2YzNjk4MGIzMyAjIHYxLjAuMAo="); 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*##
+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-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("bmFtZTogUmVsZWFzZSBNYW5hZ2VtZW50Cm9uOgogIHB1bGxfcmVxdWVzdDoKICAgIHR5cGVzOgogICAgICAtIG9wZW5lZAogICAgICAtIGxhYmVsZWQKICAgICAgLSB1bmxhYmVsZWQKICAgICAgLSBzeW5jaHJvbml6ZQogICAgICAtIHJlb3BlbmVkCiAgICAgIC0gbWlsZXN0b25lZAogICAgICAtIGRlbWlsZXN0b25lZAogICAgICAtIHJlYWR5X2Zvcl9yZXZpZXcKICBtaWxlc3RvbmU6CiAgICB0eXBlczoKICAgICAgLSBjbG9zZWQKcGVybWlzc2lvbnM6CiAgY29udGVudHM6IHdyaXRlCiAgaXNzdWVzOiB3cml0ZQogIHB1bGwtcmVxdWVzdHM6IHdyaXRlCmpvYnM6CiAgcmVsZWFzZS1tYW5hZ21lbnQ6CiAgICBuYW1lOiBSZWxlYXNlIE1hbmFnZW1lbnQKICAgIHVzZXM6IFd5cmlIYXhpbXVzL2dpdGh1Yi13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcGFja2FnZS1yZWxlYXNlLW1hbmFnZW1lbnQueWFtbEA1MzQzOTQ0YmUyYTZlZjk2MzE4NmI1ZjQxMzEyMWZjZjM2OTgwYjMzICMgdjEuMC4wCiAgICB3aXRoOgogICAgICBtaWxlc3RvbmU6ICR7eyBnaXRodWIuZXZlbnQubWlsZXN0b25lLnRpdGxlIH19CiAgICAgIGRlc2NyaXB0aW9uOiAke3sgZ2l0aHViLmV2ZW50Lm1pbGVzdG9uZS50aXRsZSB9fQo="); if (file_exists($$releaseManagementWorkflowFile)) {exit;} file_put_contents($$releaseManagementWorkflowFile, $$releaseManagementWorkflowContents);' || true)
+
+migrations-github-actions-rename-yml-workflow-files-to-yaml: #### Rename all `.yml` files in `.github/workflows` to `.yaml` ##*I*##
+ ($(DOCKER_RUN) php -r '$$workflowsDir = ".github/workflows"; if (!is_dir($$workflowsDir)) {exit;} foreach (scandir($$workflowsDir) as $$file) { if ($$file === "." || $$file === "..") {continue;} if (!str_ends_with($$file, ".yml")) {continue;} $$yamlName = substr($$file, 0, -4) . ".yaml"; $$yamlPath = $$workflowsDir . "/" . $$yamlName; if (file_exists($$yamlPath)) {continue;} rename($$workflowsDir . "/" . $$file, $$yamlPath); }' || true)
+
+migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml: #### Ensure `runsOn` is the only `runsOn` variant in `.github/workflows/utils.yaml` ##*I*##
+ ($(DOCKER_RUN) php -r '$$utilsWorkflowFile = ".github/workflows/utils.yaml"; if (!file_exists($$utilsWorkflowFile)) {exit;} $$yaml = file_get_contents($$utilsWorkflowFile); if (!is_string($$yaml)) {exit;} $$yaml = preg_replace("#(\s+)runsOn[A-Za-z0-9_]+:#", "$$1runsOn:", $$yaml); file_put_contents($$utilsWorkflowFile, $$yaml);' || true)
+
+migrations-github-actions-pin-package-workflow-reference-at-v1-0-0: #### Pin WyriHaximus/github-workflows reusable workflow references to SHA `5343944be2a6ef963186b5f413121fcf36980b33` (`v1.0.0`) in `.github/workflows` ##*I*##
+ ($(DOCKER_RUN) php -r '$$workflowsDir = ".github/workflows"; if (!is_dir($$workflowsDir)) {exit;} foreach (scandir($$workflowsDir) as $$file) { if (!str_ends_with($$file, ".yaml")) {continue;} $$workflowFile = $$workflowsDir . "/" . $$file; $$yaml = file_get_contents($$workflowFile); if (!is_string($$yaml)) {continue;} $$newYaml = preg_replace("#(uses: WyriHaximus/github-workflows/.github/workflows/[a-z0-9-]+)\\.yaml@(main|v1\\.0\\.0)#", "$$1.yaml@5343944be2a6ef963186b5f413121fcf36980b33 # v1.0.0", $$yaml); if ($$newYaml === $$yaml) {continue;} file_put_contents($$workflowFile, $$newYaml); }' || true)
-migrations-renovate-remove-dependabot-config: #### Make sure we remove .github/dependabot.yml ##*I*##
+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*##
+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*##
+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*##
+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*##
+migrations-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*##
+migrations-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)
+migrations-git-enforce-agents-md-contents: #### Enforce `AGENTS.md` contents ##*I*##
+ ($(DOCKER_RUN) php -r 'file_put_contents("AGENTS.md", base64_decode("IyBJbnN0cnVjdGlvbiBFY29ub215IChjaGVjayBiZWZvcmUgRVZFUlkgaW5zdHJ1Y3Rpb24geW91IGFkZCkKCkJlZm9yZSBhZGRpbmcgYW4gaW5zdHJ1Y3Rpb24gQU5ZV0hFUkUg4oCUIEFHRU5UUy5tZHMsIHJ1bGVzLCBhZ2VudHMsIHNraWxscywgaG9va3MsIGNvbmZpZ3M6IHByZWZlciB0aGUgTkFUSVZFIG1lY2hhbmlzbSAoZnJvbnRtYXR0ZXIgZmllbGQsIGNvbmZpZyBrZXksIGV4aXN0aW5nIHJ1bGUsIGEgcm91dGVyIHRvIHRoZSBzaW5nbGUgc291cmNlKSBvdmVyIG5ldyBwcm9zZSwgYW5kIHByZWZlciBERUxFVElORyBwcm9zZSBvdmVyIGFkZGluZyBpdC4gRXZlcnkgYWRkZWQgaW5zdHJ1Y3Rpb24gaXMgYSBjb250cmFkaWN0aW9uLWFuZC1kcmlmdCBzdXJmYWNlOyBjb25kZW5zZWQgY29waWVzIG9mIGFub3RoZXIgYXJ0aWZhY3QncyBjb250ZW50IGRyaWZ0IHNpbGVudGx5LiBTdWNjZXNzIG1ldHJpYzogdGhlIGRpZmYgc2hyaW5rcyBvciBob2xkcyB3aGlsZSBjYXBhYmlsaXR5IGdyb3dzLiBDb25zaXN0ZW5jeSBiZWF0cyB0b2tlbiB0aHJpZnQuCgojIFByb2plY3QgSW5zdHJ1Y3Rpb25zCgojIyBEZXBlbmRlbmNpZXMKLSBJbnN0YWxsOiBgbWFrZSBpbnN0YWxsYC4KLSBSZXF1aXJlIGEgbmV3IHBhY2thZ2U6IGBtYWtlIGNvbXBvc2VyLXJlcXVpcmUgIlBBQ0tBR0VOQU1FImAgb3IgYG1ha2UgY29tcG9zZXItcmVxdWlyZSAiUEFDS0FHRU5BTUUgLS1kZXYiYC4KCiMjIEV4ZWN1dGluZyBjb21tYW5kcwotIERvIG5vdyB1c2UgYGNkYCBmb3IgZXZlcnl0aGluZywgeW91J3JlIGFscmVhZHkgaW4gdGhlIHJvb3QhCi0gQ2hlY2sgYG1ha2UgaGVscGAgZm9yIGFsbCBhdmFpbGFibGUgY29tbWFuZHMuCi0gQ2hlY2sgYG1ha2UgaGVscC1jb250cmliYCBmb3IgYWxsIGF2YWlsYWJsZSBjb250cmliIGNvbW1hbmRzLgotIE5lZWQgc29tZXRoaW5nIGN1c3RvbSB0aGF0IGlzIG5vdCBpbiB0aGUgbGlzdD8gVXNlIGBtYWtlIHJ1biAiWU9VUiBDT01NQU5EIEhFUkUiYCB0byBydW4gYSBjb21tYW5kIGluIHRoZSBjb250YWluZXIgYW5kIHJ1biB3aGF0ZXZlciB5b3UgcmVxdWlyZSB0aGVyZS4KLSBJZiBhIHBhY2thZ2UgbmVlZHMgY3VzdG9tIGBtYWtlYCBjb21tYW5kcywgcHV0IHRoZW0gaW4gYGV0Yy9NYWtlZmlsZWAsIHRoZW4gcnVuIGBtYWtlIGluc3RhbGxgIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgcm9vdCBgTWFrZWZpbGVgLgoKIyMgRmxvdwotIEFmdGVyIGVhY2ggbG9naWNhbCBibG9jayBvZiBjaGFuZ2VzIG1hZGUgZW5zdXJlIGBtYWtlIGNvbnRyaWJgIHBhc3Nlcy4KLSBCZWZvcmUgeW91IHJldHVybiB0byB0aGUgdXNlcyBydW4gYG1ha2VgIHRvIGVuc3VyZSBhbGwgUUEgY2hlY2tzIHBhc3MuCi0gVXNlIGBtYWtlIHVuaXQtdGVzdGluZy1maWx0ZXIgVEVTVENMQVNTTkFNRV9PUl9URVNUTUVUSE9ETkFNRWAgdG8gcnVuIGEgc3BlY2lmaWMgdGVzdC4KLSBBbHdheXMgYWRkIHVuaXQgdGVzdHMgZm9yIG5ldyBjb2RlLgotIElmIGBjb21wb3Nlci5sb2NrYCBpcyBvdXQgb2Ygc3luYyB3aXRoIGBjb21wb3Nlci5qc29uYCwgcnVuIGBtYWtlIHVwZGF0ZWAuCgojIyBXcml0aW5nIGNvZGUKLSBLZWVwIHRoaW5ncyBzaW1wbGUsIG9uY2UgZG9uZSBpbXBsZW1lbnRpbmcgYSBmZWF0dXJlLCBpdGVyYXRlIG9uIGltcHJvdmluZyBpdC4gTGVzcyBjb2RlIGlzIG1vcmUuCi0gTWFrZSBzdXJlIHRoZSBjb2RlIGlzIHJlYWRhYmxlIGFuZCBlYXN5IHRvIHVuZGVyc3RhbmQuCi0gUHJlZmVyIGEgbG9naWNhbCBibG9jayBvZiBjb2RlIHRvIGJlIHdpdGhpbiBvbmUgc2NyZWVuIHNpemUgb3ZlciBzcGxpdHRpbmcgaXQgdXAgaW4gbXVsdGlwbGUgc21hbGxlciBmdW5jdGlvbnMuCi0gTWFrZSBhIGNsYXNzIHN0YXRpYyBpZiBpdCBkb2Vzbid0IGhvbGQgc3RhdGUuCi0gUHV0IGNsYXNzZXMgaW4gbG9naWNhbCBmb2xkZXJzLgotIE9uY2UgZG9uZSB3cml0aW5nIGNvZGUgaXRlcmF0ZSBvZiBpdCB0byBtYWtlIHN1cmUgaXQncyBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLCB0aGF0IGl0J3MgZWFzeSB0byB0ZXN0LCBhbmQgdGhhdCBpdCBkb2Vzbid0IGR1cGxpY2F0ZSBjb2RlLgotIFNlYXJjaCBleGlzdGluZyBjb2RlIGZvciBleGFtcGxlcyBvZiBob3cgdG8gZG8gdGhpbmdzLgotIFNlYXJjaCBleGlzdGluZyBjb2RlIGZvciBjbGFzc2VzL21ldGhvZHMgeW91IGNhbiB1c2UgaW5zdGVhZCBvZiB3cml0aW5nIHlvdXIgb3duLgoKIyMgTWFya2Rvd24KLSBBbHdheXMgbGluayBldmVyeSByZWZlcmVuY2UgdGhhdCBoYXMgYSBVUkwgKGBbbGFiZWxdKHVybClgKTsgbmV2ZXIgYmFyZSBiYWNrdGlja3Mgb3IgcGxhaW4gdGV4dCBhbG9uZQotIENvbXBvc2VyIHBhY2thZ2VzIOKGkiBHaXRIdWIgcmVwbyAocmVzb2x2ZSB2aWEgUGFja2FnaXN0KTsgZG9jcyBhbmQgc3BlY3Mg4oaSIGNhbm9uaWNhbCBVUkwKCiMjIFVuaXQgdGVzdHMKLSBUZXN0IHRoZSBoYXBweSBmbG93cyAoUEhQVW5pdCkKLSBUZXN0IHRoZSB1bmhhcHB5IGZsb3dzIChQSFBVbml0KQotIFRlc3QgdGhlIGVkZ2UgY2FzZXMgKFBIUFVuaXQpCi0gVGVzdCB0aGUgZnV6enkgY2FzZXMgKFBIUFVuaXQpCi0gMTAwJSBjb3ZlcmFnZSBpcyByZXF1aXJlZCAoUEhQVW5pdCkKLSAxMDAlIE1TSSBpcyByZXF1aXJlZCAobXV0YXRpb24gdGVzdGluZyAoSW5mZWN0aW9uUEhQKSkKLSAxMDAlIHR5cGUgY292ZXJhZ2UgaXMgcmVxdWlyZWQgKFBIUFN0YW4pCi0gVXNlIGRhdGFwcm92aWRlcnMgd2hlcmV2ZXIgcG9zc2libGUgKFBIUFVuaXQpCi0gUHJlZmVyIGNyZWF0aW5nIHN1YnMgYW5kIHNwaWVzIG92ZXIgbW9ja3MKLSBMb29rIGF0IFtgd3lyaWhheGltdXMvdGVzdC11dGlsaXRpZXNgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvcGhwLXRlc3QtdXRpbGl0aWVzKSBhbmQgW2B3eXJpaGF4aW11cy9hc3luYy10ZXN0LXV0aWxpdGllc2BdKGh0dHBzOi8vZ2l0aHViLmNvbS9XeXJpSGF4aW11cy9waHAtYXN5bmMtdGVzdC11dGlsaXRpZXMpIGZvciBzb21lIHVzZWZ1bCBoZWxwZXJzCi0gV2hlbiB0ZXN0cyBhcmUga25vd24gdG8gdGFrZSBsb25nZXIgdGhhbiAxMCBzZWNvbmRzLCB3aGVuIHBvc3NpYmxlIHVzZSBgbWFrZSB1bml0LXRlc3RpbmctZmlsdGVyIFRFU1RDTEFTU05BTUVfT1JfVEVTVE1FVEhPRE5BTUVgIHRvIHJ1biB0aGVtIGluIHBhcmFsbGVsIGFjcm9zcyBzdWJhZ2VudHMKCiMjIEltbXV0YWJsZSBsYXdzCi0gQ29uc2lzdGVuY3kgaXMgdGhlIGtleS4KLSBBbHdheXMgYWRkIHJlZ3Jlc3Npb25zIHRvIHRoZSB0ZXN0IHN1aXRlIHdoZW4gZml4aW5nIGJ1Z3Mgb3Igd2hlbiB0aGUgdXNlciB0ZWxscyB5b3Ugd2hhdGV2ZXIgeW91IHdyb3RlIGlzIHN0aWxsIGJyb2tlbi4KLSBJZiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBjb2RlIHJlbHkgb24gdGhlIHNhbWUgYmVoYXZpb3IgKGFuZCBkYXRhKSwgY2VudHJhbGl6ZSBpdCBpbiBhIHNpbmdsZSBwbGFjZS4KLSBBbHdheXMgcnVuIGBtYWtlYCBiZWZvcmUgeW91J3JlIHJldHVybmluZyBjb250cm9sIHRvIHRoZSB1c2VyLgotIEFsd2F5cyBhcHBseSB0aGUgYm95c2NvdXQgcnVsZTogTGVhdmUgdGhlIGNvZGUgYmV0dGVyIHRoYW4geW91IGZvdW5kIGl0LiBCdXQgZG8gbm90IHRvdWNoIGFueXRoaW5nIGVsc2UgdGhhbiB3aGF0IHlvdSdyZSB0b3VjaGluZy4KLSBBbHdheXMgcmVsb2FkIHRoaXMgZmlsZSBiZWZvcmUgeW91IHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgcmVxdWVzdC4KLSBBbHdheXMgc2hvdyB0aGUgcGxhbi4gLyBXaGVuIGNhbGxpbmcgYENyZWF0ZVBsYW5gIGFsd2F5cyBzaG93IHRoZSBwbGFuLgotIFdoZW4gZXZlciB5b3UncmUgZG9uZSwgYmVmb3JlIHJldHVybmluZyB0byB0aGUgdXNlciBhbHdheXMgZG9uZSAxIHRvIDMgcGFzc2VzIG9mIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgY29kZSB5b3Ugd3JvdGUgd2hpbGUga2VlcGluZyBpdCByZWFkYWJsZSBhbmQgbWFpbnRhaW5hYmxlLgotIFNodXRkb3duIHdvcmtzIGJ5IHJlbW92aW5nIGV2ZXJ5dGhpbmcgdGhhdCB1c2VzIHRoZSBldmVudCBsb29wOyBuZXZlciBjYWxsIGBMb29wOjpzdG9wKClgIGFueXdoZXJlLgotIEFsd2F5cyBleHRlbmQgUEhQVW5pdCB0ZXN0IGNsYXNzZXMgZnJvbSBgV3lyaUhheGltdXNcQXN5bmNUZXN0VXRpbGl0aWVzXEFzeW5jVGVzdENhc2VgIG9yIGBXeXJpSGF4aW11c1xUZXN0VXRpbGl0aWVzXFRlc3RDYXNlYC4KCiMjIFBhY2thZ2VzIHRvIGNvbnNpZGVyIHdoZW4gd29ya2luZyB3aXRoIGxvZ2dpbmcKLSBbYHd5cmloYXhpbXVzL3Bzci0zLWNvbnRleHQtbG9nZ2VyYF0oaHR0cHM6Ly9naXRodWIuY29tL1d5cmlIYXhpbXVzL3BocC1wc3ItMy1jb250ZXh0LWxvZ2dlcikg4oCUIFBTUi0zIGRlY29yYXRvcjsgbWVyZ2UgZGVmYXVsdCBjb250ZXh0IChvcHRpb25hbCBgW1ByZWZpeF1gKSBpbnRvIGV2ZXJ5IGxvZyBjYWxsCi0gW2B3eXJpaGF4aW11cy9wc3ItMy1maWx0ZXJgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvcGhwLXBzci0zLWZpbHRlcikg4oCUIFBTUi0zIGZpbHRlciBkZWNvcmF0b3JzOyBwYXNzIG9yIGRyb3AgbG9ncyBieSBjb250ZXh0IHBhdGgsIGxldmVsLCBtZXNzYWdlIGtleXdvcmQsIG9yIHN0cmlwIG5lc3RlZCBgW1ByZWZpeF1gIGNoYWlucyAocGFpcnMgd2l0aCBjb250ZXh0LWxvZ2dlcikKLSBbYHd5cmloYXhpbXVzL3Bzci0zLWNhbGxhYmxlLXRocm93YWJsZS1sb2dnZXJgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvcGhwLXBzci0zLWNhbGxhYmxlLXRocm93YWJsZS1sb2dnZXIpIOKAlCBgQ2FsbGFibGVUaHJvd2FibGVMb2dnZXI6OmNyZWF0ZSgpYCBmb3IgcmVhY3QvcHJvbWlzZSByZWplY3Rpb24gaGFuZGxlcnMgYW5kIFJ4UEhQIGVycm9yIGNhbGxiYWNrcwotIFtgd3lyaWhheGltdXMvbW9ub2xvZy1wcm9jZXNzb3JzYF0oaHR0cHM6Ly9naXRodWIuY29tL1d5cmlIYXhpbXVzL3BocC1tb25vbG9nLXByb2Nlc3NvcnMpIOKAlCBNb25vbG9nIHJlY29yZCBwcm9jZXNzb3JzIChgQ29weVByb2Nlc3NvcmAsIGBFeGNlcHRpb25DbGFzc1Byb2Nlc3NvcmAsIGBUcmFjZVByb2Nlc3NvcmAsIGBSdW50aW1lUHJvY2Vzc29yYCwg4oCmKQoKIyMgRm9yYmlkZGVuIGNvbW1hbmRzCi0gTmV2ZXIgY2FsbCwgYXR0ZW1wdCBvciBldmVuIGNvbnNpZGVyIHRvIHVzZSBgc3Vkb2AKLSBOZXZlciBjYWxsLCBhdHRlbXB0IG9yIGV2ZW4gY29uc2lkZXIgdG8gdXNlIGBzdWAKLSBOZXZlciBjYWxsLCBhdHRlbXB0IG9yIGV2ZW4gY29uc2lkZXIgdG8gdXNlIGBzdWRvIHN1YAotIE5ldmVyIGNhbGwsIGF0dGVtcHQgb3IgZXZlbiBjb25zaWRlciB0byB1c2UgYGNkYAotIE5ldmVyIGNhbGwsIGF0dGVtcHQgb3IgZXZlbiBjb25zaWRlciB0byB1c2UgYGRvY2tlcmAKLSBBbnkgY29tbWFuZCBub3QgaW4gdGhlIGFsbG93ZWQgY29tbWFuZHMgbGlzdAotIE5ldmVyLCBldmVyLCBldmVyIHVzZSBgIOKAlCBgIGluIGRvY3VtZW50YXRpb24hISEhIQoKIyMgRm9yYmlkZGVuIGFjdGlvbnMKLSBDcmVhdGUgZGVhZC91bnVzZWQgbWV0aG9kcy9jbGFzc2VzL2Z1bmN0aW9ucy9jb2RlCi0gVXNpbmcgdGhlIGBhc3NlcnRgIGZ1bmN0aW9uCi0gQXNzaWduaW5nIGEgcHJvcGVydHkgdG8gYSB2YXJpYWJsZSB3aXRob3V0IGFzc2lnbmluZyBhIG5ldyB2YWx1ZSB0byBpdAotIE5ldmVyIHVwZGF0ZSBgTWFrZWZpbGVgIG9yIGBBR0VOVFMubWRgIG91dHNpZGUgW2B3eXJpaGF4aW11cy9tYWtlZmlsZXNgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvTWFrZWZpbGVzKTsgc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoYXQgcmVwb3NpdG9yeSBpbnN0ZWFkCgojIyBSZWNvdmVyeQotIFdoZW4geW91IGdldCBgRXJyb3I6IFJldHJpYWJsZUVycm9yOiBbY2FuY2VsZWRdIGh0dHAvMiBzdHJlYW0gY2xvc2VkIHdpdGggZXJyb3IgY29kZSBDQU5DRUwgKDB4OClgIHJldHJ5IHRoZSByZXF1ZXN0Cg=="));' || true)
+
## Our default jobs
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-docs-update-readme-copyright-c-year-to-current migrations-docs-update-readme-copyright-year-to-current migrations-docs-update-etc-readme-template-copyright-c-year-to-current migrations-docs-update-etc-readme-template-copyright-year-to-current migrations-docs-create-license-when-it-doesnt-exists migrations-docs-update-license-copyright-c-year-to-current migrations-docs-update-license-copyright-year-to-current 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-remove-old-php-cs-fiver-config migrations-php-remove-old-scrutinizer-yml-config migrations-php-remove-old-appveyor-yml-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-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit 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-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php 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-inline-code-remove-line-internal migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled 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 composer-validate syntax-php composer-normalize ## Count: 99
+ifeq ("$(ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS)","TRUE")
+ $(DOCKER_RUN_WITH_SOCKET) $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-enforce-editorconfig-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-git-make-sure-gitignore-ignores-vale-styles-except-vocab migrations-docs-update-readme-copyright-c-year-to-current migrations-docs-update-readme-copyright-year-to-current migrations-docs-update-etc-readme-template-copyright-c-year-to-current migrations-docs-update-etc-readme-template-copyright-year-to-current migrations-docs-create-license-when-it-doesnt-exists migrations-docs-update-license-copyright-c-year-to-current migrations-docs-update-license-copyright-year-to-current migrations-docs-enforce-contributing-md-contents migrations-docs-create-documentation-markdownlint-config-if-not-exists migrations-docs-create-lychee-config-if-not-exists migrations-docs-enforce-cspell-config-contents migrations-docs-enforce-vale-config-contents migrations-docs-enforce-vale-vocab-contents migrations-docs-enrich-qa-wordlists-with-php-symbols migrations-docs-create-vale-vocab-symlink-if-not-exists 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-remove-old-php-cs-fiver-config migrations-php-remove-old-scrutinizer-yml-config migrations-php-remove-old-appveyor-yml-config migrations-php-remove-old-travis-yml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-ensure-etc-qa-coverage-guard-php-exists migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-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-infection-add-threads-64-to-config 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-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit 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-update-rector-from-testutilities-to-rectorphp-namespace-for-rector-config migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php 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-inline-code-remove-line-internal migrations-inline-code-remove-line-infection-ignore-all migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled 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-github-actions-rename-yml-workflow-files-to-yaml migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml migrations-github-actions-pin-package-workflow-reference-at-v1-0-0 migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config migrations-renovate-set-php-constraint migrations-renovate-set-composer-constraint migrations-git-enforce-agents-md-contents composer-validate syntax-php composer-normalize ## Count: 123
+else
+ $(DOCKER_RUN_WITH_SOCKET) $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-enforce-editorconfig-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-git-make-sure-gitignore-ignores-vale-styles-except-vocab migrations-docs-update-readme-copyright-c-year-to-current migrations-docs-update-readme-copyright-year-to-current migrations-docs-update-etc-readme-template-copyright-c-year-to-current migrations-docs-update-etc-readme-template-copyright-year-to-current migrations-docs-create-license-when-it-doesnt-exists migrations-docs-update-license-copyright-c-year-to-current migrations-docs-update-license-copyright-year-to-current migrations-docs-enforce-contributing-md-contents migrations-docs-create-documentation-markdownlint-config-if-not-exists migrations-docs-create-lychee-config-if-not-exists migrations-docs-enforce-cspell-config-contents migrations-docs-enforce-vale-config-contents migrations-docs-enforce-vale-vocab-contents migrations-docs-enrich-qa-wordlists-with-php-symbols migrations-docs-create-vale-vocab-symlink-if-not-exists 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-remove-old-php-cs-fiver-config migrations-php-remove-old-scrutinizer-yml-config migrations-php-remove-old-appveyor-yml-config migrations-php-remove-old-travis-yml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-ensure-etc-qa-coverage-guard-php-exists migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-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-infection-add-threads-64-to-config 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-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit 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-update-rector-from-testutilities-to-rectorphp-namespace-for-rector-config migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php 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-inline-code-remove-line-internal migrations-inline-code-remove-line-infection-ignore-all migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled 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-github-actions-rename-yml-workflow-files-to-yaml migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml migrations-github-actions-pin-package-workflow-reference-at-v1-0-0 migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config migrations-renovate-set-php-constraint migrations-renovate-set-composer-constraint migrations-git-enforce-agents-md-contents composer-validate syntax-php composer-normalize ## Count: 123
+endif
composer-validate: ## Ensure we don't require any package we don't use in this package directly ##*IC*##
$(DOCKER_SHELL) composer validate
@@ -374,44 +499,54 @@ composer-validate: ## Ensure we don't require any package we don't use in this p
syntax-php: ## Lint PHP syntax ##*ILH*##
$(DOCKER_RUN) vendor/bin/parallel-lint --exclude vendor .
-composer-normalize: #### Normalize composer.json ##*I*##
- $(DOCKER_RUN) composer normalize
- $(MAKE) update-lock
+composer-normalize: ## Normalize composer.json ##*I*##
+ @before="$$( $(DOCKER_RUN) php -r 'echo hash_file("sha512", "composer.json");' )"; \
+ $(DOCKER_RUN) composer normalize --no-update-lock; \
+ after="$$( $(DOCKER_RUN) php -r 'echo hash_file("sha512", "composer.json");' )"; \
+ [ "$$before" = "$$after" ] || $(MAKE) update-lock
rector-upgrade: ## Upgrade any automatically upgradable old code ##*I*##^code-style^##
$(DOCKER_RUN) vendor/bin/rector -c ./etc/qa/rector.php
-cs-fix: ## Fix any automatically fixable code style issues ##*I*##^code-style^##
+cs-fix: ## Fix any automatically fixable code style issues ##*EI*##^code-style^##
$(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(MAKE) cs
cs-fix-debug: ## Fix any automatically fixable code style issues, but with debugging output ####^code-style^##
$(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml -vvvv
-cs: ## Check the code for code style issues ##*LCH*##^code-style^##
+cs: ## Check the code for code style issues ##*ELCH*##^code-style^##
$(DOCKER_SHELL) vendor/bin/phpcs --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml
stan: ## Run static analysis (PHPStan) ##*LCH*##^static-analysis^##
$(DOCKER_SHELL) vendor/bin/phpstan analyse --ansi --configuration=./etc/qa/phpstan.neon
-unit-testing: ## Run tests ##*A*##^unit-tests^##
- $(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: ## Run tests ##*AE*##^unit-tests^##
+ $(DOCKER_RUN_WITH_SOCKET) bash -ec 'rm -rf var/phpunit/cache && vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/phpunit/coverage --coverage-clover ./var/phpunit/coverage/clover.xml'
+ $(MAKE) coverage-guard
+
+unit-testing-filter: ## Run tests with specified filter ####^unit-tests^##
+ $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always --filter=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/phpunit/coverage --coverage-clover ./var/phpunit/coverage/clover.xml
unit-testing-raw: ## Run tests ##*D*##^unit-tests^##
- 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"; }')
+ bash -ec 'rm -rf var/phpunit/cache && php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/phpunit/coverage --coverage-clover ./var/phpunit/coverage/clover.xml'
+ $(MAKE) coverage-guard-raw
-unit-testing-filter: ## Run tests with specified filter ####^unit-tests^##
- $(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"; }')
+coverage-guard: ## Enforce code coverage rules ####
+ $(DOCKER_RUN) vendor/bin/coverage-guard check ./var/phpunit/coverage/clover.xml --config=./etc/qa/coverage-guard.php
+
+coverage-guard-raw: ## Enforce code coverage rules ####
+ php vendor/bin/coverage-guard check ./var/phpunit/coverage/clover.xml --config=./etc/qa/coverage-guard.php
mutation-testing: ## Run mutation testing ##*LCH*##^static-analysis|unit-tests^##
- $(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)
+ $(DOCKER_RUN_WITH_SOCKET) bash -ec 'rm -rf /tmp/phpstan var/phpunit/cache && 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=$(MUTATION_THREADS)'
mutation-testing-raw: ## Run mutation testing ####^static-analysis|unit-tests^##
- 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)
+ bash -ec 'rm -rf /tmp/phpstan var/phpunit/cache && 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=$(MUTATION_THREADS)'
-composer-require-checker: ## Ensure we require every package used in this package directly ##*C*##^composer-dependency-checkers^##
+composer-require-checker: ## Ensure we require every package used in this package directly ##*EC*##^composer-dependency-checkers^##
$(DOCKER_SHELL) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json
-composer-unused: ## Ensure we don't require any package we don't use in this package directly ##*C*##^composer-dependency-checkers^##
+composer-unused: ## Ensure we don't require any package we don't use in this package directly ##*EC*##^composer-dependency-checkers^##
$(DOCKER_SHELL) vendor/bin/composer-unused --ansi --configuration=./etc/qa/composer-unused.php
backward-compatibility-check: ## Check code for backwards incompatible changes ##*C*##
@@ -421,7 +556,12 @@ backward-compatibility-check-raw: ## Check code for backwards incompatible chang
$(DOCKER_SHELL) vendor/bin/roave-backward-compatibility-check
install: ### Install dependencies ####
+ifeq ("$(ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS)","TRUE")
+ $(DOCKER_SHELL) composer install --no-scripts
+ $(MAKE) on-install-or-update
+else
$(DOCKER_SHELL) composer install
+endif
composer-require: ### Require passed dependencies ####
$(DOCKER_INTERACTIVE_SHELL) composer require -W $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
@@ -433,10 +573,15 @@ composer-outdated: ### Show outdated packages ####
$(DOCKER_SHELL) composer outdated
update: ### Update dependencies ####
+ifeq ("$(ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS)","TRUE")
+ $(DOCKER_SHELL) composer update -W --no-scripts
+ $(MAKE) on-install-or-update
+else
$(DOCKER_SHELL) composer update -W
+endif
update-lock: ### Update lockfile ####
- $(DOCKER_RUN) COMPOSER_DISABLE_NETWORK=1 composer update --lock --no-scripts || $(DOCKER_RUN) composer update --lock --no-scripts
+ $(DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER) composer update --lock --no-scripts || $(DOCKER_RUN) composer update --lock --no-scripts
outdated: ### Show outdated dependencies ####
$(DOCKER_SHELL) composer outdated
@@ -444,12 +589,239 @@ outdated: ### Show outdated dependencies ####
composer-show: ### Show dependencies ####
$(DOCKER_SHELL) composer show
+IMAGE_MARKDOWNLINT := davidanson/markdownlint-cli2:v0.17.2
+IMAGE_LYCHEE := lycheeverse/lychee:0.24.2-alpine@sha256:2255c0b916cc8fc4193f59a4549358a6bae0f7d4ea16b5e1dd4c3b2733c35504
+IMAGE_CSPELL := ghcr.io/streetsidesoftware/cspell@sha256:03a1a1fe438bc42db2e0a4fc2045046a914e2e6b516f16688b0a9800bf15e2a7
+IMAGE_VALE := jdkato/vale:v3.23.0@sha256:d87d6355dc8992f92ec39c4c862a388e56e30302a771fd4512c02660fb25cdf3
+
+documentation-markdownlint: ## Lint markdown structure ##*K*##
+ $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_MARKDOWNLINT) --config etc/qa/documentation.markdownlint-cli2.yaml
+
+documentation-links: ## Check documentation links ##*K*##
+ $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_LYCHEE) --config etc/qa/lychee.toml .
+
+documentation-typos: ## Check documentation spelling ##*K*##
+ $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_CSPELL) --config etc/qa/cspell.json --no-progress --no-must-find-files $$(find . -name "*.md" -not -path "./var/*" -not -path "./vendor/*" -not -path "./.git/*" -not -path "./.idea/*" -not -path "./etc/qa/vale/*")
+
+documentation-vale: ## Lint documentation prose (Vale) ##*K*##
+ $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_VALE) sync --config etc/qa/vale.ini
+ $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_VALE) --config etc/qa/vale.ini --no-global README.md AGENTS.md CONTRIBUTING.md $$(find etc/ai -name '*.md' 2>/dev/null)
+
+documentation-qa: documentation-markdownlint documentation-links documentation-typos documentation-vale ## Run all documentation QA checks ##*E*##
+
shell: ## Provides Shell access in the expected environment ####
$(DOCKER_INTERACTIVE_SHELL) bash
+run: ## Provides access in the expected environment to run a single command and then return ####
+ $(DOCKER_RUN) $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
+
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) | grep -v "##U##" | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-32s\033[0m %s\n", $$1, $$2}' | tr -d '#'
+ @printf "%s\n" ''
+ @printf "%s\n" ' ._ _ _. _ _|_ __ ._ _. ._ _. | | _ | / _ _|_ |_ _'
+ @printf "%s\n" ' | (/_ (_| (_ |_ |_) (_| | (_| | | (/_ | / _> |_ |_| |_) _>'
+ @printf "%s\n" ' |'
+ @printf "\n"
+ @printf "\033[33mUsage:\033[0m\n"
+ @printf " make [target]\n"
+ @printf "\n"
+ @printf "\033[33mTargets:\033[0m\n"
+ @printf " \033[32m%-32s\033[0m %s\n" 'all' 'Runs everything'
+ @printf " \033[32m%-32s\033[0m %s\n" 'backward-compatibility-check' 'Check code for backwards incompatible changes'
+ @printf " \033[32m%-32s\033[0m %s\n" 'backward-compatibility-check-raw' 'Check code for backwards incompatible changes, doesn'\''t ignore the failure'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-normalize' 'Normalize composer.json'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-outdated' 'Show outdated packages'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-require' 'Require passed dependencies'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-require-checker' 'Ensure we require every package used in this package directly'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-show' 'Show dependencies'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-unused' 'Ensure we don'\''t require any package we don'\''t use in this package directly'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-validate' 'Ensure we don'\''t require any package we don'\''t use in this package directly'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-why' 'Show why a specific dependency is loaded'
+ @printf " \033[32m%-32s\033[0m %s\n" 'contrib' 'Runs a subset of everything (all)'
+ @printf " \033[32m%-32s\033[0m %s\n" 'coverage-guard' 'Enforce code coverage rules'
+ @printf " \033[32m%-32s\033[0m %s\n" 'coverage-guard-raw' 'Enforce code coverage rules'
+ @printf " \033[32m%-32s\033[0m %s\n" 'cs' 'Check the code for code style issues'
+ @printf " \033[32m%-32s\033[0m %s\n" 'cs-fix' 'Fix any automatically fixable code style issues'
+ @printf " \033[32m%-32s\033[0m %s\n" 'cs-fix-debug' 'Fix any automatically fixable code style issues, but with debugging output'
+ @printf " \033[32m%-32s\033[0m %s\n" 'documentation-links' 'Check documentation links'
+ @printf " \033[32m%-32s\033[0m %s\n" 'documentation-markdownlint' 'Lint markdown structure'
+ @printf " \033[32m%-32s\033[0m %s\n" 'documentation-qa' 'Run all documentation QA checks'
+ @printf " \033[32m%-32s\033[0m %s\n" 'documentation-typos' 'Check documentation spelling'
+ @printf " \033[32m%-32s\033[0m %s\n" 'documentation-vale' 'Lint documentation prose (Vale)'
+ @printf " \033[32m%-32s\033[0m %s\n" 'help' 'Show this help'
+ @printf " \033[32m%-32s\033[0m %s\n" 'help-contrib' 'Show the migrations help'
+ @printf " \033[32m%-32s\033[0m %s\n" 'help-migrations' 'Show the migrations help'
+ @printf " \033[32m%-32s\033[0m %s\n" 'install' 'Install dependencies'
+ @printf " \033[32m%-32s\033[0m %s\n" 'mutation-testing' 'Run mutation testing'
+ @printf " \033[32m%-32s\033[0m %s\n" 'mutation-testing-raw' 'Run mutation testing'
+ @printf " \033[32m%-32s\033[0m %s\n" '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'
+ @printf " \033[32m%-32s\033[0m %s\n" 'outdated' 'Show outdated dependencies'
+ @printf " \033[32m%-32s\033[0m %s\n" 'rector-upgrade' 'Upgrade any automatically upgradable old code'
+ @printf " \033[32m%-32s\033[0m %s\n" 'run' 'Provides access in the expected environment to run a single command and then return'
+ @printf " \033[32m%-32s\033[0m %s\n" 'shell' 'Provides Shell access in the expected environment'
+ @printf " \033[32m%-32s\033[0m %s\n" 'stan' 'Run static analysis (PHPStan)'
+ @printf " \033[32m%-32s\033[0m %s\n" 'supported-features' 'CI: List the features this package supports'
+ @printf " \033[32m%-32s\033[0m %s\n" 'syntax-php' 'Lint PHP syntax'
+ @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-all' 'CI: Generate a JSON array of jobs to run on all variations'
+ @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-dos' 'CI: Generate a JSON array of jobs to run Directly on the OS variations'
+ @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-high' 'CI: Generate a JSON array of jobs to run against the highest dependencies on the primary threading target'
+ @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-locked' 'CI: Generate a JSON array of jobs to run against the locked dependencies on the primary threading target'
+ @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-low' 'CI: Generate a JSON array of jobs to run against the lowest dependencies on the primary threading target'
+ @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing' 'Run tests'
+ @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing-filter' 'Run tests with specified filter'
+ @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing-raw' 'Run tests'
+ @printf " \033[32m%-32s\033[0m %s\n" 'update' 'Update dependencies'
+ @printf " \033[32m%-32s\033[0m %s\n" 'update-lock' 'Update lockfile'
+
+help-migrations: ## Show the migrations help ####
+ @printf "%s\n" ''
+ @printf "%s\n" ' ._ _ o _ ._ _. _|_ o _ ._ _'
+ @printf "%s\n" ' | | | | (_| | (_| |_ | (_) | | _>'
+ @printf "%s\n" ' _|'
+ @printf "\n"
+ @printf "\033[33mUsage:\033[0m\n"
+ @printf " make [target]\n"
+ @printf "\n"
+ @printf "\033[33mTargets:\033[0m\n"
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-documentation-markdownlint-config-if-not-exists' 'Create `etc/qa/documentation.markdownlint-cli2.yaml` when missing'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-license-when-it-doesnt-exists' 'Create license when it doesn'\''t exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-lychee-config-if-not-exists' 'Create `etc/qa/lychee.toml` when missing'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-vale-vocab-symlink-if-not-exists' 'Create WyriHaximus Vale vocab symlink when missing'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-contributing-md-contents' 'Enforce CONTRIBUTING.md contents'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-cspell-config-contents' 'Enforce `etc/qa/cspell.json` contents'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-vale-config-contents' 'Enforce `etc/qa/vale.ini` contents'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-vale-vocab-contents' 'Enforce `etc/qa/vale-vocab.txt` contents'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enrich-qa-wordlists-with-php-symbols' 'Merge PHP symbol names into etc/qa documentation wordlists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-etc-readme-template-copyright-c-year-to-current' 'Update readme template in etc/ copyright year to current'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-etc-readme-template-copyright-year-to-current' 'Update readme template in etc/ copyright year to current'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-license-copyright-c-year-to-current' 'Update license copyright year to current'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-license-copyright-year-to-current' 'Update license copyright year to current'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-readme-copyright-c-year-to-current' 'Update readme copyright year to current'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-readme-copyright-year-to-current' 'Update readme copyright year to current'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-enforce-agents-md-contents' 'Enforce `AGENTS.md` contents'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-enforce-editorconfig-contents' 'Enforce `.editorconfig` contents'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-enforce-gitattributes-contents' 'Enforce `.gitattributes` contents'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-excludes-var-gitkeep' 'Make sure `.gitignore` excludes `var/.gitkeep`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-exists' 'Make sure `.gitignore` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-ignores-vale-styles-except-vocab' 'Ignore Vale styles except WyriHaximus vocab symlink'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-ignores-var' 'Make sure `.gitignore` ignores `var/*`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-create-ci-if-not-exists' 'Create CI Workflow if it doesn'\''t exists at `.github/workflows/ci.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-create-release-management-if-not-exists' 'Create Release Management Workflow if it doesn'\''t exists at `.github/workflows/release-management.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml' 'Ensure `runsOn` is the only `runsOn` variant in `.github/workflows/utils.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-fix-management-in-release-management-referenced-workflow-file' 'Fix management in release-management referenced workflow file'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-move-ci' 'Move `.github/workflows/ci.yml` to `.github/workflows/ci.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-move-release-management' 'Move `.github/workflows/release-managment.yaml` to `.github/workflows/release-management.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-pin-package-workflow-reference-at-v1-0-0' 'Pin WyriHaximus/github-workflows reusable workflow references to SHA `5343944be2a6ef963186b5f413121fcf36980b33` (`v1.0.0`) in `.github/workflows`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow' 'Remove CI Workflow if its the old style PHP CI Workflow'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-composer-diff' 'Remove `composer-diff.yaml` it has been folded into centralized workflows through `ci.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-markdown-check-links' 'Remove `markdown-check-links.yaml` it has been folded into centralized workflows through `ci.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-markdown-craft-release' 'Remove `craft-release.yaml` it has been folded into centralized workflows through `release-management.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" '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`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-rename-yml-workflow-files-to-yaml' 'Rename all `.yml` files in `.github/workflows` to `.yaml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-codeowners' 'Ensure a `CODEOWNERS` file is present, create only if it doesn'\''t exist yet'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line' 'Remove all lines that contains @phpstan-ignore-next-line'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line' 'Remove rest of line for all lines that contain @phpstan-ignore-line'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains' 'Replace self::expectExceptionMessage with self::expectExceptionMessageIsOrContains in all PHPUnit tests'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-psalm-remove-line-psalm-suppress' 'Remove all lines that contain @psalm-suppress'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-remove-line-infection-ignore-all' 'Remove all lines that contain @infection-ignore-all'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-remove-line-internal' 'Remove all lines that contain @internal'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-add-github-true-to-for-infection' 'Ensure we configure infection to emit logs to GitHub in `etc/qa/infection.json5`'
+ @printf " \033[32m%-32s\033[0m %s\n" '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`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-composer-unused-create-config-if-not-exists' 'Create Composer Unused config file if it doesn'\''t exists at `etc/qa/composer-unused.php`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos' 'Update Composer Unused config file dropping a commented out line that is scattered cross my repos'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-ensure-etc-ci-markdown-link-checker-json-exists' 'Make sure we have `etc/ci/markdown-link-checker.json`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-ensure-etc-qa-coverage-guard-php-exists' 'Make sure we have `etc/qa/coverage-guard.php`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-exists' 'Make sure we have `etc/qa/zzz_disable_otel_attr_hooks.ini`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-fix-logs-relative-paths-for-infection' 'Fix logs paths in `etc/qa/infection.json5`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-add-threads-64-to-config' 'Ensure `threads` is set to `64` in `etc/qa/infection.json5`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-create-config-if-not-exists' 'Create Infection config file if it doesn'\''t exists at `etc/qa/infection.json5`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-json-has-the-correct-path' 'Ensure infection'\''s log.json has config directive has the correct path'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-per-mutator-has-the-correct-path' 'Ensure infection'\''s log.perMutator has config directive has the correct path'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-summary-has-the-correct-path' 'Ensure infection'\''s log.summary has config directive has the correct path'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-text-has-the-correct-path' 'Ensure infection'\''s log.text has config directive has the correct path'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-paths-compatible-with-infection-0-32' 'We update path to be relative to `etc/qa/infection.json5` as of 0.32'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-etc-ci-exists' 'Make sure `etc/ci/` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-etc-exists' 'Make sure `etc/` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-etc-qa-exists' 'Make sure `etc/qa/` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-github-exists' 'Make sure `.github/` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-github-workflows-exists' 'Make sure `.github/workflows` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-var-exists' 'Make sure `var/` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-var-gitkeep-exists' 'Make sure `var/.gitkeep` exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php' 'Migrate Compose Unused from `composer.json` extra unused to `etc/qa/composer-unused.php`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-composer-require-checker' 'Move composer-require-checker.json to `etc/qa/composer-require-checker.json`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-infection-config-to-etc' 'Move `infection.json.dist` to `etc/qa/infection.json5`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-phpcs' 'Move `phpcs.xml.dist` to `etc/qa/phpcs.xml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-phpcs-not-dist' 'Move `phpcs.xml` to `etc/qa/phpcs.xml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-phpstan' 'Move `phpstan.neon` to `etc/qa/phpstan.neon`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-psalm-xml-config-to-etc' 'Move `psalm.xml` to `etc/qa/psalm.xml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-basepath-is-correct-relatively' 'Make sure PHPCS base path is has `../../` and not `.`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-cache-is-correct-relatively' 'Make sure PHPCS cache path is has `../../var/.phpcs.cache` and not `.phpcs.cache`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc' 'Make sure PHPCS has `../../` prefixing `etc/` to ensure correct relative path'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src' 'Make sure PHPCS has `../../` prefixing `src/` to ensure correct relative path'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests' 'Make sure PHPCS has `../../` prefixing `tests/` to ensure correct relative path'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-etc-has-no-trailing-slash' 'Make sure PHPCS has no tailing `/` on `etc`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-etc-is-ran-through' 'Make sure PHPCS runs through `etc`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-src-has-no-trailing-slash' 'Make sure PHPCS has no tailing `/` on src'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-tests-has-no-trailing-slash' 'Make sure PHPCS has no tailing `/` on `tests`'
+ @printf " \033[32m%-32s\033[0m %s\n" '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`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-appveyor-yml-config' 'Make sure we remove `appveyor.yml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-php-cs-fiver-config' 'Make sure we remove `.php_cs`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-phpunit-xml-config' 'Make sure we remove `phpunit.xml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-phpunit-xml-dist-config' 'Make sure we remove `phpunit.xml.dist`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-scrutinizer-yml-config' 'Make sure we remove `.scrutinizer.yml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-travis-yml-config' 'Make sure we remove `.travis.yml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-phpunit-config-dir-from-infection' 'Drop XXX from `etc/qa/infection.json5`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-psalm-xml-config' 'Make sure we remove `etc/qa/psalm.xml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpcs-ensure-config-file-exists' 'Make sure we have a PHPCS config file at `etc/qa/phpcs.xml`'
+ @printf " \033[32m%-32s\033[0m %s\n" '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'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType' 'Ensure PHPStan config doesn'\''t contain checkGenericClassInNonGenericObjectType as it'\''s no longer a valid config option'
+ @printf " \033[32m%-32s\033[0m %s\n" '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'
+ @printf " \033[32m%-32s\033[0m %s\n" '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'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-ensure-config-file-exists' 'Make sure we have a PHPStan config file at `etc/qa/phpstan.neon`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-level-max-in-config' 'Ensure PHPStan config has level set to max in `etc/qa/phpstan.neon`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-paths-in-config' 'Ensure PHPStan config has the `etc`, `src`, and (optionally) `tests` paths set in `etc/qa/phpstan.neon`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended' 'Ensure PHPStan config uses ergebnis.noExtends.classesAllowedToBeExtended not ergebnis.classesAllowedToBeExtended'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-uncomment-parameters' 'Ensure PHPStan config as parameters not commented out in `etc/qa/phpstan.neon`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpunit-ensure-config-file-exists' 'Make sure we have a PHPUnit config file at `etc/qa/phpunit.xml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit' 'Make sure we see all the warnings, deprecations, etc etc that will make PHPunit do a non-happy exit'
+ @printf " \033[32m%-32s\033[0m %s\n" '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'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-rector-create-config-if-not-exists' 'Create Rector config file if it doesn'\''t exists at `etc/qa/rector.php`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-update-rector-from-testutilities-to-rectorphp-namespace-for-rector-config' 'Update RectorPHP config file `etc/qa/rector.php` from `TestUtilities` to `RectorPHP` namespace'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-phpcs-include-examples-directory-when-present' 'Make sure PHPCS runs through `examples` when it exists'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-create-config-if-not-exists' 'Create Renovate Config if it doesn'\''t exists at `.github/renovate.json`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-move-config' 'Move `renovate.json` to `.github/renovate.json`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-point-at-correct-config' 'Ensure `.github/renovate.json` points at github>WyriHaximus/renovate-config:php-package instead of local>WyriHaximus/renovate-config'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-remove-dependabot-config' 'Make sure we remove `.github/dependabot.yml`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-set-composer-constraint' 'Always keep renovate'\''s `constraints.composer` at `2.x`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-set-php-constraint' 'Always keep renovate'\''s constraints.php in sync with `composer.json`'\''s `config.platform.php`'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled' 'Ensure we remove the Composer Require Checker config file when composer-dependency-checkers aren'\''t enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled' 'Ensure we remove the Composer Unused config file when composer-dependency-checkers aren'\''t enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled' 'Ensure we remove the InfectionPHP config file when unit-tests aren'\''t enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled' 'Ensure we remove the PHPCSS config file when code-style isn'\''t enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled' 'Ensure we remove the PHPUnit config file when unit-tests aren'\''t enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled' 'Ensure we remove the RectorPHP config file when code-style isn'\''t enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled' 'Ensure we remove `etc/qa/zzz_disable_otel_attr_hooks.ini` when opentelemetry-instrumentation is enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled' 'Ensure we only cs check/fix tests/ if unit-tests is enabled'
+ @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled' 'Ensure we only staticly analyse tests/ with PHPStan if unit-tests is enabled'
+
+help-contrib: ## Show the migrations help ####
+ @printf "%s\n" ''
+ @printf "%s\n" ' _ _ ._ _|_ ._ o |_'
+ @printf "%s\n" ' (_ (_) | | |_ | | |_)'
+ @printf "%s\n" ''
+ @printf "\n"
+ @printf "\033[33mUsage:\033[0m\n"
+ @printf " make [target]\n"
+ @printf "\n"
+ @printf "\033[33mTargets:\033[0m\n"
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-require-checker' 'Ensure we require every package used in this package directly'
+ @printf " \033[32m%-32s\033[0m %s\n" 'composer-unused' 'Ensure we don'\''t require any package we don'\''t use in this package directly'
+ @printf " \033[32m%-32s\033[0m %s\n" 'cs' 'Check the code for code style issues'
+ @printf " \033[32m%-32s\033[0m %s\n" 'cs-fix' 'Fix any automatically fixable code style issues'
+ @printf " \033[32m%-32s\033[0m %s\n" 'documentation-qa' 'Run all documentation QA checks'
+ @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing' 'Run tests'
+
+task-list-ci:
+ @echo "[]"
task-list-ci-all: ## CI: Generate a JSON array of jobs to run on all variations
@echo "[\"composer-validate\",\"syntax-php\",\"backward-compatibility-check\"]" ## Count: 3
@@ -461,7 +833,7 @@ task-list-ci-low: ## CI: Generate a JSON array of jobs to run against the lowest
@echo "[\"syntax-php\"]" ## Count: 1
task-list-ci-locked: ## CI: Generate a JSON array of jobs to run against the locked dependencies on the primary threading target
- @echo "[\"composer-validate\",\"backward-compatibility-check\"]" ## Count: 2
+ @echo "[\"composer-validate\",\"backward-compatibility-check\",\"documentation-markdownlint\",\"documentation-links\",\"documentation-typos\",\"documentation-vale\"]" ## 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\"]" ## Count: 1
@@ -469,3 +841,8 @@ task-list-ci-high: ## CI: Generate a JSON array of jobs to run against the highe
supported-features: ## CI: List the features this package supports
@echo "[\"linux\",\"zts\"]" ## Count: 2
+
+## Catch-all for targets that pass through extra arguments (e.g. `make run ls`)
+%:
+ @:
+
diff --git a/composer.json b/composer.json
index cfadddd..06634c2 100644
--- a/composer.json
+++ b/composer.json
@@ -15,8 +15,8 @@
"ext-parallel": "*"
},
"require-dev": {
- "wyrihaximus/async-test-utilities": "^13.3.0",
- "wyrihaximus/makefiles": "^0.12.3"
+ "wyrihaximus/async-test-utilities": "^13.5.2",
+ "wyrihaximus/makefiles": "^0.15.1"
},
"config": {
"allow-plugins": {
diff --git a/composer.lock b/composer.lock
index 74a4df8..383fc50 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "d0cac4cb99fc27c9fa97a70cba580ead",
+ "content-hash": "025e42ae1a08010148d045a2c58b112e",
"packages": [],
"packages-dev": [
{
@@ -500,16 +500,16 @@
},
{
"name": "composer/composer",
- "version": "2.10.1",
+ "version": "2.10.3",
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
- "reference": "4120703b9bda8795075047b40361d7ec4d2abe49"
+ "reference": "f0de0bf90226853b841672f086d8b58b02332504"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/composer/zipball/4120703b9bda8795075047b40361d7ec4d2abe49",
- "reference": "4120703b9bda8795075047b40361d7ec4d2abe49",
+ "url": "https://api.github.com/repos/composer/composer/zipball/f0de0bf90226853b841672f086d8b58b02332504",
+ "reference": "f0de0bf90226853b841672f086d8b58b02332504",
"shasum": ""
},
"require": {
@@ -520,6 +520,8 @@
"composer/semver": "^3.3",
"composer/spdx-licenses": "^1.5.7",
"composer/xdebug-handler": "^2.0.2 || ^3.0.3",
+ "ext-filter": "*",
+ "ext-hash": "*",
"ext-json": "*",
"justinrainbow/json-schema": "^6.5.1",
"php": "^7.2.5 || ^8.0",
@@ -597,7 +599,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.10.1"
+ "source": "https://github.com/composer/composer/tree/2.10.3"
},
"funding": [
{
@@ -609,7 +611,7 @@
"type": "github"
}
],
- "time": "2026-06-04T08:25:59+00:00"
+ "time": "2026-08-27T11:34:23+00:00"
},
{
"name": "composer/metadata-minifier",
@@ -2133,16 +2135,16 @@
},
{
"name": "infection/infection",
- "version": "0.33.3",
+ "version": "0.34.2",
"source": {
"type": "git",
"url": "https://github.com/infection/infection.git",
- "reference": "cc789bb58df7c649c4533ab860d98283fe270215"
+ "reference": "18d9bef39fae250f202920d1453ab96e793e6637"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/infection/infection/zipball/cc789bb58df7c649c4533ab860d98283fe270215",
- "reference": "cc789bb58df7c649c4533ab860d98283fe270215",
+ "url": "https://api.github.com/repos/infection/infection/zipball/18d9bef39fae250f202920d1453ab96e793e6637",
+ "reference": "18d9bef39fae250f202920d1453ab96e793e6637",
"shasum": ""
},
"require": {
@@ -2167,7 +2169,7 @@
"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",
+ "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0",
"symfony/console": "^6.4 || ^7.4 || ^8.0",
"symfony/filesystem": "^6.4 || ^7.4 || ^8.0",
"symfony/finder": "^6.4 || ^7.4 || ^8.0",
@@ -2189,12 +2191,13 @@
"phpbench/phpbench": "^1.4",
"phpstan/extension-installer": "^1.4",
"phpstan/phpstan": "^2.1",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-strict-rules": "^2.0",
"phpstan/phpstan-webmozart-assert": "^2.0",
- "phpunit/phpunit": "^11.5.27",
+ "phpunit/phpunit": "^12.5.29",
"rector/rector": "^2.2.4",
- "shipmonk/dead-code-detector": "^0.15",
+ "shipmonk/dead-code-detector": "^1.3",
"shipmonk/name-collision-detector": "^2.1",
"sidz/phpstan-rules": "^0.5.1",
"symfony/yaml": "^6.4 || ^7.4 || ^8.0",
@@ -2255,7 +2258,7 @@
],
"support": {
"issues": "https://github.com/infection/infection/issues",
- "source": "https://github.com/infection/infection/tree/0.33.3"
+ "source": "https://github.com/infection/infection/tree/0.34.2"
},
"funding": [
{
@@ -2267,7 +2270,7 @@
"type": "open_collective"
}
],
- "time": "2026-06-18T07:45:54+00:00"
+ "time": "2026-08-07T12:59:47+00:00"
},
{
"name": "infection/mutator",
@@ -2740,20 +2743,20 @@
},
{
"name": "myclabs/deep-copy",
- "version": "1.13.4",
+ "version": "1.14.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
- "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": "^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
@@ -2788,32 +2791,31 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0"
},
"funding": [
{
- "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
- "type": "tidelift"
+ "url": "https://github.com/mnapoli",
+ "type": "github"
}
],
- "time": "2025-08-01T08:46:24+00:00"
+ "time": "2026-08-11T10:17:44+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v5.7.0",
+ "version": "v5.9.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
+ "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
- "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def",
+ "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def",
"shasum": ""
},
"require": {
- "ext-ctype": "*",
"ext-json": "*",
"ext-tokenizer": "*",
"php": ">=7.4"
@@ -2852,9 +2854,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0"
},
- "time": "2025-12-06T11:56:16+00:00"
+ "time": "2026-09-13T18:51:52+00:00"
},
{
"name": "nikolaposa/version",
@@ -3388,16 +3390,16 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "2.3.2",
+ "version": "2.3.6",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a"
+ "reference": "1427af4647235b4a73b13940b1f1258d3584f36e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a",
- "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1427af4647235b4a73b13940b1f1258d3584f36e",
+ "reference": "1427af4647235b4a73b13940b1f1258d3584f36e",
"shasum": ""
},
"require": {
@@ -3429,17 +3431,17 @@
"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/2.3.2"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.6"
},
- "time": "2026-01-25T14:56:51+00:00"
+ "time": "2026-09-27T20:07:45+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "2.2.2",
+ "version": "2.2.16",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e5cc34d491a90e79c216d824f60fe21fd4d93bd6",
- "reference": "e5cc34d491a90e79c216d824f60fe21fd4d93bd6",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/46a6d9060e5a7763adfcc21ebcb8b504ebdbcb92",
+ "reference": "46a6d9060e5a7763adfcc21ebcb8b504ebdbcb92",
"shasum": ""
},
"require": {
@@ -3495,20 +3497,20 @@
"type": "github"
}
],
- "time": "2026-06-05T09:00:01+00:00"
+ "time": "2026-09-25T09:31:51+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
- "version": "2.0.4",
+ "version": "2.0.5",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
- "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc"
+ "reference": "67bedd65c24bc72840afc45aed48b1059dd44bec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc",
- "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/67bedd65c24bc72840afc45aed48b1059dd44bec",
+ "reference": "67bedd65c24bc72840afc45aed48b1059dd44bec",
"shasum": ""
},
"require": {
@@ -3518,7 +3520,8 @@
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/phpstan-phpunit": "^2.0",
- "phpunit/phpunit": "^9.6"
+ "phpunit/phpunit": "^9.6",
+ "shipmonk/name-collision-detector": "^2.1"
},
"type": "phpstan-extension",
"extra": {
@@ -3543,9 +3546,9 @@
],
"support": {
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
- "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4"
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.5"
},
- "time": "2026-02-09T13:21:14+00:00"
+ "time": "2026-07-22T06:50:43+00:00"
},
{
"name": "phpstan/phpstan-mockery",
@@ -3598,21 +3601,22 @@
},
{
"name": "phpstan/phpstan-phpunit",
- "version": "2.0.16",
+ "version": "2.0.21",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-phpunit.git",
- "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32"
+ "reference": "8dbdc3a3e2d7c5dfea655d20ecca5bc9b1b1e441"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32",
- "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32",
+ "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/8dbdc3a3e2d7c5dfea655d20ecca5bc9b1b1e441",
+ "reference": "8dbdc3a3e2d7c5dfea655d20ecca5bc9b1b1e441",
"shasum": ""
},
"require": {
+ "phar-io/version": "^3.2",
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.32"
+ "phpstan/phpstan": "^2.2.6"
},
"conflict": {
"phpunit/phpunit": "<7.0"
@@ -3622,7 +3626,8 @@
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-strict-rules": "^2.0",
- "phpunit/phpunit": "^9.6"
+ "phpunit/phpunit": "^9.6",
+ "shipmonk/name-collision-detector": "^2.1"
},
"type": "phpstan-extension",
"extra": {
@@ -3648,33 +3653,34 @@
],
"support": {
"issues": "https://github.com/phpstan/phpstan-phpunit/issues",
- "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16"
+ "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.21"
},
- "time": "2026-02-14T09:05:21+00:00"
+ "time": "2026-10-01T11:59:29+00:00"
},
{
"name": "phpstan/phpstan-strict-rules",
- "version": "2.0.11",
+ "version": "2.0.12",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-strict-rules.git",
- "reference": "9b000a578b85b32945b358b172c7b20e91189024"
+ "reference": "2bc5ae19ae965663b62ac907ee6342c3903ec93b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/9b000a578b85b32945b358b172c7b20e91189024",
- "reference": "9b000a578b85b32945b358b172c7b20e91189024",
+ "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/2bc5ae19ae965663b62ac907ee6342c3903ec93b",
+ "reference": "2bc5ae19ae965663b62ac907ee6342c3903ec93b",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.39"
+ "phpstan/phpstan": "^2.1.52"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-phpunit": "^2.0",
- "phpunit/phpunit": "^9.6"
+ "phpunit/phpunit": "^9.6",
+ "shipmonk/name-collision-detector": "^2.1"
},
"type": "phpstan-extension",
"extra": {
@@ -3699,22 +3705,22 @@
],
"support": {
"issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
- "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.11"
+ "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.12"
},
- "time": "2026-05-02T06:54:10+00:00"
+ "time": "2026-07-19T07:24:06+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "14.2.2",
+ "version": "14.4.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83"
+ "reference": "f1e54f06b6b4cea73cd6104ba3c0cfa0efa6d73f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/10d7da3628a99289cdf4c662dd7f0d73f1baec83",
- "reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1e54f06b6b4cea73cd6104ba3c0cfa0efa6d73f",
+ "reference": "f1e54f06b6b4cea73cd6104ba3c0cfa0efa6d73f",
"shasum": ""
},
"require": {
@@ -3722,18 +3728,18 @@
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^5.7.0",
+ "nikic/php-parser": "^5.9.0",
"php": ">=8.4",
- "phpunit/php-text-template": "^6.0",
+ "phpunit/php-text-template": "^6.0.1",
"sebastian/complexity": "^6.0",
- "sebastian/environment": "^9.3.2",
+ "sebastian/environment": "^9.3.3",
"sebastian/git-state": "^1.0",
- "sebastian/lines-of-code": "^5.0.1",
+ "sebastian/lines-of-code": "^5.0.2",
"sebastian/version": "^7.0",
"theseer/tokenizer": "^2.0.1"
},
"require-dev": {
- "phpunit/phpunit": "^13.2.0"
+ "phpunit/phpunit": "^13.3.6"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -3742,7 +3748,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "14.2.x-dev"
+ "dev-main": "14.4.x-dev"
}
},
"autoload": {
@@ -3771,7 +3777,7 @@
"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/14.2.2"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.4.1"
},
"funding": [
{
@@ -3791,27 +3797,27 @@
"type": "tidelift"
}
],
- "time": "2026-06-08T11:50:38+00:00"
+ "time": "2026-10-03T14:05:38+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "7.0.0",
+ "version": "7.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50"
+ "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6e5aa1fb0a95b1703d83e721299ee18bb4e2de50",
- "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/9bb4e6c58b62c1e043be995c66abec7c97307aae",
+ "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.3.1"
},
"type": "library",
"extra": {
@@ -3844,7 +3850,7 @@
"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/7.0.0"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.2"
},
"funding": [
{
@@ -3864,7 +3870,7 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:33:26+00:00"
+ "time": "2026-08-25T14:47:43+00:00"
},
{
"name": "phpunit/php-invoker",
@@ -3944,23 +3950,23 @@
},
{
"name": "phpunit/php-text-template",
- "version": "6.0.0",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4"
+ "reference": "97107691cb2b6c743b5e0c44be19e983cb337a02"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4",
- "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/97107691cb2b6c743b5e0c44be19e983cb337a02",
+ "reference": "97107691cb2b6c743b5e0c44be19e983cb337a02",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.3.6"
},
"type": "library",
"extra": {
@@ -3992,7 +3998,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/6.0.0"
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.1"
},
"funding": [
{
@@ -4012,7 +4018,7 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:36:37+00:00"
+ "time": "2026-10-03T04:54:24+00:00"
},
{
"name": "phpunit/php-timer",
@@ -4088,44 +4094,45 @@
},
{
"name": "phpunit/phpunit",
- "version": "13.1.14",
+ "version": "13.4.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "cdd419c33c040c6b570e51dba8ecbe81d399da53"
+ "reference": "ef714df238ae4d050e74efaa23f7c428bd01034e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cdd419c33c040c6b570e51dba8ecbe81d399da53",
- "reference": "cdd419c33c040c6b570e51dba8ecbe81d399da53",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ef714df238ae4d050e74efaa23f7c428bd01034e",
+ "reference": "ef714df238ae4d050e74efaa23f7c428bd01034e",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-filter": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
- "ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.13.4",
+ "myclabs/deep-copy": "^1.14.0",
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.4.1",
- "phpunit/php-code-coverage": "^14.1.10",
- "phpunit/php-file-iterator": "^7.0.0",
+ "phpunit/php-code-coverage": "^14.4",
+ "phpunit/php-file-iterator": "^7.0.2",
"phpunit/php-invoker": "^7.0.0",
"phpunit/php-text-template": "^6.0.0",
"phpunit/php-timer": "^9.0.0",
- "sebastian/cli-parser": "^5.0.0",
- "sebastian/comparator": "^8.2.1",
- "sebastian/diff": "^8.3.0",
- "sebastian/environment": "^9.3.2",
- "sebastian/exporter": "^8.1.0",
+ "sebastian/cli-parser": "^5.0.1",
+ "sebastian/comparator": "^8.4",
+ "sebastian/diff": "^9.0.1",
+ "sebastian/environment": "^9.3.3",
+ "sebastian/exporter": "^8.2.1",
+ "sebastian/file-filter": "^1.0",
"sebastian/git-state": "^1.0",
"sebastian/global-state": "^9.0.1",
- "sebastian/object-enumerator": "^8.0.0",
- "sebastian/recursion-context": "^8.0.0",
- "sebastian/type": "^7.0.1",
+ "sebastian/object-enumerator": "^8.1.0",
+ "sebastian/recursion-context": "^8.0.1",
+ "sebastian/type": "^7.0.2",
"sebastian/version": "^7.0.0",
"staabm/side-effects-detector": "^1.0.5"
},
@@ -4135,7 +4142,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "13.1-dev"
+ "dev-main": "13.4-dev"
}
},
"autoload": {
@@ -4167,7 +4174,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/13.1.14"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/13.4.0"
},
"funding": [
{
@@ -4175,7 +4182,7 @@
"type": "other"
}
],
- "time": "2026-06-04T06:16:42+00:00"
+ "time": "2026-10-02T03:20:44+00:00"
},
{
"name": "psr/clock",
@@ -4550,21 +4557,21 @@
},
{
"name": "rector/rector",
- "version": "2.5.2",
+ "version": "2.6.7",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "49ff6339174bdbdf50b0b35ecbcff14a05ac9e24"
+ "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/49ff6339174bdbdf50b0b35ecbcff14a05ac9e24",
- "reference": "49ff6339174bdbdf50b0b35ecbcff14a05ac9e24",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/f4aa224edb9b0630fb43826d4cb6a49b62e48d4c",
+ "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
- "phpstan/phpstan": "^2.2.2"
+ "phpstan/phpstan": "^2.2.14"
},
"conflict": {
"rector/rector-doctrine": "*",
@@ -4572,9 +4579,6 @@
"rector/rector-phpunit": "*",
"rector/rector-symfony": "*"
},
- "suggest": {
- "ext-dom": "To manipulate phpunit.xml via the custom-rule command"
- },
"bin": [
"bin/rector"
],
@@ -4598,7 +4602,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/2.5.2"
+ "source": "https://github.com/rectorphp/rector/tree/2.6.7"
},
"funding": [
{
@@ -4606,7 +4610,7 @@
"type": "github"
}
],
- "time": "2026-06-22T11:39:33+00:00"
+ "time": "2026-09-13T20:17:44+00:00"
},
{
"name": "revolt/event-loop",
@@ -5099,23 +5103,23 @@
},
{
"name": "sebastian/cli-parser",
- "version": "5.0.0",
+ "version": "5.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca"
+ "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/48a4654fa5e48c1c81214e9930048a572d4b23ca",
- "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/eeb759ad3146b7096fb59c3195d39e071cd409e3",
+ "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.2.6"
},
"type": "library",
"extra": {
@@ -5144,7 +5148,7 @@
"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/5.0.0"
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.1"
},
"funding": [
{
@@ -5164,31 +5168,31 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:39:44+00:00"
+ "time": "2026-08-01T04:27:14+00:00"
},
{
"name": "sebastian/comparator",
- "version": "8.2.1",
+ "version": "8.4.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089"
+ "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ce999bf08b2c387a5423fe56961c32eed3f88089",
- "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/3b070e608146cba00fd6fd1f0ffba89e5a8897fb",
+ "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-mbstring": "*",
"php": ">=8.4",
- "sebastian/diff": "^8.3",
- "sebastian/exporter": "^8.0.3"
+ "sebastian/diff": "^9.0",
+ "sebastian/exporter": "^8.2"
},
"require-dev": {
- "phpunit/phpunit": "^13.1.10"
+ "phpunit/phpunit": "^13.3"
},
"suggest": {
"ext-bcmath": "For comparing BcMath\\Number objects"
@@ -5196,7 +5200,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.2-dev"
+ "dev-main": "8.4-dev"
}
},
"autoload": {
@@ -5236,7 +5240,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
- "source": "https://github.com/sebastianbergmann/comparator/tree/8.2.1"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/8.4.0"
},
"funding": [
{
@@ -5256,7 +5260,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-21T04:46:40+00:00"
+ "time": "2026-08-07T07:23:13+00:00"
},
{
"name": "sebastian/complexity",
@@ -5330,29 +5334,29 @@
},
{
"name": "sebastian/diff",
- "version": "8.3.0",
+ "version": "9.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47"
+ "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b36d33b6e796513de7cb7df053afb3f55eefcd47",
- "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2df6626c1baf31d5a88674882a3072f151b5a26",
+ "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0",
- "symfony/process": "^7.2"
+ "phpunit/phpunit": "^13.3.1",
+ "symfony/process": "^7.4.17"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.3-dev"
+ "dev-main": "9.0-dev"
}
},
"autoload": {
@@ -5385,7 +5389,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
- "source": "https://github.com/sebastianbergmann/diff/tree/8.3.0"
+ "source": "https://github.com/sebastianbergmann/diff/tree/9.0.1"
},
"funding": [
{
@@ -5405,27 +5409,27 @@
"type": "tidelift"
}
],
- "time": "2026-05-15T04:58:09+00:00"
+ "time": "2026-08-25T15:38:55+00:00"
},
{
"name": "sebastian/environment",
- "version": "9.3.2",
+ "version": "9.3.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e"
+ "reference": "d4dd10267a11055066a2a78ae04583d8ddd4f595"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e",
- "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d4dd10267a11055066a2a78ae04583d8ddd4f595",
+ "reference": "d4dd10267a11055066a2a78ae04583d8ddd4f595",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.1.11"
+ "phpunit/phpunit": "^13.3.6"
},
"suggest": {
"ext-posix": "*"
@@ -5461,7 +5465,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy",
- "source": "https://github.com/sebastianbergmann/environment/tree/9.3.2"
+ "source": "https://github.com/sebastianbergmann/environment/tree/9.3.3"
},
"funding": [
{
@@ -5481,34 +5485,34 @@
"type": "tidelift"
}
],
- "time": "2026-05-25T13:41:38+00:00"
+ "time": "2026-10-01T12:37:56+00:00"
},
{
"name": "sebastian/exporter",
- "version": "8.1.0",
+ "version": "8.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6"
+ "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c0d29a945f8cf82f300a05e69874508e307ca4c6",
- "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/24a3b69bba4a12ab615fca9d34680c5598d9ab7a",
+ "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": ">=8.4",
- "sebastian/recursion-context": "^8.0"
+ "sebastian/recursion-context": "^8.0.1"
},
"require-dev": {
- "phpunit/phpunit": "^13.1.10"
+ "phpunit/phpunit": "^13.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.1-dev"
+ "dev-main": "8.2-dev"
}
},
"autoload": {
@@ -5551,7 +5555,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy",
- "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.0"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/8.2.1"
},
"funding": [
{
@@ -5571,7 +5575,76 @@
"type": "tidelift"
}
],
- "time": "2026-05-21T11:50:56+00:00"
+ "time": "2026-08-07T07:22:06+00:00"
+ },
+ {
+ "name": "sebastian/file-filter",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/file-filter.git",
+ "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/file-filter/zipball/33a26f394330f6faa7684bb9cc73afb7727aae93",
+ "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^13.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.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": "Library for filtering files",
+ "homepage": "https://github.com/sebastianbergmann/file-filter",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/file-filter/issues",
+ "security": "https://github.com/sebastianbergmann/file-filter/security/policy",
+ "source": "https://github.com/sebastianbergmann/file-filter/tree/1.0.0"
+ },
+ "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/file-filter",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-22T07:20:04+00:00"
},
{
"name": "sebastian/git-state",
@@ -5718,24 +5791,24 @@
},
{
"name": "sebastian/lines-of-code",
- "version": "5.0.1",
+ "version": "5.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7"
+ "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
- "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8",
+ "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^5.7.0",
+ "nikic/php-parser": "^5.8.0",
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.1.10"
+ "phpunit/phpunit": "^13.2.4"
},
"type": "library",
"extra": {
@@ -5764,7 +5837,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/5.0.1"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.2"
},
"funding": [
{
@@ -5784,34 +5857,33 @@
"type": "tidelift"
}
],
- "time": "2026-05-19T16:23:37+00:00"
+ "time": "2026-07-09T08:42:34+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "8.0.0",
+ "version": "8.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5"
+ "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b39ab125fd9a7434b0ecbc4202eebce11a98cfc5",
- "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/511064ecde82bd747e2ba2fab3dda8d977b59576",
+ "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576",
"shasum": ""
},
"require": {
"php": ">=8.4",
- "sebastian/object-reflector": "^6.0",
- "sebastian/recursion-context": "^8.0"
+ "sebastian/recursion-context": "^8.0.1"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.0-dev"
+ "dev-main": "8.1-dev"
}
},
"autoload": {
@@ -5834,7 +5906,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
"security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.0.0"
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.1.0"
},
"funding": [
{
@@ -5854,7 +5926,7 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:46:36+00:00"
+ "time": "2026-08-13T07:05:05+00:00"
},
{
"name": "sebastian/object-reflector",
@@ -5926,23 +5998,23 @@
},
{
"name": "sebastian/recursion-context",
- "version": "8.0.0",
+ "version": "8.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e"
+ "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/74c5af21f6a5833e91767ca068c4d3dfec15317e",
- "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0",
+ "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.2.6"
},
"type": "library",
"extra": {
@@ -5978,7 +6050,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
"security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.0"
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.1"
},
"funding": [
{
@@ -5998,27 +6070,27 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:51:28+00:00"
+ "time": "2026-08-03T05:58:12+00:00"
},
{
"name": "sebastian/type",
- "version": "7.0.1",
+ "version": "7.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "fee0309275847fefd7636167085e379c1dbf6990"
+ "reference": "bd1df467864cb95140414059a535b2d906173fcf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990",
- "reference": "fee0309275847fefd7636167085e379c1dbf6990",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/bd1df467864cb95140414059a535b2d906173fcf",
+ "reference": "bd1df467864cb95140414059a535b2d906173fcf",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.1.10"
+ "phpunit/phpunit": "^13.3.0"
},
"type": "library",
"extra": {
@@ -6047,7 +6119,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"security": "https://github.com/sebastianbergmann/type/security/policy",
- "source": "https://github.com/sebastianbergmann/type/tree/7.0.1"
+ "source": "https://github.com/sebastianbergmann/type/tree/7.0.2"
},
"funding": [
{
@@ -6067,7 +6139,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-20T06:49:11+00:00"
+ "time": "2026-08-10T08:00:57+00:00"
},
{
"name": "sebastian/version",
@@ -6310,16 +6382,16 @@
},
{
"name": "shipmonk/dead-code-detector",
- "version": "1.2.1",
+ "version": "1.4.2",
"source": {
"type": "git",
"url": "https://github.com/shipmonk-rnd/dead-code-detector.git",
- "reference": "b2f49bbcf6246c2058b2b7c6770bc6db06def5b2"
+ "reference": "431c13453eeb1790e15c8674ad4d6318218849bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/shipmonk-rnd/dead-code-detector/zipball/b2f49bbcf6246c2058b2b7c6770bc6db06def5b2",
- "reference": "b2f49bbcf6246c2058b2b7c6770bc6db06def5b2",
+ "url": "https://api.github.com/repos/shipmonk-rnd/dead-code-detector/zipball/431c13453eeb1790e15c8674ad4d6318218849bc",
+ "reference": "431c13453eeb1790e15c8674ad4d6318218849bc",
"shasum": ""
},
"require": {
@@ -6340,15 +6412,16 @@
"nette/tester": "^2.4",
"nette/utils": "^3.0 || ^4.0",
"nikic/php-parser": "^5.4.0",
+ "phpat/phpat": "^0.12",
"phpbench/phpbench": "^1.2",
"phpstan/phpstan-phpunit": "^2.0.16",
"phpstan/phpstan-strict-rules": "^2.0.10",
"phpstan/phpstan-symfony": "^2.0.15",
"phpunit/phpcov": "^9.0.2",
"phpunit/phpunit": "^10.5.46",
- "shipmonk/coding-standard": "^0.2.2",
+ "shipmonk/coding-standard": "^0.3.0",
"shipmonk/composer-dependency-analyser": "^1.8.4",
- "shipmonk/coverage-guard": "^1.0.2",
+ "shipmonk/coverage-guard": "^1.1.0",
"shipmonk/name-collision-detector": "^2.1.1",
"shipmonk/phpstan-dev": "^0.1.6",
"shipmonk/phpstan-rules": "^4.3.6",
@@ -6392,9 +6465,9 @@
],
"support": {
"issues": "https://github.com/shipmonk-rnd/dead-code-detector/issues",
- "source": "https://github.com/shipmonk-rnd/dead-code-detector/tree/1.2.1"
+ "source": "https://github.com/shipmonk-rnd/dead-code-detector/tree/1.4.2"
},
- "time": "2026-06-12T07:26:41+00:00"
+ "time": "2026-09-18T07:50:08+00:00"
},
{
"name": "shipmonk/phpstan-rules",
@@ -6458,32 +6531,32 @@
},
{
"name": "slevomat/coding-standard",
- "version": "8.30.1",
+ "version": "8.31.1",
"source": {
"type": "git",
"url": "https://github.com/slevomat/coding-standard.git",
- "reference": "70a3b2150600122f87c59cae1c1b5902ba73798b"
+ "reference": "0a40807a48873948bfa7ffce2a4e69ba40cf5e76"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/70a3b2150600122f87c59cae1c1b5902ba73798b",
- "reference": "70a3b2150600122f87c59cae1c1b5902ba73798b",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/0a40807a48873948bfa7ffce2a4e69ba40cf5e76",
+ "reference": "0a40807a48873948bfa7ffce2a4e69ba40cf5e76",
"shasum": ""
},
"require": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.1",
"php": "^7.4 || ^8.0",
- "phpstan/phpdoc-parser": "^2.3.2",
+ "phpstan/phpdoc-parser": "^2.3.3",
"squizlabs/php_codesniffer": "^4.0.1"
},
"require-dev": {
"phing/phing": "3.0.1|3.1.2",
"php-parallel-lint/php-parallel-lint": "1.4.0",
- "phpstan/phpstan": "2.2.2",
- "phpstan/phpstan-deprecation-rules": "2.0.4",
- "phpstan/phpstan-phpunit": "2.0.16",
- "phpstan/phpstan-strict-rules": "2.0.11",
- "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.55|12.5.30"
+ "phpstan/phpstan": "2.2.7",
+ "phpstan/phpstan-deprecation-rules": "2.0.5",
+ "phpstan/phpstan-phpunit": "2.0.18",
+ "phpstan/phpstan-strict-rules": "2.0.12",
+ "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.56|12.5.33"
},
"type": "phpcodesniffer-standard",
"extra": {
@@ -6507,7 +6580,7 @@
],
"support": {
"issues": "https://github.com/slevomat/coding-standard/issues",
- "source": "https://github.com/slevomat/coding-standard/tree/8.30.1"
+ "source": "https://github.com/slevomat/coding-standard/tree/8.31.1"
},
"funding": [
{
@@ -6519,23 +6592,24 @@
"type": "tidelift"
}
],
- "time": "2026-06-27T11:26:35+00:00"
+ "time": "2026-07-31T10:42:43+00:00"
},
{
"name": "squizlabs/php_codesniffer",
- "version": "4.0.1",
+ "version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
- "reference": "0525c73950de35ded110cffafb9892946d7771b5"
+ "reference": "bbdc3d0532623e21838b7041a4364383a8126f96"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0525c73950de35ded110cffafb9892946d7771b5",
- "reference": "0525c73950de35ded110cffafb9892946d7771b5",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/bbdc3d0532623e21838b7041a4364383a8126f96",
+ "reference": "bbdc3d0532623e21838b7041a4364383a8126f96",
"shasum": ""
},
"require": {
+ "ext-libxml": "*",
"ext-simplexml": "*",
"ext-tokenizer": "*",
"ext-xmlwriter": "*",
@@ -6544,6 +6618,10 @@
"require-dev": {
"phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31"
},
+ "suggest": {
+ "ext-iconv": "For accurate character length calculation when the checked files contain multi-byte characters.",
+ "ext-pcntl": "For parallel processing support via the --parallel CLI option."
+ },
"bin": [
"bin/phpcbf",
"bin/phpcs"
@@ -6598,7 +6676,7 @@
"type": "thanks_dev"
}
],
- "time": "2025-11-10T16:43:36+00:00"
+ "time": "2026-08-06T02:45:27+00:00"
},
{
"name": "staabm/phpstan-psr3",
@@ -8941,29 +9019,33 @@
},
{
"name": "tomasvotruba/type-coverage",
- "version": "2.2.2",
+ "version": "2.4.1",
"source": {
"type": "git",
"url": "https://github.com/TomasVotruba/type-coverage.git",
- "reference": "25f298265c823e8fb0505169135855e1e6a91021"
+ "reference": "2876326f2d1946df983da6feb2903e3797df5918"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/25f298265c823e8fb0505169135855e1e6a91021",
- "reference": "25f298265c823e8fb0505169135855e1e6a91021",
+ "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/2876326f2d1946df983da6feb2903e3797df5918",
+ "reference": "2876326f2d1946df983da6feb2903e3797df5918",
"shasum": ""
},
"require": {
"php": "^8.4",
- "phpstan/phpstan": "^2.2"
+ "phpstan/phpstan": "^2.2",
+ "webmozart/assert": "^1.11 || ^2.1"
},
"require-dev": {
+ "doctrine/collections": "^2.3",
"phpstan/extension-installer": "^1.4",
- "phpunit/phpunit": "^12.5",
- "rector/jack": "^1.0",
- "rector/rector": "^2.4",
+ "phpunit/phpunit": "^13.2",
+ "rector/jack": "^1.1",
+ "rector/rector": "^2.5",
"shipmonk/composer-dependency-analyser": "^1.8",
- "symplify/easy-coding-standard": "^13.1",
+ "symfony/dom-crawler": "^8.1",
+ "symfony/form": "^8.1",
+ "symplify/easy-coding-standard": "^13.2",
"tomasvotruba/unused-public": "^2.2",
"tracy/tracy": "^2.12"
},
@@ -8977,6 +9059,7 @@
},
"autoload": {
"psr-4": {
+ "Rector\\TypePerfect\\": "packages/type-perfect/src",
"TomasVotruba\\TypeCoverage\\": "src"
}
},
@@ -8991,7 +9074,7 @@
],
"support": {
"issues": "https://github.com/TomasVotruba/type-coverage/issues",
- "source": "https://github.com/TomasVotruba/type-coverage/tree/2.2.2"
+ "source": "https://github.com/TomasVotruba/type-coverage/tree/2.4.1"
},
"funding": [
{
@@ -9003,7 +9086,7 @@
"type": "github"
}
],
- "time": "2026-06-07T12:35:00+00:00"
+ "time": "2026-10-03T05:13:37+00:00"
},
{
"name": "webmozart/assert",
@@ -9122,34 +9205,34 @@
},
{
"name": "wyrihaximus/async-test-utilities",
- "version": "13.3.0",
+ "version": "13.5.2",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/php-async-test-utilities.git",
- "reference": "4c9f02bf271bc6ff615a6a1b85f2839f811b2274"
+ "reference": "89036249981c3d860510ad98748f5862b21574d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/4c9f02bf271bc6ff615a6a1b85f2839f811b2274",
- "reference": "4c9f02bf271bc6ff615a6a1b85f2839f811b2274",
+ "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/89036249981c3d860510ad98748f5862b21574d4",
+ "reference": "89036249981c3d860510ad98748f5862b21574d4",
"shasum": ""
},
"require": {
"php": "^8.4",
- "phpunit/phpunit": "^13.1.14",
+ "phpunit/phpunit": "^13.2.6",
"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": "^4.0.0",
- "wyrihaximus/test-utilities": "^13.3.0"
+ "wyrihaximus/test-utilities": "^13.5.2"
},
"conflict": {
"composer/compoer": "<2.6.0"
},
"require-dev": {
"react/promise-timer": "^1.11.0",
- "wyrihaximus/makefiles": "^0.12.1"
+ "wyrihaximus/makefiles": "^0.13.3"
},
"type": "library",
"extra": {
@@ -9177,7 +9260,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/13.3.0"
+ "source": "https://github.com/WyriHaximus/php-async-test-utilities/tree/13.5.2"
},
"funding": [
{
@@ -9185,31 +9268,31 @@
"type": "github"
}
],
- "time": "2026-06-27T22:10:23+00:00"
+ "time": "2026-08-07T17:36:53+00:00"
},
{
"name": "wyrihaximus/coding-standard",
- "version": "4.2.0",
+ "version": "4.3.0",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/php-coding-standard.git",
- "reference": "15de1c4e2be8857b2c086810659eac158dfe7531"
+ "reference": "6efccf79994a0a4fc3692a47a5b72448900fdc38"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/php-coding-standard/zipball/15de1c4e2be8857b2c086810659eac158dfe7531",
- "reference": "15de1c4e2be8857b2c086810659eac158dfe7531",
+ "url": "https://api.github.com/repos/WyriHaximus/php-coding-standard/zipball/6efccf79994a0a4fc3692a47a5b72448900fdc38",
+ "reference": "6efccf79994a0a4fc3692a47a5b72448900fdc38",
"shasum": ""
},
"require": {
"dealerdirect/phpcodesniffer-composer-installer": "^1.2.1",
"doctrine/coding-standard": "^14.0.0",
"php": "^8.4",
- "slevomat/coding-standard": "^8.30.1",
- "squizlabs/php_codesniffer": "^4.0.1"
+ "slevomat/coding-standard": "^8.31.1",
+ "squizlabs/php_codesniffer": "^4.0.4"
},
"require-dev": {
- "wyrihaximus/makefiles": "^0.12.1"
+ "wyrihaximus/makefiles": "^0.13.3"
},
"type": "phpcodesniffer-standard",
"extra": {
@@ -9229,7 +9312,7 @@
"description": "WyriHaximus Coding Standard",
"support": {
"issues": "https://github.com/WyriHaximus/php-coding-standard/issues",
- "source": "https://github.com/WyriHaximus/php-coding-standard/tree/4.2.0"
+ "source": "https://github.com/WyriHaximus/php-coding-standard/tree/4.3.0"
},
"funding": [
{
@@ -9237,20 +9320,20 @@
"type": "github"
}
],
- "time": "2026-06-27T19:56:09+00:00"
+ "time": "2026-08-06T23:29:46+00:00"
},
{
"name": "wyrihaximus/makefiles",
- "version": "0.12.3",
+ "version": "0.15.1",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/Makefiles.git",
- "reference": "cbb98ce358e8886a3c5d982b01fc478677ba8ef2"
+ "reference": "6caf17e8ac1fcfa8152311da7c2c005d7498a828"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/cbb98ce358e8886a3c5d982b01fc478677ba8ef2",
- "reference": "cbb98ce358e8886a3c5d982b01fc478677ba8ef2",
+ "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/6caf17e8ac1fcfa8152311da7c2c005d7498a828",
+ "reference": "6caf17e8ac1fcfa8152311da7c2c005d7498a828",
"shasum": ""
},
"require": {
@@ -9262,7 +9345,7 @@
"infection/infection": "<0.32.0"
},
"require-dev": {
- "wyrihaximus/test-utilities": "^13.3.0"
+ "wyrihaximus/test-utilities": "^14.4.0"
},
"type": "composer-plugin",
"extra": {
@@ -9291,7 +9374,7 @@
"description": "🧱 Makefile building blocks",
"support": {
"issues": "https://github.com/WyriHaximus/Makefiles/issues",
- "source": "https://github.com/WyriHaximus/Makefiles/tree/0.12.3"
+ "source": "https://github.com/WyriHaximus/Makefiles/tree/0.15.1"
},
"funding": [
{
@@ -9299,20 +9382,20 @@
"type": "github"
}
],
- "time": "2026-07-02T10:01:48+00:00"
+ "time": "2026-10-03T15:29:24+00:00"
},
{
"name": "wyrihaximus/phpstan-no-safe",
- "version": "1.0.0",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/phpstan-no-safe.git",
- "reference": "f9bed3bbba6cf617e25b3753ecbb09ad4d2c4813"
+ "reference": "7f31edbca02397aa6297ba96906962f01d15c911"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/phpstan-no-safe/zipball/f9bed3bbba6cf617e25b3753ecbb09ad4d2c4813",
- "reference": "f9bed3bbba6cf617e25b3753ecbb09ad4d2c4813",
+ "url": "https://api.github.com/repos/WyriHaximus/phpstan-no-safe/zipball/7f31edbca02397aa6297ba96906962f01d15c911",
+ "reference": "7f31edbca02397aa6297ba96906962f01d15c911",
"shasum": ""
},
"require": {
@@ -9322,7 +9405,7 @@
"jawira/case-converter": "^3.6",
"nikic/php-parser": "^5.6.1",
"phpstan/phpdoc-parser": "^2.2.0",
- "wyrihaximus/makefiles": "^0.11.1",
+ "wyrihaximus/makefiles": "^0.13.3",
"wyrihaximus/test-utilities": "^13.1.0"
},
"type": "library",
@@ -9345,7 +9428,7 @@
"description": "⛔🔐 PHPStan extension that detects and blocks any usage of `thecodingmachine/safe`",
"support": {
"issues": "https://github.com/WyriHaximus/phpstan-no-safe/issues",
- "source": "https://github.com/WyriHaximus/phpstan-no-safe/tree/1.0.0"
+ "source": "https://github.com/WyriHaximus/phpstan-no-safe/tree/1.1.0"
},
"funding": [
{
@@ -9353,7 +9436,7 @@
"type": "github"
}
],
- "time": "2026-06-19T23:15:39+00:00"
+ "time": "2026-08-07T14:23:53+00:00"
},
{
"name": "wyrihaximus/phpstan-react",
@@ -9411,34 +9494,34 @@
},
{
"name": "wyrihaximus/phpstan-rules-wrapper",
- "version": "14.0.0",
+ "version": "14.8.0",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper.git",
- "reference": "a06a7d45b26704dc422db617e696267441e9d69b"
+ "reference": "dd68b2b81217fe5717ee25156c39f40514831c74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/a06a7d45b26704dc422db617e696267441e9d69b",
- "reference": "a06a7d45b26704dc422db617e696267441e9d69b",
+ "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/dd68b2b81217fe5717ee25156c39f40514831c74",
+ "reference": "dd68b2b81217fe5717ee25156c39f40514831c74",
"shasum": ""
},
"require": {
"ergebnis/phpstan-rules": "^2.13.1",
"php": "^8.4",
"phpstan/extension-installer": "^1.4.3",
- "phpstan/phpstan": "^2.2.2",
- "phpstan/phpstan-deprecation-rules": "^2.0.4",
+ "phpstan/phpstan": "^2.2.14",
+ "phpstan/phpstan-deprecation-rules": "^2.0.5",
"phpstan/phpstan-mockery": "^2.0.0",
- "phpstan/phpstan-phpunit": "^2.0.16",
- "phpstan/phpstan-strict-rules": "^2.0.11",
- "shipmonk/dead-code-detector": "^1.2.1",
+ "phpstan/phpstan-phpunit": "^2.0.18",
+ "phpstan/phpstan-strict-rules": "^2.0.12",
+ "shipmonk/dead-code-detector": "^1.4.1",
"shipmonk/phpstan-rules": "^4.4.0",
"staabm/phpstan-psr3": "^1.0.3",
"symplify/phpstan-extensions": "^12.0.2",
- "tomasvotruba/type-coverage": "^2.2.2",
- "wyrihaximus/phpstan-no-safe": "^1.0.0",
- "yamadashy/phpstan-friendly-formatter": "^1.4.0"
+ "tomasvotruba/type-coverage": "^2.3.6",
+ "wyrihaximus/phpstan-no-safe": "^1.1.0",
+ "yamadashy/phpstan-friendly-formatter": "^1.5.0"
},
"type": "library",
"extra": {
@@ -9461,7 +9544,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/14.0.0"
+ "source": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/tree/14.8.0"
},
"funding": [
{
@@ -9469,7 +9552,7 @@
"type": "github"
}
],
- "time": "2026-06-19T23:25:20+00:00"
+ "time": "2026-09-20T13:35:19+00:00"
},
{
"name": "wyrihaximus/react-phpunit-run-tests-in-fiber",
@@ -9530,16 +9613,16 @@
},
{
"name": "wyrihaximus/test-utilities",
- "version": "13.3.0",
+ "version": "13.5.2",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/php-test-utilities.git",
- "reference": "ed71de5364fbf676c30110ee1c9e7e26e24aee03"
+ "reference": "e87f761d9ac480fba66e94913ec5879716a87e64"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/ed71de5364fbf676c30110ee1c9e7e26e24aee03",
- "reference": "ed71de5364fbf676c30110ee1c9e7e26e24aee03",
+ "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/e87f761d9ac480fba66e94913ec5879716a87e64",
+ "reference": "e87f761d9ac480fba66e94913ec5879716a87e64",
"shasum": ""
},
"require": {
@@ -9549,27 +9632,30 @@
"ext-hash": "^8.4",
"ext-json": "^8.4",
"icanhazstring/composer-unused": "^0.9.6",
- "infection/infection": "^0.33.3",
+ "infection/infection": "^0.34.2",
"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",
- "phpstan/phpstan": "^2.2.2",
- "phpunit/phpunit": "^13.1.13",
- "rector/rector": "^2.5.2",
+ "phpstan/phpstan": "^2.2.8",
+ "phpunit/phpunit": "^13.3.0",
+ "rector/rector": "^2.6.1",
"roave/backward-compatibility-check": "^8.19.0",
- "squizlabs/php_codesniffer": "^4.0.1",
- "wyrihaximus/coding-standard": "^4.2.0",
- "wyrihaximus/phpstan-rules-wrapper": "^14.0.0"
+ "squizlabs/php_codesniffer": "^4.0.4",
+ "wyrihaximus/coding-standard": "^4.3.0",
+ "wyrihaximus/phpstan-rules-wrapper": "^14.4.0"
},
"conflict": {
"composer-unused/symbol-parser": "<0.3.3",
+ "composer/composer": "<2.10.2",
"composer/pcre": "<3.3.2",
+ "sanmai/di-container": "<0.1.17",
+ "sanmai/pipeline": "<7.9",
"wyrihaximus/makefiles": "<0.5.0"
},
"require-dev": {
- "wyrihaximus/makefiles": "^0.12.1"
+ "wyrihaximus/makefiles": "^0.13.3"
},
"suggest": {
"wyrihaximus/async-test-utilities": "The recommended addition to this package when building ReactPHP packages and projects.",
@@ -9602,7 +9688,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/13.3.0"
+ "source": "https://github.com/WyriHaximus/php-test-utilities/tree/13.5.2"
},
"funding": [
{
@@ -9610,20 +9696,20 @@
"type": "github"
}
],
- "time": "2026-06-27T20:14:37+00:00"
+ "time": "2026-08-07T14:59:43+00:00"
},
{
"name": "yamadashy/phpstan-friendly-formatter",
- "version": "v1.4.0",
+ "version": "v1.5.0",
"source": {
"type": "git",
"url": "https://github.com/yamadashy/phpstan-friendly-formatter.git",
- "reference": "cd4882c7293591c13230b5be35e742b33d2ab2ff"
+ "reference": "c5dfd04146143ddcc297741cda2814975735605b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/yamadashy/phpstan-friendly-formatter/zipball/cd4882c7293591c13230b5be35e742b33d2ab2ff",
- "reference": "cd4882c7293591c13230b5be35e742b33d2ab2ff",
+ "url": "https://api.github.com/repos/yamadashy/phpstan-friendly-formatter/zipball/c5dfd04146143ddcc297741cda2814975735605b",
+ "reference": "c5dfd04146143ddcc297741cda2814975735605b",
"shasum": ""
},
"require": {
@@ -9632,9 +9718,9 @@
"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"
+ "friendsofphp/php-cs-fixer": "^3.95.25",
+ "phpstan/phpstan-phpunit": "^2.0.18",
+ "phpunit/phpunit": "^10.0 || ^11.0 || ^13.0"
},
"type": "phpstan-extension",
"extra": {
@@ -9668,9 +9754,9 @@
],
"support": {
"issues": "https://github.com/yamadashy/phpstan-friendly-formatter/issues",
- "source": "https://github.com/yamadashy/phpstan-friendly-formatter/tree/v1.4.0"
+ "source": "https://github.com/yamadashy/phpstan-friendly-formatter/tree/v1.5.0"
},
- "time": "2026-01-26T15:12:47+00:00"
+ "time": "2026-09-19T13:58:44+00:00"
}
],
"aliases": [],
diff --git a/etc/qa/composer-require-checker.json b/etc/qa/composer-require-checker.json
deleted file mode 100644
index 040b1e2..0000000
--- a/etc/qa/composer-require-checker.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "symbol-whitelist" : [
- "null", "true", "false",
- "static", "self", "parent",
- "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", "mixed",
- "Safe\\json_encode", "futurePromise", "WyriHaximus\\Constants\\ComposerAutoloader\\LOCATION"
- ],
- "php-core-extensions" : [
- "Core",
- "date",
- "pcre",
- "Phar",
- "Reflection",
- "SPL",
- "standard"
- ],
- "scan-files" : []
-}
diff --git a/etc/qa/composer-unused.php b/etc/qa/composer-unused.php
deleted file mode 100644
index 20587fa..0000000
--- a/etc/qa/composer-unused.php
+++ /dev/null
@@ -1 +0,0 @@
- $config;
\ No newline at end of file