diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 004add68de..2f6f88d0df 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1,11 +1,4 @@
-# [Choice] PHP version: 7, 7.4, 7.3
-ARG VARIANT=7
-FROM mcr.microsoft.com/vscode/devcontainers/php:${VARIANT}
-
-# [Option] Install Node.js
-ARG INSTALL_NODE="true"
-ARG NODE_VERSION="lts/*"
-RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
+FROM mcr.microsoft.com/vscode/devcontainers/php:8.1
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
@@ -17,11 +10,4 @@ RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/shar
# PHP memory limit
RUN echo "memory_limit=768M" > /usr/local/etc/php/php.ini
-# Composer v2
-RUN EXPECTED_CHECKSUM="$(wget -q -O - https://composer.github.io/installer.sig)" \
- && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
- && ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" \
- && if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then >&2 echo 'ERROR: Invalid installer checksum'; rm composer-setup.php; exit 1; fi \
- && php composer-setup.php --version=2.0.0-RC1 \
- && php -r "unlink('composer-setup.php');" \
- && mv composer.phar /usr/local/bin/composer
+COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
diff --git a/.devcontainer/base.Dockerfile b/.devcontainer/base.Dockerfile
deleted file mode 100644
index 5c57924435..0000000000
--- a/.devcontainer/base.Dockerfile
+++ /dev/null
@@ -1,47 +0,0 @@
-# [Choice] PHP version: 7, 7.4, 7.3
-ARG VARIANT=7
-FROM php:${VARIANT}-apache
-
-# [Option] Install zsh
-ARG INSTALL_ZSH="true"
-# [Option] Upgrade OS packages to their latest versions
-ARG UPGRADE_PACKAGES="true"
-
-# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies.
-ARG USERNAME=vscode
-ARG USER_UID=1000
-ARG USER_GID=$USER_UID
-COPY library-scripts/common-debian.sh /tmp/library-scripts/
-RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
- && bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \
- && apt-get -y install --no-install-recommends lynx \
- && usermod -aG www-data ${USERNAME} \
- && sed -i -e "s/Listen 80/Listen 80\\nListen 8080/g" /etc/apache2/ports.conf \
- && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts
-
-# Install xdebug
-RUN yes | pecl install xdebug \
- && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
- && echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
- && echo "xdebug.remote_autostart=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
- && rm -rf /tmp/pear
-
-# Install composer
-RUN curl -sSL https://getcomposer.org/installer | php \
- && chmod +x composer.phar \
- && mv composer.phar /usr/local/bin/composer
-
-# [Option] Install Node.js
-ARG INSTALL_NODE="true"
-ARG NODE_VERSION="none"
-ENV NVM_DIR=/usr/local/share/nvm
-ENV NVM_SYMLINK_CURRENT=true \
- PATH=${NVM_DIR}/current/bin:${PATH}
-COPY library-scripts/node-debian.sh /tmp/library-scripts/
-RUN if [ "$INSTALL_NODE" = "true" ]; then /bin/bash /tmp/library-scripts/node-debian.sh "${NVM_DIR}" "${NODE_VERSION}" "${USERNAME}"; fi \
- && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts
-
-# [Optional] Uncomment this section to install additional packages.
-# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
-# && apt-get -y install --no-install-recommends
-
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index e2f0ccb650..ff13dd64a3 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,13 +1,7 @@
{
"name": "PHP",
"build": {
- "dockerfile": "Dockerfile",
- "args": {
- // Update VARIANT to pick a PHP version: 7, 7.4, 7.3
- "VARIANT": "7.4",
- "INSTALL_NODE": "false",
- "NODE_VERSION": "lts/*"
- }
+ "dockerfile": "Dockerfile"
},
// Set *default* container specific settings.json values on container create.
diff --git a/.devcontainer/library-scripts/node-debian.sh b/.devcontainer/library-scripts/node-debian.sh
index f35e77fe1b..d230a14e82 100644
--- a/.devcontainer/library-scripts/node-debian.sh
+++ b/.devcontainer/library-scripts/node-debian.sh
@@ -18,7 +18,7 @@ if [ "$(id -u)" -ne 0 ]; then
exit 1
fi
-# Treat a user name of "none" or non-existant user as root
+# Treat a user name of "none" or non-existent user as root
if [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then
USERNAME=root
fi
diff --git a/.editorconfig b/.editorconfig
index 5d66bc427b..0dc4814a91 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -6,7 +6,11 @@ insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
-[*.{php,phpt}]
+[*.{php,phpt,stub}]
+indent_style = tab
+indent_size = 4
+
+[bin/phpstan]
indent_style = tab
indent_size = 4
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index d04f75155f..0000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-version: 2
-updates:
-- package-ecosystem: composer
- directory: "/build-cs"
- schedule:
- interval: weekly
- open-pull-requests-limit: 10
-- package-ecosystem: composer
- directory: "/compiler"
- schedule:
- interval: weekly
- open-pull-requests-limit: 10
-- package-ecosystem: github-actions
- directory: "/"
- schedule:
- interval: monthly
- open-pull-requests-limit: 10
diff --git a/.github/renovate.json b/.github/renovate.json
new file mode 100644
index 0000000000..9657e99a52
--- /dev/null
+++ b/.github/renovate.json
@@ -0,0 +1,71 @@
+{
+ "extends": [
+ "config:recommended",
+ "schedule:weekly"
+ ],
+ "dependencyDashboard": true,
+ "rangeStrategy": "update-lockfile",
+ "rebaseWhen": "conflicted",
+ "baseBranches": [
+ "2.1.x"
+ ],
+ "packageRules": [
+ {
+ "enabled": false,
+ "matchPackageNames": [
+ "*"
+ ]
+ },
+ {
+ "matchFileNames": [
+ "+(composer.json)"
+ ],
+ "enabled": true,
+ "matchBaseBranches": [
+ "2.1.x"
+ ]
+ },
+ {
+ "matchFileNames": [
+ "apigen/**"
+ ],
+ "enabled": true,
+ "groupName": "apigen"
+ },
+ {
+ "matchFileNames": [
+ "issue-bot/**"
+ ],
+ "enabled": true,
+ "groupName": "issue-bot"
+ },
+ {
+ "matchFileNames": [
+ "changelog-generator/**"
+ ],
+ "enabled": true,
+ "groupName": "changelog-generator"
+ },
+ {
+ "matchFileNames": [
+ "compiler/**"
+ ],
+ "enabled": true,
+ "groupName": "compiler"
+ },
+ {
+ "matchFileNames": [
+ "tests/composer.json"
+ ],
+ "enabled": true,
+ "groupName": "paratest"
+ },
+ {
+ "matchFileNames": [
+ ".github/**"
+ ],
+ "enabled": true,
+ "groupName": "github-actions"
+ }
+ ]
+}
diff --git a/.github/scripts/.gitignore b/.github/scripts/.gitignore
new file mode 100644
index 0000000000..f06235c460
--- /dev/null
+++ b/.github/scripts/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+dist
diff --git a/.github/scripts/diffPrefixes.php b/.github/scripts/diffPrefixes.php
new file mode 100644
index 0000000000..0f3c22cbfc
--- /dev/null
+++ b/.github/scripts/diffPrefixes.php
@@ -0,0 +1,85 @@
+diff(file_get_contents($oldFilePath), file_get_contents($newFilePath));
+ if ($stringDiff === '') {
+ continue;
+ }
+
+ $isDifferent = true;
+
+ echo "$path:\n";
+ $startLine = 1;
+ $startContext = 1;
+ foreach (explode("\n", $stringDiff) as $i => $line) {
+ $matches = Strings::match($line, '/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/');
+ if ($matches !== null) {
+ $startLine = (int) $matches[1];
+ $startContext = (int) $matches[2];
+ continue;
+ }
+
+ if ($lineNumber < $startLine || $lineNumber > ($startLine + $startContext)) {
+ continue;
+ }
+
+ if (str_starts_with($line, '+')) {
+ echo "\033[32m$line\033[0m\n";
+ } elseif (str_starts_with($line, '-')) {
+ echo "\033[31m$line\033[0m\n";
+ } else {
+ echo "$line\n";
+ }
+ }
+
+ echo "\n";
+}
+
+if ($isDifferent) {
+ exit(1);
+}
diff --git a/.github/scripts/find-artifact.ts b/.github/scripts/find-artifact.ts
new file mode 100644
index 0000000000..3f3524c9cc
--- /dev/null
+++ b/.github/scripts/find-artifact.ts
@@ -0,0 +1,63 @@
+import * as core from "@actions/core";
+import * as github from "@actions/github";
+
+interface Inputs {
+ github: ReturnType;
+ context: typeof github.context;
+ core: typeof core;
+}
+
+module.exports = async ({github, context, core}: Inputs) => {
+ const commitSha = process.env.BASE_SHA;
+ const artifactName = process.env.ARTIFACT_NAME;
+ const workflowName = process.env.WORKFLOW_NAME;
+
+ // Get all workflow runs for this commit
+ const runs = await github.rest.actions.listWorkflowRunsForRepo({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ per_page: 20,
+ event: "push",
+ head_sha: commitSha
+ });
+
+ if (runs.data.workflow_runs.length === 0) {
+ core.setFailed(`No workflow runs found for commit ${commitSha}`);
+ return;
+ }
+
+ const workflowRuns = runs.data.workflow_runs;
+ if (workflowRuns.length === 0) {
+ core.setFailed(`No workflow runs found for commit ${commitSha}`);
+ return;
+ }
+
+ let found = false;
+ for (const run of workflowRuns) {
+ if (run.status !== "completed" || run.conclusion !== "success") {
+ continue;
+ }
+
+ if (run.name !== workflowName) {
+ continue;
+ }
+
+ const artifactsResp = await github.rest.actions.listWorkflowRunArtifacts({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ run_id: run.id,
+ });
+
+ const artifact = artifactsResp.data.artifacts.find(a => a.name === artifactName);
+ if (artifact) {
+ core.setOutput("artifact_id", artifact.id.toString());
+ core.setOutput("run_id", run.id.toString());
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ core.setFailed(`No artifact named '${artifactName}' found for commit ${commitSha}`);
+ }
+}
diff --git a/.github/scripts/listPrefix.php b/.github/scripts/listPrefix.php
new file mode 100644
index 0000000000..d7f902e855
--- /dev/null
+++ b/.github/scripts/listPrefix.php
@@ -0,0 +1,32 @@
+setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
+$files = new RecursiveIteratorIterator($iterator);
+
+$locations = [];
+foreach ($files as $file) {
+ $path = $file->getPathname();
+ if ($file->getExtension() !== 'php') {
+ continue;
+ }
+ $contents = file_get_contents($path);
+ $lines = explode("\n", $contents);
+ foreach ($lines as $i => $line) {
+ if (!str_contains($line, '_PHPStan_checksum')) {
+ continue;
+ }
+
+ $trimmedPath = substr($path, strlen($dir) + 1);
+ if (str_starts_with($trimmedPath, 'vendor/composer/autoload_')) {
+ continue;
+ }
+ $locations[] = $trimmedPath . ':' . ($i + 1);
+ }
+}
+sort($locations);
+echo implode("\n", $locations);
+echo "\n";
diff --git a/.github/scripts/package-lock.json b/.github/scripts/package-lock.json
new file mode 100644
index 0000000000..be699a73ce
--- /dev/null
+++ b/.github/scripts/package-lock.json
@@ -0,0 +1,323 @@
+{
+ "name": "scripts",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "scripts",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "@actions/core": "^1.11.1",
+ "@actions/github": "^6.0.1"
+ },
+ "devDependencies": {
+ "@types/node": "^22.15.29",
+ "typescript": "^5.8.3"
+ }
+ },
+ "node_modules/@actions/core": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz",
+ "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@actions/exec": "^1.1.1",
+ "@actions/http-client": "^2.0.1"
+ }
+ },
+ "node_modules/@actions/exec": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz",
+ "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==",
+ "license": "MIT",
+ "dependencies": {
+ "@actions/io": "^1.0.1"
+ }
+ },
+ "node_modules/@actions/github": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz",
+ "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@actions/http-client": "^2.2.0",
+ "@octokit/core": "^5.0.1",
+ "@octokit/plugin-paginate-rest": "^9.2.2",
+ "@octokit/plugin-rest-endpoint-methods": "^10.4.0",
+ "@octokit/request": "^8.4.1",
+ "@octokit/request-error": "^5.1.1",
+ "undici": "^5.28.5"
+ }
+ },
+ "node_modules/@actions/http-client": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz",
+ "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==",
+ "license": "MIT",
+ "dependencies": {
+ "tunnel": "^0.0.6",
+ "undici": "^5.25.4"
+ }
+ },
+ "node_modules/@actions/io": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
+ "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==",
+ "license": "MIT"
+ },
+ "node_modules/@fastify/busboy": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+ "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
+ "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz",
+ "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/auth-token": "^4.0.0",
+ "@octokit/graphql": "^7.1.0",
+ "@octokit/request": "^8.4.1",
+ "@octokit/request-error": "^5.1.1",
+ "@octokit/types": "^13.0.0",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz",
+ "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.1.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/graphql": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz",
+ "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/request": "^8.4.1",
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/openapi-types": {
+ "version": "24.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
+ "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz",
+ "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^12.6.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": "5"
+ }
+ },
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
+ "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
+ "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^20.0.0"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz",
+ "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^12.6.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": "5"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
+ "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
+ "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^20.0.0"
+ }
+ },
+ "node_modules/@octokit/request": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz",
+ "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/endpoint": "^9.0.6",
+ "@octokit/request-error": "^5.1.1",
+ "@octokit/types": "^13.1.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/request-error": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz",
+ "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.1.0",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/types": {
+ "version": "13.10.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
+ "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^24.2.0"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "22.16.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz",
+ "integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/before-after-hook": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
+ "license": "ISC"
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici": {
+ "version": "5.29.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
+ "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
+ "license": "MIT",
+ "dependencies": {
+ "@fastify/busboy": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/universal-user-agent": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
+ "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
+ "license": "ISC"
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ }
+ }
+}
diff --git a/.github/scripts/package.json b/.github/scripts/package.json
new file mode 100644
index 0000000000..e809b2ee73
--- /dev/null
+++ b/.github/scripts/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "scripts",
+ "version": "1.0.0",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "dependencies": {
+ "@actions/core": "^1.11.1",
+ "@actions/github": "^6.0.1"
+ },
+ "devDependencies": {
+ "@types/node": "^22.15.29",
+ "typescript": "^5.8.3"
+ }
+}
diff --git a/.github/scripts/tsconfig.json b/.github/scripts/tsconfig.json
new file mode 100644
index 0000000000..62ac6dae38
--- /dev/null
+++ b/.github/scripts/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "CommonJS",
+ "moduleResolution": "Node",
+ "esModuleInterop": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "resolveJsonModule": true,
+ "outDir": "dist"
+ },
+ "include": ["find-artifact.ts"]
+}
diff --git a/.github/workflows/apiref.yml b/.github/workflows/apiref.yml
new file mode 100644
index 0000000000..8847e326dc
--- /dev/null
+++ b/.github/workflows/apiref.yml
@@ -0,0 +1,108 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "API Reference"
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'src/**'
+ - 'composer.lock'
+ - 'apigen/**'
+ - '.github/workflows/apiref.yml'
+
+env:
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
+
+concurrency:
+ group: apigen-${{ github.ref }} # will be canceled on subsequent pushes in branch
+ cancel-in-progress: true
+
+jobs:
+ apigen:
+ name: "Run ApiGen"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.2"
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Install ApiGen dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "apigen"
+
+ - name: "Run ApiGen"
+ run: "apigen/vendor/bin/apigen -c apigen/apigen.neon --output docs -- src vendor/nikic/php-parser vendor/ondrejmirtes/better-reflection vendor/phpstan/phpdoc-parser"
+
+ - name: "Upload docs"
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs
+ path: docs
+
+ deploy:
+ name: "Deploy"
+ needs:
+ - apigen
+ if: github.repository_owner == 'phpstan'
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: "Install Node"
+ uses: actions/setup-node@v4
+ with:
+ node-version: "16"
+
+ - name: "Download docs"
+ uses: actions/download-artifact@v4
+ with:
+ name: docs
+ path: docs
+
+ - name: "Sync with S3"
+ uses: jakejarvis/s3-sync-action@v0.5.1
+ with:
+ args: --exclude '.git*/*' --follow-symlinks
+ env:
+ SOURCE_DIR: './docs'
+ DEST_DIR: ${{ github.ref_name }}
+ AWS_REGION: 'eu-west-1'
+ AWS_S3_BUCKET: "web-apiref.phpstan.org"
+ AWS_ACCESS_KEY_ID: ${{ secrets.APIREF_AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.APIREF_AWS_SECRET_ACCESS_KEY }}
+
+ - name: "Invalidate CloudFront"
+ uses: chetan/invalidate-cloudfront-action@v2
+ env:
+ DISTRIBUTION: "E37G1C2KWNAPBD"
+ PATHS: '/${{ github.ref_name }}/*'
+ AWS_REGION: 'eu-west-1'
+ AWS_ACCESS_KEY_ID: ${{ secrets.APIREF_AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.APIREF_AWS_SECRET_ACCESS_KEY }}
+
+ - uses: peter-evans/repository-dispatch@v3
+ with:
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ repository: "phpstan/phpstan"
+ event-type: check_website_links
+
+ - name: "Check for broken links"
+ uses: ScholliYT/Broken-Links-Crawler-Action@v3
+ with:
+ website_url: 'https://apiref.phpstan.org/${{ github.ref_name }}/index.html'
+ resolve_before_filtering: 'true'
+ verbose: 'warning'
+ max_retry_time: 30
+ max_retries: 5
diff --git a/.github/workflows/backward-compatibility.yml b/.github/workflows/backward-compatibility.yml
index fd0c7f37a4..53f74a4996 100644
--- a/.github/workflows/backward-compatibility.yml
+++ b/.github/workflows/backward-compatibility.yml
@@ -6,21 +6,25 @@ on:
pull_request:
push:
branches:
- - "master"
+ - "2.1.x"
+ paths:
+ - 'src/**'
+ - '.github/workflows/backward-compatibility.yml'
-env:
- COMPOSER_ROOT_VERSION: "1.0.x-dev"
+concurrency:
+ group: bc-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
jobs:
backward-compatibility:
name: "Backward Compatibility"
runs-on: "ubuntu-latest"
- timeout-minutes: 30
+ timeout-minutes: 60
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -28,16 +32,15 @@ jobs:
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "8.0"
+ php-version: "8.2"
- - name: "Install dependencies"
- run: "composer install --no-dev --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
- name: "Install BackwardCompatibilityCheck"
run: |
composer global config minimum-stability dev
composer global config prefer-stable true
- composer global require --dev ondrejmirtes/backward-compatibility-check:^5.0.7
+ composer global require --dev ondrejmirtes/backward-compatibility-check:^7.3.0.1
- name: "Check"
run: "$(composer global config bin-dir --absolute)/roave-backward-compatibility-check"
diff --git a/.github/workflows/block-merge-commits.yml b/.github/workflows/block-merge-commits.yml
new file mode 100644
index 0000000000..2399d07570
--- /dev/null
+++ b/.github/workflows/block-merge-commits.yml
@@ -0,0 +1,15 @@
+on: pull_request
+
+name: Block merge commits
+
+jobs:
+ message-check:
+ name: Block Merge Commits
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Block Merge Commits
+ uses: Morishiri/block-merge-commits-action@v1.0.1
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/build-issue-bot.yml b/.github/workflows/build-issue-bot.yml
new file mode 100644
index 0000000000..4cb6286c2b
--- /dev/null
+++ b/.github/workflows/build-issue-bot.yml
@@ -0,0 +1,54 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Build Issue Bot"
+
+on:
+ pull_request:
+ paths:
+ - 'issue-bot/**'
+ - '.github/workflows/build-issue-bot.yml'
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'issue-bot/**'
+ - '.github/workflows/build-issue-bot.yml'
+
+concurrency:
+ group: build-issue-bot-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ build-issue-bot:
+ name: "Build Issue Bot"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ script:
+ - "../bin/phpstan"
+ - "vendor/bin/phpunit"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Install issue-bot dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "issue-bot"
+
+ - name: "Tests"
+ working-directory: "issue-bot"
+ run: ${{ matrix.script }}
diff --git a/.github/workflows/changelog-generator.yml b/.github/workflows/changelog-generator.yml
new file mode 100644
index 0000000000..1dfc0d775c
--- /dev/null
+++ b/.github/workflows/changelog-generator.yml
@@ -0,0 +1,47 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Build Changelog Generator"
+
+on:
+ pull_request:
+ paths:
+ - 'changelog-generator/**'
+ - '.github/workflows/changelog-generator.yml'
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'changelog-generator/**'
+ - '.github/workflows/changelog-generator.yml'
+
+concurrency:
+ group: changelog-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ changelog-generator:
+ name: "Build Changelog Generator"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.2"
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Install Changelog Generator dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "changelog-generator"
+
+ - name: "PHPStan"
+ working-directory: "changelog-generator"
+ run: "../bin/phpstan"
diff --git a/.github/workflows/compiler-tests.yml b/.github/workflows/compiler-tests.yml
deleted file mode 100644
index ca0ffc885a..0000000000
--- a/.github/workflows/compiler-tests.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
-
-name: "Compiler tests"
-
-on:
- pull_request:
- push:
- branches:
- - "master"
-
-env:
- COMPOSER_ROOT_VERSION: "1.0.x-dev"
-
-jobs:
- compiler-tests:
- name: "Compiler Tests"
-
- runs-on: "ubuntu-latest"
- timeout-minutes: 30
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@v2"
- with:
- coverage: "none"
- php-version: "8.0"
-
- - name: "Install dependencies"
- run: "composer install --no-dev --no-interaction --no-progress --no-suggest"
-
- - name: "Transform source code"
- run: php bin/transform-source.php
-
- - name: "Tests"
- run: |
- cd compiler && \
- composer install --no-interaction && \
- vendor/bin/phpunit -c tests/phpunit.xml tests && \
- ../bin/phpstan analyse -l 8 src tests && \
- php bin/compile && \
- ../tmp/phpstan.phar list
-
- - uses: actions/upload-artifact@v2
- with:
- name: phpstan.phar
- path: tmp/phpstan.phar
diff --git a/.github/workflows/create-tag.yml b/.github/workflows/create-tag.yml
new file mode 100644
index 0000000000..a853501487
--- /dev/null
+++ b/.github/workflows/create-tag.yml
@@ -0,0 +1,53 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Create tag"
+
+on:
+ # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Next version'
+ required: true
+ default: 'patch'
+ type: choice
+ options:
+ - patch
+ - minor
+
+jobs:
+ create-tag:
+ name: "Create tag"
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+
+ - name: 'Get Previous tag'
+ id: previoustag
+ uses: "WyriHaximus/github-action-get-previous-tag@v1"
+ env:
+ GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+
+ - name: 'Get next versions'
+ id: semvers
+ uses: "WyriHaximus/github-action-next-semvers@v1"
+ with:
+ version: ${{ steps.previoustag.outputs.tag }}
+
+ - name: "Create new minor tag"
+ uses: rickstaa/action-create-tag@v1
+ if: inputs.version == 'minor'
+ with:
+ tag: ${{ steps.semvers.outputs.minor }}
+ message: ${{ steps.semvers.outputs.minor }}
+
+ - name: "Create new patch tag"
+ uses: rickstaa/action-create-tag@v1
+ if: inputs.version == 'patch'
+ with:
+ tag: ${{ steps.semvers.outputs.patch }}
+ message: ${{ steps.semvers.outputs.patch }}
diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml
index c7217ff0c5..f6a3e86255 100644
--- a/.github/workflows/e2e-tests.yml
+++ b/.github/workflows/e2e-tests.yml
@@ -4,78 +4,416 @@ name: "E2E Tests"
on:
pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
push:
branches:
- - "master"
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
-env:
- COMPOSER_ROOT_VERSION: "1.0.x-dev"
+concurrency:
+ group: e2e-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
jobs:
result-cache-e2e-tests:
name: "Result cache E2E tests"
-
- runs-on: ${{ matrix.operating-system }}
- timeout-minutes: 30
+ runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
- php-version:
- - "7.4"
- operating-system: [ubuntu-latest, windows-latest]
+ include:
+ - script: |
+ cd e2e/result-cache-1
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-2
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-3
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Baz.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Baz.php.orig src/Baz.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-4
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-5
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Baz.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Baz.php.orig src/Baz.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-6
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Baz.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Baz.php.orig src/Baz.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-7
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/bug10449
+ ../../bin/phpstan analyze
+ git apply patch.diff
+ rm phpstan-baseline.neon
+ mv after-phpstan-baseline.neon phpstan-baseline.neon
+ ../../bin/phpstan analyze -vvv
+ - script: |
+ cd e2e/bug10449b
+ ../../bin/phpstan analyze
+ git apply patch.diff
+ rm phpstan-baseline.neon
+ mv after-phpstan-baseline.neon phpstan-baseline.neon
+ ../../bin/phpstan analyze -vvv
+ - script: |
+ cd e2e/bug-9622
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Foo.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Foo.php.orig src/Foo.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/bug-9622-trait
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Foo.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Foo.php.orig src/Foo.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/env-parameter
+ export PHPSTAN_RESULT_CACHE_PATH=/some/path
+ ACTUAL=$(../../bin/phpstan dump-parameters -c phpstan.neon --json -l 9 | jq --raw-output '.resultCachePath')
+ [[ "$ACTUAL" == "/some/path" ]];
+ - script: |
+ cd e2e/result-cache-8
+ composer install
+ ../../bin/phpstan
+ echo -en '\n' >> build/CustomRule.php
+ OUTPUT=$(../../bin/phpstan analyze 2>&1 || true)
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Result cache might not behave correctly' "$OUTPUT"
+ ../bashunit -a contains 'ResultCache8E2E\CustomRule' "$OUTPUT"
+ - script: |
+ cd e2e/env-int-key
+ env 1=1 ../../bin/phpstan analyse test.php
+ - script: |
+ cd e2e/result-cache-scanned
+ ../../bin/phpstan
+ patch -b src/Generated/Foo.php < patch.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -vv --error-format raw")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Result cache not used because the metadata do not match: projectConfig, scannedFiles' "$OUTPUT"
+ ../bashunit -a contains 'Instantiated class ResultCacheE2EGenerated\Foo not found.' "$OUTPUT"
+ - script: |
+ cd e2e/result-cache-traits
+ ../../bin/phpstan analyse
+ patch -b src/FooTrait.php < renameFooTraitMethod.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -vv --error-format raw")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'ClassMentioningClassUsingBarTrait.php:10:Call to an undefined method ResultCacheE2ETraits\ClassUsingBarTrait::doFooTrait(). [identifier=method.notFound]' "$OUTPUT"
+ - script: |
+ cd e2e/editor-mode
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -vv --error-format raw")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Bar.php:10:Parameter #1 $s of method EditorModeE2E\Bar::requireString() expects string, int given. [identifier=argument.type]' "$OUTPUT"
+ ../bashunit -a contains 'Foo.php:10:Method EditorModeE2E\Foo::doFoo() should return int but returns string. [identifier=return.type]' "$OUTPUT"
+ ../bashunit -a contains 'Result cache is saved.' "$OUTPUT"
+
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -vv --error-format raw --tmp-file differentFoo.php --instead-of src/Foo.php")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Foo.php:10:Method EditorModeE2E\Foo::doFoo() should return float but returns string. [identifier=return.type]' "$OUTPUT"
+ ../bashunit -a not_contains 'Foo.php:10:Method EditorModeE2E\Foo::doFoo() should return int but returns string. [identifier=return.type]' "$OUTPUT"
+ ../bashunit -a not_contains 'differentFoo.php' "$OUTPUT"
+ ../bashunit -a contains 'Bar.php:10:Parameter #1 $s of method EditorModeE2E\Bar::requireString() expects string, float given. [identifier=argument.type]' "$OUTPUT"
+ ../bashunit -a contains 'Result cache restored. 2 files will be reanalysed.' "$OUTPUT"
+ ../bashunit -a contains 'Result cache was not saved because of --tmp-file and --instead-of CLI options passed (editor mode).' "$OUTPUT"
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ patch -b data/TraitOne.php < TraitOne.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/")
+ echo "$OUTPUT"
+ ../bashunit -a line_count 2 "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Method TraitsCachingIssue\TestClassUsingTrait::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ patch -b data/TraitTwo.php < TraitTwo.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/")
+ echo "$OUTPUT"
+ ../bashunit -a line_count 2 "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Method class@anonymous/TestClassUsingTrait.php:20::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ patch -b data/TraitOne.php < TraitOne.patch
+ patch -b data/TraitTwo.php < TraitTwo.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/")
+ echo "$OUTPUT"
+ ../bashunit -a line_count 3 "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Method TraitsCachingIssue\TestClassUsingTrait::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ ../bashunit -a contains 'Method class@anonymous/TestClassUsingTrait.php:20::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c ignore.neon")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in ignoreErrors' "$OUTPUT"
+ ../bashunit -a contains 'tests" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c phpneon.php")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in ignoreErrors' "$OUTPUT"
+ ../bashunit -a contains '"src/test.php" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c excludePaths.neon")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in excludePaths' "$OUTPUT"
+ ../bashunit -a contains 'tests" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c phpneon2.php")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in excludePaths' "$OUTPUT"
+ ../bashunit -a contains '"src/test.php" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../../bin/phpstan analyse -c ignoreNonexistentExcludePath.neon)
+ echo "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ cp -r tmp-node-modules node_modules
+ OUTPUT=$(../../bin/phpstan analyse -c ignoreNonexistentExcludePath.neon)
+ echo "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../../bin/phpstan analyse -c ignoreReportUnmatchedFalse.neon)
+ echo "$OUTPUT"
+ - script: |
+ cd e2e/bug-11826
+ composer install
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Child process error (exit code 255): PHP Fatal error' "$OUTPUT"
+ ../bashunit -a contains 'Result is incomplete because of severe errors.' "$OUTPUT"
+ - script: |
+ cd e2e/bug-11857
+ composer install
+ ../../bin/phpstan
+ - script: |
+ cd e2e/result-cache-meta-extension
+ composer install
+ ../../bin/phpstan -vvv
+ ../../bin/phpstan -vvv --fail-without-result-cache
+ echo 'modified-hash' > hash.txt
+ OUTPUT=$(../bashunit -a exit_code "2" "../../bin/phpstan -vvv --fail-without-result-cache")
+ echo "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Result cache not used because the metadata do not match: metaExtensions' "$OUTPUT"
+ - script: |
+ cd e2e/bug-12606
+ export CONFIGTEST=test
+ ../../bin/phpstan
+ - script: |
+ cd e2e/ignore-error-extension
+ composer install
+ ../../bin/phpstan
+ - script: |
+ cd e2e/bug-10483
+ ../../bin/phpstan
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "${{ matrix.php-version }}"
+ php-version: "8.2"
extensions: mbstring
ini-values: memory_limit=256M
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
- - name: "Tests"
- run: |
- git clone https://github.com/nikic/PHP-Parser.git tests/e2e/PHP-Parser && git -C tests/e2e/PHP-Parser checkout v3.1.5 && composer install --working-dir tests/e2e/PHP-Parser && vendor/bin/phpunit tests/e2e/ResultCacheEndToEndTest.php
+ - name: "Patch PHPStan"
+ run: "patch src/Analyser/Error.php < e2e/PHPStanErrorPatch.patch"
+
+ - name: "Install bashunit"
+ run: "curl -s https://bashunit.typeddevs.com/install.sh | bash -s e2e/ 0.22.0"
+
+ - name: "Test"
+ run: "${{ matrix.script }}"
e2e-tests:
name: "E2E tests"
runs-on: "ubuntu-latest"
- timeout-minutes: 30
+ timeout-minutes: 60
strategy:
+ fail-fast: false
matrix:
include:
- - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/timecop.php tests/e2e/data/timecop.php"
+ - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/timecop.php -c tests/e2e/data/empty.neon tests/e2e/data/timecop.php"
tools: "pecl"
extensions: "timecop-beta"
- - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php tests/e2e/data/soap.php"
+ - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php -c tests/e2e/data/empty.neon tests/e2e/data/soap.php"
extensions: "soap"
- - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php tests/e2e/data/soap.php"
+ - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php -c tests/e2e/data/empty.neon tests/e2e/data/soap.php"
extensions: ""
- script: "bin/phpstan analyse -l 8 tests/e2e/anon-class/Granularity.php"
extensions: ""
+ - script: "bin/phpstan analyse -l 8 e2e/phpstan-phpunit-190/test.php -c e2e/phpstan-phpunit-190/test.neon"
+ extensions: ""
+ - script: "bin/phpstan analyse e2e/only-files-not-analysed-trait/src -c e2e/only-files-not-analysed-trait/ignore.neon"
+ extensions: ""
+ - script: "bin/phpstan analyse e2e/only-files-not-analysed-trait/src/Foo.php e2e/only-files-not-analysed-trait/src/BarTrait.php -c e2e/only-files-not-analysed-trait/no-ignore.neon"
+ extensions: ""
+ - script: |
+ cd e2e/baseline-uninit-prop-trait
+ ../../bin/phpstan analyse --debug --configuration test-no-baseline.neon --generate-baseline test-baseline.neon
+ ../../bin/phpstan analyse --debug --configuration test.neon
+ - script: |
+ cd e2e/baseline-uninit-prop-trait
+ ../../bin/phpstan analyse --configuration test-no-baseline.neon --generate-baseline test-baseline.neon
+ ../../bin/phpstan analyse --configuration test.neon
+ - script: |
+ cd e2e/discussion-11362
+ composer install
+ ../../bin/phpstan
+ - script: |
+ cd e2e/bug-11819
+ ../../bin/phpstan
+ - script: |
+ cd e2e/composer-and-phpstan-version-config
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-max-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-max-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-open-end-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-version-v5
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-version-v7
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-no-versions
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-version-config-invalid
+ OUTPUT=$(../bashunit -a exit_code "1" ../../bin/phpstan)
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid configuration' "$OUTPUT"
+ ../bashunit -a contains 'Invalid PHP version range: phpVersion.max should be greater or equal to phpVersion.min.' "$OUTPUT"
+ - script: |
+ cd e2e/composer-version-config-patch
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-version-config
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/bug13425
+ timeout 15 ../bashunit -a exit_code "1" "../../bin/phpstan analyze src/ plugins/"
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "7.4"
+ php-version: "8.2"
tools: ${{ matrix.tools }}
extensions: ${{ matrix.extensions }}
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Install bashunit"
+ run: "curl -s https://bashunit.typeddevs.com/install.sh | bash -s e2e/ 0.22.0"
- name: "Test"
run: ${{ matrix.script }}
diff --git a/.github/workflows/issue-bot.yml b/.github/workflows/issue-bot.yml
new file mode 100644
index 0000000000..19055acdc7
--- /dev/null
+++ b/.github/workflows/issue-bot.yml
@@ -0,0 +1,196 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Issue bot"
+
+on:
+ workflow_dispatch:
+ pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ push:
+ branches:
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+
+concurrency:
+ group: run-issue-bot-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ download:
+ name: "Download data"
+
+ runs-on: "ubuntu-latest"
+
+ outputs:
+ matrix: ${{ steps.download-data.outputs.matrix }}
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - name: "Install issue-bot dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "issue-bot"
+
+ - name: "Cache downloads"
+ uses: actions/cache@v4
+ with:
+ path: ./issue-bot/tmp
+ key: "issue-bot-download-v7-${{ github.run_id }}"
+ restore-keys: |
+ issue-bot-download-v7-
+
+ - name: "Download data"
+ working-directory: "issue-bot"
+ id: download-data
+ env:
+ GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
+ run: echo "matrix=$(./console.php download)" >> $GITHUB_OUTPUT
+
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: playground-cache
+ path: issue-bot/tmp/playgroundCache.tmp
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: issue-cache
+ path: issue-bot/tmp/issueCache.tmp
+
+ analyse:
+ name: "Analyse"
+ needs: download
+
+ runs-on: "ubuntu-latest"
+
+ strategy:
+ fail-fast: false
+ matrix: ${{ fromJSON(needs.download.outputs.matrix) }}
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - uses: "ramsey/composer-install@v3"
+ with:
+ composer-options: "--no-dev"
+
+ - name: "Install issue-bot dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "issue-bot"
+
+ - uses: Wandalen/wretry.action@v3.8.0
+ with:
+ action: actions/download-artifact@v4
+ with: |
+ name: playground-cache
+ path: issue-bot/tmp
+ attempt_limit: 5
+ attempt_delay: 1000
+
+ - name: "Run PHPStan"
+ working-directory: "issue-bot"
+ timeout-minutes: 5
+ run: ./console.php run ${{ matrix.phpVersion }} ${{ matrix.playgroundExamples }}
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: results-${{ matrix.phpVersion }}-${{ matrix.chunkNumber }}
+ path: issue-bot/tmp/results-${{ matrix.phpVersion }}-*.tmp
+
+ evaluate:
+ name: "Evaluate results"
+ needs: analyse
+
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - name: "Install issue-bot dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "issue-bot"
+
+ - uses: actions/download-artifact@v4
+ with:
+ name: playground-cache
+ path: issue-bot/tmp
+
+ - uses: actions/download-artifact@v4
+ with:
+ name: issue-cache
+ path: issue-bot/tmp
+
+ - uses: actions/download-artifact@v4
+ with:
+ pattern: results-*
+ merge-multiple: true
+ path: issue-bot/tmp
+
+ - name: "List tmp"
+ run: "ls -lA issue-bot/tmp"
+
+ - name: "Evaluate results - pull request"
+ working-directory: "issue-bot"
+ if: github.event_name == 'pull_request'
+ env:
+ GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ set +e
+ ./console.php evaluate >> $GITHUB_STEP_SUMMARY
+ exit_code="$?"
+
+ if [[ "$exit_code" == "2" ]]; then
+ echo "::notice file=.github/workflows/issue-bot.yml,line=3 ::Issue bot detected open issues which are affected by this pull request - see https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
+ exit 0
+ fi
+
+ exit $exit_code
+
+ - name: "Evaluate results - push"
+ working-directory: "issue-bot"
+ if: "github.repository_owner == 'phpstan' && github.ref == 'refs/heads/2.1.x'"
+ env:
+ GITHUB_PAT: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ PHPSTAN_SRC_COMMIT_BEFORE: ${{ github.event.before }}
+ PHPSTAN_SRC_COMMIT_AFTER: ${{ github.event.after }}
+ run: |
+ set +e
+ ./console.php evaluate --post-comments >> $GITHUB_STEP_SUMMARY
+ exit_code="$?"
+
+ # its fine when issue-bot found affected issues
+ if [[ "$exit_code" == "2" ]]; then
+ exit 0
+ fi
+
+ exit $exit_code
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 01976ec12f..f9c451b89d 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -6,30 +6,33 @@ on:
pull_request:
push:
branches:
- - "master"
+ - "2.1.x"
-env:
- COMPOSER_ROOT_VERSION: "1.0.x-dev"
+concurrency:
+ group: lint-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
jobs:
lint:
name: "Lint"
runs-on: "ubuntu-latest"
- timeout-minutes: 30
+ timeout-minutes: 60
strategy:
fail-fast: false
matrix:
php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- "7.4"
- "8.0"
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+ - "8.5"
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
@@ -37,15 +40,35 @@ jobs:
coverage: "none"
php-version: "${{ matrix.php-version }}"
- - name: "Validate Composer"
- run: "composer validate"
+ - name: "Downgrade PHPUnit"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ run: "composer require --dev phpunit/phpunit:^9.6 sebastian/diff:^4.0 --update-with-dependencies --ignore-platform-reqs"
+
+ - uses: "ramsey/composer-install@v3"
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - name: "Change to simple-downgrade PHP version"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.4"
- name: "Transform source code"
- if: matrix.php-version != '7.4' && matrix.php-version != '8.0'
- run: php bin/transform-source.php
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ run: |
+ composer install --no-interaction --no-progress --working-dir=compiler
+ ./compiler/vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}
+ composer dump
+
+ - name: "Re-store PHP version"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+
+ - name: "Validate Composer"
+ run: "composer validate"
- name: "Lint"
run: "make lint"
@@ -54,28 +77,34 @@ jobs:
name: "Coding Standard"
runs-on: "ubuntu-latest"
- timeout-minutes: 30
-
- strategy:
- matrix:
- php-version:
- - "8.0"
+ timeout-minutes: 60
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
+
+ - name: "Checkout build-cs"
+ uses: actions/checkout@v4
+ with:
+ repository: "phpstan/build-cs"
+ path: "build-cs"
+ ref: "2.x"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "${{ matrix.php-version }}"
+ php-version: "8.2"
- name: "Validate Composer"
run: "composer validate"
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Install build-cs dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "build-cs"
- name: "Lint"
run: "make lint"
@@ -87,25 +116,40 @@ jobs:
name: "Dependency Analysis"
runs-on: "ubuntu-latest"
- timeout-minutes: 30
+ timeout-minutes: 60
- strategy:
- matrix:
- php-version:
- - "8.0"
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Composer Dependency Analyser"
+ run: "make composer-dependency-analyser"
+
+ name-collision:
+ name: "Name Collision Detector"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "${{ matrix.php-version }}"
+ php-version: "8.5"
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
- - name: "Composer Require Checker"
- run: "make composer-require-checker"
+ - name: "Name Collision Detector"
+ run: "make name-collision"
diff --git a/.github/workflows/merge-bot-pr.yml b/.github/workflows/merge-bot-pr.yml
new file mode 100644
index 0000000000..6d34bb3d80
--- /dev/null
+++ b/.github/workflows/merge-bot-pr.yml
@@ -0,0 +1,29 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+# https://github.com/WyriHaximus/github-action-wait-for-status
+
+name: Merge bot PR
+on:
+ pull_request:
+ types:
+ - opened
+jobs:
+ automerge:
+ name: Automerge PRs
+ runs-on: ubuntu-latest
+ steps:
+ - name: 'Wait for status checks'
+ if: github.event.pull_request.user.login == 'phpstan-bot'
+ id: waitforstatuschecks
+ uses: "WyriHaximus/github-action-wait-for-status@v1"
+ with:
+ ignoreActions: "automerge,Automerge PRs"
+ checkInterval: 13
+ env:
+ GITHUB_TOKEN: "${{ secrets.PHPSTAN_BOT_TOKEN }}"
+ - name: Merge Pull Request
+ uses: juliangruber/merge-pull-request-action@v1
+ if: steps.waitforstatuschecks.outputs.status == 'success'
+ with:
+ github-token: "${{ secrets.PHPSTAN_BOT_TOKEN }}"
+ number: "${{ github.event.number }}"
+ method: rebase
diff --git a/.github/workflows/merge-maintained-branch.yml b/.github/workflows/merge-maintained-branch.yml
new file mode 100644
index 0000000000..0ac13c5f68
--- /dev/null
+++ b/.github/workflows/merge-maintained-branch.yml
@@ -0,0 +1,24 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: Merge maintained branch
+
+on:
+ push:
+ branches:
+ - "1.12.x"
+
+jobs:
+ merge:
+ name: Merge branch
+ if: github.repository_owner == 'phpstan'
+ runs-on: ubuntu-latest
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ - name: "Merge branch"
+ uses: everlytic/branch-merge@1.1.5
+ with:
+ github_token: "${{ secrets.PHPSTAN_BOT_TOKEN }}"
+ source_ref: ${{ github.ref }}
+ target_branch: '2.1.x'
+ commit_message_template: 'Merge branch {source_ref} into {target_branch}'
diff --git a/.github/workflows/phar-old.yml b/.github/workflows/phar-old.yml
deleted file mode 100644
index eb91eb3d60..0000000000
--- a/.github/workflows/phar-old.yml
+++ /dev/null
@@ -1,89 +0,0 @@
-# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
-
-name: "Compile PHAR"
-
-on:
- push:
- tags:
- - '0.12.*'
-
-jobs:
- compile:
- name: "Compile PHAR"
- runs-on: "ubuntu-latest"
- timeout-minutes: 30
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2"
- with:
- fetch-depth: 0
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@v2"
- with:
- coverage: "none"
- php-version: "8.0"
-
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
-
- - name: "Install compiler dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest --working-dir=compiler"
-
- - name: "Transform source code"
- run: php bin/transform-source.php
-
- - name: "Compile PHAR"
- run: php compiler/bin/compile
-
- - name: "Configure GPG signing key"
- run: echo "$GPG_SIGNING_KEY" | base64 --decode | gpg --import --no-tty --batch --yes
- env:
- GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
-
- - name: "Get Git log"
- id: git-log
- run: echo ::set-output name=log::$(git log ${{ github.event.before }}..${{ github.event.after }} --reverse --pretty='%H %s' | sed -e 's/^/https:\/\/github.com\/phpstan\/phpstan-src\/commit\//')
-
- - name: "Checkout phpstan-dist"
- uses: "actions/checkout@v2"
- with:
- repository: phpstan/phpstan
- ref: 0.12.x
- path: phpstan-dist
- token: ${{ secrets.PAT }}
-
- - name: "cp PHAR"
- run: cp tmp/phpstan.phar phpstan-dist/phpstan.phar
-
- - name: "Sign PHAR"
- working-directory: phpstan-dist
- run: rm phpstan.phar.asc && gpg --command-fd 0 --pinentry-mode loopback -u "$GPG_ID" --batch --detach-sign --armor --output phpstan.phar.asc phpstan.phar
- env:
- GPG_ID: ${{ secrets.GPG_ID }}
-
- - name: "Verify PHAR"
- working-directory: phpstan-dist
- run: "gpg --verify phpstan.phar.asc"
-
- - name: "Set Git signing key"
- working-directory: phpstan-dist
- run: git config user.signingkey "$GPG_ID"
- env:
- GPG_ID: ${{ secrets.GPG_ID }}
-
- - name: "Configure Git"
- working-directory: phpstan-dist
- run: |
- git config user.email "ondrej@mirtes.cz" && \
- git config user.name "Ondrej Mirtes"
-
- - name: "Commit PHAR - tag"
- working-directory: phpstan-dist
- run: |
- git add phpstan.phar phpstan.phar.asc && \
- git commit -S -m "PHPStan ${GITHUB_REF#refs/tags/}" -m "${{ steps.git-log.outputs.log }}" && \
- git push --quiet origin 0.12.x && \
- git tag -s ${GITHUB_REF#refs/tags/} -m "${GITHUB_REF#refs/tags/}" && \
- git push --quiet origin ${GITHUB_REF#refs/tags/}
diff --git a/.github/workflows/phar.yml b/.github/workflows/phar.yml
index a0de139f4d..6485a87369 100644
--- a/.github/workflows/phar.yml
+++ b/.github/workflows/phar.yml
@@ -3,21 +3,31 @@
name: "Compile PHAR"
on:
+ pull_request:
push:
branches:
- - "master"
+ - "2.1.x"
tags:
- - '1.*'
+ - '2.1.*'
+
+concurrency:
+ group: phar-${{ github.ref }} # will be canceled on subsequent pushes in both branches and pull requests
+ cancel-in-progress: true
jobs:
- compile:
- name: "Compile PHAR"
+ compiler-tests:
+ name: "Compiler Tests"
+
runs-on: "ubuntu-latest"
- timeout-minutes: 30
+ timeout-minutes: 60
+
+ outputs:
+ checksum: ${{ steps.checksum.outputs.md5 }}
+ compiler_changed: ${{ steps.changes.outputs.compiler }}
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -25,75 +35,361 @@ jobs:
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "8.0"
+ php-version: "8.2"
+ extensions: mbstring, intl
+
+ - uses: "ramsey/composer-install@v3"
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ # only sebastian/diff ^4 supports PHP 7.4 so we need that in the PHAR
+ - name: "Downgrade PHPUnit"
+ run: "composer require --dev phpunit/phpunit:^9.6 sebastian/diff:^4.0 --update-with-dependencies --ignore-platform-reqs"
- name: "Install compiler dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest --working-dir=compiler"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "compiler"
+
+ - name: "Compiler tests"
+ working-directory: "compiler"
+ run: "vendor/bin/phpunit -c tests/phpunit.xml tests"
+
+ - name: "Compiler PHPStan"
+ working-directory: "compiler"
+ run: "vendor/bin/phpstan analyse -l 8 src tests"
- - name: "Transform source code"
- run: php bin/transform-source.php
+ - name: "Prepare for PHAR compilation"
+ working-directory: "compiler"
+ run: "php bin/prepare"
+
+ - name: "Dump autoloader one more time for attributes"
+ run: "composer dump"
+
+ - name: "Install Box dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "compiler/box"
- name: "Compile PHAR"
- run: php compiler/bin/compile
+ working-directory: "compiler/build"
+ run: "php ../box/vendor/bin/box compile --no-parallel"
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: phar-file
+ path: tmp/phpstan.phar
+
+ - name: "Run PHAR"
+ working-directory: "compiler"
+ run: "../tmp/phpstan.phar list"
- - name: "Configure GPG signing key"
- run: echo "$GPG_SIGNING_KEY" | base64 --decode | gpg --import --no-tty --batch --yes
+ - name: "Delete PHAR"
+ run: "rm tmp/phpstan.phar"
+
+ - name: "Set autoloader suffix"
+ run: "composer config autoloader-suffix PHPStanChecksum"
+
+ - uses: "ramsey/composer-install@v3"
env:
- GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
- - name: "Get Git log"
- id: git-log
- run: echo ::set-output name=log::$(git log ${{ github.event.before }}..${{ github.event.after }} --reverse --pretty='%H %s' | sed -e 's/^/https:\/\/github.com\/phpstan\/phpstan-src\/commit\//')
+ - name: "Compile PHAR for checksum"
+ working-directory: "compiler/build"
+ run: "php ../box/vendor/bin/box compile --no-parallel"
+ env:
+ PHAR_CHECKSUM: "1"
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
+
+ - name: "Re-sign PHAR"
+ run: "php compiler/build/resign.php tmp/phpstan.phar"
+
+ - name: "Unset autoloader suffix"
+ run: "composer config autoloader-suffix --unset"
+
+ - name: "Save checksum"
+ id: "checksum"
+ run: echo "md5=$(md5sum tmp/phpstan.phar | cut -d' ' -f1)" >> $GITHUB_OUTPUT
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: phar-file-checksum
+ path: tmp/phpstan.phar
+
+ - name: "Delete checksum PHAR"
+ run: "rm tmp/phpstan.phar"
+
+ - uses: dorny/paths-filter@v3
+ id: changes
+ with:
+ filters: |
+ compiler:
+ - 'compiler/**'
+ - '.github/workflows/phar.yml'
+ - '.github/scripts/**'
+
+ integration-tests:
+ if: github.event_name == 'pull_request'
+ needs: compiler-tests
+ uses: phpstan/phpstan/.github/workflows/integration-tests.yml@2.1.x
+ with:
+ ref: 2.1.x
+ phar-checksum: ${{needs.compiler-tests.outputs.checksum}}
+
+ extension-tests:
+ if: github.event_name == 'pull_request'
+ needs: compiler-tests
+ uses: phpstan/phpstan/.github/workflows/extension-tests.yml@2.1.x
+ with:
+ ref: 2.1.x
+ phar-checksum: ${{needs.compiler-tests.outputs.checksum}}
+
+ other-tests:
+ if: github.event_name == 'pull_request'
+ needs: compiler-tests
+ uses: phpstan/phpstan/.github/workflows/other-tests.yml@2.1.x
+ with:
+ ref: 2.1.x
+ phar-checksum: ${{needs.compiler-tests.outputs.checksum}}
+
+ download-base-sha-phar:
+ name: "Download base SHA PHAR"
+ needs: compiler-tests
+ if: github.event_name == 'pull_request' && needs.compiler-tests.outputs.compiler_changed == 'true'
+ runs-on: "ubuntu-latest"
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Get base commit SHA
+ id: base
+ run: echo "base_sha=${{ github.event.pull_request.base.sha }}" >> "$GITHUB_OUTPUT"
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+
+ - name: Install dependencies
+ working-directory: .github/scripts
+ run: npm ci
+
+ - name: "Compile TS scripts"
+ working-directory: .github/scripts
+ run: npx tsc
+
+ - name: Find phar-file-checksum from base commit
+ id: find-artifact
+ uses: actions/github-script@v7
+ env:
+ BASE_SHA: ${{ steps.base.outputs.base_sha }}
+ ARTIFACT_NAME: phar-file-checksum
+ WORKFLOW_NAME: Compile PHAR
+ with:
+ script: |
+ const script = require('./.github/scripts/dist/find-artifact.js');
+ await script({github, context, core})
+
+ # saved to phar-file-checksum/phpstan.phar
+ - name: Download old artifact by ID
+ uses: actions/download-artifact@v4
+ with:
+ artifact-ids: ${{ steps.find-artifact.outputs.artifact_id }}
+ run-id: ${{ steps.find-artifact.outputs.run_id }}
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: "Upload old artifact"
+ uses: actions/upload-artifact@v4
+ with:
+ name: phar-file-checksum-base
+ path: phar-file-checksum/phpstan.phar
+
+ checksum-phar:
+ name: "Checksum PHAR"
+ needs:
+ - compiler-tests
+ - download-base-sha-phar
+ runs-on: "ubuntu-latest"
+ steps:
+ # saved to phpstan.phar
+ - name: "Download base phpstan.phar"
+ uses: actions/download-artifact@v4
+ with:
+ name: phar-file-checksum-base
+
+ - name: "Save old checksum"
+ id: "old_checksum"
+ run: echo "md5=$(md5sum phpstan.phar | cut -d' ' -f1)" >> $GITHUB_OUTPUT
+
+ - name: "Assert checksum"
+ run: |
+ old_checksum=${{ steps.old_checksum.outputs.md5 }}
+ new_checksum=${{needs.compiler-tests.outputs.checksum}}
+ [[ "$old_checksum" == "$new_checksum" ]];
+
+ phar-prefix-diff:
+ name: "PHAR Prefix Diff"
+ needs: download-base-sha-phar
+ runs-on: "ubuntu-latest"
+ steps:
+ - uses: actions/checkout@v4
+
+ # saved to phar-file-checksum/phpstan.phar
+ - name: "Download phpstan.phar"
+ uses: actions/download-artifact@v4
+ with:
+ name: phar-file-checksum
+ path: phar-file-checksum
+
+ # saved to phar-file-checksum-base/phpstan.phar
+ - name: "Download base phpstan.phar"
+ uses: actions/download-artifact@v4
+ with:
+ name: phar-file-checksum-base
+ path: phar-file-checksum-base
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.2"
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Install Box dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "compiler/box"
+
+ - name: "Extract old phpstan.phar"
+ run: "php compiler/box/vendor/bin/box extract phar-file-checksum-base/phpstan.phar phar-old"
+
+ - name: "Extract new phpstan.phar"
+ run: "php compiler/box/vendor/bin/box extract phar-file-checksum/phpstan.phar phar-new"
+
+ - name: "List prefix locations in old PHAR"
+ run: "php .github/scripts/listPrefix.php ${{ github.workspace }}/phar-old > phar-old.txt"
+
+ - name: "List prefix locations in new PHAR"
+ run: "php .github/scripts/listPrefix.php ${{ github.workspace }}/phar-new > phar-new.txt"
+
+ - name: "Diff locations"
+ run: "diff -u phar-old.txt phar-new.txt > diff.txt || true"
+
+ - name: "Diff files where prefix changed"
+ run: "php .github/scripts/diffPrefixes.php ${{ github.workspace }}/diff.txt ${{ github.workspace }}/phar-old ${{ github.workspace }}/phar-new"
+
+ commit:
+ name: "Commit PHAR"
+ if: "github.repository_owner == 'phpstan' && (github.ref == 'refs/heads/2.1.x' || startsWith(github.ref, 'refs/tags/'))"
+ needs: compiler-tests
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+ steps:
+ -
+ name: Import GPG key
+ id: import-gpg
+ uses: crazy-max/ghaction-import-gpg@v6
+ with:
+ gpg_private_key: ${{ secrets.GPG_PHPSTANBOT_PRIVATE_KEY }}
+ passphrase: ${{ secrets.GPG_PHPSTANBOT_KEY_PASSPHRASE }}
+ git_config_global: true
+ git_user_signingkey: true
+ git_commit_gpgsign: true
- name: "Checkout phpstan-dist"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
with:
repository: phpstan/phpstan
path: phpstan-dist
- token: ${{ secrets.PAT }}
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ ref: 2.1.x
+
+ - name: "Get previous pushed dist commit"
+ id: previous-commit
+ working-directory: phpstan-dist
+ run: echo "sha=$(sed -n '2p' .phar-checksum)" >> $GITHUB_OUTPUT
- - name: "cp PHAR"
- run: cp tmp/phpstan.phar phpstan-dist/phpstan.phar
+ - name: "Checkout phpstan-src"
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ path: phpstan-src
+
+ - name: "Get Git log"
+ id: git-log
+ working-directory: phpstan-src
+ run: |
+ echo "log<> $GITHUB_OUTPUT
+ echo "$(git log ${{ steps.previous-commit.outputs.sha }}..${{ github.event.after }} --reverse --pretty='https://github.com/phpstan/phpstan-src/commit/%H %s')" >> $GITHUB_OUTPUT
+ echo 'MESSAGE' >> $GITHUB_OUTPUT
+
+ - name: "Get short phpstan-src SHA"
+ id: short-src-sha
+ working-directory: phpstan-src
+ run: echo "sha=$(git rev-parse --short=7 HEAD)" >> $GITHUB_OUTPUT
+
+ - name: "Check PHAR checksum"
+ id: checksum-difference
+ working-directory: phpstan-dist
+ run: |
+ checksum=${{needs.compiler-tests.outputs.checksum}}
+ if [[ $(head -n 1 .phar-checksum) != "$checksum" ]]; then
+ echo "result=different" >> $GITHUB_OUTPUT
+ else
+ echo "result=same" >> $GITHUB_OUTPUT
+ fi
+
+ - name: "Download phpstan.phar"
+ uses: actions/download-artifact@v4
+ with:
+ name: phar-file
+
+ - name: "mv PHAR"
+ run: mv phpstan.phar phpstan-dist/phpstan.phar
+
+ - name: "chmod PHAR"
+ run: chmod 755 phpstan-dist/phpstan.phar
+
+ - name: "Update checksum"
+ run: |
+ echo ${{needs.compiler-tests.outputs.checksum}} > phpstan-dist/.phar-checksum
+ echo ${{ github.event.head_commit.id }} >> phpstan-dist/.phar-checksum
- name: "Sign PHAR"
working-directory: phpstan-dist
run: rm phpstan.phar.asc && gpg --command-fd 0 --pinentry-mode loopback -u "$GPG_ID" --batch --detach-sign --armor --output phpstan.phar.asc phpstan.phar
env:
- GPG_ID: ${{ secrets.GPG_ID }}
+ GPG_ID: ${{ steps.import-gpg.outputs.fingerprint }}
- name: "Verify PHAR"
working-directory: phpstan-dist
run: "gpg --verify phpstan.phar.asc"
- - name: "Set Git signing key"
- working-directory: phpstan-dist
- run: git config user.signingkey "$GPG_ID"
- env:
- GPG_ID: ${{ secrets.GPG_ID }}
-
- - name: "Configure Git"
- working-directory: phpstan-dist
- run: |
- git config user.email "ondrej@mirtes.cz" && \
- git config user.name "Ondrej Mirtes"
+ - name: "Install lucky_commit"
+ uses: baptiste0928/cargo-install@v3
+ with:
+ crate: lucky_commit
+ args: --no-default-features
- - name: "Commit PHAR - master"
+ - name: "Commit PHAR - development"
+ if: "!startsWith(github.ref, 'refs/tags/') && steps.checksum-difference.outputs.result == 'different'"
working-directory: phpstan-dist
- if: "!startsWith(github.ref, 'refs/tags/')"
+ env:
+ INPUT_LOG: ${{ steps.git-log.outputs.log }}
run: |
- git add phpstan.phar phpstan.phar.asc && \
- git commit -S -m "Updated PHPStan to commit ${{ github.event.after }}" -m "${{ steps.git-log.outputs.log }}" && \
- git push --quiet origin master
+ git config --global user.name "phpstan-bot"
+ git config --global user.email "ondrej+phpstanbot@mirtes.cz"
+ git add .
+ git commit --gpg-sign -m "Updated PHPStan to commit ${{ github.event.after }}" -m "$INPUT_LOG" --author "phpstan-bot "
+ lucky_commit ${{ steps.short-src-sha.outputs.sha }}
+ git push
- name: "Commit PHAR - tag"
- working-directory: phpstan-dist
if: "startsWith(github.ref, 'refs/tags/')"
- run: |
- git add phpstan.phar phpstan.phar.asc && \
- git commit -S -m "PHPStan ${GITHUB_REF#refs/tags/}" -m "${{ steps.git-log.outputs.log }}" && \
- git push --quiet origin master && \
- git tag -s ${GITHUB_REF#refs/tags/} -m "${GITHUB_REF#refs/tags/}" && \
- git push --quiet origin ${GITHUB_REF#refs/tags/}
+ uses: stefanzweifel/git-auto-commit-action@v5
+ with:
+ commit_user_name: "phpstan-bot"
+ commit_user_email: "ondrej+phpstanbot@mirtes.cz"
+ commit_author: "phpstan-bot "
+ commit_options: "--gpg-sign"
+ repository: phpstan-dist
+ commit_message: "PHPStan ${{github.ref_name}}"
+ tagging_message: ${{github.ref_name}}
diff --git a/.github/workflows/pr-base-on-previous-branch.yml b/.github/workflows/pr-base-on-previous-branch.yml
new file mode 100644
index 0000000000..34ef71bb83
--- /dev/null
+++ b/.github/workflows/pr-base-on-previous-branch.yml
@@ -0,0 +1,24 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Base PR on previous branch"
+
+on:
+ pull_request_target:
+ types:
+ - opened
+ branches:
+ - '2.2.x'
+
+
+jobs:
+ comment:
+ name: "Comment on pull request"
+ runs-on: 'ubuntu-latest'
+
+ steps:
+ - name: Comment PR
+ uses: peter-evans/create-or-update-comment@v4
+ with:
+ body: "You've opened the pull request against the latest branch 2.2.x. PHPStan 2.2 is not going to be released for months. If your code is relevant on 2.1.x and you want it to be released sooner, please rebase your pull request and change its target to 2.1.x."
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ issue-number: ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/pr-marked-as-ready.yml b/.github/workflows/pr-marked-as-ready.yml
new file mode 100644
index 0000000000..b9785a2a3c
--- /dev/null
+++ b/.github/workflows/pr-marked-as-ready.yml
@@ -0,0 +1,21 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Pull request ready for review"
+
+on:
+ pull_request_target:
+ types:
+ - ready_for_review
+
+jobs:
+ comment:
+ name: "Comment on pull request"
+ runs-on: 'ubuntu-latest'
+
+ steps:
+ - name: Comment PR
+ uses: peter-evans/create-or-update-comment@v4
+ with:
+ body: "This pull request has been marked as ready for review."
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ issue-number: ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/reflection-golden-test.yml b/.github/workflows/reflection-golden-test.yml
new file mode 100644
index 0000000000..7f962ce2c0
--- /dev/null
+++ b/.github/workflows/reflection-golden-test.yml
@@ -0,0 +1,112 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Reflection golden test"
+
+on:
+ pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+ push:
+ branches:
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+
+env:
+ REFLECTION_GOLDEN_TEST_FILE: "/tmp/reflection-golden.test"
+ REFLECTION_GOLDEN_SYMBOLS_FILE: "/tmp/reflection-golden-symbols.txt"
+
+concurrency:
+ group: reflection-golden-test-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ dump-php-symbols:
+ name: "Dump PHP symbols"
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+ # Include exotic extensions to discover more symbols
+ extensions: ds,mbstring,runkit7,scoutapm,seaslog,simdjson,var_representation,yac
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Dump phpSymbols.txt"
+ run: "php tests/dump-reflection-test-symbols.php"
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: phpSymbols
+ path: ${{ env.REFLECTION_GOLDEN_SYMBOLS_FILE }}
+
+ reflection-golden-test:
+ name: "Reflection golden test"
+ needs: dump-php-symbols
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php-version:
+ - "8.2"
+ - "8.3"
+ - "8.4"
+ - "8.5"
+
+ steps:
+ - uses: Wandalen/wretry.action@v3.8.0
+ with:
+ action: actions/download-artifact@v4
+ with: |
+ name: phpSymbols
+ path: /tmp
+ attempt_limit: 5
+ attempt_delay: 1000
+
+ - name: "Checkout base commit"
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.base.sha || github.event.before }}
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=2G
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Dump previous reflection data"
+ run: "php tests/generate-reflection-test.php"
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: reflection-${{ matrix.php-version }}.test
+ path: ${{ env.REFLECTION_GOLDEN_TEST_FILE }}
+
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Reflection golden test"
+ run: "make tests-golden-reflection || true"
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
new file mode 100644
index 0000000000..b2f810732c
--- /dev/null
+++ b/.github/workflows/spelling.yml
@@ -0,0 +1,23 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Spelling"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - "2.1.x"
+
+jobs:
+ typos:
+ name: "Check for typos"
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Check for typos"
+ uses: "crate-ci/typos@v1"
+ with:
+ files: "README.md src/"
diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml
index be5b2663c8..ec4fb7ba05 100644
--- a/.github/workflows/static-analysis.yml
+++ b/.github/workflows/static-analysis.yml
@@ -4,89 +4,123 @@ name: "Static Analysis"
on:
pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
push:
branches:
- - "master"
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
-env:
- COMPOSER_ROOT_VERSION: "1.0.x-dev"
+concurrency:
+ group: sa-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
jobs:
static-analysis:
name: "PHPStan"
runs-on: ${{ matrix.operating-system }}
- timeout-minutes: 30
+ timeout-minutes: 60
strategy:
fail-fast: false
matrix:
php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- "7.4"
- "8.0"
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+ - "8.5"
operating-system: [ubuntu-latest, windows-latest]
- script:
- - "make phpstan"
- - "make phpstan-static-reflection"
- - "make phpstan-validate-stub-files"
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
php-version: "${{ matrix.php-version }}"
+ ini-file: development
extensions: mbstring
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
-
- name: "Downgrade PHPUnit"
- if: matrix.php-version == '7.1' || matrix.php-version == '7.2'
- run: "composer require --dev phpunit/phpunit:^7.5.20 brianium/paratest:^4.0 --update-with-dependencies"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ shell: bash
+ run: "composer require --dev phpunit/phpunit:^9.6 sebastian/diff:^4.0 --update-with-dependencies --ignore-platform-reqs"
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Change to simple-downgrade PHP version"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.4"
+ ini-file: development
+ extensions: mbstring
- name: "Transform source code"
- if: matrix.php-version != '7.4' && matrix.php-version != '8.0'
- run: php bin/transform-source.php
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ shell: bash
+ run: |
+ composer install --no-interaction --no-progress --working-dir=compiler
+ ./compiler/vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}
+ composer dump
+
+ - name: "Re-store PHP version"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ ini-file: development
+ extensions: mbstring
- name: "PHPStan"
- run: ${{ matrix.script }}
+ run: "make phpstan"
static-analysis-with-result-cache:
name: "PHPStan with result cache"
runs-on: "ubuntu-latest"
- timeout-minutes: 30
+ timeout-minutes: 60
strategy:
+ fail-fast: false
matrix:
php-version:
- - "7.4"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+ - "8.5"
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
php-version: "${{ matrix.php-version }}"
+ ini-file: development
extensions: mbstring
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
- name: "Cache Result cache"
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: ./tmp
- key: "result-cache-v4"
+ key: "result-cache-v14-${{ matrix.php-version }}-${{ github.run_id }}"
+ restore-keys: |
+ result-cache-v14-${{ matrix.php-version }}-
- name: "PHPStan with result cache"
run: |
@@ -97,38 +131,52 @@ jobs:
make phpstan-result-cache
make phpstan-result-cache
- - name: "Upload result cache artifact"
- uses: actions/upload-artifact@v2
- with:
- name: resultCache-ubuntu-latest.php
- path: tmp/resultCache.php
-
generate-baseline:
name: "Generate baseline"
runs-on: "ubuntu-latest"
- timeout-minutes: 30
-
- strategy:
- matrix:
- php-version:
- - "7.4"
+ timeout-minutes: 60
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "${{ matrix.php-version }}"
+ php-version: "8.2"
+ ini-file: development
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
- name: "Generate baseline"
run: |
cp phpstan-baseline.neon phpstan-baseline-orig.neon && \
make phpstan-generate-baseline && \
diff phpstan-baseline.neon phpstan-baseline-orig.neon
+
+ generate-baseline-php:
+ name: "Generate PHP baseline"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.2"
+ ini-file: development
+
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Generate baseline"
+ run: |
+ > phpstan-baseline.neon && \
+ make phpstan-generate-baseline-php && \
+ make phpstan-result-cache
diff --git a/.github/workflows/tests-levels-matrix.php b/.github/workflows/tests-levels-matrix.php
new file mode 100644
index 0000000000..d5dbc90b82
--- /dev/null
+++ b/.github/workflows/tests-levels-matrix.php
@@ -0,0 +1,38 @@
+tests as $testClasses) {
+ foreach($testClasses->testClass as $testClass) {
+ foreach($testClass->testMethod as $testMethod) {
+ $testCaseName = (string)$testMethod['id'];
+
+ [$className, $testName] = explode('::', $testCaseName, 2);
+ $fileName = 'tests/' . str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
+
+ $filter = str_replace('\\', '\\\\', $testCaseName);
+
+ $testFilters[] = sprintf("%s --filter %s", escapeshellarg($fileName), escapeshellarg($filter));
+ }
+ }
+}
+
+if ($testFilters === []) {
+ throw new RuntimeException('No tests found');
+}
+
+$chunkSize = (int) ceil(count($testFilters) / 10);
+$chunks = array_chunk($testFilters, $chunkSize);
+
+$commands = [];
+foreach ($chunks as $chunk) {
+ $commands[] = implode("\n", array_map(fn (string $ch) => sprintf('php vendor/bin/phpunit %s --group levels', $ch), $chunk));
+}
+
+echo json_encode($commands);
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index d2a1ecd903..cff6d8792a 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -4,35 +4,43 @@ name: "Tests"
on:
pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
push:
branches:
- - "master"
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
-env:
- COMPOSER_ROOT_VERSION: "1.0.x-dev"
+concurrency:
+ group: tests-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
jobs:
tests:
name: "Tests"
runs-on: ${{ matrix.operating-system }}
- timeout-minutes: 30
+ timeout-minutes: 60
strategy:
fail-fast: false
matrix:
php-version:
- - "7.3"
- - "7.4"
- - "8.0"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+ - "8.5"
operating-system: [ ubuntu-latest, windows-latest ]
- script:
- - "make tests"
- - "make tests-static-reflection"
- - "make tests-integration"
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
@@ -41,88 +49,167 @@ jobs:
php-version: "${{ matrix.php-version }}"
tools: pecl
extensions: ds,mbstring
- ini-values: memory_limit=640M
+ ini-file: development
+ ini-values: memory_limit=2G
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
-
- - name: "Transform source code"
- if: matrix.php-version != '7.4' && matrix.php-version != '8.0'
- run: php bin/transform-source.php
+ - uses: "ramsey/composer-install@v3"
- name: "Tests"
- run: "${{ matrix.script }}"
+ run: "make tests"
- tests-old-phpunit:
- name: "Tests with old PHPUnit"
+ tests-integration:
+ name: "Integration tests"
runs-on: ${{ matrix.operating-system }}
- timeout-minutes: 30
+ timeout-minutes: 60
strategy:
fail-fast: false
matrix:
- php-version:
- - "7.1"
- - "7.2"
operating-system: [ ubuntu-latest, windows-latest ]
- script:
- - "make tests-coverage"
- - "make tests-static-reflection-coverage"
- - "make tests-integration-coverage"
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "${{ matrix.php-version }}"
+ php-version: "8.2"
tools: pecl
extensions: ds,mbstring
- ini-values: memory_limit=640M
+ ini-file: development
+ ini-values: memory_limit=1G
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - uses: "ramsey/composer-install@v3"
- - name: "Downgrade PHPUnit"
- run: "composer require --dev phpunit/phpunit:^7.5.20 brianium/paratest:^4.0 --update-with-dependencies"
+ - name: "Tests"
+ run: "make tests-integration"
- - name: "Transform source code"
- run: php bin/transform-source.php
+ tests-levels-matrix:
+ name: "Determine levels tests matrix"
+ runs-on: ubuntu-latest
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=1G
+
+ - uses: "ramsey/composer-install@v3"
+
+ - id: set-matrix
+ run: echo "matrix=$(php .github/workflows/tests-levels-matrix.php)" >> $GITHUB_OUTPUT
+
+ outputs:
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
+
+ tests-levels:
+ needs: tests-levels-matrix
+
+ name: "Levels tests"
+ runs-on: ubuntu-latest
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ script: "${{fromJson(needs.tests-levels-matrix.outputs.matrix)}}"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=1G
+
+ - uses: "ramsey/composer-install@v3"
- name: "Tests"
run: "${{ matrix.script }}"
- tests-code-coverage:
- name: "Tests with code coverage"
+ tests-with-old-phpunit:
+ name: "Tests with old PHPUnit"
+ runs-on: ${{ matrix.operating-system }}
+ timeout-minutes: 60
- runs-on: "ubuntu-latest"
- timeout-minutes: 30
+ strategy:
+ fail-fast: false
+ matrix:
+ php-version:
+ - "7.4"
+ - "8.0"
+ - "8.1"
+ operating-system: [ ubuntu-latest, windows-latest ]
steps:
- name: "Checkout"
- uses: "actions/checkout@v2"
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
- coverage: "pcov"
- php-version: "7.4"
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
tools: pecl
- extensions: ds
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=2G
- - name: "Install dependencies"
- run: "composer install --no-interaction --no-progress --no-suggest"
+ - name: "Downgrade PHPUnit"
+ shell: bash
+ run: "composer require --dev phpunit/phpunit:^9.6 sebastian/diff:^4.0 --update-with-dependencies --ignore-platform-reqs"
- - name: "Tests"
- run: |
- php -dpcov.enabled=1 -dpcov.directory=. -dpcov.exclude="~vendor~" vendor/bin/phpunit
+ - uses: "ramsey/composer-install@v3"
+
+ - name: "Downgrade PHPUnit with Paratest"
+ shell: bash
+ run: "composer require --dev phpunit/phpunit:^9.6 brianium/paratest:^6.5 symfony/console:^5.4 symfony/process:^5.4 --update-with-dependencies --ignore-platform-reqs --working-dir=tests"
- - name: "Coveralls"
- env:
- COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: "Change to simple-downgrade PHP version"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.4"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=2G
+
+ - name: "Transform source code"
+ shell: bash
run: |
- composer require twinh/php-coveralls --dev && \
- vendor/bin/php-coveralls --verbose --coverage_clover=tests/tmp/clover.xml --json_path=tests/tmp/coveralls-upload.json
+ composer install --no-interaction --no-progress --working-dir=compiler
+ ./compiler/vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}
+ composer dump
+
+ - name: "Re-store PHP version"
+ if: matrix.php-version == '7.4' || matrix.php-version == '8.0' || matrix.php-version == '8.1'
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=2G
+
+ - name: "Tests"
+ run: "make tests"
diff --git a/.github/workflows/update-phpstorm-stubs.yml b/.github/workflows/update-phpstorm-stubs.yml
new file mode 100644
index 0000000000..ad4ae46d60
--- /dev/null
+++ b/.github/workflows/update-phpstorm-stubs.yml
@@ -0,0 +1,49 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Update PhpStorm stubs"
+on:
+ workflow_dispatch:
+ schedule:
+ # * is a special character in YAML so you have to quote this string
+ - cron: '0 0 * * 2'
+
+jobs:
+ update-phpstorm-stubs:
+ name: "Update PhpStorm stubs"
+ if: ${{ github.repository == 'phpstan/phpstan-src' }}
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ with:
+ ref: 2.1.x
+ fetch-depth: '0'
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.2"
+ - uses: "ramsey/composer-install@v3"
+ - name: "Checkout stubs"
+ uses: actions/checkout@v4
+ with:
+ path: "phpstorm-stubs"
+ repository: "jetbrains/phpstorm-stubs"
+ - name: "Update stubs"
+ run: "composer require jetbrains/phpstorm-stubs:dev-master#$(git -C phpstorm-stubs rev-parse HEAD)"
+ - name: "Remove stubs repo"
+ run: "rm -r phpstorm-stubs"
+ - name: "Update function metadata"
+ run: "./bin/generate-function-metadata.php"
+ - name: "Create Pull Request"
+ id: create-pr
+ uses: peter-evans/create-pull-request@v6
+ with:
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ branch-suffix: random
+ delete-branch: true
+ title: "Update PhpStorm stubs"
+ body: "Update PhpStorm stubs"
+ committer: "phpstan-bot "
+ commit-message: "Update PhpStorm stubs"
diff --git a/.gitignore b/.gitignore
index 625cace6ae..c4d0656bfb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,12 @@
/compiler/tmp
/compiler/vendor
/conf/config.local.yml
+/build-cs
/vendor
-/.idea
+/.idea/*
+!.idea/icon.png
/tests/tmp
/tests/.phpunit.result.cache
+/tests/PHPStan/Reflection/data/golden/
+tmp/.memory_limit
+e2e/bashunit
diff --git a/.idea/icon.png b/.idea/icon.png
new file mode 100644
index 0000000000..5f346e71c1
Binary files /dev/null and b/.idea/icon.png differ
diff --git a/.typos.toml b/.typos.toml
new file mode 100644
index 0000000000..78c99b1d76
--- /dev/null
+++ b/.typos.toml
@@ -0,0 +1,14 @@
+[files]
+extend-exclude = [
+ ".git/",
+]
+ignore-hidden = false
+
+[default.extend-identifiers]
+# Known typos
+NonRemoveableTypeTrait = "NonRemoveableTypeTrait"
+supportsLessOverridenParametersWithVariadic = "supportsLessOverridenParametersWithVariadic"
+
+[default.extend-words]
+# override false-positives
+Excluder = "Excluder"
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 162e250c6d..7ab0db920a 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,74 +1,134 @@
-# Contributor Code of Conduct
+
+# Contributor Covenant Code of Conduct
## Our Pledge
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, gender identity and expression, level of experience,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
## Our Standards
-Examples of behavior that contributes to creating a positive environment
-include:
+Examples of behavior that contributes to a positive environment for our
+community include:
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+ community
-Examples of unacceptable behavior by participants include:
+Examples of unacceptable behavior include:
-* The use of sexualized language or imagery and unwelcome sexual attention or
-advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
+* The use of sexualized language or imagery, and sexual attention or advances of
+ any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
+* Publishing others' private information, such as a physical or email address,
+ without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
-## Our Responsibilities
+## Enforcement Responsibilities
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
## Scope
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project maintainer at . All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
+reported to the community leaders responsible for enforcement at
+ondrej@mirtes.cz.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
## Attribution
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at [http://contributor-covenant.org/version/1/4][version]
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
-[homepage]: http://contributor-covenant.org
-[version]: http://contributor-covenant.org/version/1/4/
diff --git a/LICENSE b/LICENSE
index 7c0f2b7b69..e5f34e607a 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,7 @@
MIT License
Copyright (c) 2016 Ondřej Mirtes
+Copyright (c) 2025 PHPStan s.r.o.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/Makefile b/Makefile
index 9d85ecb989..3cb07512ee 100644
--- a/Makefile
+++ b/Makefile
@@ -2,36 +2,32 @@
build: cs tests phpstan
-tests:
- php vendor/bin/paratest --no-coverage
+tests: install-paratest
+ XDEBUG_MODE=off php tests/vendor/bin/paratest --runner WrapperRunner --no-coverage
-tests-integration:
- php vendor/bin/paratest --no-coverage --group exec
+tests-integration: install-paratest
+ php tests/vendor/bin/paratest --runner WrapperRunner --no-coverage --group exec
-tests-static-reflection:
- php vendor/bin/paratest --no-coverage --bootstrap tests/bootstrap-static-reflection.php
-
-tests-coverage:
- php vendor/bin/paratest
-
-tests-integration-coverage:
- php vendor/bin/paratest --group exec
-
-tests-static-reflection-coverage:
- php vendor/bin/paratest --bootstrap tests/bootstrap-static-reflection.php
+tests-golden-reflection:
+ php vendor/bin/phpunit tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
lint:
- php vendor/bin/parallel-lint --colors \
+ XDEBUG_MODE=off php vendor/bin/parallel-lint --colors \
--exclude tests/PHPStan/Analyser/data \
+ --exclude tests/PHPStan/Analyser/nsrt \
--exclude tests/PHPStan/Rules/Methods/data \
--exclude tests/PHPStan/Rules/Functions/data \
+ --exclude tests/PHPStan/Rules/Names/data \
--exclude tests/PHPStan/Rules/Operators/data/invalid-inc-dec.php \
--exclude tests/PHPStan/Rules/Arrays/data/offset-access-without-dim-for-reading.php \
--exclude tests/PHPStan/Rules/Classes/data/duplicate-declarations.php \
+ --exclude tests/PHPStan/Rules/Classes/data/duplicate-enum-cases.php \
+ --exclude tests/PHPStan/Rules/Classes/data/enum-sanity.php \
--exclude tests/PHPStan/Rules/Classes/data/extends-error.php \
--exclude tests/PHPStan/Rules/Classes/data/implements-error.php \
--exclude tests/PHPStan/Rules/Classes/data/interface-extends-error.php \
--exclude tests/PHPStan/Rules/Classes/data/trait-use-error.php \
+ --exclude tests/PHPStan/Rules/Methods/data/method-in-enum-without-body.php \
--exclude tests/PHPStan/Rules/Properties/data/default-value-for-native-property-type.php \
--exclude tests/PHPStan/Rules/Arrays/data/empty-array-item.php \
--exclude tests/PHPStan/Rules/Classes/data/invalid-promoted-properties.php \
@@ -41,31 +37,124 @@ lint:
--exclude tests/PHPStan/Rules/Functions/data/arrow-function-nullsafe-by-ref.php \
--exclude tests/PHPStan/Levels/data/namedArguments.php \
--exclude tests/PHPStan/Rules/Keywords/data/continue-break.php \
- src tests compiler/src
-
-cs:
- composer install --working-dir build-cs && php build-cs/vendor/bin/phpcs
-
-cs-fix:
- php build-cs/vendor/bin/phpcbf
+ --exclude tests/PHPStan/Rules/Keywords/data/continue-break-property-hook.php \
+ --exclude tests/PHPStan/Rules/Properties/data/invalid-callable-property-type.php \
+ --exclude tests/PHPStan/Rules/Properties/data/properties-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/read-only-property.php \
+ --exclude tests/PHPStan/Rules/Properties/data/read-only-property-phpdoc-and-native.php \
+ --exclude tests/PHPStan/Rules/Properties/data/read-only-property-readonly-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/overriding-property.php \
+ --exclude tests/PHPStan/Rules/Constants/data/overriding-final-constant.php \
+ --exclude tests/PHPStan/Rules/Properties/data/intersection-types.php \
+ --exclude tests/PHPStan/Rules/Classes/data/first-class-instantiation-callable.php \
+ --exclude tests/PHPStan/Rules/Classes/data/instantiation-callable.php \
+ --exclude tests/PHPStan/Rules/Classes/data/bug-9402.php \
+ --exclude tests/PHPStan/Rules/Constants/data/class-as-class-constant.php \
+ --exclude tests/PHPStan/Rules/Constants/data/value-assigned-to-class-constant-native-type.php \
+ --exclude tests/PHPStan/Rules/Constants/data/overriding-constant-native-types.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-10043.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-7859.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-8081.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-9014.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-10101.php \
+ --exclude tests/PHPStan/Rules/Methods/data/final-method-by-phpdoc.php \
+ --exclude tests/PHPStan/Rules/Traits/data/conflicting-trait-constants-types.php \
+ --exclude tests/PHPStan/Rules/Types/data/invalid-union-with-mixed.php \
+ --exclude tests/PHPStan/Rules/Types/data/invalid-union-with-never.php \
+ --exclude tests/PHPStan/Rules/Types/data/invalid-union-with-void.php \
+ --exclude tests/PHPStan/Rules/Constants/data/dynamic-class-constant-fetch.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-position.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-position2.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-position-nested.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-strict-nonsense.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-strict-nonsense-bool.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-inline-html.php \
+ --exclude tests/PHPStan/Rules/Classes/data/extends-readonly-class.php \
+ --exclude tests/PHPStan/Rules/Classes/data/instantiation-promoted-properties.php \
+ --exclude tests/PHPStan/Rules/Classes/data/bug-11592.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-hooks-bodies-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-hooks-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-hooks-visibility-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-hooked-properties-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-hooked-properties-with-bodies.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-non-hooked-properties-in-abstract-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/non-abstract-hooked-properties-in-abstract-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/non-abstract-hooked-properties-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/hooked-properties-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/hooked-properties-without-bodies-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/readonly-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/readonly-property-hooks-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/static-hooked-properties.php \
+ --exclude tests/PHPStan/Rules/Properties/data/static-hooked-property-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/virtual-hooked-properties.php \
+ --exclude tests/PHPStan/Rules/Classes/data/bug-12281.php \
+ --exclude tests/PHPStan/Rules/Traits/data/bug-12281.php \
+ --exclude tests/PHPStan/Rules/Classes/data/invalid-hooked-properties.php \
+ --exclude tests/PHPStan/Parser/data/cleaning-property-hooks-before.php \
+ --exclude tests/PHPStan/Parser/data/cleaning-property-hooks-after.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-private-property-hook.php \
+ --exclude tests/PHPStan/Rules/Properties/data/existing-classes-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/set-property-hook-parameter.php \
+ --exclude tests/PHPStan/Rules/Properties/data/overriding-final-property.php \
+ --exclude tests/PHPStan/Rules/Properties/data/private-final-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-final-property-hook.php \
+ --exclude tests/PHPStan/Rules/Properties/data/final-property-hooks-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/final-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/final-properties.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-in-interface-explicit-abstract.php \
+ --exclude tests/PHPStan/Rules/Constants/data/final-private-const.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-final-property-hook-parse-error.php \
+ --exclude tests/PHPStan/Rules/Playground/data/promote-missing-override.php \
+ --exclude tests/PHPStan/Rules/Traits/data/trait-attributes.php \
+ --exclude tests/PHPStan/Rules/Classes/data/non-class-attribute-class.php \
+ --exclude tests/PHPStan/Rules/Classes/data/enum-cannot-be-attribute.php \
+ --exclude tests/PHPStan/Rules/Classes/data/class-attributes.php \
+ --exclude tests/PHPStan/Rules/Classes/data/enum-attributes.php \
+ --exclude tests/PHPStan/Rules/Cast/data/void-cast.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-hook-attributes-nodiscard.php \
+ --exclude tests/PHPStan/Rules/Functions/data/arrow-function-typehints-nodiscard.php \
+ --exclude tests/PHPStan/Rules/Functions/data/closure-typehints-nodiscard.php \
+ --exclude tests/PHPStan/Rules/Functions/data/typehints-nodiscard.php \
+ --exclude tests/PHPStan/Rules/Methods/data/typehints-nodiscard.php \
+ src tests
+
+install-paratest:
+ composer install --working-dir tests
+
+.PHONY: cs-install
+cs-install:
+ git clone https://github.com/phpstan/build-cs.git || true
+ git -C build-cs fetch origin && git -C build-cs reset --hard origin/2.x
+ composer install --working-dir build-cs
+
+.PHONY: cs
+cs: cs-install
+ XDEBUG_MODE=off php build-cs/vendor/bin/phpcs
+
+.PHONY: cs-fix
+cs-fix: cs-install
+ XDEBUG_MODE=off php build-cs/vendor/bin/phpcbf
phpstan:
- php bin/phpstan clear-result-cache -q && php -d memory_limit=768M bin/phpstan
-
-phpstan-static-reflection:
- php bin/phpstan clear-result-cache -q && php -d memory_limit=800M bin/phpstan analyse -c phpstan-static-reflection.neon
+ php bin/phpstan clear-result-cache -q && php -d memory_limit=448M bin/phpstan
phpstan-result-cache:
- php -d memory_limit=768M bin/phpstan
+ php -d memory_limit=448M bin/phpstan
+
+phpstan-fix:
+ php -d memory_limit=448M bin/phpstan --fix
phpstan-generate-baseline:
- php -d memory_limit=768M bin/phpstan --generate-baseline
+ php -d memory_limit=448M bin/phpstan --generate-baseline
-phpstan-validate-stub-files:
- php bin/phpstan analyse -c conf/config.stubFiles.neon -l 8 tests/notAutoloaded/empty.php
+phpstan-generate-baseline-php:
+ php -d memory_limit=448M bin/phpstan analyse --generate-baseline phpstan-baseline.php
phpstan-pro:
- php -d memory_limit=768M bin/phpstan --pro
+ php -d memory_limit=448M bin/phpstan --pro
+
+name-collision:
+ php vendor/bin/detect-collisions --configuration build/collision-detector.json
-composer-require-checker:
- php build/composer-require-checker.phar check --config-file $(CURDIR)/build/composer-require-checker.json
+composer-dependency-analyser:
+ php vendor/bin/composer-dependency-analyser --config build/composer-dependency-analyser.php
diff --git a/README.md b/README.md
index 6692591ca7..e817604542 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,6 @@
# PHPStan - PHP Static Analysis Tool
-[](https://github.com/phpstan/phpstan-src/actions)
-[](https://coveralls.io/github/phpstan/phpstan-src)
+[](https://github.com/phpstan/phpstan-src/actions)
[](https://github.com/phpstan/phpstan)
---
@@ -12,11 +11,19 @@ This repository (`phpstan/phpstan-src`) is for PHPStan's development only. Head
Any contributions are welcome.
+### Installation
+
+```bash
+composer install
+```
+
+If you are using macOS and are using an older version of `patch`, you may have problems with patch application failure during `composer install`. Try using `brew install gpatch` to install a newer and supported `patch` version.
+
### Building
-PHPStan's source code is developed on PHP 7.4. For distribution in `phpstan/phpstan` package and as a PHAR file, the source code is transformed to run on PHP 7.1 and higher.
+PHPStan's source code is developed on PHP 8.1. For distribution in `phpstan/phpstan` package and as a PHAR file, the source code is transformed to run on PHP 7.2 and higher.
-Initially you need to run `composer install`, or `composer update` in case you aren't working in a directory which was built before.
+Initially you need to run `composer install` in case you aren't working in a directory which was built before.
Afterwards you can either run the whole build including linting and coding standards using
@@ -40,8 +47,6 @@ To detect code style issues, run:
make cs
```
-This requires PHP 7.4. On older versions the build target will be skipped and succeed silently.
-
And then to fix code style, run:
```bash
@@ -57,7 +62,7 @@ make tests
### Debugging
-1. Make sure XDebug is installed and configured.
+1. Make sure Xdebug is installed and configured.
2. Add `--xdebug` option when running PHPStan. Without it PHPStan turns the debugger off at runtime.
3. If you're not debugging the [result cache](https://phpstan.org/user-guide/result-cache), also add the `--debug` option.
diff --git a/UPGRADING.md b/UPGRADING.md
new file mode 100644
index 0000000000..1b76768ec4
--- /dev/null
+++ b/UPGRADING.md
@@ -0,0 +1,338 @@
+Upgrading from PHPStan 1.x to 2.0
+=================================
+
+## PHP version requirements
+
+PHPStan now requires PHP 7.4 or newer to run.
+
+## Upgrading guide for end users
+
+The best way to get ready for upgrade to PHPStan 2.0 is to update to the **latest PHPStan 1.12 release**
+and enable [**Bleeding Edge**](https://phpstan.org/blog/what-is-bleeding-edge). This will enable the new rules and behaviours that 2.0 turns on for all users.
+
+Also make sure to install and enable [`phpstan/phpstan-deprecation-rules`](https://github.com/phpstan/phpstan-deprecation-rules).
+
+Once you get to a green build with no deprecations showed on latest PHPStan 1.12.x with Bleeding Edge enabled, you can update all your related PHPStan dependencies to 2.0 in `composer.json`:
+
+```json
+"require-dev": {
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-doctrine": "^2.0",
+ "phpstan/phpstan-nette": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpstan/phpstan-symfony": "^2.0",
+ "phpstan/phpstan-webmozart-assert": "^2.0",
+ ...
+}
+```
+
+Don't forget to update [3rd party PHPStan extensions](https://phpstan.org/user-guide/extension-library) as well.
+
+After changing your `composer.json`, run `composer update 'phpstan/*' -W`.
+
+It's up to you whether you go through the new reported errors or if you just put them all to the [baseline](https://phpstan.org/user-guide/baseline) ;) Everyone who's on PHPStan 1.12 should be able to upgrade to PHPStan 2.0.
+
+### Noteworthy changes to code analysis
+
+* [**Enhancements in handling parameters passed by reference**](https://phpstan.org/blog/enhancements-in-handling-parameters-passed-by-reference)
+* [**Validate inline PHPDoc `@var` tag type**](https://phpstan.org/blog/phpstan-1-10-comes-with-lie-detector#validate-inline-phpdoc-%40var-tag-type)
+* [**List type enforced**](https://phpstan.org/blog/phpstan-1-9-0-with-phpdoc-asserts-list-type#list-type)
+* **Always `true` conditions always reported**: previously reported only with phpstan-strict-rules, this is now always reported.
+
+### Removed option `checkMissingIterableValueType`
+
+It's strongly recommended to add the missing array typehints.
+
+If you want to continue ignoring missing typehints from arrays, add `missingType.iterableValue` error identifier to your `ignoreErrors`:
+
+```neon
+parameters:
+ ignoreErrors:
+ -
+ identifier: missingType.iterableValue
+```
+
+### Removed option `checkGenericClassInNonGenericObjectType`
+
+It's strongly recommended to add the missing generic typehints.
+
+If you want to continue ignoring missing typehints from generics, add `missingType.generics` error identifier to your `ignoreErrors`:
+
+```neon
+parameters:
+ ignoreErrors:
+ -
+ identifier: missingType.generics
+```
+
+### Removed `checkAlwaysTrue*` options
+
+These options have been removed because PHPStan now always behaves as if these were set to `true`:
+
+* `checkAlwaysTrueCheckTypeFunctionCall`
+* `checkAlwaysTrueInstanceof`
+* `checkAlwaysTrueStrictComparison`
+* `checkAlwaysTrueLooseComparison`
+
+### Removed option `excludes_analyse`
+
+It has been replaced with [`excludePaths`](https://phpstan.org/user-guide/ignoring-errors#excluding-whole-files).
+
+### Paths in `excludePaths` and `ignoreErrors` have to be a valid file path or a fnmatch pattern
+
+If you are excluding a file path that might not exist but you still want to have it in `excludePaths`, append `(?)`:
+
+```neon
+parameters:
+ excludePaths:
+ - tests/*/data/*
+ - src/broken
+ - node_modules (?) # optional path, might not exist
+```
+
+If you have the same situation in `ignoreErrors` (ignoring an error in a path that might not exist), use `reportUnmatchedIgnoredErrors: false`.
+
+```neon
+parameters:
+ reportUnmatchedIgnoredErrors: false
+```
+
+Appending `(?)` in `ignoreErrors` is not supported.
+
+### Changes in 1st party PHPStan extensions
+
+* [phpstan-doctrine](https://github.com/phpstan/phpstan-doctrine)
+ * Removed config parameter `searchOtherMethodsForQueryBuilderBeginning` (extension now behaves as when this was set to `true`)
+ * Removed config parameter `queryBuilderFastAlgorithm` (extension now behaves as when this was set to `false`)
+* [phpstan-symfony](https://github.com/phpstan/phpstan-symfony)
+ * Removed legacy options with `_` in the name
+ * `container_xml_path` -> use `containerXmlPath`
+ * `constant_hassers` -> use `constantHassers`
+ * `console_application_loader` -> use `consoleApplicationLoader`
+
+### Minor backward compatibility breaks
+
+* Removed unused config parameter `cache.nodesByFileCountMax`
+* Removed unused config parameter `memoryLimitFile`
+* Removed unused feature toggle `disableRuntimeReflectionProvider`
+* Removed unused config parameter `staticReflectionClassNamePatterns`
+* Remove `fixerTmpDir` config parameter, use `pro.tmpDir` instead
+* Remove `tempResultCachePath` config parameter, use `resultCachePath` instead
+* `additionalConfigFiles` config parameter must be a list
+
+## Upgrading guide for extension developers
+
+> [!NOTE]
+> Please switch to PHPStan 2.0 in a new major version of your extension. It's not feasible to try to support both PHPStan 1.x and PHPStan 2.x with the same extension code.
+>
+> You can definitely get closer to supporting PHPStan 2.0 without increasing major version by solving reported deprecations and other issues by analysing your extension code with PHPStan & phpstan-deprecation-rules & Bleeding Edge, but the final leap and solving backward incompatibilities should be done by requiring `"phpstan/phpstan": "^2.0"` in your `composer.json`, and releasing a new major version.
+
+### PHPStan now uses nikic/php-parser v5
+
+See [UPGRADING](https://github.com/nikic/PHP-Parser/blob/master/UPGRADE-5.0.md) guide for PHP-Parser.
+
+The most notable change is how `throw` statement is represented. Previously, `throw` statements like `throw $e;` were represented using the `Stmt\Throw_` class, while uses inside other expressions (such as `$x ?? throw $e`) used the `Expr\Throw_` class.
+
+Now, `throw $e;` is represented as a `Stmt\Expression` that contains an `Expr\Throw_`. The
+`Stmt\Throw_` class has been removed.
+
+### PHPStan now uses phpstan/phpdoc-parser v2
+
+See [UPGRADING](https://github.com/phpstan/phpdoc-parser/blob/2.0.x/UPGRADING.md) guide for phpstan/phpdoc-parser.
+
+### Returning plain strings as errors no longer supported, use RuleErrorBuilder
+
+Identifiers are also required in custom rules.
+
+Learn more: [Using RuleErrorBuilder to enrich reported errors in custom rules](https://phpstan.org/blog/using-rule-error-builder)
+
+**Before**:
+
+```php
+return ['My error'];
+```
+
+**After**:
+
+```php
+return [
+ RuleErrorBuilder::message('My error')
+ ->identifier('my.error')
+ ->build(),
+];
+```
+
+### Deprecate various `instanceof *Type` in favour of new methods on `Type` interface
+
+Learn more: [Why Is instanceof *Type Wrong and Getting Deprecated?](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated)
+
+### Removed deprecated `ParametersAcceptorSelector::selectSingle()`
+
+Use [`ParametersAcceptorSelector::selectFromArgs()`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ParametersAcceptorSelector.html#_selectFromArgs) instead. It should be used in most places where `selectSingle()` was previously used, like dynamic return type extensions.
+
+**Before**:
+
+```php
+$defaultReturnType = ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
+```
+
+**After**:
+
+```php
+$defaultReturnType = ParametersAcceptorSelector::selectFromArgs(
+ $scope,
+ $functionCall->getArgs(),
+ $functionReflection->getVariants()
+)->getReturnType();
+```
+
+If you're analysing function or method body itself and you're using one of the following methods, ask for `getParameters()` and `getReturnType()` directly on the reflection object:
+
+* [InClassMethodNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InClassMethodNode.html)
+* [InFunctionNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InFunctionNode.html)
+* [FunctionReturnStatementsNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.FunctionReturnStatementsNode.html)
+* [MethodReturnStatementsNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.MethodReturnStatementsNode.html)
+* [Scope::getFunction()](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.Scope.html#_getFunction)
+
+**Before**:
+
+```php
+$function = $node->getFunctionReflection();
+$returnType = ParametersAcceptorSelector::selectSingle($function->getVariants())->getReturnType();
+```
+
+**After**:
+
+```php
+$returnType = $node->getFunctionReflection()->getReturnType();
+```
+
+### Changed `TypeSpecifier::create()` and `SpecifiedTypes` constructor parameters
+
+[`PHPStan\Analyser\TypeSpecifier::create()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.TypeSpecifier.html#_create) now accepts (all parameters are required):
+
+* `Expr $expr`
+* `Type $type`
+* `TypeSpecifierContext $context`
+* `Scope $scope`
+
+If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by this method), call `setAlwaysOverwriteTypes()` and `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::create()`). These methods return a new object (SpecifiedTypes is immutable).
+
+[`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) constructor now accepts:
+
+* `array $sureTypes`
+* `array $sureNotTypes`
+
+If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by the constructor), call `setAlwaysOverwriteTypes()` and `setRootExpr()`. These methods return a new object (SpecifiedTypes is immutable).
+
+### `ConstantArrayType` no longer extends `ArrayType`
+
+`Type::getArrays()` now returns `list`.
+
+Using `$type instanceof ArrayType` is [being deprecated anyway](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated) so the impact of this change should be minimal.
+
+### Changed `TypeSpecifier::specifyTypesInCondition()`
+
+This method now longer accepts `Expr $rootExpr`. If you want to change it, call `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::specifyTypesInCondition()`). `setRootExpr()` method returns a new object (SpecifiedTypes is immutable).
+
+### Node attributes `parent`, `previous`, `next` are no longer available
+
+Learn more: https://phpstan.org/blog/preprocessing-ast-for-custom-rules
+
+### Removed config parameter `scopeClass`
+
+As a replacement you can implement [`PHPStan\Type\ExpressionTypeResolverExtension`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.ExpressionTypeResolverExtension.html) interface instead and register it as a service.
+
+### Removed `PHPStan\Broker\Broker`
+
+Use [`PHPStan\Reflection\ReflectionProvider`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ReflectionProvider.html) instead.
+
+`BrokerAwareExtension` was also removed. Ask for `ReflectionProvider` in the extension constructor instead.
+
+Instead of `PHPStanTestCase::createBroker()`, call `PHPStanTestCase::createReflectionProvider()`.
+
+### List type is enabled for everyone
+
+Removed static methods from `AccessoryArrayListType` class:
+
+* `isListTypeEnabled()`
+* `setListTypeEnabled()`
+* `intersectWith()`
+
+Instead of `AccessoryArrayListType::intersectWith($type)`, do `TypeCombinator::intersect($type, new AccessoryArrayListType())`.
+
+### Minor backward compatibility breaks
+
+* Classes that were previously `@final` were made `final`
+* Parameter `$callableParameters` of [`MutatingScope::enterAnonymousFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterAnonymousFunction) and [`enterArrowFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterArrowFunction) made required
+* Parameter `StatementContext $context` of [`NodeScopeResolver::processStmtNodes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.NodeScopeResolver.html#_processStmtNodes) made required
+* ClassPropertiesNode - remove `$extensions` parameter from [`getUninitializedProperties()`](https://apiref.phpstan.org/2.0.x/PHPStan.Node.ClassPropertiesNode.html#_getUninitializedProperties)
+* `Type::getSmallerType()`, `Type::getSmallerOrEqualType()`, `Type::getGreaterType()`, `Type::getGreaterOrEqualType()`, `Type::isSmallerThan()`, `Type::isSmallerThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument.
+* `CompoundType::isGreaterThan()`, `CompoundType::isGreaterThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument.
+* Removed `ReflectionProvider::supportsAnonymousClasses()` (all reflection providers support anonymous classes)
+* Remove `ArrayType::generalizeKeys()`
+* Remove `ArrayType::count()`, use `Type::getArraySize()` instead
+* Remove `ArrayType::castToArrayKeyType()`, `Type::toArrayKey()` instead
+* Remove `UnionType::pickTypes()`, use `pickFromTypes()` instead
+* Remove `RegexArrayShapeMatcher::matchType()`, use `matchExpr()` instead
+* Remove unused `PHPStanTestCase::$useStaticReflectionProvider`
+* Remove `PHPStanTestCase::getReflectors()`, use `getReflector()` instead
+* Remove `ClassReflection::getFileNameWithPhpDocs()`, use `getFileName()` instead
+* Remove `AnalysisResult::getInternalErrors()`, use `getInternalErrorObjects()` instead
+* Remove `ConstantReflection::getValue()`, use `getValueExpr()` instead. To get `Type` from `Expr`, use `Scope::getType()` or `InitializerExprTypeResolver::getType()`
+* Remove `PropertyTag::getType()`, use `getReadableType()` / `getWritableType()` instead
+* Remove `GenericTypeVariableResolver`, use [`Type::getTemplateType()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getTemplateType) instead
+* Rename `Type::isClassStringType()` to `Type::isClassString()`
+* Remove `Scope::isSpecified()`, use `hasExpressionType()` instead
+* Remove `ConstantArrayType::isEmpty()`, use `isIterableAtLeastOnce()->no()` instead
+* Remove `ConstantArrayType::getNextAutoIndex()`
+* Removed methods from `ConstantArrayType` - `getFirst*Type` and `getLast*Type`
+ * Use `getFirstIterable*Type` and `getLastIterable*Type` instead
+* Remove `ConstantArrayType::generalizeToArray()`
+* Remove `ConstantArrayType::findTypeAndMethodName()`, use `findTypeAndMethodNames()` instead
+* Remove `ConstantArrayType::removeLast()`, use [`Type::popArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_popArray) instead
+* Remove `ConstantArrayType::removeFirst()`, use [`Type::shiftArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_shiftArray) instead
+* Remove `ConstantArrayType::reverse()`, use [`Type::reverseArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_reverseArray) instead
+* Remove `ConstantArrayType::chunk()`, use [`Type::chunkArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_chunkArray) instead
+* Remove `ConstantArrayType::slice()`, use [`Type::sliceArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_sliceArray) instead
+* Made `TypeUtils` thinner by removing methods:
+ * Remove `TypeUtils::getArrays()` and `getAnyArrays()`, use [`Type::getArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getArrays) instead
+ * Remove `TypeUtils::getConstantArrays()` and `getOldConstantArrays()`, use [`Type::getConstantArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantArrays) instead
+ * Remove `TypeUtils::getConstantStrings()`, use [`Type::getConstantStrings()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantStrings) instead
+ * Remove `TypeUtils::getConstantTypes()` and `getAnyConstantTypes()`, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) or [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize)
+ * Remove `TypeUtils::generalizeType()`, use [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize) instead
+ * Remove `TypeUtils::getDirectClassNames()`, use [`Type::getObjectClassNames()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getObjectClassNames) instead
+ * Remove `TypeUtils::getConstantScalars()`, use [`Type::isConstantScalarValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantScalarValue) or [`Type::getConstantScalarTypes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantScalarTypes) instead
+ * Remove `TypeUtils::getEnumCaseObjects()`, use [`Type::getEnumCases()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getEnumCases) instead
+ * Remove `TypeUtils::containsCallable()`, use [`Type::isCallable()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isCallable) instead
+* Removed `Scope::doNotTreatPhpDocTypesAsCertain()`, use `getNativeType()` instead
+* Parameter `$isList` in `ConstantArrayType` constructor can only be `TrinaryLogic`, no longer `bool`
+* Parameter `$nextAutoIndexes` in `ConstantArrayType` constructor can only be `non-empty-list`, no longer `int`
+* Remove `ConstantType` interface, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) instead
+* `acceptsNamedArguments()` in `FunctionReflection`, `ExtendedMethodReflection` and `CallableParametersAcceptor` interfaces returns `TrinaryLogic` instead of `bool`
+* Remove `FunctionReflection::isFinal()`
+* [`Type::getProperty()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getProperty) now returns [`ExtendedPropertyReflection`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ExtendedPropertyReflection.html)
+* Remove `__set_state()` on objects that should not be serialized in cache
+* Parameter `$selfClass` of [`TypehintHelper::decideTypeFromReflection()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.TypehintHelper.html#_decideTypeFromReflection) no longer accepts `string`
+* `LevelsTestCase::dataTopics()` data provider made static
+* `PHPStan\Node\Printer\Printer` no longer autowired as `PhpParser\PrettyPrinter\Standard`, use `PHPStan\Node\Printer\Printer` in the typehint
+* Remove `Type::acceptsWithReason()`, `Type:accepts()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+* Remove `CompoundType::isAcceptedWithReasonBy()`, `CompoundType::isAcceptedBy()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+Remove `Type::isSuperTypeOfWithReason()`, `Type:isSuperTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* Remove `CompoundType::isSubTypeOfWithReasonBy()`, `CompoundType::isSubTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* Remove `TemplateType::isValidVarianceWithReason()`, changed `TemplateType::isValidVariance()` return type to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* `RuleLevelHelper::accepts()` return type changed from `bool` to [`RuleLevelHelperAcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+* Changes around `ClassConstantReflection`
+ * Class `ClassConstantReflection` removed from BC promise, renamed to `RealClassConstantReflection`
+ * Interface `ConstantReflection` renamed to `ClassConstantReflection`
+ * Added more methods around PHPDoc types and native types to the (new) `ClassConstantReflection`
+ * Interface `GlobalConstantReflection` renamed to `ConstantReflection`
+* Renamed interfaces and classes from `*WithPhpDocs` to `Extended*`
+ * `ParametersAcceptorWithPhpDocs` -> `ExtendedParametersAcceptor`
+ * `ParameterReflectionWithPhpDocs` -> `ExtendedParameterReflection`
+ * `FunctionVariantWithPhpDocs` -> `ExtendedFunctionVariant`
+* `ClassPropertyNode::getNativeType()` return type changed from AST node to `Type|null`
+* Class `PHPStan\Node\ClassMethod` (accessible from `ClassMethodsNode`) is no longer an AST node
+ * Call `PHPStan\Node\ClassMethod::getNode()` to access the original AST node
diff --git a/build-cs/.gitignore b/apigen/.gitignore
similarity index 100%
rename from build-cs/.gitignore
rename to apigen/.gitignore
diff --git a/apigen/apigen.neon b/apigen/apigen.neon
new file mode 100644
index 0000000000..16d87b17a4
--- /dev/null
+++ b/apigen/apigen.neon
@@ -0,0 +1,10 @@
+parameters:
+ title: PHPStan
+ themeDir: theme
+
+services:
+ analyzer.filter:
+ factory: PHPStan\ApiGen\Filter(excludeProtected: %excludeProtected%, excludePrivate: %excludePrivate%, excludeTagged: %excludeTagged%)
+
+ renderer.filter:
+ factory: PHPStan\ApiGen\RendererFilter
diff --git a/apigen/composer.json b/apigen/composer.json
new file mode 100644
index 0000000000..827002329a
--- /dev/null
+++ b/apigen/composer.json
@@ -0,0 +1,13 @@
+{
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "apigen/apigen": "dev-master#aa151a961053d20e46d2c7da65cbb03c130d12ff"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\ApiGen\\": "src"
+ }
+ }
+}
diff --git a/apigen/composer.lock b/apigen/composer.lock
new file mode 100644
index 0000000000..36e6073f5e
--- /dev/null
+++ b/apigen/composer.lock
@@ -0,0 +1,1713 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "f25de5a945d9862c3ba649cab28f3e61",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "apigen/apigen",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ApiGen/ApiGen.git",
+ "reference": "aa151a961053d20e46d2c7da65cbb03c130d12ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ApiGen/ApiGen/zipball/aa151a961053d20e46d2c7da65cbb03c130d12ff",
+ "reference": "aa151a961053d20e46d2c7da65cbb03c130d12ff",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.0",
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-tokenizer": "*",
+ "jetbrains/phpstorm-stubs": "^2024.2",
+ "latte/latte": "^3.0",
+ "league/commonmark": "^2.3",
+ "nette/di": "^3.1",
+ "nette/finder": "^3.0",
+ "nette/schema": "^1.2",
+ "nette/utils": "^4.0",
+ "nikic/php-parser": "^5.3",
+ "php": "^8.1",
+ "phpstan/php-8-stubs": "^0.4.0",
+ "phpstan/phpdoc-parser": "^1.16",
+ "symfony/console": "^6.4"
+ },
+ "replace": {
+ "symfony/polyfill-ctype": "*",
+ "symfony/polyfill-mbstring": "*",
+ "symfony/polyfill-php80": "*"
+ },
+ "require-dev": {
+ "nette/neon": "^3.4",
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.9",
+ "tracy/tracy": "^2.9"
+ },
+ "default-branch": true,
+ "bin": [
+ "bin/apigen"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ApiGen\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "ApiGen Contributors",
+ "homepage": "https://github.com/apigen/apigen/graphs/contributors"
+ },
+ {
+ "name": "Jaroslav Hanslík",
+ "homepage": "https://github.com/kukulich"
+ },
+ {
+ "name": "Ondřej Nešpor",
+ "homepage": "https://github.com/andrewsville"
+ },
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ }
+ ],
+ "description": "PHP source code API generator.",
+ "support": {
+ "issues": "https://github.com/ApiGen/ApiGen/issues",
+ "source": "https://github.com/ApiGen/ApiGen/tree/master"
+ },
+ "time": "2025-02-21T14:27:46+00:00"
+ },
+ {
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.42",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+ "scrutinizer/ocular": "1.6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dflydev\\DotAccessData\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Dragonfly Development Inc.",
+ "email": "info@dflydev.com",
+ "homepage": "http://dflydev.com"
+ },
+ {
+ "name": "Beau Simensen",
+ "email": "beau@dflydev.com",
+ "homepage": "http://beausimensen.com"
+ },
+ {
+ "name": "Carlos Frutos",
+ "email": "carlos@kiwing.it",
+ "homepage": "https://github.com/cfrutos"
+ },
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com"
+ }
+ ],
+ "description": "Given a deep data structure, access data by dot notation.",
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+ "keywords": [
+ "access",
+ "data",
+ "dot",
+ "notation"
+ ],
+ "support": {
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
+ },
+ "time": "2024-07-08T12:26:09+00:00"
+ },
+ {
+ "name": "jetbrains/phpstorm-stubs",
+ "version": "v2024.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JetBrains/phpstorm-stubs.git",
+ "reference": "0e82bdfe850c71857ee4ee3501ed82a9fc5d043c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/0e82bdfe850c71857ee4ee3501ed82a9fc5d043c",
+ "reference": "0e82bdfe850c71857ee4ee3501ed82a9fc5d043c",
+ "shasum": ""
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "v3.64.0",
+ "nikic/php-parser": "v5.3.1",
+ "phpdocumentor/reflection-docblock": "5.6.0",
+ "phpunit/phpunit": "11.4.3"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "PhpStormStubsMap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "PHP runtime & extensions header files for PhpStorm",
+ "homepage": "https://www.jetbrains.com/phpstorm",
+ "keywords": [
+ "autocomplete",
+ "code",
+ "inference",
+ "inspection",
+ "jetbrains",
+ "phpstorm",
+ "stubs",
+ "type"
+ ],
+ "support": {
+ "source": "https://github.com/JetBrains/phpstorm-stubs/tree/v2024.3"
+ },
+ "time": "2024-12-14T08:03:12+00:00"
+ },
+ {
+ "name": "latte/latte",
+ "version": "v3.0.23",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/latte.git",
+ "reference": "3198a4e336a2a1e535924af11d9a63fbf1650836"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/latte/zipball/3198a4e336a2a1e535924af11d9a63fbf1650836",
+ "reference": "3198a4e336a2a1e535924af11d9a63fbf1650836",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "8.0 - 8.4"
+ },
+ "conflict": {
+ "nette/application": "<3.1.7",
+ "nette/caching": "<3.1.4"
+ },
+ "require-dev": {
+ "nette/php-generator": "^4.0",
+ "nette/tester": "^2.5",
+ "nette/utils": "^4.0",
+ "phpstan/phpstan-nette": "^2.0@stable",
+ "tracy/tracy": "^2.10"
+ },
+ "suggest": {
+ "ext-fileinfo": "to use filter |datastream",
+ "ext-iconv": "to use filters |reverse, |substring",
+ "ext-intl": "to use Latte\\Engine::setLocale()",
+ "ext-mbstring": "to use filters like lower, upper, capitalize, ...",
+ "nette/php-generator": "to use tag {templatePrint}",
+ "nette/utils": "to use filter |webalize"
+ },
+ "bin": [
+ "bin/latte-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Latte\\": "src/Latte"
+ },
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "☕ Latte: the intuitive and fast template engine for those who want the most secure PHP sites. Introduces context-sensitive escaping.",
+ "homepage": "https://latte.nette.org",
+ "keywords": [
+ "context-sensitive",
+ "engine",
+ "escaping",
+ "html",
+ "nette",
+ "security",
+ "template",
+ "twig"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/latte/issues",
+ "source": "https://github.com/nette/latte/tree/v3.0.23"
+ },
+ "time": "2025-07-17T01:01:46+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6fbb36d44824ed4091adbcf4c7d4a3923cdb3405",
+ "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "league/config": "^1.1.1",
+ "php": "^7.4 || ^8.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "cebe/markdown": "^1.0",
+ "commonmark/cmark": "0.31.1",
+ "commonmark/commonmark.js": "0.31.1",
+ "composer/package-versions-deprecated": "^1.8",
+ "embed/embed": "^4.4",
+ "erusev/parsedown": "^1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "^1.4 || ^2.0",
+ "nyholm/psr7": "^1.5",
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "forum": "https://github.com/thephpleague/commonmark/discussions",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-05-05T12:20:28+00:00"
+ },
+ {
+ "name": "league/config",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/config.git",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "shasum": ""
+ },
+ "require": {
+ "dflydev/dot-access-data": "^3.0.1",
+ "nette/schema": "^1.2",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Config\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Define configuration arrays with strict schemas and access values with dot notation",
+ "homepage": "https://config.thephpleague.com",
+ "keywords": [
+ "array",
+ "config",
+ "configuration",
+ "dot",
+ "dot-access",
+ "nested",
+ "schema"
+ ],
+ "support": {
+ "docs": "https://config.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/config/issues",
+ "rss": "https://github.com/thephpleague/config/releases.atom",
+ "source": "https://github.com/thephpleague/config"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-11T20:36:23+00:00"
+ },
+ {
+ "name": "nette/di",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/di.git",
+ "reference": "57f923a7af32435b6e4921c0adbc70c619625a17"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/di/zipball/57f923a7af32435b6e4921c0adbc70c619625a17",
+ "reference": "57f923a7af32435b6e4921c0adbc70c619625a17",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-tokenizer": "*",
+ "nette/neon": "^3.3 || ^4.0",
+ "nette/php-generator": "^4.1.6",
+ "nette/robot-loader": "^4.0",
+ "nette/schema": "^1.2.5",
+ "nette/utils": "^4.0",
+ "php": "8.1 - 8.4"
+ },
+ "require-dev": {
+ "nette/tester": "^2.5.2",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP features.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "compiled",
+ "di",
+ "dic",
+ "factory",
+ "ioc",
+ "nette",
+ "static"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/di/issues",
+ "source": "https://github.com/nette/di/tree/v3.2.4"
+ },
+ "time": "2025-01-10T04:57:37+00:00"
+ },
+ {
+ "name": "nette/finder",
+ "version": "v3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/finder.git",
+ "reference": "027395c638637de95c8e9fad49a7c51249404ed2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/finder/zipball/027395c638637de95c8e9fad49a7c51249404ed2",
+ "reference": "027395c638637de95c8e9fad49a7c51249404ed2",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🔍 Nette Finder: find files and directories with an intuitive API.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "filesystem",
+ "glob",
+ "iterator",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/finder/issues",
+ "source": "https://github.com/nette/finder/tree/v3.0.0"
+ },
+ "time": "2022-12-14T17:05:54+00:00"
+ },
+ {
+ "name": "nette/neon",
+ "version": "v3.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/neon.git",
+ "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/neon/zipball/3411aa86b104e2d5b7e760da4600865ead963c3c",
+ "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "8.0 - 8.4"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "bin": [
+ "bin/neon-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
+ "homepage": "https://ne-on.org",
+ "keywords": [
+ "export",
+ "import",
+ "neon",
+ "nette",
+ "yaml"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/neon/issues",
+ "source": "https://github.com/nette/neon/tree/v3.4.4"
+ },
+ "time": "2024-10-04T22:00:08+00:00"
+ },
+ {
+ "name": "nette/php-generator",
+ "version": "v4.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/php-generator.git",
+ "reference": "42806049a7774a2bd316c958f5dcf01c6b5c56fa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/php-generator/zipball/42806049a7774a2bd316c958f5dcf01c6b5c56fa",
+ "reference": "42806049a7774a2bd316c958f5dcf01c6b5c56fa",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^3.2.9 || ^4.0",
+ "php": "8.0 - 8.4"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "^2.4",
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.8"
+ },
+ "suggest": {
+ "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.4 features.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "code",
+ "nette",
+ "php",
+ "scaffolding"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/php-generator/issues",
+ "source": "https://github.com/nette/php-generator/tree/v4.1.8"
+ },
+ "time": "2025-03-31T00:29:29+00:00"
+ },
+ {
+ "name": "nette/robot-loader",
+ "version": "v4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/robot-loader.git",
+ "reference": "45d67753fb4865bb718e9a6c9be69cc9470137b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/robot-loader/zipball/45d67753fb4865bb718e9a6c9be69cc9470137b7",
+ "reference": "45d67753fb4865bb718e9a6c9be69cc9470137b7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "nette/utils": "^4.0",
+ "php": "8.0 - 8.4"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "autoload",
+ "class",
+ "interface",
+ "nette",
+ "trait"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/robot-loader/issues",
+ "source": "https://github.com/nette/robot-loader/tree/v4.0.3"
+ },
+ "time": "2024-06-18T20:26:39+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d",
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^4.0",
+ "php": "8.1 - 8.4"
+ },
+ "require-dev": {
+ "nette/tester": "^2.5.2",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.3.2"
+ },
+ "time": "2024-10-06T23:10:23+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v4.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2",
+ "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "8.0 - 8.4"
+ },
+ "conflict": {
+ "nette/finder": "<3",
+ "nette/schema": "<1.2.2"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "^2.5",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v4.0.7"
+ },
+ "time": "2025-06-03T04:55:08+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "ae59794362fe85e051a58ad36b289443f57be7a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9",
+ "reference": "ae59794362fe85e051a58ad36b289443f57be7a9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0"
+ },
+ "time": "2025-05-31T08:24:38+00:00"
+ },
+ {
+ "name": "phpstan/php-8-stubs",
+ "version": "0.4.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/php-8-stubs.git",
+ "reference": "66b0ffe2d4dba18f12ffee663cdbe31640819e7a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/php-8-stubs/zipball/66b0ffe2d4dba18f12ffee663cdbe31640819e7a",
+ "reference": "66b0ffe2d4dba18f12ffee663cdbe31640819e7a",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Php8StubsMap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT",
+ "PHP-3.01"
+ ],
+ "description": "PHP stubs extracted from php-src",
+ "support": {
+ "issues": "https://github.com/phpstan/php-8-stubs/issues",
+ "source": "https://github.com/phpstan/php-8-stubs/tree/0.4.14"
+ },
+ "time": "2025-06-16T07:31:03+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140",
+ "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^4.15",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.5",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0"
+ },
+ "time": "2024-10-13T11:25:22+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.4.23",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "9056771b8eca08d026cd3280deeec3cfd99c4d93"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/9056771b8eca08d026cd3280deeec3cfd99c4d93",
+ "reference": "9056771b8eca08d026cd3280deeec3cfd99c4d93",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.4.23"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-27T19:37:22+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-25T09:37:31+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125",
+ "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-20T20:19:01+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "apigen/apigen": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1"
+ },
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
+}
diff --git a/apigen/src/Filter.php b/apigen/src/Filter.php
new file mode 100644
index 0000000000..66f39c3bfb
--- /dev/null
+++ b/apigen/src/Filter.php
@@ -0,0 +1,170 @@
+namespacedName->toString();
+ if (Strings::startsWith($name, 'PhpParser\\')) {
+ return true;
+ }
+
+ if (!Strings::startsWith($name, 'PHPStan\\')) {
+ return false;
+ }
+
+ if (Strings::startsWith($name, 'PHPStan\\PhpDocParser\\')) {
+ return true;
+ }
+
+ if (Strings::startsWith($name, 'PHPStan\\BetterReflection\\')) {
+ return true;
+ }
+
+ if ($this->hasApiTag($node)) {
+ return true;
+ }
+
+ foreach ($node->getMethods() as $method) {
+ if ($this->hasApiTag($method)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function filterClassLikeTags(array $tags): bool
+ {
+ return parent::filterClassLikeTags($tags);
+ }
+
+ public function filterClassLikeInfo(ClassLikeInfo $info): bool
+ {
+ return parent::filterClassLikeInfo($info);
+ }
+
+ public function filterFunctionNode(Node\Stmt\Function_ $node): bool
+ {
+ $name = $node->namespacedName->toString();
+ if (!Strings::startsWith($name, 'PHPStan\\')) {
+ return false;
+ }
+
+ return $this->hasApiTag($node);
+ }
+
+ public function filterFunctionTags(array $tags): bool
+ {
+ return parent::filterFunctionTags($tags);
+ }
+
+ public function filterFunctionInfo(FunctionInfo $info): bool
+ {
+ return parent::filterFunctionInfo($info);
+ }
+
+ public function filterConstantNode(Node\Stmt\ClassConst $node): bool
+ {
+ return parent::filterConstantNode($node);
+ }
+
+ public function filterPropertyNode(Node\Stmt\Property $node): bool
+ {
+ return parent::filterPropertyNode($node);
+ }
+
+ public function filterPromotedPropertyNode(Node\Param $node): bool
+ {
+ return parent::filterPromotedPropertyNode($node);
+ }
+
+ public function filterMethodNode(Node\Stmt\ClassMethod $node): bool
+ {
+ return parent::filterMethodNode($node);
+ }
+
+ public function filterEnumCaseNode(Node\Stmt\EnumCase $node): bool
+ {
+ return parent::filterEnumCaseNode($node);
+ }
+
+ public function filterMemberTags(array $tags): bool
+ {
+ return parent::filterMemberTags($tags);
+ }
+
+ public function filterMemberInfo(ClassLikeInfo $classLike, MemberInfo $member): bool
+ {
+ $className = $classLike->name->full;
+ if (Strings::startsWith($className, 'PhpParser\\')) {
+ return true;
+ }
+ if (Strings::startsWith($className, 'PHPStan\\PhpDocParser\\')) {
+ return true;
+ }
+
+ if (Strings::startsWith($className, 'PHPStan\\BetterReflection\\')) {
+ return true;
+ }
+ if (!$member instanceof MethodInfo) {
+ return !Strings::startsWith($className, 'PHPStan\\');
+ }
+
+ if (!Strings::startsWith($className, 'PHPStan\\')) {
+ return false;
+ }
+
+ if (isset($classLike->tags['api'])) {
+ return true;
+ }
+
+ return isset($member->tags['api']);
+ }
+
+ private function hasApiTag(Node $node): bool
+ {
+ $classDoc = $this->extractPhpDoc($node);
+ $tags = $this->extractTags($classDoc);
+
+ return isset($tags['api']);
+ }
+
+ private function extractPhpDoc(Node $node): PhpDocNode
+ {
+ return $node->getAttribute('phpDoc') ?? new PhpDocNode([]);
+ }
+
+ /**
+ * @return PhpDocTagValueNode[][] indexed by [tagName][]
+ */
+ private function extractTags(PhpDocNode $node): array
+ {
+ $tags = [];
+
+ foreach ($node->getTags() as $tag) {
+ if ($tag->value instanceof InvalidTagValueNode) {
+ continue;
+ }
+
+ $tags[substr($tag->name, 1)][] = $tag->value;
+ }
+
+ return $tags;
+ }
+
+}
diff --git a/apigen/src/RendererFilter.php b/apigen/src/RendererFilter.php
new file mode 100644
index 0000000000..9f25bbd5d8
--- /dev/null
+++ b/apigen/src/RendererFilter.php
@@ -0,0 +1,113 @@
+children as $child) {
+ if ($this->filterNamespacePage($child)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->class as $class) {
+ if ($this->filterClassLikePage($class)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->interface as $interface) {
+ if ($this->filterClassLikePage($interface)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->trait as $trait) {
+ if ($this->filterClassLikePage($trait)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->enum as $enum) {
+ if ($this->filterClassLikePage($enum)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->exception as $exception) {
+ if ($this->filterClassLikePage($exception)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->function as $function) {
+ if ($this->filterFunctionPage($function)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function filterClassLikePage(ClassLikeInfo $classLike): bool
+ {
+ return $this->isClassRendered($classLike);
+ }
+
+ private function isClassRendered(ClassLikeInfo $classLike): bool
+ {
+ $className = $classLike->name->full;
+ if (Strings::startsWith($className, 'PhpParser\\')) {
+ return true;
+ }
+ if (Strings::startsWith($className, 'PHPStan\\PhpDocParser\\')) {
+ return true;
+ }
+
+ if (Strings::startsWith($className, 'PHPStan\\BetterReflection\\')) {
+ return true;
+ }
+
+ if (!Strings::startsWith($className, 'PHPStan\\')) {
+ return false;
+ }
+
+ if (isset($classLike->tags['api'])) {
+ return true;
+ }
+
+ foreach ($classLike->methods as $method) {
+ if (isset($method->tags['api'])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function filterFunctionPage(FunctionInfo $function): bool
+ {
+ return parent::filterFunctionPage($function); // todo
+ }
+
+ public function filterSourcePage(FileIndex $file): bool
+ {
+ return parent::filterSourcePage($file);
+ }
+
+}
diff --git a/apigen/theme/blocks/head.latte b/apigen/theme/blocks/head.latte
new file mode 100644
index 0000000000..16f25417e3
--- /dev/null
+++ b/apigen/theme/blocks/head.latte
@@ -0,0 +1,8 @@
+{define head}
+
+
+{/define}
+{define menu}
+ API Reference
+ {include #parent}
+{/define}
diff --git a/bin/functionMetadata_original.php b/bin/functionMetadata_original.php
index b7505a6f6f..ed5d223fa8 100644
--- a/bin/functionMetadata_original.php
+++ b/bin/functionMetadata_original.php
@@ -31,11 +31,14 @@
'array_merge' => ['hasSideEffects' => false],
'array_merge_recursive' => ['hasSideEffects' => false],
'array_pad' => ['hasSideEffects' => false],
+ 'array_pop' => ['hasSideEffects' => true],
'array_product' => ['hasSideEffects' => false],
+ 'array_push' => ['hasSideEffects' => true],
'array_rand' => ['hasSideEffects' => false],
'array_replace' => ['hasSideEffects' => false],
'array_replace_recursive' => ['hasSideEffects' => false],
'array_reverse' => ['hasSideEffects' => false],
+ 'array_shift' => ['hasSideEffects' => true],
'array_slice' => ['hasSideEffects' => false],
'array_sum' => ['hasSideEffects' => false],
'array_udiff' => ['hasSideEffects' => false],
@@ -45,6 +48,7 @@
'array_uintersect_assoc' => ['hasSideEffects' => false],
'array_uintersect_uassoc' => ['hasSideEffects' => false],
'array_unique' => ['hasSideEffects' => false],
+ 'array_unshift' => ['hasSideEffects' => true],
'array_values' => ['hasSideEffects' => false],
'asin' => ['hasSideEffects' => false],
'asinh' => ['hasSideEffects' => false],
@@ -61,8 +65,63 @@
'bcmod' => ['hasSideEffects' => false],
'bcmul' => ['hasSideEffects' => false],
// continue functionMap.php, line 424
+ 'chgrp' => ['hasSideEffects' => true],
+ 'chmod' => ['hasSideEffects' => true],
+ 'chown' => ['hasSideEffects' => true],
+ 'copy' => ['hasSideEffects' => true],
'count' => ['hasSideEffects' => false],
+ 'error_log' => ['hasSideEffects' => true],
+ 'fclose' => ['hasSideEffects' => true],
+ 'fflush' => ['hasSideEffects' => true],
+ 'fgetc' => ['hasSideEffects' => true],
+ 'fgetcsv' => ['hasSideEffects' => true],
+ 'fgets' => ['hasSideEffects' => true],
+ 'fgetss' => ['hasSideEffects' => true],
+ 'file_put_contents' => ['hasSideEffects' => true],
+ 'flock' => ['hasSideEffects' => true],
+ 'fopen' => ['hasSideEffects' => true],
+ 'fpassthru' => ['hasSideEffects' => true],
+ 'fputcsv' => ['hasSideEffects' => true],
+ 'fputs' => ['hasSideEffects' => true],
+ 'fread' => ['hasSideEffects' => true],
+ 'fscanf' => ['hasSideEffects' => true],
+ 'fseek' => ['hasSideEffects' => true],
+ 'ftruncate' => ['hasSideEffects' => true],
+ 'fwrite' => ['hasSideEffects' => true],
+ 'json_validate' => ['hasSideEffects' => false],
+ 'lchgrp' => ['hasSideEffects' => true],
+ 'lchown' => ['hasSideEffects' => true],
+ 'link' => ['hasSideEffects' => true],
+ 'mb_str_pad' => ['hasSideEffects' => false],
+ 'mkdir' => ['hasSideEffects' => true],
+ 'move_uploaded_file' => ['hasSideEffects' => true],
+ 'ob_clean' => ['hasSideEffects' => true],
+ 'ob_end_clean' => ['hasSideEffects' => true],
+ 'ob_end_flush' => ['hasSideEffects' => true],
+ 'ob_flush' => ['hasSideEffects' => true],
+ 'ob_get_clean' => ['hasSideEffects' => true],
+ 'ob_get_contents' => ['hasSideEffects' => true],
+ 'ob_get_length' => ['hasSideEffects' => true],
+ 'ob_get_level' => ['hasSideEffects' => true],
+ 'ob_get_status' => ['hasSideEffects' => true],
+ 'ob_list_handlers' => ['hasSideEffects' => true],
+ 'output_add_rewrite_var' => ['hasSideEffects' => true],
+ 'output_reset_rewrite_vars' => ['hasSideEffects' => true],
+ 'pclose' => ['hasSideEffects' => true],
+ 'popen' => ['hasSideEffects' => true],
+ 'readfile' => ['hasSideEffects' => true],
+ 'rename' => ['hasSideEffects' => true],
+ 'rewind' => ['hasSideEffects' => true],
+ 'rmdir' => ['hasSideEffects' => true],
'sprintf' => ['hasSideEffects' => false],
+ 'str_decrement' => ['hasSideEffects' => false],
+ 'str_increment' => ['hasSideEffects' => false],
+ 'symlink' => ['hasSideEffects' => true],
+ 'tempnam' => ['hasSideEffects' => true],
+ 'tmpfile' => ['hasSideEffects' => true],
+ 'touch' => ['hasSideEffects' => true],
+ 'umask' => ['hasSideEffects' => true],
+ 'unlink' => ['hasSideEffects' => true],
// random functions, do not have side effects but are not deterministic
'mt_rand' => ['hasSideEffects' => true],
@@ -71,6 +130,12 @@
'random_int' => ['hasSideEffects' => true],
// methods
+ 'DateTimeInterface::diff' => ['hasSideEffects' => false],
+ 'DateTimeInterface::format' => ['hasSideEffects' => false],
+ 'DateTimeInterface::getOffset' => ['hasSideEffects' => false],
+ 'DateTimeInterface::getTimestamp' => ['hasSideEffects' => false],
+ 'DateTimeInterface::getTimezone' => ['hasSideEffects' => false],
+
'DateTime::createFromFormat' => ['hasSideEffects' => false],
'DateTime::createFromImmutable' => ['hasSideEffects' => false],
'DateTime::getLastErrors' => ['hasSideEffects' => false],
@@ -104,4 +169,45 @@
'DateTimeImmutable::getOffset' => ['hasSideEffects' => false],
'DateTimeImmutable::getTimestamp' => ['hasSideEffects' => false],
'DateTimeImmutable::getTimezone' => ['hasSideEffects' => false],
+
+ // affects isConnected()
+ 'Redis::connect' => ['hasSideEffects' => true],
+ 'Redis::pconnect' => ['hasSideEffects' => true],
+
+ 'SplDoublyLinkedList::pop' => ['hasSideEffects' => true],
+ 'SplDoublyLinkedList::shift' => ['hasSideEffects' => true],
+
+ 'SplFileObject::fflush' => ['hasSideEffects' => true],
+ 'SplFileObject::fgetc' => ['hasSideEffects' => true],
+ 'SplFileObject::fgetcsv' => ['hasSideEffects' => true],
+ 'SplFileObject::fgets' => ['hasSideEffects' => true],
+ 'SplFileObject::fgetss' => ['hasSideEffects' => true],
+ 'SplFileObject::fpassthru' => ['hasSideEffects' => true],
+ 'SplFileObject::fputcsv' => ['hasSideEffects' => true],
+ 'SplFileObject::fread' => ['hasSideEffects' => true],
+ 'SplFileObject::fscanf' => ['hasSideEffects' => true],
+ 'SplFileObject::fseek' => ['hasSideEffects' => true],
+ 'SplFileObject::ftruncate' => ['hasSideEffects' => true],
+ 'SplFileObject::fwrite' => ['hasSideEffects' => true],
+
+ 'SplFixedArray::extract' => ['hasSideEffects' => true],
+
+ 'SplHead::extract' => ['hasSideEffects' => true],
+ 'SplHead::insert' => ['hasSideEffects' => true],
+ 'SplHead::recoverFromCorruption' => ['hasSideEffects' => true],
+
+ 'SplObjectStorage::addAll' => ['hasSideEffects' => true],
+ 'SplObjectStorage::attach' => ['hasSideEffects' => true],
+ 'SplObjectStorage::detach' => ['hasSideEffects' => true],
+ 'SplObjectStorage::removeAll' => ['hasSideEffects' => true],
+ 'SplObjectStorage::removeAllExcept' => ['hasSideEffects' => true],
+
+ 'SplPriorityQueue::extract' => ['hasSideEffects' => true],
+ 'SplPriorityQueue::insert' => ['hasSideEffects' => true],
+ 'SplPriorityQueue::recoverFromCorruption' => ['hasSideEffects' => true],
+
+ 'SplQueue::dequeue' => ['hasSideEffects' => true],
+
+ 'XmlReader::next' => ['hasSideEffects' => true],
+ 'XmlReader::read' => ['hasSideEffects' => true],
];
diff --git a/bin/generate-changelog.php b/bin/generate-changelog.php
deleted file mode 100755
index 5119d62564..0000000000
--- a/bin/generate-changelog.php
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env php
-setName('run');
- $this->addArgument('fromCommit', InputArgument::REQUIRED);
- $this->addArgument('toCommit', InputArgument::REQUIRED);
- }
-
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $commitLines = $this->exec(['git', 'log', sprintf('%s..%s', $input->getArgument('fromCommit'), $input->getArgument('toCommit')), '--reverse', '--pretty=%H %s']);
- $commits = array_map(function (string $line): array {
- [$hash, $message] = explode(' ', $line, 2);
-
- return [
- 'hash' => $hash,
- 'message' => $message
- ];
- }, explode("\n", $commitLines));
-
- $i = 0;
-
- foreach ($commits as $commit) {
- $searchPullRequestsResponse = Request::get(sprintf('https://api.github.com/search/issues?q=repo:phpstan/phpstan-src+%s', $commit['hash']))
- ->sendsAndExpectsType('application/json')
- ->basicAuth('ondrejmirtes', getenv('GITHUB_TOKEN'))
- ->send();
- if ($searchPullRequestsResponse->code !== 200) {
- $output->writeln(var_export($searchPullRequestsResponse->body, true));
- throw new \InvalidArgumentException((string) $searchPullRequestsResponse->code);
- }
- $searchPullRequestsResponse = $searchPullRequestsResponse->body;
-
- $searchIssuesResponse = Request::get(sprintf('https://api.github.com/search/issues?q=repo:phpstan/phpstan+%s', $commit['hash']))
- ->sendsAndExpectsType('application/json')
- ->basicAuth('ondrejmirtes', getenv('GITHUB_TOKEN'))
- ->send();
- if ($searchIssuesResponse->code !== 200) {
- $output->writeln(var_export($searchIssuesResponse->body, true));
- throw new \InvalidArgumentException((string) $searchIssuesResponse->code);
- }
- $searchIssuesResponse = $searchIssuesResponse->body;
- $items = array_merge($searchPullRequestsResponse->items, $searchIssuesResponse->items);
- $parenthesis = 'https://github.com/phpstan/phpstan-src/commit/' . $commit['hash'];
- $thanks = null;
- $issuesToReference = [];
- foreach ($items as $responseItem) {
- if (isset($responseItem->pull_request)) {
- $parenthesis = sprintf('[#%d](%s)', $responseItem->number, 'https://github.com/phpstan/phpstan-src/pull/' . $responseItem->number);
- $thanks = $responseItem->user->login;
- } else {
- $issuesToReference[] = sprintf('#%d', $responseItem->number);
- }
- }
-
- $output->writeln(sprintf('* %s (%s)%s%s', $commit['message'], $parenthesis, count($issuesToReference) > 0 ? ', ' . implode(', ', $issuesToReference) : '', $thanks !== null ? sprintf(', thanks @%s!', $thanks) : ''));
-
- if ($i > 0 && $i % 8 === 0) {
- sleep(60);
- }
-
- $i++;
- }
-
- return 0;
- }
-
- /**
- * @param string[] $commandParts
- * @return string
- */
- private function exec(array $commandParts): string
- {
- $command = implode(' ', array_map(function (string $part): string {
- return escapeshellarg($part);
- }, $commandParts));
-
- exec($command, $outputLines, $statusCode);
- $output = implode("\n", $outputLines);
- if ($statusCode !== 0) {
- throw new \InvalidArgumentException(sprintf('Command %s failed: %s', $command, $output));
- }
-
- return $output;
- }
-
- };
-
- $application = new \Symfony\Component\Console\Application();
- $application->add($command);
- $application->setDefaultCommand('run', true);
- $application->run();
-
-})();
diff --git a/bin/generate-function-metadata.php b/bin/generate-function-metadata.php
index a7e4ebd35a..d161d374e4 100755
--- a/bin/generate-function-metadata.php
+++ b/bin/generate-function-metadata.php
@@ -1,36 +1,87 @@
#!/usr/bin/env php
-create(ParserFactory::ONLY_PHP7);
- $finder = new Symfony\Component\Finder\Finder();
+ $parser = (new ParserFactory())->createForNewestSupportedVersion();
+ $finder = new Finder();
$finder->in(__DIR__ . '/../vendor/jetbrains/phpstorm-stubs')->files()->name('*.php');
- $visitor = new class() extends \PhpParser\NodeVisitorAbstract {
+ $visitor = new class() extends NodeVisitorAbstract {
/** @var string[] */
- public $functions = [];
+ public array $functions = [];
+
+ /** @var list */
+ public array $impureFunctions = [];
/** @var string[] */
- public $methods = [];
+ public array $methods = [];
public function enterNode(Node $node)
{
if ($node instanceof Node\Stmt\Function_) {
+ assert(isset($node->namespacedName));
+ $functionName = $node->namespacedName->toLowerString();
+
foreach ($node->attrGroups as $attrGroup) {
foreach ($attrGroup->attrs as $attr) {
- if ($attr->name->toString() === \JetBrains\PhpStorm\Pure::class) {
- $this->functions[] = $node->namespacedName->toLowerString();
- break;
+ if ($attr->name->toString() !== Pure::class) {
+ continue;
+ }
+
+ // The following functions have side effects, but their state is managed within the PHPStan scope:
+ if (in_array($functionName, [
+ 'stat',
+ 'lstat',
+ 'file_exists',
+ 'is_writable',
+ 'is_writeable',
+ 'is_readable',
+ 'is_executable',
+ 'is_file',
+ 'is_dir',
+ 'is_link',
+ 'filectime',
+ 'fileatime',
+ 'filemtime',
+ 'fileinode',
+ 'filegroup',
+ 'fileowner',
+ 'filesize',
+ 'filetype',
+ 'fileperms',
+ 'ftell',
+ 'ini_get',
+ 'function_exists',
+ 'json_last_error',
+ 'json_last_error_msg',
+ ], true)) {
+ $this->functions[] = $functionName;
+ break 2;
+ }
+
+ // PhpStorm stub's #[Pure(true)] means the function has side effects but its return value is important.
+ // In PHPStan's criteria, these functions are simply considered as ['hasSideEffect' => true].
+ if (isset($attr->args[0]->value->name->name) && $attr->args[0]->value->name->name === 'true') {
+ $this->impureFunctions[] = $functionName;
+ } else {
+ $this->functions[] = $functionName;
}
+ break 2;
}
}
}
@@ -38,14 +89,14 @@ public function enterNode(Node $node)
if ($node instanceof Node\Stmt\ClassMethod) {
$class = $node->getAttribute('parent');
if (!$class instanceof Node\Stmt\ClassLike) {
- throw new \PHPStan\ShouldNotHappenException($node->name->toString());
+ throw new ShouldNotHappenException($node->name->toString());
}
$className = $class->namespacedName->toString();
foreach ($node->attrGroups as $attrGroup) {
foreach ($attrGroup->attrs as $attr) {
- if ($attr->name->toString() === \JetBrains\PhpStorm\Pure::class) {
+ if ($attr->name->toString() === Pure::class) {
$this->methods[] = sprintf('%s::%s', $className, $node->name->toString());
- break;
+ break 2;
}
}
}
@@ -53,6 +104,7 @@ public function enterNode(Node $node)
return null;
}
+
};
foreach ($finder as $stubFile) {
@@ -63,24 +115,46 @@ public function enterNode(Node $node)
$traverser->addVisitor($visitor);
$traverser->traverse(
- $parser->parse(\PHPStan\File\FileReader::read($path))
+ $parser->parse(FileReader::read($path)),
);
}
+ /** @var array $metadata */
$metadata = require __DIR__ . '/functionMetadata_original.php';
foreach ($visitor->functions as $functionName) {
if (array_key_exists($functionName, $metadata)) {
if ($metadata[$functionName]['hasSideEffects']) {
- throw new \PHPStan\ShouldNotHappenException($functionName);
+ throw new ShouldNotHappenException($functionName);
}
}
$metadata[$functionName] = ['hasSideEffects' => false];
}
+ foreach ($visitor->impureFunctions as $functionName) {
+ if (in_array($functionName, [
+ 'class_exists',
+ 'enum_exists',
+ 'interface_exists',
+ 'trait_exists',
+ ], true)) {
+ continue;
+ }
+ if (array_key_exists($functionName, $metadata)) {
+ if (in_array($functionName, [
+ 'ob_get_contents',
+ ], true)) {
+ continue;
+ }
+ if (!$metadata[$functionName]['hasSideEffects']) {
+ throw new ShouldNotHappenException($functionName);
+ }
+ }
+ $metadata[$functionName] = ['hasSideEffects' => true];
+ }
foreach ($visitor->methods as $methodName) {
if (array_key_exists($methodName, $metadata)) {
if ($metadata[$methodName]['hasSideEffects']) {
- throw new \PHPStan\ShouldNotHappenException($methodName);
+ throw new ShouldNotHappenException($methodName);
}
}
$metadata[$methodName] = ['hasSideEffects' => false];
@@ -91,6 +165,20 @@ public function enterNode(Node $node)
$template = <<<'php'
true as a modification to bin/functionMetadata_original.php.
+ * 3) Contribute the #[Pure] functions without side effects to https://github.com/JetBrains/phpstorm-stubs
+ * 4) Once the PR from 3) is merged, please update the package here and run ./bin/generate-function-metadata.php.
+ */
+
return [
%s
];
@@ -105,6 +193,5 @@ public function enterNode(Node $node)
);
}
- \PHPStan\File\FileWriter::write(__DIR__ . '/../resources/functionMetadata.php', sprintf($template, $content));
-
+ FileWriter::write(__DIR__ . '/../resources/functionMetadata.php', sprintf($template, $content));
})();
diff --git a/bin/generate-rule-error-classes.php b/bin/generate-rule-error-classes.php
index 116910ee86..6b8284669e 100755
--- a/bin/generate-rule-error-classes.php
+++ b/bin/generate-rule-error-classes.php
@@ -1,7 +1,9 @@
#!/usr/bin/env php
- [$interface, $propertyName, $nativePropertyType, $phpDocPropertyType]) {
- if (($typeCombination & $typeNumber) === $typeNumber) {
- $interfaces[] = '\\' . $interface;
- if ($propertyName !== null && $nativePropertyType !== null && $phpDocPropertyType !== null) {
- $properties[] = [$propertyName, $nativePropertyType, $phpDocPropertyType];
- }
+ foreach ($ruleErrorTypes as $typeNumber => [$interface, $typeProperties]) {
+ if (!(($typeCombination & $typeNumber) === $typeNumber)) {
+ continue;
}
+
+ $interfaces[] = '\\' . $interface;
+ $properties = array_merge($properties, $typeProperties);
}
$phpClass = sprintf(
$template,
$typeCombination,
implode(', ', $interfaces),
- implode("\n\n\t", array_map(function (array $property): string {
- return sprintf("%spublic %s $%s;", $property[2] !== $property[1] ? sprintf("/** @var %s */\n\t", $property[2]) : '', $property[1], $property[0]);
- }, $properties)),
- implode("\n\n\t", array_map(function (array $property): string {
- return sprintf("%spublic function get%s(): %s\n\t{\n\t\treturn \$this->%s;\n\t}", $property[2] !== $property[1] ? sprintf("/**\n\t * @return %s\n\t */\n\t", $property[2]) : '', ucfirst($property[0]), $property[1], $property[0]);
- }, $properties))
+ implode("\n\n\t", array_map(static fn (array $property): string => sprintf('%spublic %s $%s;', $property[2] !== $property[1] ? sprintf("/** @var %s */\n\t", $property[2]) : '', $property[1], $property[0]), $properties)),
+ implode("\n\n\t", array_map(static fn (array $property): string => sprintf("%spublic function get%s()%s\n\t{\n\t\treturn \$this->%s;\n\t}", $property[2] !== $property[1] ? sprintf("/**\n\t * @return %s\n\t */\n\t", $property[2]) : '', ucfirst($property[0]), $property[1] === null ? '' : sprintf(': %s', $property[1]), $property[0]), $properties)),
);
file_put_contents(__DIR__ . '/../src/Rules/RuleErrors/RuleError' . $typeCombination . '.php', $phpClass);
diff --git a/bin/make-optional-parameters-required.php b/bin/make-optional-parameters-required.php
new file mode 100755
index 0000000000..5d2dd308c0
--- /dev/null
+++ b/bin/make-optional-parameters-required.php
@@ -0,0 +1,51 @@
+#!/usr/bin/env php
+createForHostVersion();
+ $traverser = new NodeTraverser(new CloningVisitor());
+ $printer = new Standard();
+ $finder = new Finder();
+ $finder->followLinks();
+
+ $removeParamDefaultTraverser = new NodeTraverser(new class () extends NodeVisitorAbstract {
+
+ public function enterNode(Node $node)
+ {
+ if (!$node instanceof Node\Param) {
+ return null;
+ }
+
+ $node->default = null;
+
+ return $node;
+ }
+
+ });
+ foreach ($finder->files()->name('*.php')->in($dir) as $fileInfo) {
+ $oldStmts = $parser->parse(file_get_contents($fileInfo->getPathname()));
+ $oldTokens = $parser->getTokens();
+
+ $newStmts = $traverser->traverse($oldStmts);
+ $newStmts = $removeParamDefaultTraverser->traverse($newStmts);
+
+ $newCode = $printer->printFormatPreserving($newStmts, $oldStmts, $oldTokens);
+ file_put_contents($fileInfo->getPathname(), $newCode);
+ }
+})();
diff --git a/bin/phpstan b/bin/phpstan
index 1a7a618c64..89bbe2c381 100755
--- a/bin/phpstan
+++ b/bin/phpstan
@@ -3,99 +3,126 @@
use PHPStan\Command\AnalyseCommand;
use PHPStan\Command\ClearResultCacheCommand;
+use PHPStan\Command\DiagnoseCommand;
+use PHPStan\Command\DumpParametersCommand;
use PHPStan\Command\FixerWorkerCommand;
use PHPStan\Command\WorkerCommand;
+use PHPStan\Internal\ComposerHelper;
use Symfony\Component\Console\Helper\ProgressBar;
(function () {
- error_reporting(E_ALL);
+ error_reporting(E_ALL & ~E_DEPRECATED);
ini_set('display_errors', 'stderr');
- if (version_compare(PHP_VERSION, '7.4.0', '<')) {
- // PHP earlier than 7.4.x with OpCache triggers a bug when we intercept
- // custom autoloaders' reads to discover file paths. See PHPStan #4881.
- ini_set('opcache.enable', 'Off');
- }
- gc_disable(); // performance boost
define('__PHPSTAN_RUNNING__', true);
+ $analysisStartTime = microtime(true);
+
$devOrPharLoader = require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../preload.php';
- $devOrPharLoader->unregister();
+ $composer = ComposerHelper::getComposerConfig(getcwd());
- $composerAutoloadFiles = $GLOBALS['__composer_autoload_files'];
- if (
- !array_key_exists('e88992873b7765f9b5710cab95ba5dd7', $composerAutoloadFiles)
- || !array_key_exists('3e76f7f02b41af8cea96018933f6b7e3', $composerAutoloadFiles)
- ) {
- echo "Composer autoloader changed\n";
- exit(1);
+ if ($composer !== null) {
+ $vendorDirectory = ComposerHelper::getVendorDirFromComposerConfig(getcwd(), $composer);
+ } else {
+ $vendorDirectory = getcwd() . '/' . 'vendor';
}
+ $devOrPharLoader->unregister();
- // empty the global variable so that unprefixed functions from user-space can be loaded
- $GLOBALS['__composer_autoload_files'] = [
- // fix unprefixed Hoa namespace - files already loaded
- 'e88992873b7765f9b5710cab95ba5dd7' => true,
- '3e76f7f02b41af8cea96018933f6b7e3' => true,
- ];
+ // fix missing key for vendor/hoa/protocol/Wrapper.php
+ $existingComposerAutoloadFiles = $GLOBALS['__composer_autoload_files'] ?? [];
+ $GLOBALS['__composer_autoload_files'] = array_merge(
+ $existingComposerAutoloadFiles,
+ array_fill_keys(['3e76f7f02b41af8cea96018933f6b7e3'], true),
+ );
- $autoloaderInWorkingDirectory = getcwd() . '/vendor/autoload.php';
+ $autoloaderInWorkingDirectory = $vendorDirectory . '/autoload.php';
$composerAutoloaderProjectPaths = [];
- if (is_file($autoloaderInWorkingDirectory)) {
+
+ /** @var array|false $autoloadFunctionsBefore */
+ $autoloadFunctionsBefore = spl_autoload_functions();
+
+ if (@is_file($autoloaderInWorkingDirectory)) {
$composerAutoloaderProjectPaths[] = dirname($autoloaderInWorkingDirectory, 2);
require_once $autoloaderInWorkingDirectory;
}
- $autoloadProjectAutoloaderFile = function (string $file) use (&$composerAutoloaderProjectPaths): void {
- $path = dirname(__DIR__) . $file;
- if (!extension_loaded('phar')) {
- if (is_file($path)) {
+ $path = dirname(__DIR__, 3) . '/autoload.php';
+ if (!extension_loaded('phar')) {
+ if (@is_file($path)) {
+ $composerAutoloaderProjectPaths[] = dirname($path, 2);
+
+ require_once $path;
+ }
+ } else {
+ $pharPath = \Phar::running(false);
+ if ($pharPath === '') {
+ if (@is_file($path)) {
$composerAutoloaderProjectPaths[] = dirname($path, 2);
require_once $path;
}
} else {
- $pharPath = \Phar::running(false);
- if ($pharPath === '') {
- if (is_file($path)) {
- $composerAutoloaderProjectPaths[] = dirname($path, 2);
+ $path = dirname($pharPath, 3) . '/autoload.php';
+ if (@is_file($path)) {
+ $composerAutoloaderProjectPaths[] = dirname($path, 2);
- require_once $path;
- }
- } else {
- $path = dirname($pharPath) . $file;
- if (is_file($path)) {
- $composerAutoloaderProjectPaths[] = dirname($path, 2);
+ require_once $path;
+ }
+ }
+ }
- require_once $path;
+ /** @var array|false $autoloadFunctionsAfter */
+ $autoloadFunctionsAfter = spl_autoload_functions();
+
+ if ($autoloadFunctionsBefore !== false && $autoloadFunctionsAfter !== false) {
+ $newAutoloadFunctions = [];
+ foreach ($autoloadFunctionsAfter as $after) {
+ if (
+ is_array($after)
+ && count($after) > 0
+ ) {
+ if (is_object($after[0])
+ && get_class($after[0]) === \Composer\Autoload\ClassLoader::class
+ ) {
+ continue;
+ }
+ if ($after[0] === 'PHPStan\\PharAutoloader') {
+ continue;
+ }
+ }
+ foreach ($autoloadFunctionsBefore as $before) {
+ if ($after === $before) {
+ continue 2;
}
}
+
+ $newAutoloadFunctions[] = $after;
}
- };
- $autoloadProjectAutoloaderFile('/../../autoload.php');
+ $GLOBALS['__phpstanAutoloadFunctions'] = $newAutoloadFunctions;
+ }
$devOrPharLoader->register(true);
- $version = 'Version unknown';
- try {
- $version = \Jean85\PrettyVersions::getVersion('phpstan/phpstan')->getPrettyVersion();
- } catch (\OutOfBoundsException $e) {
-
- }
-
$application = new \Symfony\Component\Console\Application(
'PHPStan - PHP Static Analysis Tool',
- $version
+ ComposerHelper::getPhpStanVersion()
);
$application->setDefaultCommand('analyse');
ProgressBar::setFormatDefinition('file_download', ' [%bar%] %percent:3s%% %fileSize%');
- $reversedComposerAutoloaderProjectPaths = array_reverse($composerAutoloaderProjectPaths);
- $application->add(new AnalyseCommand($reversedComposerAutoloaderProjectPaths));
+ $composerAutoloaderProjectPaths = array_map(function(string $s): string {
+ return str_replace(DIRECTORY_SEPARATOR, '/', $s);
+ }, $composerAutoloaderProjectPaths);
+ $reversedComposerAutoloaderProjectPaths = array_values(array_unique(array_reverse($composerAutoloaderProjectPaths)));
+
+ $application->add(new AnalyseCommand($reversedComposerAutoloaderProjectPaths, $analysisStartTime));
$application->add(new WorkerCommand($reversedComposerAutoloaderProjectPaths));
$application->add(new ClearResultCacheCommand($reversedComposerAutoloaderProjectPaths));
$application->add(new FixerWorkerCommand($reversedComposerAutoloaderProjectPaths));
+ $application->add(new DumpParametersCommand($reversedComposerAutoloaderProjectPaths));
+ $application->add(new DiagnoseCommand($reversedComposerAutoloaderProjectPaths));
$application->run();
})();
diff --git a/bin/transform-source.php b/bin/transform-source.php
deleted file mode 100755
index 8ecbefb023..0000000000
--- a/bin/transform-source.php
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env php
-type === null) {
- return null;
- }
- $docComment = $node->getDocComment();
- if ($docComment !== null) {
- $node->type = null;
- return $node;
- }
-
- $node->setDocComment(new \PhpParser\Comment\Doc(sprintf('/** @var %s */', $this->printType($node->type))));
- $node->type = null;
-
- return $node;
- }
-
- /**
- * @param Identifier|Name|NullableType|UnionType $type
- * @return string
- */
- private function printType($type): string
- {
- if ($type instanceof NullableType) {
- return $this->printType($type->type) . '|null';
- }
-
- if ($type instanceof UnionType) {
- throw new \Exception('UnionType not yet supported');
- }
-
- if ($type instanceof Name) {
- $name = $type->toString();
- if ($type->isFullyQualified()) {
- return '\\' . $name;
- }
-
- return $name;
- }
-
- if ($type instanceof Identifier) {
- return $type->name;
- }
-
- throw new \Exception('Unsupported type class');
- }
-
-}
-
-(function () {
- $dir = __DIR__ . '/../src';
-
- $lexer = new Lexer\Emulative([
- 'usedAttributes' => [
- 'comments',
- 'startLine', 'endLine',
- 'startTokenPos', 'endTokenPos',
- ],
- ]);
- $parser = new Parser\Php7($lexer, [
- 'useIdentifierNodes' => true,
- 'useConsistentVariableNodes' => true,
- 'useExpressionStatements' => true,
- 'useNopStatements' => false,
- ]);
- $nameResolver = new NodeVisitor\NameResolver(null, [
- 'replaceNodes' => false
- ]);
-
- $printer = new PrettyPrinter\Standard();
-
- $traverser = new NodeTraverser();
- $traverser->addVisitor(new NodeVisitor\CloningVisitor());
- $traverser->addVisitor($nameResolver);
- $traverser->addVisitor(new PhpPatcher($printer));
-
- $it = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($dir),
- RecursiveIteratorIterator::LEAVES_ONLY
- );
- foreach ($it as $file) {
- $fileName = $file->getPathname();
- if (!preg_match('/\.php$/', $fileName)) {
- continue;
- }
-
- $code = \PHPStan\File\FileReader::read($fileName);
- $origStmts = $parser->parse($code);
- $newCode = $printer->printFormatPreserving(
- $traverser->traverse($origStmts),
- $origStmts,
- $lexer->getTokens()
- );
-
- \PHPStan\File\FileWriter::write($fileName, $newCode);
- }
-})();
diff --git a/build-cs/composer.json b/build-cs/composer.json
deleted file mode 100644
index 562c29c0f4..0000000000
--- a/build-cs/composer.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "require-dev": {
- "consistence-community/coding-standard": "^3.11.0",
- "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
- "slevomat/coding-standard": "^6.3.0",
- "squizlabs/php_codesniffer": "^3.5.3"
- }
-}
diff --git a/build-cs/composer.lock b/build-cs/composer.lock
deleted file mode 100644
index 19ea198bf0..0000000000
--- a/build-cs/composer.lock
+++ /dev/null
@@ -1,325 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
- "This file is @generated automatically"
- ],
- "content-hash": "2bd0f4453d373af44aff8ec8868f82e9",
- "packages": [],
- "packages-dev": [
- {
- "name": "consistence-community/coding-standard",
- "version": "3.11.0",
- "source": {
- "type": "git",
- "url": "https://github.com/consistence-community/coding-standard.git",
- "reference": "20f5c3673013be606a62ba0b6624f5c0e43bb64e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/consistence-community/coding-standard/zipball/20f5c3673013be606a62ba0b6624f5c0e43bb64e",
- "reference": "20f5c3673013be606a62ba0b6624f5c0e43bb64e",
- "shasum": ""
- },
- "require": {
- "php": ">=7.4",
- "slevomat/coding-standard": "~6.4",
- "squizlabs/php_codesniffer": "~3.5.8"
- },
- "replace": {
- "consistence/coding-standard": "3.10.*"
- },
- "require-dev": {
- "phing/phing": "2.16.4",
- "php-parallel-lint/php-parallel-lint": "1.2.0",
- "phpunit/phpunit": "9.5.2"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Consistence\\": [
- "Consistence"
- ]
- },
- "classmap": [
- "Consistence"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Vašek Purchart",
- "email": "me@vasekpurchart.cz",
- "homepage": "http://vasekpurchart.cz"
- }
- ],
- "description": "Consistence - Coding Standard - PHP Code Sniffer rules",
- "keywords": [
- "Coding Standard",
- "PHPCodeSniffer",
- "codesniffer",
- "coding",
- "cs",
- "phpcs",
- "ruleset",
- "sniffer",
- "standard"
- ],
- "support": {
- "source": "https://github.com/consistence-community/coding-standard/tree/3.11.0"
- },
- "time": "2021-02-28T08:38:12+00:00"
- },
- {
- "name": "dealerdirect/phpcodesniffer-composer-installer",
- "version": "v0.7.1",
- "source": {
- "type": "git",
- "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
- "reference": "fe390591e0241955f22eb9ba327d137e501c771c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c",
- "reference": "fe390591e0241955f22eb9ba327d137e501c771c",
- "shasum": ""
- },
- "require": {
- "composer-plugin-api": "^1.0 || ^2.0",
- "php": ">=5.3",
- "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0"
- },
- "require-dev": {
- "composer/composer": "*",
- "phpcompatibility/php-compatibility": "^9.0",
- "sensiolabs/security-checker": "^4.1.0"
- },
- "type": "composer-plugin",
- "extra": {
- "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
- },
- "autoload": {
- "psr-4": {
- "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Franck Nijhof",
- "email": "franck.nijhof@dealerdirect.com",
- "homepage": "http://www.frenck.nl",
- "role": "Developer / IT Manager"
- }
- ],
- "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
- "homepage": "http://www.dealerdirect.com",
- "keywords": [
- "PHPCodeSniffer",
- "PHP_CodeSniffer",
- "code quality",
- "codesniffer",
- "composer",
- "installer",
- "phpcs",
- "plugin",
- "qa",
- "quality",
- "standard",
- "standards",
- "style guide",
- "stylecheck",
- "tests"
- ],
- "support": {
- "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
- "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
- },
- "time": "2020-12-07T18:04:37+00:00"
- },
- {
- "name": "phpstan/phpdoc-parser",
- "version": "0.4.9",
- "source": {
- "type": "git",
- "url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/98a088b17966bdf6ee25c8a4b634df313d8aa531",
- "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531",
- "shasum": ""
- },
- "require": {
- "php": "^7.1 || ^8.0"
- },
- "require-dev": {
- "consistence/coding-standard": "^3.5",
- "ergebnis/composer-normalize": "^2.0.2",
- "jakub-onderka/php-parallel-lint": "^0.9.2",
- "phing/phing": "^2.16.0",
- "phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^0.12.26",
- "phpstan/phpstan-strict-rules": "^0.12",
- "phpunit/phpunit": "^6.3",
- "slevomat/coding-standard": "^4.7.2",
- "symfony/process": "^4.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "0.4-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "PHPStan\\PhpDocParser\\": [
- "src/"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "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/master"
- },
- "time": "2020-08-03T20:32:43+00:00"
- },
- {
- "name": "slevomat/coding-standard",
- "version": "6.4.1",
- "source": {
- "type": "git",
- "url": "https://github.com/slevomat/coding-standard.git",
- "reference": "696dcca217d0c9da2c40d02731526c1e25b65346"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/696dcca217d0c9da2c40d02731526c1e25b65346",
- "reference": "696dcca217d0c9da2c40d02731526c1e25b65346",
- "shasum": ""
- },
- "require": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7",
- "php": "^7.1 || ^8.0",
- "phpstan/phpdoc-parser": "0.4.5 - 0.4.9",
- "squizlabs/php_codesniffer": "^3.5.6"
- },
- "require-dev": {
- "phing/phing": "2.16.3",
- "php-parallel-lint/php-parallel-lint": "1.2.0",
- "phpstan/phpstan": "0.12.48",
- "phpstan/phpstan-deprecation-rules": "0.12.5",
- "phpstan/phpstan-phpunit": "0.12.16",
- "phpstan/phpstan-strict-rules": "0.12.5",
- "phpunit/phpunit": "7.5.20|8.5.5|9.4.0"
- },
- "type": "phpcodesniffer-standard",
- "extra": {
- "branch-alias": {
- "dev-master": "6.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "SlevomatCodingStandard\\": "SlevomatCodingStandard"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
- "support": {
- "issues": "https://github.com/slevomat/coding-standard/issues",
- "source": "https://github.com/slevomat/coding-standard/tree/6.4.1"
- },
- "funding": [
- {
- "url": "https://github.com/kukulich",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
- "type": "tidelift"
- }
- ],
- "time": "2020-10-05T12:39:37+00:00"
- },
- {
- "name": "squizlabs/php_codesniffer",
- "version": "3.5.8",
- "source": {
- "type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "9d583721a7157ee997f235f327de038e7ea6dac4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4",
- "reference": "9d583721a7157ee997f235f327de038e7ea6dac4",
- "shasum": ""
- },
- "require": {
- "ext-simplexml": "*",
- "ext-tokenizer": "*",
- "ext-xmlwriter": "*",
- "php": ">=5.4.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
- },
- "bin": [
- "bin/phpcs",
- "bin/phpcbf"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Greg Sherwood",
- "role": "lead"
- }
- ],
- "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
- "keywords": [
- "phpcs",
- "standards"
- ],
- "support": {
- "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
- "source": "https://github.com/squizlabs/PHP_CodeSniffer",
- "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
- },
- "time": "2020-10-23T02:01:07+00:00"
- }
- ],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": [],
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": [],
- "platform-dev": [],
- "plugin-api-version": "2.0.0"
-}
diff --git a/build.xml b/build.xml
deleted file mode 100644
index ba53184e43..0000000000
--- a/build.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/PHPStan/Build/AttributeNamedArgumentsRule.php b/build/PHPStan/Build/AttributeNamedArgumentsRule.php
new file mode 100644
index 0000000000..fe520d007e
--- /dev/null
+++ b/build/PHPStan/Build/AttributeNamedArgumentsRule.php
@@ -0,0 +1,86 @@
+
+ */
+final class AttributeNamedArgumentsRule implements Rule
+{
+
+ public function __construct(private ReflectionProvider $reflectionProvider)
+ {
+ }
+
+ public function getNodeType(): string
+ {
+ return Attribute::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $attributeName = $node->name->toString();
+ if (!$this->reflectionProvider->hasClass($attributeName)) {
+ return [];
+ }
+
+ $attributeReflection = $this->reflectionProvider->getClass($attributeName);
+ if (!$attributeReflection->hasConstructor()) {
+ return [];
+ }
+ $constructor = $attributeReflection->getConstructor();
+ if (!$constructor->acceptsNamedArguments()->yes()) {
+ return [];
+ }
+
+ $variants = $constructor->getVariants();
+ if (count($variants) !== 1) {
+ return [];
+ }
+
+ $parameters = $variants[0]->getParameters();
+
+ foreach ($node->args as $arg) {
+ if ($arg->name !== null) {
+ break;
+ }
+
+ return [
+ RuleErrorBuilder::message(sprintf('Attribute %s is not using named arguments.', $node->name->toString()))
+ ->identifier('phpstan.attributeWithoutNamedArguments')
+ ->nonIgnorable()
+ ->fixNode($node, static function (Node $node) use ($parameters) {
+ $args = $node->args;
+ foreach ($args as $i => $arg) {
+ if ($arg->name !== null) {
+ break;
+ }
+
+ $parameterName = $parameters[$i]->getName();
+ if ($parameterName === '') {
+ throw new ShouldNotHappenException();
+ }
+
+ $arg->name = new Node\Identifier($parameterName);
+ }
+
+ return $node;
+ })
+ ->build(),
+ ];
+ }
+
+ return [];
+ }
+
+}
diff --git a/build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php b/build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php
new file mode 100644
index 0000000000..8e43bd2d47
--- /dev/null
+++ b/build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php
@@ -0,0 +1,62 @@
+getName(), [
+ 'getByType',
+ ], true);
+ }
+
+ public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type
+ {
+ if (count($methodCall->getArgs()) === 0) {
+ return ParametersAcceptorSelector::selectFromArgs(
+ $scope,
+ $methodCall->getArgs(),
+ $methodReflection->getVariants(),
+ )->getReturnType();
+ }
+ $argType = $scope->getType($methodCall->getArgs()[0]->value);
+ if (!$argType instanceof ConstantStringType) {
+ return ParametersAcceptorSelector::selectFromArgs(
+ $scope,
+ $methodCall->getArgs(),
+ $methodReflection->getVariants(),
+ )->getReturnType();
+ }
+
+ $type = new ObjectType($argType->getValue());
+ if ($methodReflection->getName() === 'getByType' && count($methodCall->getArgs()) >= 2) {
+ $argType = $scope->getType($methodCall->getArgs()[1]->value);
+ if ($argType->isTrue()->yes()) {
+ $type = TypeCombinator::addNull($type);
+ }
+ }
+
+ return $type;
+ }
+
+}
diff --git a/build/PHPStan/Build/FinalClassRule.php b/build/PHPStan/Build/FinalClassRule.php
new file mode 100644
index 0000000000..85b313bb03
--- /dev/null
+++ b/build/PHPStan/Build/FinalClassRule.php
@@ -0,0 +1,84 @@
+
+ */
+final class FinalClassRule implements Rule
+{
+
+ public function __construct(private FileHelper $fileHelper, private bool $skipTests = true)
+ {
+ }
+
+ public function getNodeType(): string
+ {
+ return InClassNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $classReflection = $node->getClassReflection();
+ if (!$classReflection->isClass()) {
+ return [];
+ }
+ if ($classReflection->isAbstract()) {
+ return [];
+ }
+ if ($classReflection->isFinal()) {
+ return [];
+ }
+ if ($classReflection->is(Type::class)) {
+ return [];
+ }
+
+ // exceptions
+ if (in_array($classReflection->getName(), [
+ FunctionVariant::class,
+ ExtendedFunctionVariant::class,
+ DummyParameter::class,
+ PhpFunctionFromParserNodeReflection::class,
+ ], true)) {
+ return [];
+ }
+
+ if ($this->skipTests && str_starts_with($this->fileHelper->normalizePath($scope->getFile()), $this->fileHelper->normalizePath(dirname(__DIR__, 3) . '/tests'))) {
+ return [];
+ }
+
+ $errorBuilder = RuleErrorBuilder::message(
+ sprintf('Class %s must be abstract or final.', $classReflection->getDisplayName()),
+ )->identifier('phpstan.finalClass');
+
+ $originalNode = $node->getOriginalNode();
+ if ($originalNode instanceof Node\Stmt\Class_ && $originalNode->name !== null) {
+ $errorBuilder->fixNode($originalNode, static function ($classNode) {
+ $classNode->flags |= Modifiers::FINAL;
+
+ return $classNode;
+ });
+ }
+
+ return [
+ $errorBuilder->build(),
+ ];
+ }
+
+}
diff --git a/build/PHPStan/Build/MemoizationPropertyRule.php b/build/PHPStan/Build/MemoizationPropertyRule.php
new file mode 100644
index 0000000000..7680c3eebe
--- /dev/null
+++ b/build/PHPStan/Build/MemoizationPropertyRule.php
@@ -0,0 +1,150 @@
+
+ */
+final class MemoizationPropertyRule implements Rule
+{
+
+ public function __construct(private FileHelper $fileHelper, private bool $skipTests = true)
+ {
+ }
+
+ public function getNodeType(): string
+ {
+ return If_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $ifNode = $node;
+
+ if (count($ifNode->stmts) !== 1
+ || !$ifNode->stmts[0] instanceof Expression
+ || count($ifNode->elseifs) !== 0
+ || $ifNode->else !== null
+ || !$ifNode->cond instanceof Identical
+ || !$this->isSupportedFetchNode($ifNode->cond->left)
+ || !$ifNode->cond->right instanceof ConstFetch
+ || strcasecmp($ifNode->cond->right->name->name, 'null') !== 0
+ ) {
+ return [];
+ }
+
+ $ifThenNode = $ifNode->stmts[0]->expr;
+ if (!$ifThenNode instanceof Assign || !$this->isSupportedFetchNode($ifThenNode->var)) {
+ return [];
+ }
+
+ if ($this->areNodesNotEqual($ifNode->cond->left, [$ifThenNode->var])) {
+ return [];
+ }
+
+ if ($this->skipTests && str_starts_with($this->fileHelper->normalizePath($scope->getFile()), $this->fileHelper->normalizePath(dirname(__DIR__, 3) . '/tests'))) {
+ return [];
+ }
+
+ $errorBuilder = RuleErrorBuilder::message('This initializing if statement can be replaced with null coalescing assignment operator (??=).')
+ ->fixNode($node, static fn (If_ $node) => new Expression(new Coalesce($ifThenNode->var, $ifThenNode->expr)))
+ ->identifier('phpstan.memoizationProperty');
+
+ return [
+ $errorBuilder->build(),
+ ];
+ }
+
+ /**
+ * @phpstan-assert-if-true PropertyFetch|StaticPropertyFetch $node
+ */
+ private function isSupportedFetchNode(?Expr $node): bool
+ {
+ return $node instanceof PropertyFetch || $node instanceof StaticPropertyFetch;
+ }
+
+ /**
+ * @param list $otherNodes
+ */
+ private function areNodesNotEqual(PropertyFetch|StaticPropertyFetch $node, array $otherNodes): bool
+ {
+ if ($node instanceof PropertyFetch) {
+ if (!$node->var instanceof Variable
+ || !is_string($node->var->name)
+ || !$node->name instanceof Identifier
+ ) {
+ return true;
+ }
+
+ foreach ($otherNodes as $otherNode) {
+ if (!$otherNode instanceof PropertyFetch) {
+ return true;
+ }
+ if (!$otherNode->var instanceof Variable
+ || !is_string($otherNode->var->name)
+ || !$otherNode->name instanceof Identifier
+ ) {
+ return true;
+ }
+
+ if ($node->var->name !== $otherNode->var->name
+ || $node->name->name !== $otherNode->name->name
+ ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ if (!$node->class instanceof Name || !$node->name instanceof VarLikeIdentifier) {
+ return true;
+ }
+
+ foreach ($otherNodes as $otherNode) {
+ if (!$otherNode instanceof StaticPropertyFetch) {
+ return true;
+ }
+
+ if (!$otherNode->class instanceof Name
+ || !$otherNode->name instanceof VarLikeIdentifier
+ ) {
+ return true;
+ }
+
+ if ($node->class->toLowerString() !== $otherNode->class->toLowerString()
+ || $node->name->toString() !== $otherNode->name->toString()
+ ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/build/PHPStan/Build/NamedArgumentsRule.php b/build/PHPStan/Build/NamedArgumentsRule.php
new file mode 100644
index 0000000000..b44a10ddea
--- /dev/null
+++ b/build/PHPStan/Build/NamedArgumentsRule.php
@@ -0,0 +1,237 @@
+
+ */
+final class NamedArgumentsRule implements Rule
+{
+
+ public function __construct(
+ private ReflectionProvider $reflectionProvider,
+ private PhpVersion $phpVersion,
+ )
+ {
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\CallLike::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$this->phpVersion->supportsNamedArguments()) {
+ return [];
+ }
+
+ if ($node->isFirstClassCallable()) {
+ return [];
+ }
+
+ if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
+ if ($this->reflectionProvider->hasFunction($node->name, $scope)) {
+ $function = $this->reflectionProvider->getFunction($node->name, $scope);
+ $variants = $function->getVariants();
+ if (count($variants) !== 1) {
+ return [];
+ }
+
+ return $this->processArgs($variants[0], $scope, $node);
+ }
+ }
+
+ if ($node instanceof Node\Expr\New_ && $node->class instanceof Node\Name) {
+ if ($this->reflectionProvider->hasClass($node->class->toString())) {
+ $class = $this->reflectionProvider->getClass($node->class->toString());
+ if ($class->hasConstructor()) {
+ $constructor = $class->getConstructor();
+ $variants = $constructor->getVariants();
+ if (count($variants) !== 1) {
+ return [];
+ }
+
+ return $this->processArgs($variants[0], $scope, $node);
+ }
+ }
+ }
+
+ if ($node instanceof Node\Expr\StaticCall && $node->class instanceof Node\Name && $node->name instanceof Node\Identifier) {
+ $className = $scope->resolveName($node->class);
+ if ($this->reflectionProvider->hasClass($className)) {
+ $class = $this->reflectionProvider->getClass($className);
+ if ($class->hasNativeMethod($node->name->toString())) {
+ $method = $class->getNativeMethod($node->name->toString());
+ $variants = $method->getVariants();
+ if (count($variants) !== 1) {
+ return [];
+ }
+
+ return $this->processArgs($variants[0], $scope, $node);
+ }
+ }
+ }
+
+ return [];
+ }
+
+ /**
+ * @return list
+ */
+ private function processArgs(ExtendedParametersAcceptor $acceptor, Scope $scope, Node\Expr\FuncCall|Node\Expr\New_|Node\Expr\StaticCall $node): array
+ {
+ if ($acceptor->isVariadic()) {
+ return [];
+ }
+ $normalizedArgs = ArgumentsNormalizer::reorderArgs($acceptor, $node->getArgs());
+ if ($normalizedArgs === null) {
+ return [];
+ }
+
+ $hasNamedArgument = false;
+ foreach ($node->getArgs() as $arg) {
+ if ($arg->name === null) {
+ continue;
+ }
+
+ $hasNamedArgument = true;
+ break;
+ }
+
+ $errorBuilders = [];
+ $parameters = $acceptor->getParameters();
+ $defaultValueWasPassed = [];
+ foreach ($normalizedArgs as $i => $normalizedArg) {
+ if ($normalizedArg->unpack) {
+ return [];
+ }
+ $parameter = $parameters[$i];
+ if ($parameter->getDefaultValue() === null) {
+ continue;
+ }
+ if (!$parameter->passedByReference()->no()) {
+ continue;
+ }
+ $argValue = $scope->getType($normalizedArg->value);
+ if ($normalizedArg->name !== null) {
+ continue;
+ }
+
+ /** @var Node\Arg|null $originalArg */
+ $originalArg = $normalizedArg->getAttribute(ArgumentsNormalizer::ORIGINAL_ARG_ATTRIBUTE);
+ if ($originalArg === null) {
+ if ($hasNamedArgument) {
+ // this is an optional parameter not passed by the user, but filled in by ArgumentsNormalizer
+ continue;
+ }
+ }
+
+ if (count($parameter->getDefaultValue()->getFiniteTypes()) === 0) {
+ continue;
+ }
+
+ if (!$argValue->equals($parameter->getDefaultValue())) {
+ if (count($defaultValueWasPassed) > 0) {
+ $errorBuilders[] = RuleErrorBuilder::message(sprintf(
+ 'You\'re passing a non-default value %s to parameter $%s but previous %s (%s). You can skip %s and use named argument for $%s instead.',
+ $argValue->describe(VerbosityLevel::precise()),
+ $parameter->getName(),
+ count($defaultValueWasPassed) === 1 ? 'argument is passing default value to its parameter' : 'arguments are passing default values to their parameters',
+ implode(', ', $defaultValueWasPassed),
+ count($defaultValueWasPassed) === 1 ? 'it' : 'them',
+ $parameter->getName(),
+ ))
+ ->identifier('phpstan.namedArgument')
+ ->line($normalizedArg->getStartLine())
+ ->nonIgnorable();
+ }
+ continue;
+ } else {
+ if ($originalArg !== null && $originalArg->name !== null) {
+ $errorBuilders[] = RuleErrorBuilder::message(sprintf('Named argument $%s can be omitted, type %s is the same as the default value.', $originalArg->name, $argValue->describe(VerbosityLevel::precise())))
+ ->identifier('phpstan.namedArgumentWithDefaultValue')
+ ->nonIgnorable();
+ continue;
+ }
+ }
+
+ $defaultValueWasPassed[] = '$' . $parameter->getName();
+ }
+
+ if (count($errorBuilders) > 0) {
+ $errorBuilders[0]->fixNode($node, static function ($node) use ($acceptor, $hasNamedArgument, $parameters, $scope) {
+ $normalizedArgs = ArgumentsNormalizer::reorderArgs($acceptor, $node->getArgs());
+ if ($normalizedArgs === null) {
+ return $node;
+ }
+
+ $newArgs = [];
+ $skippedOptional = false;
+ foreach ($normalizedArgs as $i => $normalizedArg) {
+ /** @var Node\Arg|null $originalArg */
+ $originalArg = $normalizedArg->getAttribute(ArgumentsNormalizer::ORIGINAL_ARG_ATTRIBUTE);
+ if ($originalArg === null) {
+ if ($hasNamedArgument) {
+ // this is an optional parameter not passed by the user, but filled in by ArgumentsNormalizer
+ continue;
+ }
+
+ $originalArg = $normalizedArg;
+ }
+ $parameter = $parameters[$i];
+ if ($parameter->getDefaultValue() === null) {
+ $newArgs[] = $originalArg;
+ continue;
+ }
+ if (!$parameter->passedByReference()->no()) {
+ $newArgs[] = $originalArg;
+ continue;
+ }
+ if (count($parameter->getDefaultValue()->getFiniteTypes()) === 0) {
+ $newArgs[] = $originalArg;
+ continue;
+ }
+ $argValue = $scope->getType($normalizedArg->value);
+ if ($argValue->equals($parameter->getDefaultValue())) {
+ $skippedOptional = true;
+ continue;
+ }
+
+ if ($skippedOptional) {
+ if ($parameter->getName() === '') {
+ throw new ShouldNotHappenException();
+ }
+
+ $newArgs[] = new Node\Arg($originalArg->value, $originalArg->byRef, $originalArg->unpack, $originalArg->getAttributes(), new Node\Identifier($parameter->getName()));
+ continue;
+ }
+
+ $newArgs[] = $originalArg;
+ }
+
+ $node->args = $newArgs;
+
+ return $node;
+ });
+ }
+
+ return array_map(static fn ($builder) => $builder->build(), $errorBuilders);
+ }
+
+}
diff --git a/build/PHPStan/Build/OrChainIdenticalComparisonToInArrayRule.php b/build/PHPStan/Build/OrChainIdenticalComparisonToInArrayRule.php
new file mode 100644
index 0000000000..01762e05ca
--- /dev/null
+++ b/build/PHPStan/Build/OrChainIdenticalComparisonToInArrayRule.php
@@ -0,0 +1,162 @@
+
+ */
+final class OrChainIdenticalComparisonToInArrayRule implements Rule
+{
+
+ public function __construct(
+ private ExprPrinter $printer,
+ private FileHelper $fileHelper,
+ private bool $skipTests = true,
+ )
+ {
+ }
+
+ public function getNodeType(): string
+ {
+ return If_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $errors = $this->processConditionNode($node->cond, $scope);
+ foreach ($node->elseifs as $elseifCondNode) {
+ $errors = array_merge($errors, $this->processConditionNode($elseifCondNode->cond, $scope));
+ }
+
+ return $errors;
+ }
+
+ /**
+ * @return list
+ */
+ public function processConditionNode(Expr $condNode, Scope $scope): array
+ {
+ $comparisons = $this->unpackOrChain($condNode);
+ if (count($comparisons) < 2) {
+ return [];
+ }
+
+ $firstComparison = array_shift($comparisons);
+ if (!$firstComparison instanceof Identical) {
+ return [];
+ }
+
+ $subjectAndValue = $this->getSubjectAndValue($firstComparison);
+ if ($subjectAndValue === null) {
+ return [];
+ }
+
+ if ($this->skipTests && str_starts_with($this->fileHelper->normalizePath($scope->getFile()), $this->fileHelper->normalizePath(dirname(__DIR__, 3) . '/tests'))) {
+ return [];
+ }
+
+ $subjectNode = $subjectAndValue['subject'];
+ $subjectStr = $this->printer->printExpr($subjectNode);
+ $values = [$subjectAndValue['value']];
+
+ foreach ($comparisons as $comparison) {
+ if (!$comparison instanceof Identical) {
+ return [];
+ }
+
+ $currentSubjectAndValue = $this->getSubjectAndValue($comparison);
+ if ($currentSubjectAndValue === null) {
+ return [];
+ }
+
+ if ($this->printer->printExpr($currentSubjectAndValue['subject']) !== $subjectStr) {
+ return [];
+ }
+
+ $values[] = $currentSubjectAndValue['value'];
+ }
+
+ $errorBuilder = RuleErrorBuilder::message('This chain of identical comparisons can be simplified using in_array().')
+ ->line($condNode->getStartLine())
+ ->fixNode($condNode, static fn (Expr $node) => self::createInArrayCall($subjectNode, $values))
+ ->identifier('or.chainIdenticalComparison');
+
+ return [$errorBuilder->build()];
+ }
+
+ /**
+ * @return list
+ */
+ private function unpackOrChain(Expr $node): array
+ {
+ if ($node instanceof BooleanOr) {
+ return [...$this->unpackOrChain($node->left), ...$this->unpackOrChain($node->right)];
+ }
+
+ return [$node];
+ }
+
+ /**
+ * @phpstan-assert-if-true Scalar|ClassConstFetch|ConstFetch $node
+ */
+ private static function isSubjectNode(Expr $node): bool
+ {
+ return $node instanceof Scalar || $node instanceof ClassConstFetch || $node instanceof ConstFetch;
+ }
+
+ /**
+ * @return array{subject: Expr, value: Scalar|ClassConstFetch|ConstFetch}|null
+ */
+ private function getSubjectAndValue(Identical $comparison): ?array
+ {
+ if (self::isSubjectNode($comparison->left) && !self::isSubjectNode($comparison->left)) {
+ return ['subject' => $comparison->right, 'value' => $comparison->left];
+ }
+
+ if (!self::isSubjectNode($comparison->left) && self::isSubjectNode($comparison->right)) {
+ return ['subject' => $comparison->left, 'value' => $comparison->right];
+ }
+
+ return null;
+ }
+
+ /**
+ * @param list $values
+ */
+ private static function createInArrayCall(Expr $subjectNode, array $values): FuncCall
+ {
+ return new FuncCall(new Name('\in_array'), [
+ new Arg($subjectNode),
+ new Arg(new Array_(array_map(static fn ($value) => new ArrayItem($value), $values))),
+ new Arg(new ConstFetch(new Name('true'))),
+ ]);
+ }
+
+}
diff --git a/build/PHPStan/Build/OverrideAttributeThirdPartyMethodRule.php b/build/PHPStan/Build/OverrideAttributeThirdPartyMethodRule.php
new file mode 100644
index 0000000000..3249fab3e1
--- /dev/null
+++ b/build/PHPStan/Build/OverrideAttributeThirdPartyMethodRule.php
@@ -0,0 +1,92 @@
+
+ */
+final class OverrideAttributeThirdPartyMethodRule implements Rule
+{
+
+ public function __construct(
+ private PhpVersion $phpVersion,
+ private MethodPrototypeFinder $methodPrototypeFinder,
+ )
+ {
+ }
+
+ public function getNodeType(): string
+ {
+ return InClassMethodNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $method = $node->getMethodReflection();
+ $prototypeData = $this->methodPrototypeFinder->findPrototype($node->getClassReflection(), $method->getName());
+ if ($prototypeData === null) {
+ return [];
+ }
+
+ [$prototype, $prototypeDeclaringClass] = $prototypeData;
+
+ if (str_starts_with($prototypeDeclaringClass->getName(), 'PHPStan\\')) {
+ if (
+ !str_starts_with($prototypeDeclaringClass->getName(), 'PHPStan\\PhpDocParser\\')
+ && !str_starts_with($prototypeDeclaringClass->getName(), 'PHPStan\\BetterReflection\\')
+ ) {
+ return [];
+ }
+ }
+
+ $messages = [];
+ if (
+ $this->phpVersion->supportsOverrideAttribute()
+ && !$scope->isInTrait()
+ && !$this->hasOverrideAttribute($node->getOriginalNode())
+ ) {
+ $messages[] = RuleErrorBuilder::message(sprintf(
+ 'Method %s::%s() overrides 3rd party method %s::%s() but is missing the #[\Override] attribute.',
+ $method->getDeclaringClass()->getDisplayName(),
+ $method->getName(),
+ $prototypeDeclaringClass->getDisplayName(true),
+ $prototype->getName(),
+ ))
+ ->identifier('phpstan.missing3rdPartyOverride')
+ ->fixNode($node->getOriginalNode(), static function (Node\Stmt\ClassMethod $method) {
+ $method->attrGroups[] = new Node\AttributeGroup([
+ new Attribute(new Node\Name\FullyQualified('Override')),
+ ]);
+
+ return $method;
+ })
+ ->build();
+ }
+
+ return $messages;
+ }
+
+ private function hasOverrideAttribute(Node\Stmt\ClassMethod $method): bool
+ {
+ foreach ($method->attrGroups as $attrGroup) {
+ foreach ($attrGroup->attrs as $attr) {
+ if ($attr->name->toLowerString() === 'override') {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php b/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php
index 1a1207e723..22812240f4 100644
--- a/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php
+++ b/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php
@@ -6,13 +6,10 @@
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
-use PHPStan\Type\Constant\ConstantBooleanType;
-use PHPStan\Type\Constant\ConstantStringType;
-use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
-class ServiceLocatorDynamicReturnTypeExtension implements \PHPStan\Type\DynamicMethodReturnTypeExtension
+final class ServiceLocatorDynamicReturnTypeExtension implements \PHPStan\Type\DynamicMethodReturnTypeExtension
{
public function getClass(): string
@@ -31,22 +28,23 @@ public function isMethodSupported(MethodReflection $methodReflection): bool
public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type
{
if (count($methodCall->getArgs()) === 0) {
- return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
- }
- $argType = $scope->getType($methodCall->getArgs()[0]->value);
- if (!$argType instanceof ConstantStringType) {
- return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ return ParametersAcceptorSelector::selectFromArgs($scope, $methodCall->getArgs(), $methodReflection->getVariants())->getReturnType();
}
- $type = new ObjectType($argType->getValue());
- if ($methodReflection->getName() === 'getByType' && count($methodCall->getArgs()) >= 2) {
- $argType = $scope->getType($methodCall->getArgs()[1]->value);
- if ($argType instanceof ConstantBooleanType && $argType->getValue()) {
- $type = TypeCombinator::addNull($type);
+ $returnType = ParametersAcceptorSelector::selectFromArgs($scope, $methodCall->getArgs(), $methodReflection->getVariants())->getReturnType();
+
+ if ($methodReflection->getName() === 'getByType') {
+ if (count($methodCall->getArgs()) < 2) {
+ $returnType = TypeCombinator::removeNull($returnType);
+ } else {
+ $argType = $scope->getType($methodCall->getArgs()[1]->value);
+ if ($argType->isTrue()->yes()) {
+ $returnType = TypeCombinator::removeNull($returnType);
+ }
}
}
- return $type;
+ return $returnType;
}
}
diff --git a/build/PHPStan/Build/SkipTestsWithRequiresPhpAttributeRule.php b/build/PHPStan/Build/SkipTestsWithRequiresPhpAttributeRule.php
new file mode 100644
index 0000000000..05de1553e2
--- /dev/null
+++ b/build/PHPStan/Build/SkipTestsWithRequiresPhpAttributeRule.php
@@ -0,0 +1,130 @@
+
+ */
+final class SkipTestsWithRequiresPhpAttributeRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return InClassMethodNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $methodReflection = $node->getMethodReflection();
+ if (!$methodReflection->getDeclaringClass()->is(TestCase::class)) {
+ return [];
+ }
+
+ $originalNode = $node->getOriginalNode();
+ if ($originalNode->stmts === null) {
+ return [];
+ }
+
+ if (count($originalNode->stmts) === 0) {
+ return [];
+ }
+
+ $firstStmt = $originalNode->stmts[0];
+ if (!$firstStmt instanceof Node\Stmt\If_) {
+ return [];
+ }
+
+ if (!$firstStmt->cond instanceof Node\Expr\BinaryOp) {
+ return [];
+ }
+
+ switch (get_class($firstStmt->cond)) {
+ case Node\Expr\BinaryOp\SmallerOrEqual::class:
+ $inverseBinaryOpSigil = '>';
+ break;
+ case Node\Expr\BinaryOp\Smaller::class:
+ $inverseBinaryOpSigil = '>=';
+ break;
+ case Node\Expr\BinaryOp\GreaterOrEqual::class:
+ $inverseBinaryOpSigil = '<';
+ break;
+ case Node\Expr\BinaryOp\Greater::class:
+ $inverseBinaryOpSigil = '<=';
+ break;
+ case Node\Expr\BinaryOp\Identical::class:
+ $inverseBinaryOpSigil = '!==';
+ break;
+ case Node\Expr\BinaryOp\NotIdentical::class:
+ $inverseBinaryOpSigil = '===';
+ break;
+ default:
+ throw new ShouldNotHappenException('No inverse comparison specified for ' . get_class($firstStmt->cond));
+ }
+
+ if (!$firstStmt->cond->left instanceof Node\Expr\ConstFetch || $firstStmt->cond->left->name->toString() !== 'PHP_VERSION_ID') {
+ return [];
+ }
+
+ if (!$firstStmt->cond->right instanceof Node\Scalar\Int_) {
+ return [];
+ }
+
+ if (count($firstStmt->stmts) !== 1) {
+ return [];
+ }
+
+ $ifStmt = $firstStmt->stmts[0];
+ if (!$ifStmt instanceof Node\Stmt\Expression) {
+ return [];
+ }
+
+ if (!$ifStmt->expr instanceof Node\Expr\StaticCall && !$ifStmt->expr instanceof Node\Expr\MethodCall) {
+ return [];
+ }
+
+ if (!$ifStmt->expr->name instanceof Node\Identifier || $ifStmt->expr->name->toLowerString() !== 'marktestskipped') {
+ return [];
+ }
+
+ $phpVersion = new PhpVersion($firstStmt->cond->right->value);
+
+ return [
+ RuleErrorBuilder::message('Skip tests with #[RequiresPhp] attribute instead.')
+ ->identifier('phpstan.skipTestsRequiresPhp')
+ ->line($firstStmt->getStartLine())
+ ->fixNode($originalNode, static function (Node\Stmt\ClassMethod $node) use ($phpVersion, $inverseBinaryOpSigil) {
+ $stmts = $node->stmts;
+ if ($stmts === null) {
+ return $node;
+ }
+
+ unset($stmts[0]);
+ $node->stmts = array_values($stmts);
+ $node->attrGroups[] = new Node\AttributeGroup([
+ new Attribute(new Node\Name\FullyQualified('PHPUnit\\Framework\\Attributes\\RequiresPhp'), [
+ new Node\Arg(new Node\Scalar\String_(sprintf('%s %s', $inverseBinaryOpSigil, $phpVersion->getVersionString()))),
+ ]),
+ ]);
+
+ return $node;
+ })
+ ->build(),
+ ];
+ }
+
+
+}
diff --git a/build/baseline-32bit.neon b/build/baseline-32bit.neon
new file mode 100644
index 0000000000..82adbae209
--- /dev/null
+++ b/build/baseline-32bit.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Parameter \\#1 \\$value of class PHPStan\\\\Type\\\\Constant\\\\ConstantIntegerType constructor expects int, float given\\.$#"
+ count: 2
+ path: ../src/Analyser/MutatingScope.php
diff --git a/build/baseline-7.4.neon b/build/baseline-7.4.neon
index db957bbc2f..b28b9f9f5d 100644
--- a/build/baseline-7.4.neon
+++ b/build/baseline-7.4.neon
@@ -4,10 +4,6 @@ parameters:
message: "#^Class PHPStan\\\\Command\\\\ErrorsConsoleStyle has an uninitialized property \\$progressBar\\. Give it default value or assign it in the constructor\\.$#"
count: 1
path: ../src/Command/ErrorsConsoleStyle.php
- -
- message: "#^Class PHPStan\\\\DependencyInjection\\\\Reflection\\\\DirectClassReflectionExtensionRegistryProvider has an uninitialized property \\$broker\\. Give it default value or assign it in the constructor\\.$#"
- count: 1
- path: ../src/DependencyInjection/Reflection/DirectClassReflectionExtensionRegistryProvider.php
-
message: "#^Class PHPStan\\\\Parallel\\\\ParallelAnalyser has an uninitialized property \\$processPool\\. Give it default value or assign it in the constructor\\.$#"
@@ -18,10 +14,6 @@ parameters:
message: "#^Class PHPStan\\\\Parallel\\\\Process has an uninitialized property \\$process\\. Give it default value or assign it in the constructor\\.$#"
count: 1
path: ../src/Parallel/Process.php
- -
- message: "#^Class PHPStan\\\\Parallel\\\\Process has an uninitialized property \\$in\\. Give it default value or assign it in the constructor\\.$#"
- count: 1
- path: ../src/Parallel/Process.php
-
message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$phpDocNodes\\. Give it default value or assign it in the constructor\\.$#"
count: 1
@@ -55,11 +47,22 @@ parameters:
message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$phpDocNodeResolver\\. Give it default value or assign it in the constructor\\.$#"
count: 1
path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$reflectionProvider\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
-
message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$fileName\\. Give it default value or assign it in the constructor\\.$#"
count: 1
path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
+ -
+ message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$contents\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
+
-
message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$classNodes\\. Give it default value or assign it in the constructor\\.$#"
count: 1
@@ -74,7 +77,3 @@ parameters:
message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$constantNodes\\. Give it default value or assign it in the constructor\\.$#"
count: 1
path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
- -
- message: "#^Class PHPStan\\\\Reflection\\\\ReflectionProvider\\\\SetterReflectionProviderProvider has an uninitialized property \\$reflectionProvider\\. Give it default value or assign it in the constructor\\.$#"
- count: 1
- path: ../src/Reflection/ReflectionProvider/SetterReflectionProviderProvider.php
diff --git a/build/baseline-8.0.neon b/build/baseline-8.0.neon
index b9be86042c..59bcf6e715 100644
--- a/build/baseline-8.0.neon
+++ b/build/baseline-8.0.neon
@@ -1,42 +1,37 @@
parameters:
ignoreErrors:
-
- message: "#^Strict comparison using \\=\\=\\= between array and false will always evaluate to false\\.$#"
+ message: '#^Strict comparison using \=\=\= between list\ and false will always evaluate to false\.$#'
+ identifier: identical.alwaysFalse
count: 1
path: ../src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
-
- message: "#^Strict comparison using \\=\\=\\= between array and false will always evaluate to false\\.$#"
+ message: '#^Call to function method_exists\(\) with ReflectionFunction and ''getClosureCalledCla…'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
count: 1
- path: ../src/Type/Php/MbFunctionsReturnTypeExtension.php
+ path: ../src/Type/ClosureTypeFactory.php
-
- message: "#^Strict comparison using \\=\\=\\= between array&nonEmpty and false will always evaluate to false\\.$#"
+ message: '#^Strict comparison using \=\=\= between list\ and false will always evaluate to false\.$#'
+ identifier: identical.alwaysFalse
count: 1
- path: ../src/Type/Php/StrSplitFunctionReturnTypeExtension.php
-
- -
- message: "#^Call to function method_exists\\(\\) with ReflectionProperty and 'isPromoted' will always evaluate to true\\.$#"
- paths:
- - ../src/Reflection/Php/PhpClassReflectionExtension.php
- - ../src/Reflection/Php/PhpPropertyReflection.php
-
- -
- message: "#^Call to function method_exists\\(\\) with ReflectionProperty and 'getDefaultValue' will always evaluate to true\\.$#"
- paths:
- - ../tests/PHPStan/Analyser/AnalyserIntegrationTest.php
+ path: ../src/Type/Php/MbFunctionsReturnTypeExtension.php
-
- message: "#^Call to function method_exists\\(\\) with ReflectionParameter and 'isPromoted' will always evaluate to true\\.$#"
- paths:
- - ../src/Reflection/Php/PhpClassReflectionExtension.php
+ message: '#^Strict comparison using \=\=\= between int\<0, max\> and false will always evaluate to false\.$#'
+ identifier: identical.alwaysFalse
+ count: 1
+ path: ../src/Type/Php/MbStrlenFunctionReturnTypeExtension.php
-
- message: "#^Call to function method_exists\\(\\) with ReflectionClass and 'getAttributes' will always evaluate to true\\.$#"
+ message: '#^Strict comparison using \=\=\= between list\ and false will always evaluate to false\.$#'
+ identifier: identical.alwaysFalse
count: 1
- path: ../src/Reflection/ClassReflection.php
+ path: ../src/Type/Php/MbStrlenFunctionReturnTypeExtension.php
-
- message: "#^Strict comparison using \\=\\=\\= between array and false will always evaluate to false\\.$#"
+ message: '#^Strict comparison using \=\=\= between list\ and false will always evaluate to false\.$#'
+ identifier: identical.alwaysFalse
count: 1
path: ../src/Type/Php/StrSplitFunctionReturnTypeExtension.php
diff --git a/build/baseline-8.1.neon b/build/baseline-8.1.neon
new file mode 100644
index 0000000000..aab4991158
--- /dev/null
+++ b/build/baseline-8.1.neon
@@ -0,0 +1,2 @@
+parameters:
+ ignoreErrors: []
diff --git a/build/baseline-lt-7.3.neon b/build/baseline-lt-7.3.neon
deleted file mode 100644
index 8d088b9056..0000000000
--- a/build/baseline-lt-7.3.neon
+++ /dev/null
@@ -1,6 +0,0 @@
-parameters:
- ignoreErrors:
- -
- message: "#^Call to an undefined static method PHPUnit\\\\Framework\\\\TestCase\\:\\:assertFileDoesNotExist\\(\\)\\.$#"
- count: 1
- path: ../src/Testing/LevelsTestCase.php
diff --git a/build/baseline-pre-8.0.neon b/build/baseline-pre-8.0.neon
new file mode 100644
index 0000000000..237a55439c
--- /dev/null
+++ b/build/baseline-pre-8.0.neon
@@ -0,0 +1,7 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Call to function method_exists\(\) with ReflectionFunction and ''getClosureCalledCla…'' will always evaluate to false\.$#'
+ identifier: function.impossibleType
+ count: 1
+ path: ../src/Type/ClosureTypeFactory.php
diff --git a/build/collision-detector.json b/build/collision-detector.json
new file mode 100644
index 0000000000..c5171fcc96
--- /dev/null
+++ b/build/collision-detector.json
@@ -0,0 +1,21 @@
+{
+ "scanPaths": ["../src", "../build", "../tests"],
+ "excludePaths": [
+ "../tests/PHPStan/Analyser/data/parse-error.php",
+ "../tests/PHPStan/Analyser/data/multipleParseErrors.php",
+ "../tests/PHPStan/Parser/data/cleaning-1-before.php",
+ "../tests/PHPStan/Parser/data/cleaning-1-after.php",
+ "../tests/PHPStan/Parser/data/cleaning-property-hooks-before.php",
+ "../tests/PHPStan/Parser/data/cleaning-property-hooks-after.php",
+ "../tests/PHPStan/Rules/Functions/data/duplicate-function.php",
+ "../tests/PHPStan/Rules/Classes/data/duplicate-class.php",
+ "../tests/PHPStan/Rules/Names/data/multiple-namespaces.php",
+ "../tests/PHPStan/Rules/Names/data/no-namespace.php",
+ "../tests/notAutoloaded",
+ "../tests/PHPStan/Rules/Functions/data/define-bug-3349.php",
+ "../tests/PHPStan/Levels/data/stubs/function.php",
+ "../tests/PHPStan/Rules/Properties/data/abstract-final-property-hook-parse-error.php",
+ "../tests/PHPStan/Rules/Properties/data/final-property-hooks.php",
+ "../tests/PHPStan/Rules/Cast/data/void-cast.php"
+ ]
+}
diff --git a/build/composer-dependency-analyser.php b/build/composer-dependency-analyser.php
new file mode 100644
index 0000000000..9819b8d3df
--- /dev/null
+++ b/build/composer-dependency-analyser.php
@@ -0,0 +1,39 @@
+addPathToScan(__DIR__ . '/../bin', true)
+ ->ignoreErrorsOnPackages(
+ [
+ ...$pinnedToSupportPhp72, // those are unused, but we need to pin them to support PHP 7.2
+ ...$polyfills, // not detected by composer-dependency-analyser
+ ],
+ [ErrorType::UNUSED_DEPENDENCY],
+ )
+ ->ignoreErrorsOnPackage('phpunit/phpunit', [ErrorType::DEV_DEPENDENCY_IN_PROD]) // prepared test tooling
+ ->ignoreErrorsOnPackage('jetbrains/phpstorm-stubs', [ErrorType::PROD_DEPENDENCY_ONLY_IN_DEV]) // there is no direct usage, but we need newer version then required by ondrejmirtes/BetterReflection
+ ->ignoreErrorsOnPath(__DIR__ . '/../tests', [ErrorType::UNKNOWN_CLASS, ErrorType::UNKNOWN_FUNCTION, ErrorType::SHADOW_DEPENDENCY]) // to be able to test invalid symbols
+ ->ignoreUnknownClasses([
+ 'JetBrains\PhpStorm\Pure', // not present on composer's classmap
+ 'PHPStan\ExtensionInstaller\GeneratedConfig', // generated
+ ]);
diff --git a/build/composer-require-checker.json b/build/composer-require-checker.json
deleted file mode 100644
index 45fb391f8d..0000000000
--- a/build/composer-require-checker.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "symbol-whitelist" : [
- "null", "true", "false",
- "static", "self", "parent",
- "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object",
- "PHPUnit\\Framework\\TestCase", "PHPUnit\\Framework\\AssertionFailedError", "Composer\\Autoload\\ClassLoader",
- "JSON_THROW_ON_ERROR", "JSON_INVALID_UTF8_IGNORE", "JsonSerializable", "SimpleXMLElement", "PHPStan\\ExtensionInstaller\\GeneratedConfig", "Nette\\DI\\InvalidConfigurationException",
- "FILTER_SANITIZE_EMAIL", "FILTER_SANITIZE_EMAIL", "FILTER_SANITIZE_ENCODED", "FILTER_SANITIZE_MAGIC_QUOTES", "FILTER_SANITIZE_NUMBER_FLOAT",
- "FILTER_SANITIZE_NUMBER_INT", "FILTER_SANITIZE_SPECIAL_CHARS", "FILTER_SANITIZE_STRING", "FILTER_SANITIZE_URL", "FILTER_VALIDATE_BOOLEAN",
- "FILTER_VALIDATE_EMAIL", "FILTER_VALIDATE_FLOAT", "FILTER_VALIDATE_INT", "FILTER_VALIDATE_IP", "FILTER_VALIDATE_MAC", "FILTER_VALIDATE_REGEXP",
- "FILTER_VALIDATE_URL", "FILTER_NULL_ON_FAILURE", "FILTER_FORCE_ARRAY", "FILTER_SANITIZE_ADD_SLASHES", "FILTER_DEFAULT", "FILTER_UNSAFE_RAW", "opcache_invalidate", "ValueError", "ReflectionUnionType", "Attribute",
- "Clue\\React\\Block\\await"
- ],
- "php-core-extensions" : [
- "Core",
- "date",
- "pcre",
- "Phar",
- "Reflection",
- "SPL",
- "standard",
- "pcntl",
- "mbstring",
- "hash",
- "tokenizer",
- "dom"
- ]
-}
diff --git a/build/composer-require-checker.phar b/build/composer-require-checker.phar
deleted file mode 100755
index 59c029ef5c..0000000000
Binary files a/build/composer-require-checker.phar and /dev/null differ
diff --git a/build/datetime-php-83.neon b/build/datetime-php-83.neon
new file mode 100644
index 0000000000..953379bf4f
--- /dev/null
+++ b/build/datetime-php-83.neon
@@ -0,0 +1,11 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^If condition is always false\\.$#"
+ count: 1
+ path: ../src/Type/Php/DateTimeModifyReturnTypeExtension.php
+
+ -
+ message: "#^Strict comparison using \\=\\=\\= between DateTime and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/DateTimeModifyReturnTypeExtension.php
diff --git a/build/deprecated-8.4.neon b/build/deprecated-8.4.neon
new file mode 100644
index 0000000000..6b3bd6db5e
--- /dev/null
+++ b/build/deprecated-8.4.neon
@@ -0,0 +1,7 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Use of constant E_STRICT is deprecated\.$#'
+ identifier: constant.deprecated
+ count: 1
+ path: ../src/Analyser/FileAnalyser.php
diff --git a/build/downgrade.php b/build/downgrade.php
new file mode 100644
index 0000000000..437bfcf1cc
--- /dev/null
+++ b/build/downgrade.php
@@ -0,0 +1,21 @@
+ __DIR__ . '/../composer.json',
+ 'paths' => [
+ __DIR__ . '/../build/PHPStan',
+ __DIR__ . '/../src',
+ __DIR__ . '/../tests/PHPStan',
+ __DIR__ . '/../tests/e2e',
+ ],
+ 'excludePaths' => [
+ 'tests/*/data/*',
+ 'tests/*/Fixture/*',
+ 'tests/PHPStan/Analyser/traits/*',
+ 'tests/PHPStan/Analyser/nsrt/*',
+ 'tests/PHPStan/Generics/functions.php',
+ 'tests/e2e/resultCache_1.php',
+ 'tests/e2e/resultCache_2.php',
+ 'tests/e2e/resultCache_3.php',
+ ],
+];
diff --git a/build/enums.neon b/build/enums.neon
new file mode 100644
index 0000000000..44eaccbbd1
--- /dev/null
+++ b/build/enums.neon
@@ -0,0 +1,19 @@
+parameters:
+ excludePaths:
+ - ../tests/PHPStan/Fixture/TestEnum.php
+ - ../tests/PHPStan/Fixture/AnotherTestEnum.php
+ - ../tests/PHPStan/Fixture/ManyCasesTestEnum.php
+
+ ignoreErrors:
+ -
+ message: '#^Access to constant ONE on an unknown class EnumTypeAssertions\\Foo\.$#'
+ path: ../tests/PHPStan/Analyser/NodeScopeResolverTest.php
+ -
+ message: '#^Class ObjectTypeEnums\\FooEnum not found\.$#'
+ paths:
+ - ../tests/PHPStan/Type/ObjectTypeTest.php
+ - ../tests/PHPStan/Type/IntersectionTypeTest.php
+ -
+ message: '#^Class CustomDeprecations\\MyDeprecatedEnum not found\.$#'
+ paths:
+ - ../tests/PHPStan/Reflection/Deprecation/DeprecationProviderTest.php
diff --git a/build/even-more-enum-adapter-errors.neon b/build/even-more-enum-adapter-errors.neon
new file mode 100644
index 0000000000..364905f714
--- /dev/null
+++ b/build/even-more-enum-adapter-errors.neon
@@ -0,0 +1,2 @@
+parameters:
+ ignoreErrors:
diff --git a/build/ignore-by-architecture.neon.php b/build/ignore-by-architecture.neon.php
new file mode 100644
index 0000000000..4b2208f5fe
--- /dev/null
+++ b/build/ignore-by-architecture.neon.php
@@ -0,0 +1,12 @@
+= 80000) {
+ $includes[] = __DIR__ . '/baseline-8.0.neon';
+} else {
+ $includes[] = __DIR__ . '/baseline-pre-8.0.neon';
+}
+if (PHP_VERSION_ID >= 80100) {
+ $includes[] = __DIR__ . '/baseline-8.1.neon';
+} else {
+ $includes[] = __DIR__ . '/enums.neon';
+ $includes[] = __DIR__ . '/readonly-property.neon';
+}
-$adapter = new NeonAdapter();
+if (PHP_VERSION_ID >= 70400) {
+ $includes[] = __DIR__ . '/ignore-gte-php7.4-errors.neon';
+}
-$config = [];
-if (PHP_VERSION_ID < 70300) {
- $config = array_merge_recursive($config, $adapter->load(__DIR__ . '/baseline-lt-7.3.neon'));
+if (PHP_VERSION_ID < 80000) {
+ $includes[] = __DIR__ . '/more-enum-adapter-errors.neon';
+}
+
+if (PHP_VERSION_ID < 80000) {
+ $includes[] = __DIR__ . '/spl-autoload-functions-pre-php-7.neon';
} else {
- $config = array_merge_recursive($config, $adapter->load(__DIR__ . '/baseline-7.3.neon'));
+ $includes[] = __DIR__ . '/spl-autoload-functions-php-8.neon';
}
-if (PHP_VERSION_ID >= 80000) {
- $config = array_merge_recursive($config, $adapter->load(__DIR__ . '/baseline-8.0.neon'));
+
+if (PHP_VERSION_ID >= 80300) {
+ $includes[] = __DIR__ . '/datetime-php-83.neon';
}
-if (PHP_VERSION_ID >= 70400) {
- $config = array_merge_recursive($config, $adapter->load(__DIR__ . '/ignore-gte-php7.4-errors.neon'));
+if (PHP_VERSION_ID >= 80400) {
+ $includes[] = __DIR__ . '/deprecated-8.4.neon';
}
+if (PHP_VERSION_ID < 80200) {
+ $includes[] = __DIR__ . '/old-phpunit.neon';
+} else {
+ $includes[] = __DIR__ . '/new-phpunit.neon';
+}
+
+$config = [];
+$config['includes'] = $includes;
+
+// overrides config.platform.php in composer.json
$config['parameters']['phpVersion'] = PHP_VERSION_ID;
return $config;
diff --git a/build/ignore-gte-php7.4-errors.neon b/build/ignore-gte-php7.4-errors.neon
index cae6484551..112fb17e4c 100644
--- a/build/ignore-gte-php7.4-errors.neon
+++ b/build/ignore-gte-php7.4-errors.neon
@@ -3,8 +3,8 @@ includes:
parameters:
ignoreErrors:
- -
- message: "#^Call to function method_exists\\(\\) with ReflectionProperty and '(?:hasType|getType)' will always evaluate to true\\.$#"
- path: ../src/Reflection/Php/PhpClassReflectionExtension.php
- - '#^Class PHPStan\\Rules\\RuleErrors\\RuleError(?:\d+) has an uninitialized property (?:\$message|\$line|\$identifier|\$tip|\$file|\$metadata)#'
+ - '#^Class PHPStan\\Rules\\RuleErrors\\RuleError(?:\d+) has an uninitialized property (?:\$message|\$line|\$identifier|\$tip|\$file|\$metadata|\$originalNode)#'
- '#Extension has an uninitialized property (?:\$typeSpecifier|\$broker)#'
+ -
+ message: '#has an uninitialized property#'
+ path: ../tests
diff --git a/build/more-enum-adapter-errors.neon b/build/more-enum-adapter-errors.neon
new file mode 100644
index 0000000000..34f9e1f598
--- /dev/null
+++ b/build/more-enum-adapter-errors.neon
@@ -0,0 +1,28 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Strict comparison using \\!\\=\\= between class\\-string and 'UnitEnum' will always evaluate to true\\.$#"
+ count: 1
+ path: ../src/Reflection/Php/PhpClassReflectionExtension.php
+
+ -
+ message: "#^Access to property \\$name on an unknown class UnitEnum\\.$#"
+ count: 1
+ path: ../src/Type/ConstantTypeHelper.php
+
+ -
+ message: "#^PHPDoc tag @var for variable \\$value contains unknown class UnitEnum\\.$#"
+ count: 1
+ path: ../src/Type/ConstantTypeHelper.php
+
+ -
+ message: "#^Class BackedEnum not found\\.$#"
+ count: 1
+ path: ../src/Type/Php/BackedEnumFromMethodDynamicReturnTypeExtension.php
+
+ -
+ message: "#^Call to method PHPStan\\\\Reflection\\\\ClassReflection::isEnum\\(\\) will always evaluate to false\\.$#"
+ -
+ rawMessage: 'Asserted type PHPStan\BetterReflection\Reflection\Adapter\ReflectionEnum for $this->getNativeReflection() with type PHPStan\BetterReflection\Reflection\Adapter\ReflectionClass can never happen.'
+ count: 1
+ path: ../src/Reflection/ClassReflection.php
diff --git a/build/new-phpunit.neon b/build/new-phpunit.neon
new file mode 100644
index 0000000000..b94c623841
--- /dev/null
+++ b/build/new-phpunit.neon
@@ -0,0 +1,7 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Call to an undefined static method PHPUnit\\Framework\\TestCase\:\:assertFileNotExists\(\)\.$#'
+ identifier: staticMethod.notFound
+ count: 1
+ path: ../src/Testing/LevelsTestCase.php
diff --git a/build/old-phpunit.neon b/build/old-phpunit.neon
new file mode 100644
index 0000000000..52e9beb14d
--- /dev/null
+++ b/build/old-phpunit.neon
@@ -0,0 +1,37 @@
+parameters:
+ excludePaths:
+ - ../src/Testing/PHPUnit/*
+
+ ignoreErrors:
+ -
+ message: '#^Instanceof references internal interface PHPUnit\\Exception\.$#'
+ identifier: instanceof.internalInterface
+ count: 1
+ path: ../tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
+
+ -
+ message: '''
+ #^Call to deprecated method assertFileNotExists\(\) of class PHPUnit\\Framework\\Assert\:
+ https\://github\.com/sebastianbergmann/phpunit/issues/4077$#
+ '''
+ identifier: staticMethod.deprecated
+ count: 1
+ path: ../src/Testing/LevelsTestCase.php
+
+ -
+ message: '#^Catching internal class PHPUnit\\Framework\\ExpectationFailedException\.$#'
+ identifier: catch.internalClass
+ count: 1
+ path: ../src/Testing/PHPStanTestCase.php
+
+ -
+ message: '#^Call to method getComparisonFailure\(\) of internal class PHPUnit\\Framework\\ExpectationFailedException from outside its root namespace PHPUnit\.$#'
+ identifier: method.internalClass
+ count: 2
+ path: ../tests/PHPStan/Testing/NonexistentAnalysedClassRuleTest.php
+
+ -
+ message: '#^Catching internal class PHPUnit\\Framework\\ExpectationFailedException\.$#'
+ identifier: catch.internalClass
+ count: 1
+ path: ../tests/PHPStan/Testing/NonexistentAnalysedClassRuleTest.php
diff --git a/build/phpstan.neon b/build/phpstan.neon
index 8d5e8fb692..017fd4f8fa 100644
--- a/build/phpstan.neon
+++ b/build/phpstan.neon
@@ -1,13 +1,16 @@
includes:
- ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
- ../vendor/phpstan/phpstan-nette/rules.neon
- - ../vendor/phpstan/phpstan-php-parser/extension.neon
- ../vendor/phpstan/phpstan-phpunit/extension.neon
- ../vendor/phpstan/phpstan-phpunit/rules.neon
- ../vendor/phpstan/phpstan-strict-rules/rules.neon
+ - ../vendor/shipmonk/dead-code-detector/rules.neon
- ../conf/bleedingEdge.neon
- ../phpstan-baseline.neon
+ - ../phpstan-baseline.php
- ignore-by-php-version.neon.php
+ - ignore-by-architecture.neon.php
+
parameters:
level: 8
paths:
@@ -16,19 +19,19 @@ parameters:
- ../tests
bootstrapFiles:
- ../tests/phpstan-bootstrap.php
+ cache:
+ nodesByStringCountMax: 128
checkUninitializedProperties: true
checkMissingCallableSignature: true
excludePaths:
- - ../src/Reflection/SignatureMap/functionMap.php
- - ../src/Reflection/SignatureMap/functionMetadata.php
- ../tests/*/data/*
- ../tests/tmp/*
+ - ../tests/vendor/*
+ - ../tests/PHPStan/Analyser/nsrt/*
- ../tests/PHPStan/Analyser/traits/*
- ../tests/notAutoloaded/*
- - ../tests/PHPStan/Generics/functions.php
- ../tests/PHPStan/Reflection/UnionTypesTest.php
- ../tests/PHPStan/Reflection/MixedTypeTest.php
- - ../tests/PHPStan/Reflection/StaticTypeTest.php
- ../tests/e2e/magic-setter/*
- ../tests/PHPStan/Rules/Properties/UninitializedPropertyRuleTest.php
- ../tests/PHPStan/Command/IgnoredRegexValidatorTest.php
@@ -42,6 +45,7 @@ parameters:
- 'Symfony\Component\Finder\Exception\DirectoryNotFoundException'
- 'InvalidArgumentException'
- 'PHPStan\DependencyInjection\ParameterNotFoundException'
+ - 'PHPStan\DependencyInjection\DuplicateIncludedFilesException'
- 'PHPStan\Analyser\UndefinedVariableException'
- 'RuntimeException'
- 'Nette\Neon\Exception'
@@ -55,13 +59,14 @@ parameters:
- 'PHPStan\Broker\ClassNotFoundException'
- 'PHPStan\Broker\FunctionNotFoundException'
- 'PHPStan\Broker\ConstantNotFoundException'
+ - 'PHPStan\DependencyInjection\MissingServiceException'
- 'PHPStan\Reflection\MissingMethodFromReflectionException'
- 'PHPStan\Reflection\MissingPropertyFromReflectionException'
- 'PHPStan\Reflection\MissingConstantFromReflectionException'
- 'PHPStan\Type\CircularTypeAliasDefinitionException'
- - 'PHPStan\Broker\ClassAutoloadingException'
+ - 'PHPStan\Reflection\MissingStaticAccessorInstanceException'
- 'LogicException'
- - 'TypeError'
+ - 'Error'
check:
missingCheckedExceptionInThrows: true
tooWideThrowType: true
@@ -71,50 +76,70 @@ parameters:
- '#Variable property access on PhpParser\\Node#'
- '#Test::data[a-zA-Z0-9_]+\(\) return type has no value type specified in iterable type#'
-
- message: '#Fetching class constant class of deprecated class DeprecatedAnnotations\\DeprecatedFoo.#'
+ identifier: shipmonk.deadMethod
+ message: '#^Unused .*?Factory::create#' # likely used in DIC
+ -
+ identifier: shipmonk.deadMethod
+ paths:
+ - ../tests/PHPStan/Tests
+ - ../tests/e2e
+ -
+ identifier: shipmonk.deadConstant
+ paths:
+ - ../tests/PHPStan/Fixture
+ reportUnmatched: false # constants on enums, not reported on PHP8-
+ -
+ identifier: shipmonk.deadMethod
+ path: ../src/Reflection/BetterReflection/SourceLocator/FileReadTrapStreamWrapper.php
+ -
+ message: '''
+ #^Access to constant on deprecated class DeprecatedAnnotations\\DeprecatedFoo\:
+ in 1\.0\.0\.$#
+ '''
path: ../tests/PHPStan/Reflection/Annotations/DeprecatedAnnotationsTest.php
-
- message: '#Fetching class constant class of deprecated class DeprecatedAnnotations\\DeprecatedWithMultipleTags.#'
+ message: '''
+ #^Access to constant on deprecated class DeprecatedAnnotations\\DeprecatedWithMultipleTags\:
+ in Foo 1\.1\.0 and will be removed in 1\.5\.0, use
+ \\Foo\\Bar\\NotDeprecated instead\.$#
+ '''
path: ../tests/PHPStan/Reflection/Annotations/DeprecatedAnnotationsTest.php
-
- message: '#^Variable property access on PHPStan\\Rules\\RuleError\.$#'
+ message: '#^Variable property access on T of PHPStan\\Rules\\RuleError\.$#'
path: ../src/Rules/RuleErrorBuilder.php
-
message: "#^Parameter \\#1 (?:\\$argument|\\$objectOrClass) of class ReflectionClass constructor expects class\\-string\\\\|PHPStan\\\\ExtensionInstaller\\\\GeneratedConfig, string given\\.$#"
count: 1
path: ../src/Command/CommandHelper.php
+ -
+ message: "#^Parameter \\#1 (?:\\$argument|\\$objectOrClass) of class ReflectionClass constructor expects class\\-string\\\\|PHPStan\\\\ExtensionInstaller\\\\GeneratedConfig, string given\\.$#"
+ count: 1
+ path: ../src/Diagnose/PHPStanDiagnoseExtension.php
+ - '#^Short ternary operator is not allowed#'
reportStaticMethodSignatures: true
tmpDir: %rootDir%/tmp
stubFiles:
- stubs/ReactChildProcess.stub
- stubs/ReactStreams.stub
+ - stubs/NetteDIContainer.stub
+ - stubs/PhpParserName.stub
+ - stubs/Identifier.stub
+
+rules:
+ - PHPStan\Build\FinalClassRule
+ - PHPStan\Build\AttributeNamedArgumentsRule
+ - PHPStan\Build\NamedArgumentsRule
+ - PHPStan\Build\OverrideAttributeThirdPartyMethodRule
+ - PHPStan\Build\SkipTestsWithRequiresPhpAttributeRule
+ - PHPStan\Build\MemoizationPropertyRule
+ - PHPStan\Build\OrChainIdenticalComparisonToInArrayRule
+
services:
-
class: PHPStan\Build\ServiceLocatorDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Internal\ContainerDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Internal\UnionTypeGetInternalDynamicReturnTypeExtension
+ class: PHPStan\Build\ContainerDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicMethodReturnTypeExtension
-
- scopeIsInClass:
- class: PHPStan\Internal\ScopeIsInClassTypeSpecifyingExtension
- arguments:
- isInMethodName: isInClass
- removeNullMethodName: getClassReflection
- tags:
- - phpstan.typeSpecifier.methodTypeSpecifyingExtension
-
- scopeIsInTrait:
- class: PHPStan\Internal\ScopeIsInClassTypeSpecifyingExtension
- arguments:
- isInMethodName: isInTrait
- removeNullMethodName: getTraitReflection
- tags:
- - phpstan.typeSpecifier.methodTypeSpecifyingExtension
diff --git a/build/readonly-property.neon b/build/readonly-property.neon
new file mode 100644
index 0000000000..96657fb795
--- /dev/null
+++ b/build/readonly-property.neon
@@ -0,0 +1,3 @@
+parameters:
+ excludePaths:
+ - ../tests/PHPStan/Rules/Properties/MissingReadOnlyPropertyAssignRuleTest.php
diff --git a/build/spl-autoload-functions-php-8.neon b/build/spl-autoload-functions-php-8.neon
new file mode 100644
index 0000000000..3669321889
--- /dev/null
+++ b/build/spl-autoload-functions-php-8.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^PHPDoc tag @var with type list\\\\|false is not subtype of native type list\\\\.$#"
+ count: 2
+ path: ../src/Command/CommandHelper.php
diff --git a/build/spl-autoload-functions-pre-php-7.neon b/build/spl-autoload-functions-pre-php-7.neon
new file mode 100644
index 0000000000..42cd820e71
--- /dev/null
+++ b/build/spl-autoload-functions-pre-php-7.neon
@@ -0,0 +1,5 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Parameter \#1 \$array \(list\) of array_values is already a list, call has no effect\.$#'
+ path: ../src/Type/TypeCombinator.php
diff --git a/build/stubs/Identifier.stub b/build/stubs/Identifier.stub
new file mode 100644
index 0000000000..301d034b2d
--- /dev/null
+++ b/build/stubs/Identifier.stub
@@ -0,0 +1,15 @@
+ $attributes
+ */
+ public function __construct(string $name, array $attributes = []) { }
+
+}
diff --git a/build/stubs/NetteDIContainer.stub b/build/stubs/NetteDIContainer.stub
new file mode 100644
index 0000000000..455eb43455
--- /dev/null
+++ b/build/stubs/NetteDIContainer.stub
@@ -0,0 +1,15 @@
+ $type
+ * @return T
+ */
+ public function getByType(string $type);
+
+}
diff --git a/build/stubs/PhpParserName.stub b/build/stubs/PhpParserName.stub
new file mode 100644
index 0000000000..a044fbf684
--- /dev/null
+++ b/build/stubs/PhpParserName.stub
@@ -0,0 +1,25 @@
+|self $name Name as string, part array or Name instance (copy ctor)
+ * @param array $attributes Additional attributes
+ */
+ public function __construct($name, array $attributes = []) {
+ }
+
+ /** @return non-empty-string */
+ public function toString() : string {
+ }
+
+ /** @return non-empty-string */
+ public function toCodeString() : string {
+ }
+}
diff --git a/changelog-generator/.gitignore b/changelog-generator/.gitignore
new file mode 100644
index 0000000000..61ead86667
--- /dev/null
+++ b/changelog-generator/.gitignore
@@ -0,0 +1 @@
+/vendor
diff --git a/changelog-generator/composer.json b/changelog-generator/composer.json
new file mode 100644
index 0000000000..d4527f1c45
--- /dev/null
+++ b/changelog-generator/composer.json
@@ -0,0 +1,22 @@
+{
+ "name": "phpstan/changelog-generator",
+ "require": {
+ "php": "^8.1",
+ "php-http/client-common": "^2.5",
+ "php-http/discovery": "^1.14",
+ "guzzlehttp/guzzle": "^7.4",
+ "http-interop/http-factory-guzzle": "^1.2",
+ "knplabs/github-api": "^3.7",
+ "symfony/console": "^6.1"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\ChangelogGenerator\\": "src"
+ }
+ },
+ "config": {
+ "allow-plugins": {
+ "php-http/discovery": true
+ }
+ }
+}
diff --git a/changelog-generator/composer.lock b/changelog-generator/composer.lock
new file mode 100644
index 0000000000..3b830c7c5d
--- /dev/null
+++ b/changelog-generator/composer.lock
@@ -0,0 +1,2159 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "3e1d902170abb95f02293ffeb1aa1b2b",
+ "packages": [
+ {
+ "name": "clue/stream-filter",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/clue/stream-filter.git",
+ "reference": "d6169430c7731d8509da7aecd0af756a5747b78e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e",
+ "reference": "d6169430c7731d8509da7aecd0af756a5747b78e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "Clue\\StreamFilter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ }
+ ],
+ "description": "A simple and modern approach to stream filtering in PHP",
+ "homepage": "https://github.com/clue/php-stream-filter",
+ "keywords": [
+ "bucket brigade",
+ "callback",
+ "filter",
+ "php_user_filter",
+ "stream",
+ "stream_filter_append",
+ "stream_filter_register"
+ ],
+ "support": {
+ "issues": "https://github.com/clue/stream-filter/issues",
+ "source": "https://github.com/clue/stream-filter/tree/v1.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://clue.engineering/support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-21T13:15:14+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9",
+ "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.8.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-27T10:20:53+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-03T15:11:55+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727",
+ "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.6.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-27T10:13:57+00:00"
+ },
+ {
+ "name": "http-interop/http-factory-guzzle",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/http-interop/http-factory-guzzle.git",
+ "reference": "8f06e92b95405216b237521cc64c804dd44c4a81"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81",
+ "reference": "8f06e92b95405216b237521cc64c804dd44c4a81",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/psr7": "^1.7||^2.0",
+ "php": ">=7.3",
+ "psr/http-factory": "^1.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "^1.0"
+ },
+ "require-dev": {
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^9.5"
+ },
+ "suggest": {
+ "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Factory\\Guzzle\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "An HTTP Factory using Guzzle PSR7",
+ "keywords": [
+ "factory",
+ "http",
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/http-interop/http-factory-guzzle/issues",
+ "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0"
+ },
+ "time": "2021-07-21T13:50:14+00:00"
+ },
+ {
+ "name": "knplabs/github-api",
+ "version": "v3.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/KnpLabs/php-github-api.git",
+ "reference": "47024f3483520c0fafdfc5c10d2a20d87b4c7ceb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/47024f3483520c0fafdfc5c10d2a20d87b4c7ceb",
+ "reference": "47024f3483520c0fafdfc5c10d2a20d87b4c7ceb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2.5 || ^8.0",
+ "php-http/cache-plugin": "^1.7.1",
+ "php-http/client-common": "^2.3",
+ "php-http/discovery": "^1.12",
+ "php-http/httplug": "^2.2",
+ "php-http/multipart-stream-builder": "^1.1.2",
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "psr/http-client-implementation": "^1.0",
+ "psr/http-factory-implementation": "^1.0",
+ "psr/http-message": "^1.0|^2.0",
+ "symfony/deprecation-contracts": "^2.2|^3.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^7.2",
+ "guzzlehttp/psr7": "^1.7",
+ "http-interop/http-factory-guzzle": "^1.0",
+ "php-http/mock-client": "^1.4.1",
+ "phpstan/extension-installer": "^1.0.5",
+ "phpstan/phpstan": "^0.12.57",
+ "phpstan/phpstan-deprecation-rules": "^0.12.5",
+ "phpunit/phpunit": "^8.5 || ^9.4",
+ "symfony/cache": "^5.1.8",
+ "symfony/phpunit-bridge": "^5.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.20.x-dev",
+ "dev-master": "3.12-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Github\\": "lib/Github/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KnpLabs Team",
+ "homepage": "http://knplabs.com"
+ },
+ {
+ "name": "Thibault Duplessis",
+ "email": "thibault.duplessis@gmail.com",
+ "homepage": "http://ornicar.github.com"
+ }
+ ],
+ "description": "GitHub API v3 client",
+ "homepage": "https://github.com/KnpLabs/php-github-api",
+ "keywords": [
+ "api",
+ "gh",
+ "gist",
+ "github"
+ ],
+ "support": {
+ "issues": "https://github.com/KnpLabs/php-github-api/issues",
+ "source": "https://github.com/KnpLabs/php-github-api/tree/v3.13.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/acrobat",
+ "type": "github"
+ }
+ ],
+ "time": "2023-11-19T21:08:19+00:00"
+ },
+ {
+ "name": "php-http/cache-plugin",
+ "version": "1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/cache-plugin.git",
+ "reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
+ "reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/client-common": "^1.9 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\Plugin\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "PSR-6 Cache plugin for HTTPlug",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "cache",
+ "http",
+ "httplug",
+ "plugin"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/cache-plugin/issues",
+ "source": "https://github.com/php-http/cache-plugin/tree/1.8.0"
+ },
+ "time": "2023-04-28T10:56:55+00:00"
+ },
+ {
+ "name": "php-http/client-common",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/client-common.git",
+ "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b",
+ "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/httplug": "^2.0",
+ "php-http/message": "^1.6",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.1",
+ "guzzlehttp/psr7": "^1.4",
+ "nyholm/psr7": "^1.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "phpspec/prophecy": "^1.10.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+ },
+ "suggest": {
+ "ext-json": "To detect JSON responses with the ContentTypePlugin",
+ "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+ "php-http/cache-plugin": "PSR-6 Cache plugin",
+ "php-http/logger-plugin": "PSR-3 Logger plugin",
+ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Common HTTP Client implementations and tools for HTTPlug",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "common",
+ "http",
+ "httplug"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/client-common/issues",
+ "source": "https://github.com/php-http/client-common/tree/2.7.0"
+ },
+ "time": "2023-05-17T06:46:59+00:00"
+ },
+ {
+ "name": "php-http/discovery",
+ "version": "1.19.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/discovery.git",
+ "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e",
+ "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "nyholm/psr7": "<1.0",
+ "zendframework/zend-diactoros": "*"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "*",
+ "psr/http-factory-implementation": "*",
+ "psr/http-message-implementation": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "graham-campbell/phpspec-skip-example-extension": "^5.0",
+ "php-http/httplug": "^1.0 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+ "symfony/phpunit-bridge": "^6.2"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Http\\Discovery\\Composer\\Plugin",
+ "plugin-optional": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Discovery\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Composer/Plugin.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "adapter",
+ "client",
+ "discovery",
+ "factory",
+ "http",
+ "message",
+ "psr17",
+ "psr7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/discovery/issues",
+ "source": "https://github.com/php-http/discovery/tree/1.19.1"
+ },
+ "time": "2023-07-11T07:02:26+00:00"
+ },
+ {
+ "name": "php-http/httplug",
+ "version": "2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/httplug.git",
+ "reference": "625ad742c360c8ac580fcc647a1541d29e257f67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67",
+ "reference": "625ad742c360c8ac580fcc647a1541d29e257f67",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/promise": "^1.1",
+ "psr/http-client": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "HTTPlug, the HTTP client abstraction for PHP",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/httplug/issues",
+ "source": "https://github.com/php-http/httplug/tree/2.4.0"
+ },
+ "time": "2023-04-14T15:10:03+00:00"
+ },
+ {
+ "name": "php-http/message",
+ "version": "1.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message.git",
+ "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+ "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+ "shasum": ""
+ },
+ "require": {
+ "clue/stream-filter": "^1.5",
+ "php": "^7.2 || ^8.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.6",
+ "ext-zlib": "*",
+ "guzzlehttp/psr7": "^1.0 || ^2.0",
+ "laminas/laminas-diactoros": "^2.0 || ^3.0",
+ "php-http/message-factory": "^1.0.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "slim/slim": "^3.0"
+ },
+ "suggest": {
+ "ext-zlib": "Used with compressor/decompressor streams",
+ "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+ "laminas/laminas-diactoros": "Used with Diactoros Factories",
+ "slim/slim": "Used with Slim Framework PSR-7 implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/filters.php"
+ ],
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "HTTP Message related tools",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message/issues",
+ "source": "https://github.com/php-http/message/tree/1.16.0"
+ },
+ "time": "2023-05-17T06:43:38+00:00"
+ },
+ {
+ "name": "php-http/message-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message-factory.git",
+ "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+ "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Factory interfaces for PSR-7 HTTP Message",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "stream",
+ "uri"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message-factory/issues",
+ "source": "https://github.com/php-http/message-factory/tree/1.1.0"
+ },
+ "abandoned": "psr/http-factory",
+ "time": "2023-04-14T14:16:17+00:00"
+ },
+ {
+ "name": "php-http/multipart-stream-builder",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/multipart-stream-builder.git",
+ "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a",
+ "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/discovery": "^1.15",
+ "psr/http-factory-implementation": "^1.0"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.0",
+ "php-http/message": "^1.5",
+ "php-http/message-factory": "^1.0.2",
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\MultipartStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ }
+ ],
+ "description": "A builder class that help you create a multipart stream",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "multipart stream",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/multipart-stream-builder/issues",
+ "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0"
+ },
+ "time": "2023-04-28T14:10:22+00:00"
+ },
+ {
+ "name": "php-http/promise",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/promise.git",
+ "reference": "44a67cb59f708f826f3bec35f22030b3edb90119"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/promise/zipball/44a67cb59f708f826f3bec35f22030b3edb90119",
+ "reference": "44a67cb59f708f826f3bec35f22030b3edb90119",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+ "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joel Wurtz",
+ "email": "joel.wurtz@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Promise used for asynchronous HTTP requests",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/promise/issues",
+ "source": "https://github.com/php-http/promise/tree/1.2.1"
+ },
+ "time": "2023-11-08T12:57:08+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client"
+ },
+ "time": "2023-09-23T14:17:50+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:10:41+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
+ "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/lock": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0",
+ "symfony/var-dumper": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.3.8"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-10-31T08:09:35+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.4-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-23T14:45:45+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd",
+ "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v6.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-12T14:21:09+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "875e90aeea2777b6f135677f618529449334a612"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
+ "reference": "875e90aeea2777b6f135677f618529449334a612",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "42292d99c55abe617799667f454222c54c60e229"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+ "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-28T09:04:16+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
+ "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.4-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-23T14:45:45+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "13880a87790c76ef994c91e87efb96134522577a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a",
+ "reference": "13880a87790c76ef994c91e87efb96134522577a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/http-client": "^5.4|^6.0",
+ "symfony/intl": "^6.2",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.3.8"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-09T08:28:21+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/changelog-generator/phpstan.neon b/changelog-generator/phpstan.neon
new file mode 100644
index 0000000000..a1fee9d3a7
--- /dev/null
+++ b/changelog-generator/phpstan.neon
@@ -0,0 +1,16 @@
+includes:
+ - ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
+ - ../vendor/phpstan/phpstan-nette/rules.neon
+ - ../vendor/phpstan/phpstan-phpunit/extension.neon
+ - ../vendor/phpstan/phpstan-phpunit/rules.neon
+ - ../vendor/phpstan/phpstan-strict-rules/rules.neon
+ - ../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ - run.php
+ ignoreErrors:
+ -
+ identifier: missingType.generics
diff --git a/changelog-generator/run.php b/changelog-generator/run.php
new file mode 100755
index 0000000000..bab56d4d34
--- /dev/null
+++ b/changelog-generator/run.php
@@ -0,0 +1,160 @@
+#!/usr/bin/env php
+setName('run');
+ $this->addArgument('fromCommit', InputArgument::REQUIRED);
+ $this->addArgument('toCommit', InputArgument::REQUIRED);
+ $this->addOption('exclude-branch', null, InputOption::VALUE_REQUIRED);
+ $this->addOption('include-headings', null, InputOption::VALUE_NONE);
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $token = $_SERVER['GITHUB_TOKEN'];
+
+ $rateLimitPlugin = new RateLimitPlugin();
+ $httpBuilder = new Builder();
+ $httpBuilder->addPlugin($rateLimitPlugin);
+
+ $gitHubClient = new Client($httpBuilder);
+ $gitHubClient->authenticate($token, AuthMethod::ACCESS_TOKEN);
+ $rateLimitPlugin->setClient($gitHubClient);
+
+ /** @var Search $searchApi */
+ $searchApi = $gitHubClient->api('search');
+
+ $command = ['git', 'log', sprintf('%s..%s', $input->getArgument('fromCommit'), $input->getArgument('toCommit'))];
+ $excludeBranch = $input->getOption('exclude-branch');
+ if ($excludeBranch !== null) {
+ $command[] = '--not';
+ $command[] = $excludeBranch;
+ $command[] = '--no-merges';
+ }
+ $command[] = '--reverse';
+ $command[] = '--pretty=%H %s';
+
+ $commitLines = $this->exec($command);
+ $commits = array_map(static function (string $line): array {
+ [$hash, $message] = explode(' ', $line, 2);
+
+ return [
+ 'hash' => $hash,
+ 'message' => $message,
+ ];
+ }, explode("\n", $commitLines));
+
+ if ($input->getOption('include-headings') === true) {
+ $output->writeln(<<<'MARKDOWN'
+ Major new features 🚀
+ =====================
+
+ Bleeding edge 🔪
+ =====================
+
+ *
+
+ *If you want to see the shape of things to come and adopt bleeding edge features early, you can include this config file in your project's `phpstan.neon`:*
+
+ ```
+ includes:
+ - vendor/phpstan/phpstan/conf/bleedingEdge.neon
+ ```
+
+ *Of course, there are no backwards compatibility guarantees when you include this file. The behaviour and reported errors can change in minor versions with this file included. [Learn more](https://phpstan.org/blog/what-is-bleeding-edge)*
+
+ Improvements 🔧
+ =====================
+
+ Bugfixes 🐛
+ =====================
+
+ Function signature fixes 🤖
+ =======================
+
+ Internals 🔍
+ =====================
+
+
+ MARKDOWN);
+ }
+
+ foreach ($commits as $commit) {
+ $pullRequests = $searchApi->issues(sprintf('repo:phpstan/phpstan-src %s is:pull-request', $commit['hash']));
+ $issues = $searchApi->issues(sprintf('repo:phpstan/phpstan %s is:issue', $commit['hash']), 'created');
+ $items = array_merge($pullRequests['items'], $issues['items']);
+ $parenthesis = 'https://github.com/phpstan/phpstan-src/commit/' . $commit['hash'];
+ $thanks = null;
+ $issuesToReference = [];
+ foreach ($items as $responseItem) {
+ if (isset($responseItem['pull_request'])) {
+ if ($responseItem['number'] === 13191) {
+ continue;
+ }
+ $parenthesis = sprintf('[#%d](%s)', $responseItem['number'], 'https://github.com/phpstan/phpstan-src/pull/' . $responseItem['number']);
+ $thanks = $responseItem['user']['login'];
+ } else {
+ $issuesToReference[] = sprintf('#%d', $responseItem['number']);
+ }
+ }
+
+ $output->writeln(sprintf('* %s (%s)%s%s', $commit['message'], $parenthesis, count($issuesToReference) > 0 ? ', ' . implode(', ', $issuesToReference) : '', $thanks !== null ? sprintf(', thanks @%s!', $thanks) : ''));
+ }
+
+ return 0;
+ }
+
+ /**
+ * @param string[] $commandParts
+ */
+ private function exec(array $commandParts): string
+ {
+ $command = implode(' ', array_map(static fn (string $part): string => escapeshellarg($part), $commandParts));
+
+ exec($command, $outputLines, $statusCode);
+ $output = implode("\n", $outputLines);
+ if ($statusCode !== 0) {
+ throw new InvalidArgumentException(sprintf('Command %s failed: %s', $command, $output));
+ }
+
+ return $output;
+ }
+
+ };
+
+ $application = new Application();
+ $application->add($command);
+ $application->setDefaultCommand('run', true);
+ $application->setCatchExceptions(false);
+ $application->run();
+})();
diff --git a/changelog-generator/src/RateLimitPlugin.php b/changelog-generator/src/RateLimitPlugin.php
new file mode 100644
index 0000000000..fd724ab31f
--- /dev/null
+++ b/changelog-generator/src/RateLimitPlugin.php
@@ -0,0 +1,47 @@
+client = $client;
+ }
+
+ public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
+ {
+ $path = $request->getUri()->getPath();
+ if ($path === '/rate_limit') {
+ return $next($request);
+ }
+
+ /** @var RateLimit $api */
+ $api = $this->client->api('rate_limit');
+
+ /** @var RateLimitResource $resource */
+ $resource = $api->getResource('search');
+ if ($resource->getRemaining() < 10) {
+ $reset = $resource->getReset();
+ $sleepFor = $reset - time();
+ if ($sleepFor > 0) {
+ sleep($sleepFor);
+ }
+ }
+
+ return $next($request);
+ }
+
+}
diff --git a/compiler/README.md b/compiler/README.md
index 83e480cb3a..36d0676d9e 100644
--- a/compiler/README.md
+++ b/compiler/README.md
@@ -4,7 +4,9 @@
```bash
composer install
-php bin/compile
+php bin/prepare
+cd build
+php ../box/vendor/bin/box compile --no-parallel
```
The compiled PHAR will be in `tmp/phpstan.phar`.
diff --git a/compiler/bin/compile b/compiler/bin/compile
deleted file mode 100755
index e5f1ef6bb4..0000000000
--- a/compiler/bin/compile
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env php
-add($compileCommand);
-$application->setDefaultCommand($compileCommand->getName(), true);
-$application->run();
diff --git a/compiler/bin/prepare b/compiler/bin/prepare
new file mode 100755
index 0000000000..b72543c452
--- /dev/null
+++ b/compiler/bin/prepare
@@ -0,0 +1,18 @@
+#!/usr/bin/env php
+add($prepareCommand);
+$application->setDefaultCommand($prepareCommand->getName(), true);
+$application->run();
diff --git a/compiler/box/.gitignore b/compiler/box/.gitignore
new file mode 100644
index 0000000000..61ead86667
--- /dev/null
+++ b/compiler/box/.gitignore
@@ -0,0 +1 @@
+/vendor
diff --git a/compiler/box/composer.json b/compiler/box/composer.json
new file mode 100644
index 0000000000..4ea8c3e23c
--- /dev/null
+++ b/compiler/box/composer.json
@@ -0,0 +1,23 @@
+{
+ "require": {
+ "humbug/box": "^4.6",
+ "cweagans/composer-patches": "^1.7"
+ },
+ "config": {
+ "platform": {
+ "php": "8.2.99"
+ },
+ "allow-plugins": {
+ "vaimo/composer-patches": true,
+ "cweagans/composer-patches": true
+ }
+ },
+ "extra": {
+ "composer-exit-on-patch-failure": true,
+ "patches": {
+ "humbug/php-scoper": [
+ "patches/ScoperAutoloaderGenerator.patch"
+ ]
+ }
+ }
+}
diff --git a/compiler/box/composer.lock b/compiler/box/composer.lock
new file mode 100644
index 0000000000..a4695f7f3f
--- /dev/null
+++ b/compiler/box/composer.lock
@@ -0,0 +1,4171 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "fb82d3fddd187abc2f321b38688fb441",
+ "packages": [
+ {
+ "name": "amphp/amp",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/amp.git",
+ "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9",
+ "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "revolt/event-loop": "^1 || ^0.2"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "5.23.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php",
+ "src/Future/functions.php",
+ "src/Internal/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ },
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@php.net"
+ }
+ ],
+ "description": "A non-blocking concurrency framework for PHP applications.",
+ "homepage": "https://amphp.org/amp",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "awaitable",
+ "concurrency",
+ "event",
+ "event-loop",
+ "future",
+ "non-blocking",
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/amp/issues",
+ "source": "https://github.com/amphp/amp/tree/v3.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2025-01-26T16:07:39+00:00"
+ },
+ {
+ "name": "amphp/byte-stream",
+ "version": "v2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/byte-stream.git",
+ "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46",
+ "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "amphp/parser": "^1.1",
+ "amphp/pipeline": "^1",
+ "amphp/serialization": "^1",
+ "amphp/sync": "^2",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1 || ^0.2.3"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "5.22.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php",
+ "src/Internal/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\ByteStream\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A stream abstraction to make working with non-blocking I/O simple.",
+ "homepage": "https://amphp.org/byte-stream",
+ "keywords": [
+ "amp",
+ "amphp",
+ "async",
+ "io",
+ "non-blocking",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/byte-stream/issues",
+ "source": "https://github.com/amphp/byte-stream/tree/v2.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-16T17:10:27+00:00"
+ },
+ {
+ "name": "amphp/cache",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/cache.git",
+ "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c",
+ "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "amphp/serialization": "^1",
+ "amphp/sync": "^2",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1 || ^0.2"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Cache\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@php.net"
+ }
+ ],
+ "description": "A fiber-aware cache API based on Amp and Revolt.",
+ "homepage": "https://amphp.org/cache",
+ "support": {
+ "issues": "https://github.com/amphp/cache/issues",
+ "source": "https://github.com/amphp/cache/tree/v2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2024-04-19T03:38:06+00:00"
+ },
+ {
+ "name": "amphp/dns",
+ "version": "v2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/dns.git",
+ "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71",
+ "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "amphp/byte-stream": "^2",
+ "amphp/cache": "^2",
+ "amphp/parser": "^1",
+ "amphp/process": "^2",
+ "daverandom/libdns": "^2.0.2",
+ "ext-filter": "*",
+ "ext-json": "*",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1 || ^0.2"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "5.20"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\Dns\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Wright",
+ "email": "addr@daverandom.com"
+ },
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@php.net"
+ },
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ }
+ ],
+ "description": "Async DNS resolution for Amp.",
+ "homepage": "https://github.com/amphp/dns",
+ "keywords": [
+ "amp",
+ "amphp",
+ "async",
+ "client",
+ "dns",
+ "resolve"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/dns/issues",
+ "source": "https://github.com/amphp/dns/tree/v2.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2025-01-19T15:43:40+00:00"
+ },
+ {
+ "name": "amphp/parallel",
+ "version": "v2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/parallel.git",
+ "reference": "5113111de02796a782f5d90767455e7391cca190"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/parallel/zipball/5113111de02796a782f5d90767455e7391cca190",
+ "reference": "5113111de02796a782f5d90767455e7391cca190",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "amphp/byte-stream": "^2",
+ "amphp/cache": "^2",
+ "amphp/parser": "^1",
+ "amphp/pipeline": "^1",
+ "amphp/process": "^2",
+ "amphp/serialization": "^1",
+ "amphp/socket": "^2",
+ "amphp/sync": "^2",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "^5.18"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/Context/functions.php",
+ "src/Context/Internal/functions.php",
+ "src/Ipc/functions.php",
+ "src/Worker/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\Parallel\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ },
+ {
+ "name": "Stephen Coakley",
+ "email": "me@stephencoakley.com"
+ }
+ ],
+ "description": "Parallel processing component for Amp.",
+ "homepage": "https://github.com/amphp/parallel",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "concurrent",
+ "multi-processing",
+ "multi-threading"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/parallel/issues",
+ "source": "https://github.com/amphp/parallel/tree/v2.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-21T01:56:09+00:00"
+ },
+ {
+ "name": "amphp/parser",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/parser.git",
+ "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7",
+ "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Parser\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A generator parser to make streaming parsers simple.",
+ "homepage": "https://github.com/amphp/parser",
+ "keywords": [
+ "async",
+ "non-blocking",
+ "parser",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/parser/issues",
+ "source": "https://github.com/amphp/parser/tree/v1.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-21T19:16:53+00:00"
+ },
+ {
+ "name": "amphp/pipeline",
+ "version": "v1.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/pipeline.git",
+ "reference": "7b52598c2e9105ebcddf247fc523161581930367"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367",
+ "reference": "7b52598c2e9105ebcddf247fc523161581930367",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "^5.18"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Pipeline\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "Asynchronous iterators and operators.",
+ "homepage": "https://amphp.org/pipeline",
+ "keywords": [
+ "amp",
+ "amphp",
+ "async",
+ "io",
+ "iterator",
+ "non-blocking"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/pipeline/issues",
+ "source": "https://github.com/amphp/pipeline/tree/v1.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-16T16:33:53+00:00"
+ },
+ {
+ "name": "amphp/process",
+ "version": "v2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/process.git",
+ "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d",
+ "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "amphp/byte-stream": "^2",
+ "amphp/sync": "^2",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1 || ^0.2"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\Process\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A fiber-aware process manager based on Amp and Revolt.",
+ "homepage": "https://amphp.org/process",
+ "support": {
+ "issues": "https://github.com/amphp/process/issues",
+ "source": "https://github.com/amphp/process/tree/v2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2024-04-19T03:13:44+00:00"
+ },
+ {
+ "name": "amphp/serialization",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/serialization.git",
+ "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1",
+ "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "phpunit/phpunit": "^9 || ^8 || ^7"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\Serialization\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "Serialization tools for IPC and data storage in PHP.",
+ "homepage": "https://github.com/amphp/serialization",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "serialization",
+ "serialize"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/serialization/issues",
+ "source": "https://github.com/amphp/serialization/tree/master"
+ },
+ "time": "2020-03-25T21:39:07+00:00"
+ },
+ {
+ "name": "amphp/socket",
+ "version": "v2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/socket.git",
+ "reference": "58e0422221825b79681b72c50c47a930be7bf1e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1",
+ "reference": "58e0422221825b79681b72c50c47a930be7bf1e1",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "amphp/byte-stream": "^2",
+ "amphp/dns": "^2",
+ "ext-openssl": "*",
+ "kelunik/certificate": "^1.1",
+ "league/uri": "^6.5 | ^7",
+ "league/uri-interfaces": "^2.3 | ^7",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1 || ^0.2"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "amphp/process": "^2",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "5.20"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php",
+ "src/Internal/functions.php",
+ "src/SocketAddress/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\Socket\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@gmail.com"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.",
+ "homepage": "https://github.com/amphp/socket",
+ "keywords": [
+ "amp",
+ "async",
+ "encryption",
+ "non-blocking",
+ "sockets",
+ "tcp",
+ "tls"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/socket/issues",
+ "source": "https://github.com/amphp/socket/tree/v2.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2024-04-21T14:33:03+00:00"
+ },
+ {
+ "name": "amphp/sync",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/sync.git",
+ "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1",
+ "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^3",
+ "amphp/pipeline": "^1",
+ "amphp/serialization": "^1",
+ "php": ">=8.1",
+ "revolt/event-loop": "^1 || ^0.2"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "amphp/phpunit-util": "^3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "5.23"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\Sync\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ },
+ {
+ "name": "Stephen Coakley",
+ "email": "me@stephencoakley.com"
+ }
+ ],
+ "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.",
+ "homepage": "https://github.com/amphp/sync",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "mutex",
+ "semaphore",
+ "synchronization"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/sync/issues",
+ "source": "https://github.com/amphp/sync/tree/v2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-03T19:31:26+00:00"
+ },
+ {
+ "name": "composer/pcre",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+ "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<1.11.10"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.12 || ^2",
+ "phpstan/phpstan-strict-rules": "^1 || ^2",
+ "phpunit/phpunit": "^8 || ^9"
+ },
+ "type": "library",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-12T16:29:46+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-19T14:15:21+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "shasum": ""
+ },
+ "require": {
+ "composer/pcre": "^1 || ^2 || ^3",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without Xdebug.",
+ "keywords": [
+ "Xdebug",
+ "performance"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-06T16:37:16+00:00"
+ },
+ {
+ "name": "cweagans/composer-patches",
+ "version": "1.7.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cweagans/composer-patches.git",
+ "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
+ "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "composer/composer": "~1.0 || ~2.0",
+ "phpunit/phpunit": "~4.6"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "cweagans\\Composer\\Patches"
+ },
+ "autoload": {
+ "psr-4": {
+ "cweagans\\Composer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Cameron Eagans",
+ "email": "me@cweagans.net"
+ }
+ ],
+ "description": "Provides a way to patch Composer packages.",
+ "support": {
+ "issues": "https://github.com/cweagans/composer-patches/issues",
+ "source": "https://github.com/cweagans/composer-patches/tree/1.7.3"
+ },
+ "time": "2022-12-20T22:53:13+00:00"
+ },
+ {
+ "name": "daverandom/libdns",
+ "version": "v2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/DaveRandom/LibDNS.git",
+ "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a",
+ "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "Required for IDN support"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "LibDNS\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "DNS protocol implementation written in pure PHP",
+ "keywords": [
+ "dns"
+ ],
+ "support": {
+ "issues": "https://github.com/DaveRandom/LibDNS/issues",
+ "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0"
+ },
+ "time": "2024-04-12T12:12:48+00:00"
+ },
+ {
+ "name": "doctrine/deprecations",
+ "version": "1.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<=7.5 || >=13"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^12 || ^13",
+ "phpstan/phpstan": "1.4.10 || 2.1.11",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "suggest": {
+ "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Deprecations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+ "homepage": "https://www.doctrine-project.org/",
+ "support": {
+ "issues": "https://github.com/doctrine/deprecations/issues",
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.5"
+ },
+ "time": "2025-04-07T20:06:18+00:00"
+ },
+ {
+ "name": "fidry/console",
+ "version": "0.6.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theofidry/console.git",
+ "reference": "bea8316beae874fc5b8be679d67dd3169c7e205f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theofidry/console/zipball/bea8316beae874fc5b8be679d67dd3169c7e205f",
+ "reference": "bea8316beae874fc5b8be679d67dd3169c7e205f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2",
+ "psr/log": "^1.0 || ^2.0 || ^3.0",
+ "symfony/console": "^6.4 || ^7.2",
+ "symfony/deprecation-contracts": "^3.4",
+ "symfony/event-dispatcher-contracts": "^2.5 || ^3.0",
+ "symfony/polyfill-php84": "^1.31",
+ "symfony/service-contracts": "^2.5 || ^3.0",
+ "thecodingmachine/safe": "^2.0 || ^3.0",
+ "webmozart/assert": "^1.11"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4.0 || >=7.0.0 <7.2.0",
+ "symfony/framework-bundle": "<6.4.0 || >=7.0.0 <7.2.0",
+ "symfony/http-kernel": "<6.4.0 || >=7.0.0 <7.2.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "composer/semver": "^3.3.2",
+ "ergebnis/composer-normalize": "^2.33",
+ "fidry/makefile": "^0.2.1 || ^1.0.0",
+ "infection/infection": "^0.28",
+ "phpunit/phpunit": "^10.2",
+ "symfony/dependency-injection": "^6.4 || ^7.2",
+ "symfony/flex": "^2.4.0",
+ "symfony/framework-bundle": "^6.4 || ^7.2",
+ "symfony/http-kernel": "^6.4 || ^7.2",
+ "symfony/yaml": "^6.4 || ^7.2"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": false,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-main": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fidry\\Console\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Théo Fidry",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Library to create CLI applications",
+ "keywords": [
+ "cli",
+ "console",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/theofidry/console/issues",
+ "source": "https://github.com/theofidry/console/tree/0.6.11"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theofidry",
+ "type": "github"
+ }
+ ],
+ "time": "2025-02-14T11:06:15+00:00"
+ },
+ {
+ "name": "fidry/filesystem",
+ "version": "1.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theofidry/filesystem.git",
+ "reference": "3e1f9cac40f807b7c4196013ab77cc1b9416e3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theofidry/filesystem/zipball/3e1f9cac40f807b7c4196013ab77cc1b9416e3e5",
+ "reference": "3e1f9cac40f807b7c4196013ab77cc1b9416e3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1",
+ "symfony/filesystem": "^6.4 || ^7.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4",
+ "ergebnis/composer-normalize": "^2.28",
+ "infection/infection": ">=0.26",
+ "phpunit/phpunit": "^10.3",
+ "symfony/finder": "^6.4 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": false,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-main": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fidry\\FileSystem\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Théo Fidry",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Symfony Filesystem with a few more utilities.",
+ "keywords": [
+ "filesystem"
+ ],
+ "support": {
+ "issues": "https://github.com/theofidry/filesystem/issues",
+ "source": "https://github.com/theofidry/filesystem/tree/1.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theofidry",
+ "type": "github"
+ }
+ ],
+ "time": "2025-02-13T22:58:51+00:00"
+ },
+ {
+ "name": "humbug/box",
+ "version": "4.6.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/box-project/box.git",
+ "reference": "190d52718c2876452625c4489a04771e0f22c06b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/box-project/box/zipball/190d52718c2876452625c4489a04771e0f22c06b",
+ "reference": "190d52718c2876452625c4489a04771e0f22c06b",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/parallel": "^2.0",
+ "composer-plugin-api": "^2.2",
+ "composer/semver": "^3.3.2",
+ "composer/xdebug-handler": "^3.0.3",
+ "ext-iconv": "*",
+ "ext-mbstring": "*",
+ "ext-phar": "*",
+ "fidry/console": "^0.6.0",
+ "fidry/filesystem": "^1.2.1",
+ "humbug/php-scoper": "^0.18.14",
+ "justinrainbow/json-schema": "^6.2.0",
+ "nikic/iter": "^2.2",
+ "php": "^8.2",
+ "phpdocumentor/reflection-docblock": "^5.4",
+ "phpdocumentor/type-resolver": "^1.7",
+ "psr/log": "^3.0",
+ "sebastian/diff": "^5.0 || ^6.0 || ^7.0",
+ "seld/jsonlint": "^1.10.2",
+ "seld/phar-utils": "^1.2",
+ "symfony/finder": "^6.4.0 || ^7.0.0",
+ "symfony/polyfill-iconv": "^1.28",
+ "symfony/polyfill-mbstring": "^1.28",
+ "symfony/process": "^6.4.0 || ^7.0.0",
+ "symfony/var-dumper": "^6.4.0 || ^7.0.0",
+ "thecodingmachine/safe": "^2.5 || ^3.0",
+ "webmozart/assert": "^1.11"
+ },
+ "conflict": {
+ "marc-mabe/php-enum": "<4.4"
+ },
+ "replace": {
+ "symfony/polyfill-php80": "*",
+ "symfony/polyfill-php81": "*",
+ "symfony/polyfill-php82": "*"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "ergebnis/composer-normalize": "^2.29",
+ "ext-xml": "*",
+ "fidry/makefile": "^1.0.1",
+ "mikey179/vfsstream": "^1.6.11",
+ "phpspec/prophecy": "^1.18",
+ "phpspec/prophecy-phpunit": "^2.1.0",
+ "phpunit/phpunit": "^10.5.2",
+ "symfony/yaml": "^6.4.0 || ^7.0.0"
+ },
+ "suggest": {
+ "ext-openssl": "To accelerate private key generation."
+ },
+ "bin": [
+ "bin/box"
+ ],
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": false,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-main": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "KevinGH\\Box\\": "src"
+ },
+ "exclude-from-classmap": [
+ "/Test/",
+ "vendor/humbug/php-scoper/vendor-hotfix"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Herrera",
+ "email": "kevin@herrera.io",
+ "homepage": "http://kevin.herrera.io"
+ },
+ {
+ "name": "Théo Fidry",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Fast, zero config application bundler with PHARs.",
+ "keywords": [
+ "phar"
+ ],
+ "support": {
+ "issues": "https://github.com/box-project/box/issues",
+ "source": "https://github.com/box-project/box/tree/4.6.7"
+ },
+ "time": "2025-09-06T15:32:16+00:00"
+ },
+ {
+ "name": "humbug/php-scoper",
+ "version": "0.18.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/humbug/php-scoper.git",
+ "reference": "0a2556c7c23776a61cf22689e2f24298ba00e33a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/humbug/php-scoper/zipball/0a2556c7c23776a61cf22689e2f24298ba00e33a",
+ "reference": "0a2556c7c23776a61cf22689e2f24298ba00e33a",
+ "shasum": ""
+ },
+ "require": {
+ "fidry/console": "^0.6.10",
+ "fidry/filesystem": "^1.1",
+ "jetbrains/phpstorm-stubs": "^2024.1",
+ "nikic/php-parser": "^5.0",
+ "php": "^8.2",
+ "symfony/console": "^6.4 || ^7.0",
+ "symfony/filesystem": "^6.4 || ^7.0",
+ "symfony/finder": "^6.4 || ^7.0",
+ "symfony/var-dumper": "^7.1",
+ "thecodingmachine/safe": "^3.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.1",
+ "ergebnis/composer-normalize": "^2.28",
+ "fidry/makefile": "^1.0",
+ "humbug/box": "^4.6.2",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^10.0 || ^11.0",
+ "symfony/yaml": "^6.4 || ^7.0"
+ },
+ "bin": [
+ "bin/php-scoper"
+ ],
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": false,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Humbug\\PhpScoper\\": "src/"
+ },
+ "classmap": [
+ "vendor-hotfix/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ },
+ {
+ "name": "Théo Fidry",
+ "email": "theo.fidry@gmail.com"
+ },
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com"
+ }
+ ],
+ "description": "Prefixes all PHP namespaces in a file or directory.",
+ "support": {
+ "issues": "https://github.com/humbug/php-scoper/issues",
+ "source": "https://github.com/humbug/php-scoper/tree/0.18.17"
+ },
+ "time": "2025-02-19T22:50:39+00:00"
+ },
+ {
+ "name": "jetbrains/phpstorm-stubs",
+ "version": "v2024.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JetBrains/phpstorm-stubs.git",
+ "reference": "0e82bdfe850c71857ee4ee3501ed82a9fc5d043c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/0e82bdfe850c71857ee4ee3501ed82a9fc5d043c",
+ "reference": "0e82bdfe850c71857ee4ee3501ed82a9fc5d043c",
+ "shasum": ""
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "v3.64.0",
+ "nikic/php-parser": "v5.3.1",
+ "phpdocumentor/reflection-docblock": "5.6.0",
+ "phpunit/phpunit": "11.4.3"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "PhpStormStubsMap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "PHP runtime & extensions header files for PhpStorm",
+ "homepage": "https://www.jetbrains.com/phpstorm",
+ "keywords": [
+ "autocomplete",
+ "code",
+ "inference",
+ "inspection",
+ "jetbrains",
+ "phpstorm",
+ "stubs",
+ "type"
+ ],
+ "support": {
+ "source": "https://github.com/JetBrains/phpstorm-stubs/tree/v2024.3"
+ },
+ "time": "2024-12-14T08:03:12+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "6.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jsonrainbow/json-schema.git",
+ "reference": "b5ab21e431594897e5bb86343c01f140ba862c26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/b5ab21e431594897e5bb86343c01f140ba862c26",
+ "reference": "b5ab21e431594897e5bb86343c01f140ba862c26",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "marc-mabe/php-enum": "^4.0",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "3.3.0",
+ "json-schema/json-schema-test-suite": "^23.2",
+ "marc-mabe/php-enum-phpstan": "^2.0",
+ "phpspec/prophecy": "^1.19",
+ "phpstan/phpstan": "^1.12",
+ "phpunit/phpunit": "^8.5"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/jsonrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "support": {
+ "issues": "https://github.com/jsonrainbow/json-schema/issues",
+ "source": "https://github.com/jsonrainbow/json-schema/tree/6.5.1"
+ },
+ "time": "2025-08-29T10:58:11+00:00"
+ },
+ {
+ "name": "kelunik/certificate",
+ "version": "v1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kelunik/certificate.git",
+ "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e",
+ "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "^2",
+ "phpunit/phpunit": "^6 | 7 | ^8 | ^9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Kelunik\\Certificate\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "Access certificate details and transform between different formats.",
+ "keywords": [
+ "DER",
+ "certificate",
+ "certificates",
+ "openssl",
+ "pem",
+ "x509"
+ ],
+ "support": {
+ "issues": "https://github.com/kelunik/certificate/issues",
+ "source": "https://github.com/kelunik/certificate/tree/v1.1.3"
+ },
+ "time": "2023-02-03T21:26:53+00:00"
+ },
+ {
+ "name": "league/uri",
+ "version": "7.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430",
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430",
+ "shasum": ""
+ },
+ "require": {
+ "league/uri-interfaces": "^7.5",
+ "php": "^8.1"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-fileinfo": "to create Data URI from file contennts",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain",
+ "league/uri-components": "Needed to easily manipulate URI objects components",
+ "php-64bit": "to improve IPV4 host parsing",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri/tree/7.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-08T08:40:02+00:00"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "7.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742",
+ "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^8.1",
+ "psr/http-factory": "^1",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "php-64bit": "to improve IPV4 host parsing",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common interfaces and classes for URI representation and interaction",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-08T08:18:47+00:00"
+ },
+ {
+ "name": "marc-mabe/php-enum",
+ "version": "v4.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/marc-mabe/php-enum.git",
+ "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed",
+ "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed",
+ "shasum": ""
+ },
+ "require": {
+ "ext-reflection": "*",
+ "php": "^7.1 | ^8.0"
+ },
+ "require-dev": {
+ "phpbench/phpbench": "^0.16.10 || ^1.0.4",
+ "phpstan/phpstan": "^1.3.1",
+ "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11",
+ "vimeo/psalm": "^4.17.0 | ^5.26.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-3.x": "3.2-dev",
+ "dev-master": "4.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "MabeEnum\\": "src/"
+ },
+ "classmap": [
+ "stubs/Stringable.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Marc Bennewitz",
+ "email": "dev@mabe.berlin",
+ "homepage": "https://mabe.berlin/",
+ "role": "Lead"
+ }
+ ],
+ "description": "Simple and fast implementation of enumerations with native PHP",
+ "homepage": "https://github.com/marc-mabe/php-enum",
+ "keywords": [
+ "enum",
+ "enum-map",
+ "enum-set",
+ "enumeration",
+ "enumerator",
+ "enummap",
+ "enumset",
+ "map",
+ "set",
+ "type",
+ "type-hint",
+ "typehint"
+ ],
+ "support": {
+ "issues": "https://github.com/marc-mabe/php-enum/issues",
+ "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1"
+ },
+ "time": "2024-11-28T04:54:44+00:00"
+ },
+ {
+ "name": "nikic/iter",
+ "version": "v2.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/iter.git",
+ "reference": "3f031ae08d82c4394410e76b88b441331a6fa15f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/iter/zipball/3f031ae08d82c4394410e76b88b441331a6fa15f",
+ "reference": "3f031ae08d82c4394410e76b88b441331a6fa15f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+ "vimeo/psalm": "^4.18 || ^5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/iter.func.php",
+ "src/iter.php",
+ "src/iter.rewindable.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov",
+ "email": "nikic@php.net"
+ }
+ ],
+ "description": "Iteration primitives using generators",
+ "keywords": [
+ "functional",
+ "generator",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/iter/issues",
+ "source": "https://github.com/nikic/iter/tree/v2.4.1"
+ },
+ "time": "2024-03-19T20:45:05+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "ae59794362fe85e051a58ad36b289443f57be7a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9",
+ "reference": "ae59794362fe85e051a58ad36b289443f57be7a9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0"
+ },
+ "time": "2025-05-31T08:24:38+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.1",
+ "ext-filter": "*",
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.7",
+ "phpstan/phpdoc-parser": "^1.7|^2.0",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.5 || ~1.6.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^9.5",
+ "psalm/phar": "^5.26"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
+ },
+ "time": "2025-04-13T19:20:35+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.3 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpstan/phpdoc-parser": "^1.18|^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.13.9",
+ "vimeo/psalm": "^4.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0"
+ },
+ "time": "2024-11-09T15:12:26+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
+ "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "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.1.0"
+ },
+ "time": "2025-02-19T13:28:12+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory"
+ },
+ "time": "2024-04-15T12:06:14+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
+ },
+ "time": "2024-09-11T13:17:53+00:00"
+ },
+ {
+ "name": "revolt/event-loop",
+ "version": "v1.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/revoltphp/event-loop.git",
+ "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3",
+ "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "ext-json": "*",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^9",
+ "psalm/phar": "^5.15"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Revolt\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "ceesjank@gmail.com"
+ },
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "Rock-solid event loop for concurrent PHP applications.",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "concurrency",
+ "event",
+ "event-loop",
+ "non-blocking",
+ "scheduler"
+ ],
+ "support": {
+ "issues": "https://github.com/revoltphp/event-loop/issues",
+ "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7"
+ },
+ "time": "2025-01-25T19:27:39+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "5.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0",
+ "symfony/process": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T07:15:17+00:00"
+ },
+ {
+ "name": "seld/jsonlint",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/jsonlint.git",
+ "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2",
+ "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"
+ },
+ "bin": [
+ "bin/jsonlint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "JSON Linter",
+ "keywords": [
+ "json",
+ "linter",
+ "parser",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/jsonlint/issues",
+ "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-11T14:55:45+00:00"
+ },
+ {
+ "name": "seld/phar-utils",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/phar-utils.git",
+ "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
+ "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Seld\\PharUtils\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "PHAR file format utilities, for when PHP phars you up",
+ "keywords": [
+ "phar"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/phar-utils/issues",
+ "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1"
+ },
+ "time": "2022-08-31T10:31:18+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44",
+ "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^7.2"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/dotenv": "<6.4",
+ "symfony/event-dispatcher": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/process": "<6.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-05-24T10:34:04+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
+ "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
+ },
+ "require-dev": {
+ "symfony/process": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-25T15:15:23+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d",
+ "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-30T19:00:26+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-iconv",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-iconv.git",
+ "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa",
+ "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-iconv": "*"
+ },
+ "suggest": {
+ "ext-iconv": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Iconv\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Iconv extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "iconv",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-iconv/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-17T14:58:18+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php84",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php84.git",
+ "reference": "000df7860439609837bbe28670b0be15783b7fbf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf",
+ "reference": "000df7860439609837bbe28670b0be15783b7fbf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php84\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-02-20T12:04:08+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
+ "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-17T09:11:12+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-25T09:37:31+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125",
+ "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-20T20:19:01+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/548f6760c54197b1084e1e5c71f6d9d523f2f78e",
+ "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/uid": "^6.4|^7.0",
+ "twig/twig": "^3.12"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-27T18:39:23+00:00"
+ },
+ {
+ "name": "thecodingmachine/safe",
+ "version": "v3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thecodingmachine/safe.git",
+ "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/2cdd579eeaa2e78e51c7509b50cc9fb89a956236",
+ "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpstan/phpstan": "^2",
+ "phpunit/phpunit": "^10",
+ "squizlabs/php_codesniffer": "^3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/special_cases.php",
+ "generated/apache.php",
+ "generated/apcu.php",
+ "generated/array.php",
+ "generated/bzip2.php",
+ "generated/calendar.php",
+ "generated/classobj.php",
+ "generated/com.php",
+ "generated/cubrid.php",
+ "generated/curl.php",
+ "generated/datetime.php",
+ "generated/dir.php",
+ "generated/eio.php",
+ "generated/errorfunc.php",
+ "generated/exec.php",
+ "generated/fileinfo.php",
+ "generated/filesystem.php",
+ "generated/filter.php",
+ "generated/fpm.php",
+ "generated/ftp.php",
+ "generated/funchand.php",
+ "generated/gettext.php",
+ "generated/gmp.php",
+ "generated/gnupg.php",
+ "generated/hash.php",
+ "generated/ibase.php",
+ "generated/ibmDb2.php",
+ "generated/iconv.php",
+ "generated/image.php",
+ "generated/imap.php",
+ "generated/info.php",
+ "generated/inotify.php",
+ "generated/json.php",
+ "generated/ldap.php",
+ "generated/libxml.php",
+ "generated/lzf.php",
+ "generated/mailparse.php",
+ "generated/mbstring.php",
+ "generated/misc.php",
+ "generated/mysql.php",
+ "generated/mysqli.php",
+ "generated/network.php",
+ "generated/oci8.php",
+ "generated/opcache.php",
+ "generated/openssl.php",
+ "generated/outcontrol.php",
+ "generated/pcntl.php",
+ "generated/pcre.php",
+ "generated/pgsql.php",
+ "generated/posix.php",
+ "generated/ps.php",
+ "generated/pspell.php",
+ "generated/readline.php",
+ "generated/rnp.php",
+ "generated/rpminfo.php",
+ "generated/rrd.php",
+ "generated/sem.php",
+ "generated/session.php",
+ "generated/shmop.php",
+ "generated/sockets.php",
+ "generated/sodium.php",
+ "generated/solr.php",
+ "generated/spl.php",
+ "generated/sqlsrv.php",
+ "generated/ssdeep.php",
+ "generated/ssh2.php",
+ "generated/stream.php",
+ "generated/strings.php",
+ "generated/swoole.php",
+ "generated/uodbc.php",
+ "generated/uopz.php",
+ "generated/url.php",
+ "generated/var.php",
+ "generated/xdiff.php",
+ "generated/xml.php",
+ "generated/xmlrpc.php",
+ "generated/yaml.php",
+ "generated/yaz.php",
+ "generated/zip.php",
+ "generated/zlib.php"
+ ],
+ "classmap": [
+ "lib/DateTime.php",
+ "lib/DateTimeImmutable.php",
+ "lib/Exceptions/",
+ "generated/Exceptions/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHP core functions that throw exceptions instead of returning FALSE on error",
+ "support": {
+ "issues": "https://github.com/thecodingmachine/safe/issues",
+ "source": "https://github.com/thecodingmachine/safe/tree/v3.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/OskarStark",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/shish",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2025-05-14T06:15:44+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {},
+ "platform-dev": {},
+ "platform-overrides": {
+ "php": "8.2.99"
+ },
+ "plugin-api-version": "2.6.0"
+}
diff --git a/compiler/box/patches/ScoperAutoloaderGenerator.patch b/compiler/box/patches/ScoperAutoloaderGenerator.patch
new file mode 100644
index 0000000000..5f993cc80e
--- /dev/null
+++ b/compiler/box/patches/ScoperAutoloaderGenerator.patch
@@ -0,0 +1,20 @@
+--- src/Autoload/ScoperAutoloadGenerator.php 2025-06-04 20:36:51
++++ src/Autoload/ScoperAutoloadGenerator.php 2025-06-04 20:37:31
+@@ -108,7 +108,7 @@
+ \$loader = require_once __DIR__.'/autoload.php';
+ // Ensure InstalledVersions is available
+ \$installedVersionsPath = __DIR__.'/composer/InstalledVersions.php';
+- if (file_exists(\$installedVersionsPath)) require_once \$installedVersionsPath;
++ if (!class_exists(\Composer\InstalledVersions::class, false) && file_exists(\$installedVersionsPath)) require_once \$installedVersionsPath;
+
+ // Restore the backup and ensure the excluded files are properly marked as loaded
+ \$GLOBALS['__composer_autoload_files'] = \\array_merge(
+@@ -140,7 +140,7 @@
+ \$loader = require_once __DIR__.'/autoload.php';
+ // Ensure InstalledVersions is available
+ \$installedVersionsPath = __DIR__.'/composer/InstalledVersions.php';
+- if (file_exists(\$installedVersionsPath)) require_once \$installedVersionsPath;
++ if (!class_exists(\Composer\InstalledVersions::class, false) && file_exists(\$installedVersionsPath)) require_once \$installedVersionsPath;
+
+ // Restore the backup and ensure the excluded files are properly marked as loaded
+ \$GLOBALS['__composer_autoload_files'] = \\array_merge(
diff --git a/compiler/build/box.json b/compiler/build/box.json
index 9f0b7ee6c1..90bce8aff5 100644
--- a/compiler/build/box.json
+++ b/compiler/build/box.json
@@ -8,7 +8,8 @@
],
"files": [
"preload.php",
- "vendor/composer/installed.php"
+ "vendor/composer/installed.php",
+ "vendor/attributes.php"
],
"directories": [
"conf",
diff --git a/compiler/build/box.phar b/compiler/build/box.phar
deleted file mode 100644
index 76da031be9..0000000000
Binary files a/compiler/build/box.phar and /dev/null differ
diff --git a/compiler/build/resign.php b/compiler/build/resign.php
new file mode 100644
index 0000000000..01b7228962
--- /dev/null
+++ b/compiler/build/resign.php
@@ -0,0 +1,15 @@
+updateTimestamps(new \DateTimeImmutable('2017-10-11 08:58:00'));
+$util->save($file, \Phar::SHA512);
diff --git a/compiler/build/scoper.inc.php b/compiler/build/scoper.inc.php
index f097836c95..98138a3bca 100644
--- a/compiler/build/scoper.inc.php
+++ b/compiler/build/scoper.inc.php
@@ -16,6 +16,12 @@
'../../stubs',
'../../vendor/jetbrains/phpstorm-stubs',
'../../vendor/phpstan/php-8-stubs/stubs',
+ '../../vendor/symfony/polyfill-php80',
+ '../../vendor/symfony/polyfill-php81',
+ '../../vendor/symfony/polyfill-php83',
+ '../../vendor/symfony/polyfill-mbstring',
+ '../../vendor/symfony/polyfill-intl-normalizer',
+ '../../vendor/symfony/polyfill-intl-grapheme',
]) as $file) {
if ($file->getPathName() === '../../vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php') {
continue;
@@ -23,40 +29,36 @@
$stubs[] = $file->getPathName();
}
-exec('git rev-parse --short HEAD', $gitCommitOutputLines, $gitExitCode);
-if ($gitExitCode !== 0) {
- die('Could not get Git commit');
+if ($_SERVER['PHAR_CHECKSUM'] ?? false) {
+ $prefix = '_PHPStan_checksum';
+} else {
+ exec('git rev-parse --short HEAD', $gitCommitOutputLines, $gitExitCode);
+ if ($gitExitCode !== 0) {
+ die('Could not get Git commit');
+ }
+
+ $prefix = sprintf('_PHPStan_%s', $gitCommitOutputLines[0]);
}
return [
- 'prefix' => sprintf('_PHPStan_%s', $gitCommitOutputLines[0]),
+ 'prefix' => $prefix,
'finders' => [],
- 'files-whitelist' => $stubs,
+ 'exclude-files' => $stubs,
+ 'php-version' => '7.4',
'patchers' => [
- function (string $filePath, string $prefix, string $content): string {
- if ($filePath !== 'bin/phpstan') {
- return $content;
- }
- return str_replace('__DIR__ . \'/..', '\'phar://phpstan.phar', $content);
- },
function (string $filePath, string $prefix, string $content): string {
if ($filePath !== 'vendor/nette/di/src/DI/Compiler.php') {
return $content;
}
- return str_replace('|Nette\\\\DI\\\\Statement', sprintf('|\\\\%s\\\\Nette\\\\DI\\\\Statement', $prefix), $content);
+ return str_replace('|Nette\\DI\\Statement', sprintf('|\\%s\\Nette\\DI\\Statement', $prefix), $content);
},
function (string $filePath, string $prefix, string $content): string {
- if ($filePath !== 'vendor/nette/di/src/DI/Config/DefinitionSchema.php') {
+ if ($filePath !== 'vendor/nette/di/src/DI/Extensions/DefinitionSchema.php') {
return $content;
}
$content = str_replace(
- sprintf('\'%s\\\\callable', $prefix),
- '\'callable',
- $content
- );
- $content = str_replace(
- '|Nette\\\\DI\\\\Definitions\\\\Statement',
- sprintf('|%s\\\\Nette\\\\DI\\\\Definitions\\\\Statement', $prefix),
+ '|Nette\\DI\\Definitions\\Statement',
+ sprintf('|%s\\Nette\\DI\\Definitions\\Statement', $prefix),
$content
);
@@ -67,41 +69,20 @@ function (string $filePath, string $prefix, string $content): string {
return $content;
}
$content = str_replace(
- sprintf('\'%s\\\\string', $prefix),
- '\'string',
- $content
- );
- $content = str_replace(
- '|Nette\\\\DI\\\\Definitions\\\\Statement',
- sprintf('|%s\\\\Nette\\\\DI\\\\Definitions\\\\Statement', $prefix),
+ '|Nette\\DI\\Definitions\\Statement',
+ sprintf('|%s\\Nette\\DI\\Definitions\\Statement', $prefix),
$content
);
return $content;
},
- function (string $filePath, string $prefix, string $content): string {
- if ($filePath !== 'src/Testing/PHPStanTestCase.php') {
- return $content;
- }
- return str_replace(sprintf('\\%s\\PHPUnit\\Framework\\TestCase', $prefix), '\\PHPUnit\\Framework\\TestCase', $content);
- },
- function (string $filePath, string $prefix, string $content): string {
- if ($filePath !== 'src/Testing/LevelsTestCase.php') {
- return $content;
- }
- return str_replace(
- [sprintf('\\%s\\PHPUnit\\Framework\\AssertionFailedError', $prefix), sprintf('\\%s\\PHPUnit\\Framework\\TestCase', $prefix)],
- ['\\PHPUnit\\Framework\\AssertionFailedError', '\\PHPUnit\\Framework\\TestCase'],
- $content
- );
- },
+
function (string $filePath, string $prefix, string $content): string {
if (strpos($filePath, 'src/') !== 0) {
return $content;
}
- $content = str_replace(sprintf('\'%s\\\\r\\\\n\'', $prefix), '\'\\\\r\\\\n\'', $content);
- $content = str_replace(sprintf('\'%s\\\\', $prefix), '\'', $content);
+ $content = str_replace(sprintf('\'%s\\r\\n\'', $prefix), '\'\\r\\n\'', $content);
return $content;
},
@@ -159,20 +140,29 @@ function (string $filePath, string $prefix, string $content): string {
},
function (string $filePath, string $prefix, string $content): string {
if (!in_array($filePath, [
+ 'bin/phpstan',
'src/Testing/TestCaseSourceLocatorFactory.php',
'src/Testing/PHPStanTestCase.php',
+ 'vendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/ComposerSourceLocator.php',
], true)) {
return $content;
}
return str_replace(sprintf('%s\\Composer\\Autoload\\ClassLoader', $prefix), 'Composer\\Autoload\\ClassLoader', $content);
},
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'src/Internal/ComposerHelper.php') {
+ return $content;
+ }
+
+ return str_replace(sprintf('%s\\Composer\\InstalledVersions', $prefix), 'Composer\\InstalledVersions', $content);
+ },
function (string $filePath, string $prefix, string $content): string {
if ($filePath !== 'vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php') {
return $content;
}
- $content = str_replace('\'' . $prefix . '\\\\', '\'', $content);
+ $content = str_replace('\'' . $prefix . '\\', '\'', $content);
return $content;
},
@@ -181,33 +171,85 @@ function (string $filePath, string $prefix, string $content): string {
return $content;
}
- $content = str_replace('\'' . $prefix . '\\\\', '\'', $content);
+ $content = str_replace('\'' . $prefix . '\\', '\'', $content);
return $content;
},
function (string $filePath, string $prefix, string $content): string {
- if (!in_array($filePath, [
- 'src/Type/TypehintHelper.php',
- 'vendor/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionUnionType.php',
- ], true)) {
+ if ($filePath !== 'vendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubsSourceStubber.php') {
+ return $content;
+ }
+
+ return str_replace('Core/Core_d.php', 'Core/Core_d.stub', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'vendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubsSourceStubber.php') {
+ return $content;
+ }
+
+ return str_replace(sprintf('\'%s\\JetBrains\\', $prefix), '\'JetBrains\\', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (!str_starts_with($filePath, 'vendor/nikic/php-parser/lib')) {
+ return $content;
+ }
+
+ return str_replace(sprintf('use %s\\PhpParser;', $prefix), 'use PhpParser;', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (!str_starts_with($filePath, 'vendor/nikic/php-parser/lib')) {
+ return $content;
+ }
+
+ return str_replace([
+ sprintf('\\%s', $prefix),
+ sprintf('\\\\%s', $prefix),
+ ], '', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (!str_starts_with($filePath, 'vendor/ondrejmirtes/better-reflection')) {
return $content;
}
- return str_replace(sprintf('%s\\ReflectionUnionType', $prefix), 'ReflectionUnionType', $content);
+ return str_replace(sprintf('%s\\PropertyHookType', $prefix), 'PropertyHookType', $content);
},
function (string $filePath, string $prefix, string $content): string {
if (strpos($filePath, 'src/') !== 0) {
return $content;
}
- return str_replace(sprintf('%s\\Attribute', $prefix), 'Attribute', $content);
- }
+ return str_replace([
+ sprintf('\'%s\\BcMath\\', $prefix),
+ sprintf('\'%s\\Dom\\', $prefix),
+ sprintf('\'%s\\FFI\\', $prefix),
+ sprintf('\'%s\\Ds\\', $prefix),
+ ], [
+ '\'BcMath\\',
+ '\'Dom\\',
+ '\'FFI\\',
+ '\'Ds\\',
+ ], $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (strpos($filePath, 'src/Testing/ErrorFormatterTestCase.php') !== 0) {
+ return $content;
+ }
+
+ return str_replace(sprintf('new Error(\'%s\\Foobar\\Buz', $prefix), 'new Error(\'Foobar\\Buz', $content);
+ },
],
- 'whitelist' => [
- 'PHPStan\*',
- 'PhpParser\*',
- 'Hoa\*',
+ 'exclude-namespaces' => [
+ 'PHPStan',
+ 'PHPUnit',
+ 'PhpParser',
+ 'Hoa',
+ 'Symfony\Polyfill\Php80',
+ 'Symfony\Polyfill\Php81',
+ 'Symfony\Polyfill\Php83',
+ 'Symfony\Polyfill\Mbstring',
+ 'Symfony\Polyfill\Intl\Normalizer',
+ 'Symfony\Polyfill\Intl\Grapheme',
],
- 'whitelist-global-functions' => false,
- 'whitelist-global-classes' => false,
+ 'expose-global-functions' => false,
+ 'expose-global-classes' => false,
];
diff --git a/compiler/composer.json b/compiler/composer.json
index 109608810b..d69b1a1a8f 100644
--- a/compiler/composer.json
+++ b/compiler/composer.json
@@ -4,12 +4,14 @@
"description": "PHAR Compiler for PHPStan",
"license": ["MIT"],
"require": {
- "php": "^7.3",
+ "php": "^8.2",
"nette/neon": "^3.0.0",
- "symfony/console": "^5.2.2",
- "symfony/process": "^5.2.2",
- "symfony/filesystem": "^5.2.2",
- "symfony/finder": "^5.2.2"
+ "ondrejmirtes/simple-downgrader": "^2.2.2",
+ "seld/phar-utils": "^1.2",
+ "symfony/console": "^5.4.43",
+ "symfony/filesystem": "^5.4.43",
+ "symfony/finder": "^5.4.43",
+ "symfony/process": "^5.4.43"
},
"autoload": {
"psr-4": {
@@ -22,12 +24,13 @@
}
},
"require-dev": {
- "phpunit/phpunit": "^9.5.1",
- "phpstan/phpstan-phpunit": "^1.0"
+ "phpstan/phpstan": "^2.1",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.5.1"
},
"config": {
"platform": {
- "php": "7.3.24"
+ "php": "8.2.99"
},
"platform-check": false,
"sort-packages": true
diff --git a/compiler/composer.lock b/compiler/composer.lock
index 4517aaff62..cecb355cfc 100644
--- a/compiler/composer.lock
+++ b/compiler/composer.lock
@@ -4,35 +4,38 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "5e13c6da184e97394b42dff8a20ba685",
+ "content-hash": "421cae13caa4a836476ab23b026961de",
"packages": [
{
"name": "nette/neon",
- "version": "v3.2.2",
+ "version": "v3.4.4",
"source": {
"type": "git",
"url": "https://github.com/nette/neon.git",
- "reference": "e4ca6f4669121ca6876b1d048c612480e39a28d5"
+ "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/neon/zipball/e4ca6f4669121ca6876b1d048c612480e39a28d5",
- "reference": "e4ca6f4669121ca6876b1d048c612480e39a28d5",
+ "url": "https://api.github.com/repos/nette/neon/zipball/3411aa86b104e2d5b7e760da4600865ead963c3c",
+ "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c",
"shasum": ""
},
"require": {
"ext-json": "*",
- "php": ">=7.1"
+ "php": "8.0 - 8.4"
},
"require-dev": {
- "nette/tester": "^2.0",
- "phpstan/phpstan": "^0.12",
- "tracy/tracy": "^2.3"
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.7"
},
+ "bin": [
+ "bin/neon-lint"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.4-dev"
}
},
"autoload": {
@@ -67,28 +70,274 @@
],
"support": {
"issues": "https://github.com/nette/neon/issues",
- "source": "https://github.com/nette/neon/tree/v3.2.2"
+ "source": "https://github.com/nette/neon/tree/v3.4.4"
+ },
+ "time": "2024-10-04T22:00:08+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v3.2.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2 <8.4"
+ },
+ "conflict": {
+ "nette/di": "<3.0.6"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "~2.0",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.3"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
+ "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v3.2.10"
+ },
+ "time": "2023-07-30T15:38:18+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56",
+ "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.0"
+ },
+ "time": "2025-07-27T20:03:57+00:00"
+ },
+ {
+ "name": "ondrejmirtes/simple-downgrader",
+ "version": "2.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ondrejmirtes/simple-downgrader.git",
+ "reference": "5de54eaa47dac5142e36b4085a12e5103e93366c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ondrejmirtes/simple-downgrader/zipball/5de54eaa47dac5142e36b4085a12e5103e93366c",
+ "reference": "5de54eaa47dac5142e36b4085a12e5103e93366c",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^3.2.5",
+ "nikic/php-parser": "^5.5.0",
+ "php": "^8.2",
+ "phpstan/phpdoc-parser": "^2.0",
+ "symfony/console": "^5.4.47",
+ "symfony/finder": "^5.4.45",
+ "symfony/polyfill-php80": "^1.32"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.3",
+ "phpstan/phpstan": "^2.0",
+ "phpunit/phpunit": "^9.6"
+ },
+ "bin": [
+ "bin/simple-downgrade"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "SimpleDowngrader\\": [
+ "src/"
+ ]
+ }
},
- "time": "2021-02-28T12:30:32+00:00"
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Simple Downgrader",
+ "support": {
+ "issues": "https://github.com/ondrejmirtes/simple-downgrader/issues",
+ "source": "https://github.com/ondrejmirtes/simple-downgrader/tree/2.2.2"
+ },
+ "time": "2025-09-20T18:37:56+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "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.2.0"
+ },
+ "time": "2025-07-13T07:04:09+00:00"
},
{
"name": "psr/container",
- "version": "1.1.1",
+ "version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
"shasum": ""
},
"require": {
- "php": ">=7.2.0"
+ "php": ">=7.4.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
@@ -115,34 +364,83 @@
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/1.1.1"
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "seld/phar-utils",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/phar-utils.git",
+ "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
+ "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Seld\\PharUtils\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "PHAR file format utilities, for when PHP phars you up",
+ "keywords": [
+ "phar"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/phar-utils/issues",
+ "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1"
},
- "time": "2021-03-05T17:36:06+00:00"
+ "time": "2022-08-31T10:31:18+00:00"
},
{
"name": "symfony/console",
- "version": "v5.3.2",
+ "version": "v5.4.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "649730483885ff2ca99ca0560ef0e5f6b03f2ac1"
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/649730483885ff2ca99ca0560ef0e5f6b03f2ac1",
- "reference": "649730483885ff2ca99ca0560ef0e5f6b03f2ac1",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php73": "^1.8",
- "symfony/polyfill-php80": "^1.15",
- "symfony/service-contracts": "^1.1|^2",
- "symfony/string": "^5.1"
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
},
"conflict": {
+ "psr/log": ">=3",
"symfony/dependency-injection": "<4.4",
"symfony/dotenv": "<5.1",
"symfony/event-dispatcher": "<4.4",
@@ -150,16 +448,16 @@
"symfony/process": "<4.4"
},
"provide": {
- "psr/log-implementation": "1.0"
+ "psr/log-implementation": "1.0|2.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "^4.4|^5.0",
- "symfony/dependency-injection": "^4.4|^5.0",
- "symfony/event-dispatcher": "^4.4|^5.0",
- "symfony/lock": "^4.4|^5.0",
- "symfony/process": "^4.4|^5.0",
- "symfony/var-dumper": "^4.4|^5.0"
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/log": "For using the console logger",
@@ -194,12 +492,12 @@
"homepage": "https://symfony.com",
"keywords": [
"cli",
- "command line",
+ "command-line",
"console",
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v5.3.2"
+ "source": "https://github.com/symfony/console/tree/v5.4.47"
},
"funding": [
{
@@ -215,33 +513,33 @@
"type": "tidelift"
}
],
- "time": "2021-06-12T09:42:48+00:00"
+ "time": "2024-11-06T11:30:55+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v2.4.0",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627"
+ "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627",
- "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+ "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.0.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "2.4-dev"
- },
"thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -266,7 +564,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
},
"funding": [
{
@@ -282,25 +580,30 @@
"type": "tidelift"
}
],
- "time": "2021-03-23T23:28:01+00:00"
+ "time": "2022-01-02T09:55:41+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v5.3.0",
+ "version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "348116319d7fb7d1faa781d26a48922428013eb2"
+ "reference": "57c8294ed37d4a055b77057827c67f9558c95c54"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/348116319d7fb7d1faa781d26a48922428013eb2",
- "reference": "348116319d7fb7d1faa781d26a48922428013eb2",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54",
+ "reference": "57c8294ed37d4a055b77057827c67f9558c95c54",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
- "symfony/polyfill-ctype": "~1.8"
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "symfony/process": "^5.4|^6.4"
},
"type": "library",
"autoload": {
@@ -328,7 +631,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v5.3.0"
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.45"
},
"funding": [
{
@@ -344,24 +647,26 @@
"type": "tidelift"
}
],
- "time": "2021-05-26T17:43:10+00:00"
+ "time": "2024-10-22T13:05:35+00:00"
},
{
"name": "symfony/finder",
- "version": "v5.3.0",
+ "version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6"
+ "reference": "63741784cd7b9967975eec610b256eed3ede022b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6",
- "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b",
+ "reference": "63741784cd7b9967975eec610b256eed3ede022b",
"shasum": ""
},
"require": {
- "php": ">=7.2.5"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
"autoload": {
@@ -389,7 +694,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v5.3.0"
+ "source": "https://github.com/symfony/finder/tree/v5.4.45"
},
"funding": [
{
@@ -405,45 +710,45 @@
"type": "tidelift"
}
],
- "time": "2021-05-26T12:52:38+00:00"
+ "time": "2024-09-28T13:32:08+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.23.0",
+ "version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
- "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
},
"suggest": {
"ext-ctype": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- },
"files": [
"bootstrap.php"
- ]
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -468,7 +773,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
},
"funding": [
{
@@ -484,45 +789,42 @@
"type": "tidelift"
}
],
- "time": "2021-02-19T12:13:01+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.23.0",
+ "version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab"
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab",
- "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
- },
"files": [
"bootstrap.php"
- ]
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -549,7 +851,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
},
"funding": [
{
@@ -565,45 +867,42 @@
"type": "tidelift"
}
],
- "time": "2021-05-27T09:17:38+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.23.0",
+ "version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
- },
"files": [
"bootstrap.php"
],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
"classmap": [
"Resources/stubs"
]
@@ -633,7 +932,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
},
"funding": [
{
@@ -649,45 +948,46 @@
"type": "tidelift"
}
],
- "time": "2021-02-19T12:13:01+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.23.0",
+ "version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1"
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1",
- "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
},
"suggest": {
"ext-mbstring": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
"files": [
"bootstrap.php"
- ]
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -713,7 +1013,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
},
"funding": [
{
@@ -729,44 +1029,41 @@
"type": "tidelift"
}
],
- "time": "2021-05-27T09:27:20+00:00"
+ "time": "2024-12-23T08:48:59+00:00"
},
{
"name": "symfony/polyfill-php73",
- "version": "v1.23.0",
+ "version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010"
+ "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010",
- "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
+ "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php73\\": ""
- },
"files": [
"bootstrap.php"
],
- "classmap": [
- "Resources/stubs"
+ "psr-4": {
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -792,7 +1089,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0"
},
"funding": [
{
@@ -808,42 +1105,39 @@
"type": "tidelift"
}
],
- "time": "2021-02-19T12:13:01+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.23.0",
+ "version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0"
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0",
- "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php80\\": ""
- },
"files": [
"bootstrap.php"
],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
"classmap": [
"Resources/stubs"
]
@@ -875,7 +1169,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
},
"funding": [
{
@@ -891,25 +1185,25 @@
"type": "tidelift"
}
],
- "time": "2021-02-19T12:13:01+00:00"
+ "time": "2025-01-02T08:10:11+00:00"
},
{
"name": "symfony/process",
- "version": "v5.3.2",
+ "version": "v5.4.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "714b47f9196de61a196d86c4bad5f09201b307df"
+ "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df",
- "reference": "714b47f9196de61a196d86c4bad5f09201b307df",
+ "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d",
+ "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
- "symfony/polyfill-php80": "^1.15"
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
"autoload": {
@@ -937,7 +1231,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v5.3.2"
+ "source": "https://github.com/symfony/process/tree/v5.4.47"
},
"funding": [
{
@@ -953,37 +1247,40 @@
"type": "tidelift"
}
],
- "time": "2021-06-12T10:15:01+00:00"
+ "time": "2024-11-06T11:36:42+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v2.4.0",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb"
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
- "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/container": "^1.1"
+ "php": ">=8.0.2",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
},
"suggest": {
"symfony/service-implementation": ""
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "2.4-dev"
- },
"thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -1016,7 +1313,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v2.4.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.0.2"
},
"funding": [
{
@@ -1032,44 +1329,46 @@
"type": "tidelift"
}
],
- "time": "2021-04-01T10:43:52+00:00"
+ "time": "2022-05-30T19:17:58+00:00"
},
{
"name": "symfony/string",
- "version": "v5.3.2",
+ "version": "v6.0.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "0732e97e41c0a590f77e231afc16a327375d50b0"
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/0732e97e41c0a590f77e231afc16a327375d50b0",
- "reference": "0732e97e41c0a590f77e231afc16a327375d50b0",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
+ "php": ">=8.0.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php80": "~1.15"
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.0"
},
"require-dev": {
- "symfony/error-handler": "^4.4|^5.0",
- "symfony/http-client": "^4.4|^5.0",
- "symfony/translation-contracts": "^1.1|^2",
- "symfony/var-exporter": "^4.4|^5.0"
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/http-client": "^5.4|^6.0",
+ "symfony/translation-contracts": "^2.0|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0"
},
"type": "library",
"autoload": {
- "psr-4": {
- "Symfony\\Component\\String\\": ""
- },
"files": [
"Resources/functions.php"
],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
"exclude-from-classmap": [
"/Tests/"
]
@@ -1099,7 +1398,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v5.3.2"
+ "source": "https://github.com/symfony/string/tree/v6.0.19"
},
"funding": [
{
@@ -1110,335 +1409,46 @@
"url": "https://github.com/fabpot",
"type": "github"
},
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2021-06-06T09:51:56+00:00"
- }
- ],
- "packages-dev": [
- {
- "name": "doctrine/instantiator",
- "version": "1.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
- "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
- "shasum": ""
- },
- "require": {
- "php": "^7.1 || ^8.0"
- },
- "require-dev": {
- "doctrine/coding-standard": "^8.0",
- "ext-pdo": "*",
- "ext-phar": "*",
- "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
- "phpstan/phpstan": "^0.12",
- "phpstan/phpstan-phpunit": "^0.12",
- "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com",
- "homepage": "https://ocramius.github.io/"
- }
- ],
- "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
- "keywords": [
- "constructor",
- "instantiate"
- ],
- "support": {
- "issues": "https://github.com/doctrine/instantiator/issues",
- "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
- },
- "funding": [
- {
- "url": "https://www.doctrine-project.org/sponsorship.html",
- "type": "custom"
- },
- {
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
- "type": "tidelift"
- }
- ],
- "time": "2020-11-10T18:47:58+00:00"
- },
- {
- "name": "myclabs/deep-copy",
- "version": "1.10.2",
- "source": {
- "type": "git",
- "url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
- "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
- "shasum": ""
- },
- "require": {
- "php": "^7.1 || ^8.0"
- },
- "replace": {
- "myclabs/deep-copy": "self.version"
- },
- "require-dev": {
- "doctrine/collections": "^1.0",
- "doctrine/common": "^2.6",
- "phpunit/phpunit": "^7.1"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "DeepCopy\\": "src/DeepCopy/"
- },
- "files": [
- "src/DeepCopy/deep_copy.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Create deep copies (clones) of your objects",
- "keywords": [
- "clone",
- "copy",
- "duplicate",
- "object",
- "object graph"
- ],
- "support": {
- "issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
- },
- "funding": [
- {
- "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
- "type": "tidelift"
- }
- ],
- "time": "2020-11-13T09:40:50+00:00"
- },
- {
- "name": "nikic/php-parser",
- "version": "v4.10.5",
- "source": {
- "type": "git",
- "url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4432ba399e47c66624bc73c8c0f811e5c109576f",
- "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f",
- "shasum": ""
- },
- "require": {
- "ext-tokenizer": "*",
- "php": ">=7.0"
- },
- "require-dev": {
- "ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
- },
- "bin": [
- "bin/php-parse"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.9-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "PhpParser\\": "lib/PhpParser"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Nikita Popov"
- }
- ],
- "description": "A PHP parser written in PHP",
- "keywords": [
- "parser",
- "php"
- ],
- "support": {
- "issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.5"
- },
- "time": "2021-05-03T19:11:20+00:00"
- },
- {
- "name": "phar-io/manifest",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/phar-io/manifest.git",
- "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
- "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "ext-phar": "*",
- "ext-xmlwriter": "*",
- "phar-io/version": "^3.0.1",
- "php": "^7.2 || ^8.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "Developer"
- }
- ],
- "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
- "support": {
- "issues": "https://github.com/phar-io/manifest/issues",
- "source": "https://github.com/phar-io/manifest/tree/master"
- },
- "time": "2020-06-27T14:33:11+00:00"
- },
- {
- "name": "phar-io/version",
- "version": "3.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phar-io/version.git",
- "reference": "bae7c545bef187884426f042434e561ab1ddb182"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
- "reference": "bae7c545bef187884426f042434e561ab1ddb182",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "Developer"
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "description": "Library for handling version information and constraints",
- "support": {
- "issues": "https://github.com/phar-io/version/issues",
- "source": "https://github.com/phar-io/version/tree/3.1.0"
- },
- "time": "2021-02-23T14:00:09+00:00"
- },
+ "time": "2023-01-01T08:36:10+00:00"
+ }
+ ],
+ "packages-dev": [
{
- "name": "phpdocumentor/reflection-common",
- "version": "2.2.0",
+ "name": "doctrine/instantiator",
+ "version": "1.5.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": "^7.1 || ^8.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-2.x": "2.x-dev"
- }
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.16 || ^1",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.30 || ^5.4"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": "src/"
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1447,228 +1457,240 @@
],
"authors": [
{
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
}
],
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
+ "constructor",
+ "instantiate"
],
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
- "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
},
- "time": "2020-06-27T09:03:43+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:15:36+00:00"
},
{
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.2.2",
+ "name": "myclabs/deep-copy",
+ "version": "1.13.4",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
- "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
"shasum": ""
},
"require": {
- "ext-filter": "*",
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.3",
- "webmozart/assert": "^1.9.1"
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
- "mockery/mockery": "~1.3.2"
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.x-dev"
- }
- },
"autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
"psr-4": {
- "phpDocumentor\\Reflection\\": "src"
+ "DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- },
- {
- "name": "Jaap van Otterdijk",
- "email": "account@ijaap.nl"
- }
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
},
- "time": "2020-09-03T19:13:55+00:00"
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-01T08:46:24+00:00"
},
{
- "name": "phpdocumentor/type-resolver",
- "version": "1.4.0",
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
- "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.0"
- },
- "require-dev": {
- "ext-tokenizer": "*"
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-1.x": "1.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
- "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
},
- "time": "2020-09-17T18:55:26+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
},
{
- "name": "phpspec/prophecy",
- "version": "1.13.0",
+ "name": "phar-io/version",
+ "version": "3.2.1",
"source": {
"type": "git",
- "url": "https://github.com/phpspec/prophecy.git",
- "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea"
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea",
- "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.2",
- "php": "^7.2 || ~8.0, <8.1",
- "phpdocumentor/reflection-docblock": "^5.2",
- "sebastian/comparator": "^3.0 || ^4.0",
- "sebastian/recursion-context": "^3.0 || ^4.0"
- },
- "require-dev": {
- "phpspec/phpspec": "^6.0",
- "phpunit/phpunit": "^8.0 || ^9.0"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.11.x-dev"
- }
- },
"autoload": {
- "psr-4": {
- "Prophecy\\": "src/Prophecy"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
},
{
- "name": "Marcello Duarte",
- "email": "marcello.duarte@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "description": "Highly opinionated mocking framework for PHP 5.3+",
- "homepage": "https://github.com/phpspec/prophecy",
- "keywords": [
- "Double",
- "Dummy",
- "fake",
- "mock",
- "spy",
- "stub"
- ],
+ "description": "Library for handling version information and constraints",
"support": {
- "issues": "https://github.com/phpspec/prophecy/issues",
- "source": "https://github.com/phpspec/prophecy/tree/1.13.0"
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
},
- "time": "2021-03-17T13:42:18+00:00"
+ "time": "2022-02-21T01:04:05+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "dev-master",
+ "version": "2.1.28",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "ad96e5efd921513113c96245e0e3ed369c5544d4"
+ "reference": "578fa296a166605d97b94091f724f1257185d278"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad96e5efd921513113c96245e0e3ed369c5544d4",
- "reference": "ad96e5efd921513113c96245e0e3ed369c5544d4",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/578fa296a166605d97b94091f724f1257185d278",
+ "reference": "578fa296a166605d97b94091f724f1257185d278",
"shasum": ""
},
"require": {
- "php": "^7.1|^8.0"
+ "php": "^7.4|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
- "default-branch": true,
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
"autoload": {
"files": [
"bootstrap.php"
@@ -1679,9 +1701,16 @@
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
"support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
"issues": "https://github.com/phpstan/phpstan/issues",
- "source": "https://github.com/phpstan/phpstan/tree/master"
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
},
"funding": [
{
@@ -1691,50 +1720,40 @@
{
"url": "https://github.com/phpstan",
"type": "github"
- },
- {
- "url": "https://www.patreon.com/phpstan",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
- "type": "tidelift"
}
],
- "time": "2021-09-12T20:30:21+00:00"
+ "time": "2025-09-19T08:58:49+00:00"
},
{
"name": "phpstan/phpstan-phpunit",
- "version": "dev-master",
+ "version": "2.0.7",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-phpunit.git",
- "reference": "6c0e48e98f082e94be11bca4db64489194c66b06"
+ "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6c0e48e98f082e94be11bca4db64489194c66b06",
- "reference": "6c0e48e98f082e94be11bca4db64489194c66b06",
+ "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/9a9b161baee88a5f5c58d816943cff354ff233dc",
+ "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0",
- "phpstan/phpstan": "^1.0"
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.1.18"
},
"conflict": {
"phpunit/phpunit": "<7.0"
},
"require-dev": {
+ "nikic/php-parser": "^5",
"php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5"
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6"
},
- "default-branch": true,
"type": "phpstan-extension",
"extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- },
"phpstan": {
"includes": [
"extension.neon",
@@ -1754,50 +1773,50 @@
"description": "PHPUnit extensions and rules for PHPStan",
"support": {
"issues": "https://github.com/phpstan/phpstan-phpunit/issues",
- "source": "https://github.com/phpstan/phpstan-phpunit/tree/master"
+ "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.7"
},
- "time": "2021-09-12T20:25:39+00:00"
+ "time": "2025-07-13T11:31:46+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "9.2.6",
+ "version": "9.2.32",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "f6293e1b30a2354e8428e004689671b83871edde"
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde",
- "reference": "f6293e1b30a2354e8428e004689671b83871edde",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.10.2",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
"php": ">=7.3",
- "phpunit/php-file-iterator": "^3.0.3",
- "phpunit/php-text-template": "^2.0.2",
- "sebastian/code-unit-reverse-lookup": "^2.0.2",
- "sebastian/complexity": "^2.0",
- "sebastian/environment": "^5.1.2",
- "sebastian/lines-of-code": "^1.0.3",
- "sebastian/version": "^3.0.1",
- "theseer/tokenizer": "^1.2.0"
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "sebastian/code-unit-reverse-lookup": "^2.0.3",
+ "sebastian/complexity": "^2.0.3",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/lines-of-code": "^1.0.4",
+ "sebastian/version": "^3.0.2",
+ "theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^9.6"
},
"suggest": {
- "ext-pcov": "*",
- "ext-xdebug": "*"
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.2-dev"
+ "dev-main": "9.2.x-dev"
}
},
"autoload": {
@@ -1825,7 +1844,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6"
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32"
},
"funding": [
{
@@ -1833,20 +1853,20 @@
"type": "github"
}
],
- "time": "2021-03-28T07:26:59+00:00"
+ "time": "2024-08-22T04:23:01+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "3.0.5",
+ "version": "3.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
- "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
"shasum": ""
},
"require": {
@@ -1885,7 +1905,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
},
"funding": [
{
@@ -1893,7 +1913,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:57:25+00:00"
+ "time": "2021-12-02T12:48:52+00:00"
},
{
"name": "phpunit/php-invoker",
@@ -2078,55 +2098,50 @@
},
{
"name": "phpunit/phpunit",
- "version": "9.5.6",
+ "version": "9.6.28",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb"
+ "reference": "a8017241a554a259997a5285eee5d10c69ff7187"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb",
- "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a8017241a554a259997a5285eee5d10c69ff7187",
+ "reference": "a8017241a554a259997a5285eee5d10c69ff7187",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.3.1",
+ "doctrine/instantiator": "^1.5.0 || ^2",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.1",
- "phar-io/version": "^3.0.2",
+ "myclabs/deep-copy": "^1.13.4",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
"php": ">=7.3",
- "phpspec/prophecy": "^1.12.1",
- "phpunit/php-code-coverage": "^9.2.3",
- "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-code-coverage": "^9.2.32",
+ "phpunit/php-file-iterator": "^3.0.6",
"phpunit/php-invoker": "^3.1.1",
- "phpunit/php-text-template": "^2.0.3",
- "phpunit/php-timer": "^5.0.2",
- "sebastian/cli-parser": "^1.0.1",
- "sebastian/code-unit": "^1.0.6",
- "sebastian/comparator": "^4.0.5",
- "sebastian/diff": "^4.0.3",
- "sebastian/environment": "^5.1.3",
- "sebastian/exporter": "^4.0.3",
- "sebastian/global-state": "^5.0.1",
- "sebastian/object-enumerator": "^4.0.3",
- "sebastian/resource-operations": "^3.0.3",
- "sebastian/type": "^2.3.4",
+ "phpunit/php-text-template": "^2.0.4",
+ "phpunit/php-timer": "^5.0.3",
+ "sebastian/cli-parser": "^1.0.2",
+ "sebastian/code-unit": "^1.0.8",
+ "sebastian/comparator": "^4.0.9",
+ "sebastian/diff": "^4.0.6",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/exporter": "^4.0.7",
+ "sebastian/global-state": "^5.0.8",
+ "sebastian/object-enumerator": "^4.0.4",
+ "sebastian/resource-operations": "^3.0.4",
+ "sebastian/type": "^3.2.1",
"sebastian/version": "^3.0.2"
},
- "require-dev": {
- "ext-pdo": "*",
- "phpspec/prophecy-phpunit": "^2.0.1"
- },
"suggest": {
- "ext-soap": "*",
- "ext-xdebug": "*"
+ "ext-soap": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
},
"bin": [
"phpunit"
@@ -2134,15 +2149,15 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.5-dev"
+ "dev-master": "9.6-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ],
"files": [
"src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2165,32 +2180,45 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.6"
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.28"
},
"funding": [
{
- "url": "https://phpunit.de/donate.html",
+ "url": "https://phpunit.de/sponsors.html",
"type": "custom"
},
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
}
],
- "time": "2021-06-23T05:14:38+00:00"
+ "time": "2025-09-23T06:20:12+00:00"
},
{
"name": "sebastian/cli-parser",
- "version": "1.0.1",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
"shasum": ""
},
"require": {
@@ -2225,7 +2253,7 @@
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
},
"funding": [
{
@@ -2233,7 +2261,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:08:49+00:00"
+ "time": "2024-03-02T06:27:43+00:00"
},
{
"name": "sebastian/code-unit",
@@ -2348,16 +2376,16 @@
},
{
"name": "sebastian/comparator",
- "version": "4.0.6",
+ "version": "4.0.9",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
- "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5",
+ "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5",
"shasum": ""
},
"require": {
@@ -2410,32 +2438,44 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
- "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
+ "type": "tidelift"
}
],
- "time": "2020-10-26T15:49:45+00:00"
+ "time": "2025-08-10T06:51:50+00:00"
},
{
"name": "sebastian/complexity",
- "version": "2.0.2",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.7",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -2467,7 +2507,7 @@
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
- "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
},
"funding": [
{
@@ -2475,20 +2515,20 @@
"type": "github"
}
],
- "time": "2020-10-26T15:52:27+00:00"
+ "time": "2023-12-22T06:19:30+00:00"
},
{
"name": "sebastian/diff",
- "version": "4.0.4",
+ "version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
"shasum": ""
},
"require": {
@@ -2533,7 +2573,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
},
"funding": [
{
@@ -2541,20 +2581,20 @@
"type": "github"
}
],
- "time": "2020-10-26T13:10:38+00:00"
+ "time": "2024-03-02T06:30:58+00:00"
},
{
"name": "sebastian/environment",
- "version": "5.1.3",
+ "version": "5.1.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
"shasum": ""
},
"require": {
@@ -2596,7 +2636,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
},
"funding": [
{
@@ -2604,20 +2644,20 @@
"type": "github"
}
],
- "time": "2020-09-28T05:52:38+00:00"
+ "time": "2023-02-03T06:03:51+00:00"
},
{
"name": "sebastian/exporter",
- "version": "4.0.3",
+ "version": "4.0.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ "reference": "eb49b981ef0817890129cb70f774506bebe57740"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
- "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/eb49b981ef0817890129cb70f774506bebe57740",
+ "reference": "eb49b981ef0817890129cb70f774506bebe57740",
"shasum": ""
},
"require": {
@@ -2666,35 +2706,47 @@
}
],
"description": "Provides the functionality to export PHP variables for visualization",
- "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.7"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter",
+ "type": "tidelift"
}
],
- "time": "2020-09-28T05:24:23+00:00"
+ "time": "2025-09-22T05:18:21+00:00"
},
{
"name": "sebastian/global-state",
- "version": "5.0.3",
+ "version": "5.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49"
+ "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49",
- "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6",
+ "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6",
"shasum": ""
},
"require": {
@@ -2737,32 +2789,44 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state",
+ "type": "tidelift"
}
],
- "time": "2021-06-11T13:31:12+00:00"
+ "time": "2025-08-10T07:10:35+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "1.0.3",
+ "version": "1.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.6",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -2794,7 +2858,7 @@
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
},
"funding": [
{
@@ -2802,7 +2866,7 @@
"type": "github"
}
],
- "time": "2020-11-28T06:42:11+00:00"
+ "time": "2023-12-22T06:20:34+00:00"
},
{
"name": "sebastian/object-enumerator",
@@ -2918,16 +2982,16 @@
},
{
"name": "sebastian/recursion-context",
- "version": "4.0.4",
+ "version": "4.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
"shasum": ""
},
"require": {
@@ -2966,10 +3030,10 @@
}
],
"description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
},
"funding": [
{
@@ -2977,20 +3041,20 @@
"type": "github"
}
],
- "time": "2020-10-26T13:17:30+00:00"
+ "time": "2023-02-03T06:07:39+00:00"
},
{
"name": "sebastian/resource-operations",
- "version": "3.0.3",
+ "version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
"shasum": ""
},
"require": {
@@ -3002,7 +3066,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -3023,8 +3087,7 @@
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"support": {
- "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
- "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
},
"funding": [
{
@@ -3032,32 +3095,32 @@
"type": "github"
}
],
- "time": "2020-09-28T06:45:17+00:00"
+ "time": "2024-03-14T16:00:52+00:00"
},
{
"name": "sebastian/type",
- "version": "2.3.4",
+ "version": "3.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
- "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^9.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3-dev"
+ "dev-master": "3.2-dev"
}
},
"autoload": {
@@ -3080,7 +3143,7 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
},
"funding": [
{
@@ -3088,7 +3151,7 @@
"type": "github"
}
],
- "time": "2021-06-15T12:49:02+00:00"
+ "time": "2023-02-03T06:13:03+00:00"
},
{
"name": "sebastian/version",
@@ -3145,16 +3208,16 @@
},
{
"name": "theseer/tokenizer",
- "version": "1.2.0",
+ "version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
- "reference": "75a63c33a8577608444246075ea0af0d052e452a"
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
- "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
"shasum": ""
},
"require": {
@@ -3183,7 +3246,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/master"
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
},
"funding": [
{
@@ -3191,78 +3254,20 @@
"type": "github"
}
],
- "time": "2020-07-12T23:59:07+00:00"
- },
- {
- "name": "webmozart/assert",
- "version": "1.10.0",
- "source": {
- "type": "git",
- "url": "https://github.com/webmozarts/assert.git",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
- },
- "conflict": {
- "phpstan/phpstan": "<0.12.20",
- "vimeo/psalm": "<4.6.1 || 4.6.2"
- },
- "require-dev": {
- "phpunit/phpunit": "^8.5.13"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.10-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Webmozart\\Assert\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
- }
- ],
- "description": "Assertions to validate method input/output with nice error messages.",
- "keywords": [
- "assert",
- "check",
- "validate"
- ],
- "support": {
- "issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.10.0"
- },
- "time": "2021-03-09T10:59:23+00:00"
+ "time": "2024-03-03T12:36:25+00:00"
}
],
"aliases": [],
"minimum-stability": "dev",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": "^7.3"
+ "php": "^8.2"
},
- "platform-dev": [],
+ "platform-dev": {},
"platform-overrides": {
- "php": "7.3.24"
+ "php": "8.2.99"
},
- "plugin-api-version": "2.1.0"
+ "plugin-api-version": "2.6.0"
}
diff --git a/compiler/patches/stubs/PDO/PDO.stub.patch b/compiler/patches/stubs/PDO/PDO.stub.patch
deleted file mode 100644
index 0f65cc6010..0000000000
--- a/compiler/patches/stubs/PDO/PDO.stub.patch
+++ /dev/null
@@ -1,18 +0,0 @@
---- PDO/PDO.stub 2020-06-14 14:26:12.000000000 +0200
-+++ PDO/PDO2.stub 2020-06-14 14:26:12.000000000 +0200
-@@ -843,6 +843,15 @@
- */
- const SQLITE_ATTR_EXTENDED_RESULT_CODES = 2;
-
-+ const FB_ATTR_DATE_FORMAT = 1;
-+ const FB_ATTR_TIME_FORMAT = 2;
-+ const FB_ATTR_TIMESTAMP_FORMAT = 3;
-+
-+ const OCI_ATTR_ACTION = 1;
-+ const OCI_ATTR_CLIENT_INFO = 2;
-+ const OCI_ATTR_CLIENT_IDENTIFIER = 3;
-+ const OCI_ATTR_MODULE = 4;
-+
- /**
- * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
- * Creates a PDO instance representing a connection to a database
diff --git a/compiler/src/Console/CompileCommand.php b/compiler/src/Console/CompileCommand.php
deleted file mode 100644
index 194198f2f2..0000000000
--- a/compiler/src/Console/CompileCommand.php
+++ /dev/null
@@ -1,246 +0,0 @@
-filesystem = $filesystem;
- $this->processFactory = $processFactory;
- $this->dataDir = $dataDir;
- $this->buildDir = $buildDir;
- }
-
- protected function configure(): void
- {
- $this->setName('phpstan:compile')
- ->setDescription('Compile PHAR');
- }
-
- protected function execute(InputInterface $input, OutputInterface $output): int
- {
- $this->processFactory->setOutput($output);
-
- $this->buildPreloadScript();
- $this->deleteUnnecessaryVendorCode();
- $this->fixComposerJson($this->buildDir);
- $this->renamePhpStormStubs();
- $this->patchPhpStormStubs($output);
- $this->renamePhp8Stubs();
- $this->transformSource();
-
- $this->processFactory->create(['php', 'box.phar', 'compile', '--no-parallel'], $this->dataDir);
-
- return 0;
- }
-
- private function fixComposerJson(string $buildDir): void
- {
- $json = json_decode($this->filesystem->read($buildDir . '/composer.json'), true);
-
- unset($json['replace']);
- $json['name'] = 'phpstan/phpstan';
- $json['require']['php'] = '^7.1';
-
- // simplify autoload (remove not packed build directory]
- $json['autoload']['psr-4']['PHPStan\\'] = 'src/';
-
- $encodedJson = json_encode($json, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
- if ($encodedJson === false) {
- throw new \Exception('json_encode() was not successful.');
- }
-
- $this->filesystem->write($buildDir . '/composer.json', $encodedJson);
- }
-
- private function renamePhpStormStubs(): void
- {
- $directory = $this->buildDir . '/vendor/jetbrains/phpstorm-stubs';
- if (!is_dir($directory)) {
- return;
- }
-
- $stubFinder = \Symfony\Component\Finder\Finder::create();
- $stubsMapPath = $directory . '/PhpStormStubsMap.php';
- foreach ($stubFinder->files()->name('*.php')->in($directory) as $stubFile) {
- $path = $stubFile->getPathname();
- if ($path === $stubsMapPath) {
- continue;
- }
-
- $renameSuccess = rename(
- $path,
- dirname($path) . '/' . $stubFile->getBasename('.php') . '.stub'
- );
- if ($renameSuccess === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not rename %s', $path));
- }
- }
-
- $stubsMapContents = file_get_contents($stubsMapPath);
- if ($stubsMapContents === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not read %s', $stubsMapPath));
- }
-
- $stubsMapContents = str_replace('.php\',', '.stub\',', $stubsMapContents);
-
- $putSuccess = file_put_contents($stubsMapPath, $stubsMapContents);
- if ($putSuccess === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not write %s', $stubsMapPath));
- }
- }
-
- private function renamePhp8Stubs(): void
- {
- $directory = $this->buildDir . '/vendor/phpstan/php-8-stubs/stubs';
- if (!is_dir($directory)) {
- return;
- }
-
- $stubFinder = \Symfony\Component\Finder\Finder::create();
- $stubsMapPath = $directory . '/../Php8StubsMap.php';
- foreach ($stubFinder->files()->name('*.php')->in($directory) as $stubFile) {
- $path = $stubFile->getPathname();
- if ($path === $stubsMapPath) {
- continue;
- }
-
- $renameSuccess = rename(
- $path,
- dirname($path) . '/' . $stubFile->getBasename('.php') . '.stub'
- );
- if ($renameSuccess === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not rename %s', $path));
- }
- }
-
- $stubsMapContents = file_get_contents($stubsMapPath);
- if ($stubsMapContents === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not read %s', $stubsMapPath));
- }
-
- $stubsMapContents = str_replace('.php\',', '.stub\',', $stubsMapContents);
-
- $putSuccess = file_put_contents($stubsMapPath, $stubsMapContents);
- if ($putSuccess === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not write %s', $stubsMapPath));
- }
- }
-
- private function patchPhpStormStubs(OutputInterface $output): void
- {
- $stubFinder = \Symfony\Component\Finder\Finder::create();
- $stubsDirectory = __DIR__ . '/../../../vendor/jetbrains/phpstorm-stubs';
- foreach ($stubFinder->files()->name('*.patch')->in(__DIR__ . '/../../patches/stubs') as $patchFile) {
- $absolutePatchPath = $patchFile->getPathname();
- $patchPath = $patchFile->getRelativePathname();
- $stubPath = realpath($stubsDirectory . '/' . dirname($patchPath) . '/' . basename($patchPath, '.patch'));
- if ($stubPath === false) {
- $output->writeln(sprintf('Stub %s not found.', $stubPath));
- continue;
- }
- $this->patchFile($output, $stubPath, $absolutePatchPath);
- }
- }
-
- private function buildPreloadScript(): void
- {
- $vendorDir = $this->buildDir . '/vendor';
- if (!is_dir($vendorDir . '/nikic/php-parser/lib/PhpParser')) {
- return;
- }
-
- $preloadScript = $this->buildDir . '/preload.php';
- $template = <<<'php'
-files()->name('*.php')->in([
- $this->buildDir . '/src',
- $vendorDir . '/nikic/php-parser/lib/PhpParser',
- $vendorDir . '/phpstan/phpdoc-parser/src',
- ])->exclude([
- 'Testing',
- ]) as $phpFile) {
- $realPath = $phpFile->getRealPath();
- if ($realPath === false) {
- return;
- }
- $path = substr($realPath, strlen($root));
- $output .= 'require_once __DIR__ . ' . var_export($path, true) . ';' . "\n";
- }
-
- file_put_contents($preloadScript, sprintf($template, $output));
- }
-
- private function deleteUnnecessaryVendorCode(): void
- {
- $vendorDir = $this->buildDir . '/vendor';
- if (!is_dir($vendorDir . '/nikic/php-parser')) {
- return;
- }
-
- @unlink($vendorDir . '/nikic/php-parser/grammar/rebuildParsers.php');
- @unlink($vendorDir . '/nikic/php-parser/bin/php-parse');
- }
-
- private function patchFile(OutputInterface $output, string $originalFile, string $patchFile): void
- {
- exec(sprintf(
- 'patch -d %s %s %s',
- escapeshellarg($this->buildDir),
- escapeshellarg($originalFile),
- escapeshellarg($patchFile)
- ), $outputLines, $exitCode);
- if ($exitCode === 0) {
- return;
- }
-
- $output->writeln(sprintf('Patching failed: %s', implode("\n", $outputLines)));
- }
-
- private function transformSource(): void
- {
- exec(escapeshellarg(__DIR__ . '/../../../bin/transform-source.php'), $outputLines, $exitCode);
- if ($exitCode === 0) {
- return;
- }
-
- throw new \PHPStan\ShouldNotHappenException(implode("\n", $outputLines));
- }
-
-}
diff --git a/compiler/src/Console/PrepareCommand.php b/compiler/src/Console/PrepareCommand.php
new file mode 100644
index 0000000000..cc8ddbac5d
--- /dev/null
+++ b/compiler/src/Console/PrepareCommand.php
@@ -0,0 +1,231 @@
+setName('prepare')
+ ->setDescription('Prepare PHAR');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $this->buildPreloadScript();
+ $this->deleteUnnecessaryVendorCode();
+ $this->fixComposerJson($this->buildDir);
+ $this->renamePhpStormStubs();
+ $this->renamePhp8Stubs();
+ $this->transformSource();
+ return 0;
+ }
+
+ private function fixComposerJson(string $buildDir): void
+ {
+ $json = json_decode($this->filesystem->read($buildDir . '/composer.json'), true);
+
+ unset($json['replace']['phpstan/phpstan']);
+ $json['name'] = 'phpstan/phpstan';
+ $json['require']['php'] = '^7.4|^8.0';
+
+ // simplify autoload (remove not packed build directory]
+ $json['autoload']['psr-4']['PHPStan\\'] = 'src/';
+
+ $encodedJson = json_encode($json, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
+ if ($encodedJson === false) {
+ throw new Exception('json_encode() was not successful.');
+ }
+
+ $this->filesystem->write($buildDir . '/composer.json', $encodedJson);
+ }
+
+ private function renamePhpStormStubs(): void
+ {
+ $directory = $this->buildDir . '/vendor/jetbrains/phpstorm-stubs';
+ if (!is_dir($directory)) {
+ return;
+ }
+
+ $stubFinder = Finder::create();
+ $stubsMapPath = realpath($directory . '/PhpStormStubsMap.php');
+ if ($stubsMapPath === false) {
+ throw new Exception('realpath() failed');
+ }
+ foreach ($stubFinder->files()->name('*.php')->in($directory) as $stubFile) {
+ $path = $stubFile->getPathname();
+ if ($path === $stubsMapPath) {
+ continue;
+ }
+
+ $renameSuccess = rename(
+ $path,
+ dirname($path) . '/' . $stubFile->getBasename('.php') . '.stub',
+ );
+ if ($renameSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not rename %s', $path));
+ }
+ }
+
+ $stubsMapContents = file_get_contents($stubsMapPath);
+ if ($stubsMapContents === false) {
+ throw new ShouldNotHappenException(sprintf('Could not read %s', $stubsMapPath));
+ }
+
+ $stubsMapContents = str_replace('.php\',', '.stub\',', $stubsMapContents);
+
+ $putSuccess = file_put_contents($stubsMapPath, $stubsMapContents);
+ if ($putSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not write %s', $stubsMapPath));
+ }
+ }
+
+ private function renamePhp8Stubs(): void
+ {
+ $directory = $this->buildDir . '/vendor/phpstan/php-8-stubs/stubs';
+ if (!is_dir($directory)) {
+ return;
+ }
+
+ $stubFinder = Finder::create();
+ $stubsMapPath = $directory . '/../Php8StubsMap.php';
+ foreach ($stubFinder->files()->name('*.php')->in($directory) as $stubFile) {
+ $path = $stubFile->getPathname();
+ if ($path === $stubsMapPath) {
+ continue;
+ }
+
+ $renameSuccess = rename(
+ $path,
+ dirname($path) . '/' . $stubFile->getBasename('.php') . '.stub',
+ );
+ if ($renameSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not rename %s', $path));
+ }
+ }
+
+ $stubsMapContents = file_get_contents($stubsMapPath);
+ if ($stubsMapContents === false) {
+ throw new ShouldNotHappenException(sprintf('Could not read %s', $stubsMapPath));
+ }
+
+ $stubsMapContents = str_replace('.php\',', '.stub\',', $stubsMapContents);
+
+ $putSuccess = file_put_contents($stubsMapPath, $stubsMapContents);
+ if ($putSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not write %s', $stubsMapPath));
+ }
+ }
+
+ private function buildPreloadScript(): void
+ {
+ $vendorDir = $this->buildDir . '/vendor';
+ if (!is_dir($vendorDir . '/nikic/php-parser/lib/PhpParser')) {
+ return;
+ }
+
+ $preloadScript = $this->buildDir . '/preload.php';
+ $template = <<<'php'
+files()->name('*.php')->in([
+ $this->buildDir . '/src',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser',
+ $vendorDir . '/phpstan/phpdoc-parser/src',
+ ])->exclude([
+ 'Testing',
+ ])->sortByName() as $phpFile) {
+ $realPath = $phpFile->getRealPath();
+ if ($realPath === false) {
+ return;
+ }
+ if (in_array($realPath, [
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php',
+ ], true)) {
+ continue;
+ }
+ $path = substr($realPath, strlen($root));
+ $output .= 'require_once __DIR__ . ' . var_export($path, true) . ';' . "\n";
+ }
+
+ file_put_contents($preloadScript, sprintf($template, $output));
+ }
+
+ private function deleteUnnecessaryVendorCode(): void
+ {
+ $vendorDir = $this->buildDir . '/vendor';
+ if (!is_dir($vendorDir . '/nikic/php-parser')) {
+ return;
+ }
+
+ @unlink($vendorDir . '/nikic/php-parser/grammar/rebuildParsers.php');
+ @unlink($vendorDir . '/nikic/php-parser/bin/php-parse');
+ }
+
+ private function transformSource(): void
+ {
+ chdir(__DIR__ . '/../../..');
+ exec(escapeshellarg(__DIR__ . '/../../vendor/bin/simple-downgrade') . ' downgrade -c ' . escapeshellarg('build/downgrade.php') . ' 7.4', $outputLines, $exitCode);
+ if ($exitCode === 0) {
+ return;
+ }
+
+ throw new ShouldNotHappenException(implode("\n", $outputLines));
+ }
+
+}
diff --git a/compiler/src/Filesystem/SymfonyFilesystem.php b/compiler/src/Filesystem/SymfonyFilesystem.php
index 7946e92626..e74d01fd74 100644
--- a/compiler/src/Filesystem/SymfonyFilesystem.php
+++ b/compiler/src/Filesystem/SymfonyFilesystem.php
@@ -2,15 +2,15 @@
namespace PHPStan\Compiler\Filesystem;
+use RuntimeException;
+use function file_get_contents;
+use function file_put_contents;
+
final class SymfonyFilesystem implements Filesystem
{
- /** @var \Symfony\Component\Filesystem\Filesystem */
- private $filesystem;
-
- public function __construct(\Symfony\Component\Filesystem\Filesystem $filesystem)
+ public function __construct(private \Symfony\Component\Filesystem\Filesystem $filesystem)
{
- $this->filesystem = $filesystem;
}
public function exists(string $dir): bool
@@ -32,7 +32,7 @@ public function read(string $file): string
{
$content = file_get_contents($file);
if ($content === false) {
- throw new \RuntimeException();
+ throw new RuntimeException();
}
return $content;
}
diff --git a/compiler/src/Process/DefaultProcessFactory.php b/compiler/src/Process/DefaultProcessFactory.php
deleted file mode 100644
index 3f4a09a6b1..0000000000
--- a/compiler/src/Process/DefaultProcessFactory.php
+++ /dev/null
@@ -1,34 +0,0 @@
-output = new NullOutput();
- }
-
- /**
- * @param string[] $command
- * @param string $cwd
- * @return \PHPStan\Compiler\Process\Process
- */
- public function create(array $command, string $cwd): Process
- {
- return new SymfonyProcess($command, $cwd, $this->output);
- }
-
- public function setOutput(OutputInterface $output): void
- {
- $this->output = $output;
- }
-
-}
diff --git a/compiler/src/Process/Process.php b/compiler/src/Process/Process.php
deleted file mode 100644
index 1bf5d1f25d..0000000000
--- a/compiler/src/Process/Process.php
+++ /dev/null
@@ -1,13 +0,0 @@
-
- */
- public function getProcess(): \Symfony\Component\Process\Process;
-
-}
diff --git a/compiler/src/Process/ProcessFactory.php b/compiler/src/Process/ProcessFactory.php
deleted file mode 100644
index f892601f73..0000000000
--- a/compiler/src/Process/ProcessFactory.php
+++ /dev/null
@@ -1,19 +0,0 @@
- */
- private $process;
-
- /**
- * @param string[] $command
- * @param string $cwd
- * @param \Symfony\Component\Console\Output\OutputInterface $output
- */
- public function __construct(array $command, string $cwd, OutputInterface $output)
- {
- $this->process = (new \Symfony\Component\Process\Process($command, $cwd, null, null, null))
- ->mustRun(static function (string $type, string $buffer) use ($output): void {
- $output->write($buffer);
- });
- }
-
- /**
- * @return \Symfony\Component\Process\Process
- */
- public function getProcess(): \Symfony\Component\Process\Process
- {
- return $this->process;
- }
-
-}
diff --git a/compiler/tests/.phpunit.result.cache b/compiler/tests/.phpunit.result.cache
index 4cf5b2c855..136029df2b 100644
--- a/compiler/tests/.phpunit.result.cache
+++ b/compiler/tests/.phpunit.result.cache
@@ -1 +1 @@
-C:37:"PHPUnit\Runner\DefaultTestResultCache":636:{a:2:{s:7:"defects";a:0:{}s:5:"times";a:8:{s:56:"PHPStan\Compiler\Console\CompileCommandTest::testCommand";d:0.053;s:61:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testExists";d:0.01;s:61:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testRemove";d:0;s:60:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testMkdir";d:0;s:59:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testRead";d:0;s:60:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testWrite";d:0.008;s:62:"PHPStan\Compiler\Process\DefaultProcessFactoryTest::testCreate";d:0.058;s:59:"PHPStan\Compiler\Process\SymfonyProcessTest::testGetProcess";d:0.01;}}}
\ No newline at end of file
+{"version":1,"defects":[],"times":{"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testExists":0.014,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testRemove":0,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testMkdir":0,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testRead":0,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testWrite":0}}
\ No newline at end of file
diff --git a/compiler/tests/Console/CompileCommandTest.php b/compiler/tests/Console/CompileCommandTest.php
deleted file mode 100644
index 72e1a5d5dc..0000000000
--- a/compiler/tests/Console/CompileCommandTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-createMock(Filesystem::class);
- $filesystem->expects(self::once())->method('read')->with('bar/composer.json')->willReturn('{"name":"phpstan/phpstan-src","replace":{"phpstan/phpstan": "self.version"},"require":{"php":"^7.4"},"require-dev":1,"autoload-dev":2,"autoload":{"psr-4":{"PHPStan\\\\":[3]}}}');
- $filesystem->expects(self::once())->method('write')->with('bar/composer.json', <<createMock(Process::class);
-
- $processFactory = $this->createMock(ProcessFactory::class);
- $processFactory->method('setOutput');
- $processFactory->method('create')->with(['php', 'box.phar', 'compile', '--no-parallel'], 'foo')->willReturn($process);
-
- $application = new Application();
- $application->add(new CompileCommand($filesystem, $processFactory, 'foo', 'bar'));
-
- $command = $application->find('phpstan:compile');
- $commandTester = new CommandTester($command);
- $exitCode = $commandTester->execute([
- 'command' => $command->getName(),
- ]);
-
- self::assertSame(0, $exitCode);
- }
-
-}
diff --git a/compiler/tests/Filesystem/SymfonyFilesystemTest.php b/compiler/tests/Filesystem/SymfonyFilesystemTest.php
index 0d21aff557..5a0f486441 100644
--- a/compiler/tests/Filesystem/SymfonyFilesystemTest.php
+++ b/compiler/tests/Filesystem/SymfonyFilesystemTest.php
@@ -3,13 +3,15 @@
namespace PHPStan\Compiler\Filesystem;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Filesystem\Filesystem;
+use function unlink;
final class SymfonyFilesystemTest extends TestCase
{
public function testExists(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$inner->expects(self::once())->method('exists')->with('foo')->willReturn(true);
self::assertTrue((new SymfonyFilesystem($inner))->exists('foo'));
@@ -17,7 +19,7 @@ public function testExists(): void
public function testRemove(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$inner->expects(self::once())->method('remove')->with('foo')->willReturn(true);
(new SymfonyFilesystem($inner))->remove('foo');
@@ -25,7 +27,7 @@ public function testRemove(): void
public function testMkdir(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$inner->expects(self::once())->method('mkdir')->with('foo')->willReturn(true);
(new SymfonyFilesystem($inner))->mkdir('foo');
@@ -33,7 +35,7 @@ public function testMkdir(): void
public function testRead(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$content = (new SymfonyFilesystem($inner))->read(__DIR__ . '/data/composer.json');
self::assertSame("{}\n", $content);
@@ -41,7 +43,7 @@ public function testRead(): void
public function testWrite(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
@unlink(__DIR__ . '/data/test.json');
(new SymfonyFilesystem($inner))->write(__DIR__ . '/data/test.json', "{}\n");
diff --git a/compiler/tests/Process/DefaultProcessFactoryTest.php b/compiler/tests/Process/DefaultProcessFactoryTest.php
deleted file mode 100644
index 31756e8f18..0000000000
--- a/compiler/tests/Process/DefaultProcessFactoryTest.php
+++ /dev/null
@@ -1,24 +0,0 @@
-createMock(OutputInterface::class);
- $output->expects(self::once())->method('write');
-
- $factory = new DefaultProcessFactory();
- $factory->setOutput($output);
-
- $process = $factory->create(['ls'], __DIR__)->getProcess();
- self::assertSame('\'ls\'', $process->getCommandLine());
- self::assertSame(__DIR__, $process->getWorkingDirectory());
- }
-
-}
diff --git a/compiler/tests/Process/SymfonyProcessTest.php b/compiler/tests/Process/SymfonyProcessTest.php
deleted file mode 100644
index 8124ba1c96..0000000000
--- a/compiler/tests/Process/SymfonyProcessTest.php
+++ /dev/null
@@ -1,21 +0,0 @@
-createMock(OutputInterface::class);
- $output->expects(self::once())->method('write');
-
- $process = (new SymfonyProcess(['ls'], __DIR__, $output))->getProcess();
- self::assertSame('\'ls\'', $process->getCommandLine());
- self::assertSame(__DIR__, $process->getWorkingDirectory());
- }
-
-}
diff --git a/composer.json b/composer.json
index 88aaae4948..bb18a3f101 100644
--- a/composer.json
+++ b/composer.json
@@ -5,65 +5,134 @@
"MIT"
],
"require": {
- "php": "^7.4 || ^8.0",
- "clue/block-react": "^1.4",
+ "php": "^8.2",
+ "composer-runtime-api": "^2.0",
"clue/ndjson-react": "^1.0",
"composer/ca-bundle": "^1.2",
- "composer/xdebug-handler": "^2.0.1",
+ "composer/semver": "^3.4",
+ "composer/xdebug-handler": "^3.0.3",
+ "fidry/cpu-core-counter": "^1.2",
"hoa/compiler": "3.17.08.08",
"hoa/exception": "^1.0",
- "hoa/regex": "1.17.01.13",
- "jean85/pretty-package-versions": "^1.0.3",
- "jetbrains/phpstorm-stubs": "dev-master#82595d7a426c4b3d1e3a7d604ad3f99534784599",
+ "hoa/file": "1.17.07.11",
+ "jetbrains/phpstorm-stubs": "dev-master#d1ee5e570343bd4276a3d5959e6e1c2530b006d0",
"nette/bootstrap": "^3.0",
- "nette/di": "^3.0.5",
- "nette/finder": "^2.5",
- "nette/neon": "^3.0",
- "nette/schema": "^1.0",
- "nette/utils": "^3.1.3",
- "nikic/php-parser": "4.13.0",
+ "nette/di": "^3.1.4",
+ "nette/neon": "3.3.4",
+ "nette/php-generator": "3.6.9",
+ "nette/schema": "^1.2.2",
+ "nette/utils": "^3.2.5",
+ "nikic/php-parser": "^5.6.0",
"ondram/ci-detector": "^3.4.0",
- "ondrejmirtes/better-reflection": "4.3.70",
- "phpstan/php-8-stubs": "^0.1.23",
- "phpstan/phpdoc-parser": "^1.2.0",
- "react/child-process": "^0.6.1",
- "react/event-loop": "^1.1",
+ "ondrejmirtes/better-reflection": "6.64.0.1",
+ "ondrejmirtes/composer-attribute-collector": "^1.1.1",
+ "ondrejmirtes/php-merge": "^4.1",
+ "phpstan/php-8-stubs": "0.4.32",
+ "phpstan/phpdoc-parser": "2.3.0",
+ "psr/http-message": "^1.1",
+ "react/async": "^3",
+ "react/child-process": "^0.7",
+ "react/dns": "^1.10",
+ "react/event-loop": "^1.2",
"react/http": "^1.1",
- "react/promise": "^2.8",
+ "react/promise": "^3.2",
"react/socket": "^1.3",
"react/stream": "^1.1",
- "symfony/console": "^4.3",
- "symfony/finder": "^4.3",
- "symfony/service-contracts": "1.1.8"
+ "sebastian/diff": "^6.0.2",
+ "symfony/console": "^5.4.3",
+ "symfony/finder": "^5.4.3",
+ "symfony/polyfill-intl-grapheme": "^1.23",
+ "symfony/polyfill-intl-normalizer": "^1.23",
+ "symfony/polyfill-mbstring": "^1.23",
+ "symfony/polyfill-php80": "^1.23",
+ "symfony/polyfill-php81": "^1.27",
+ "symfony/polyfill-php83": "^1.33",
+ "symfony/process": "^5.4.3",
+ "symfony/service-contracts": "^2.5.0",
+ "symfony/string": "^5.4.3"
},
"replace": {
- "phpstan/phpstan": "self.version"
+ "phpstan/phpstan": "2.1.x",
+ "symfony/polyfill-php73": "*"
},
"require-dev": {
- "brianium/paratest": "^6.2.0",
- "nategood/httpful": "^0.2.20",
+ "cweagans/composer-patches": "^1.7.3",
"php-parallel-lint/php-parallel-lint": "^1.2.0",
- "phpstan/phpstan-deprecation-rules": "^1.0",
- "phpstan/phpstan-nette": "^1.0",
- "phpstan/phpstan-php-parser": "^1.0",
- "phpstan/phpstan-phpunit": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5.4",
- "vaimo/composer-patches": "^4.22"
+ "phpstan/phpstan-deprecation-rules": "^2.0.2",
+ "phpstan/phpstan-nette": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0.7",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^11.5.23",
+ "shipmonk/composer-dependency-analyser": "^1.5",
+ "shipmonk/dead-code-detector": "^0.12.0",
+ "shipmonk/name-collision-detector": "^2.0"
},
"config": {
"platform": {
- "php": "7.4.6"
+ "php": "8.2.99"
},
"platform-check": false,
- "sort-packages": true
+ "sort-packages": true,
+ "allow-plugins": {
+ "cweagans/composer-patches": true,
+ "ondrejmirtes/composer-attribute-collector": true,
+ "vaimo/composer-patches": true
+ }
},
"extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
+ "composer-attribute-collector": {
+ "include": [
+ "src"
+ ]
},
- "patcher": {
- "search": "patches"
+ "composer-exit-on-patch-failure": true,
+ "patches": {
+ "composer/ca-bundle": [
+ "patches/cloudflare-ca.patch"
+ ],
+ "hoa/exception": [
+ "patches/Idle.patch"
+ ],
+ "hoa/file": [
+ "patches/File.patch",
+ "patches/Read.patch"
+ ],
+ "hoa/iterator": [
+ "patches/Buffer.patch",
+ "patches/Lookahead.patch"
+ ],
+ "hoa/compiler": [
+ "patches/HoaException.patch",
+ "patches/HoaParser.patch",
+ "patches/Invocation.patch",
+ "patches/Rule.patch",
+ "patches/Lexer.patch",
+ "patches/TreeNode.patch"
+ ],
+ "hoa/consistency": [
+ "patches/Consistency.patch"
+ ],
+ "hoa/protocol": [
+ "patches/Node.patch",
+ "patches/Wrapper.patch"
+ ],
+ "hoa/stream": [
+ "patches/Stream.patch"
+ ],
+ "jetbrains/phpstorm-stubs": [
+ "patches/PDO.patch",
+ "patches/ReflectionProperty.patch",
+ "patches/SessionHandler.patch",
+ "patches/xmlreader.patch",
+ "patches/dom_c.patch"
+ ],
+ "nette/di": [
+ "patches/DependencyChecker.patch",
+ "patches/Resolver.patch"
+ ],
+ "symfony/console": [
+ "patches/OutputFormatter.patch"
+ ]
}
},
"autoload": {
@@ -72,7 +141,7 @@
"src/"
]
},
- "files": ["src/dumpType.php","src/Testing/functions.php"]
+ "files": ["src/debugScope.php", "src/dumpType.php", "src/autoloadFunctions.php", "src/Testing/functions.php"]
},
"autoload-dev": {
"psr-4": {
@@ -85,6 +154,83 @@
"tests/PHPStan"
]
},
+ "repositories": [
+ {
+ "type": "package",
+ "package": {
+ "name": "nette/di",
+ "version": "v3.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/di.git",
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/di/zipball/00ea0afa643b3b4383a5cd1a322656c989ade498",
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "nette/neon": "^3.3 || ^4.0",
+ "nette/php-generator": "^3.5.4 || ^4.0",
+ "nette/robot-loader": "^3.2 || ~4.0.0",
+ "nette/schema": "^1.2",
+ "nette/utils": "^3.2.5 || ~4.0.0",
+ "php": "7.2 - 8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP features.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "compiled",
+ "di",
+ "dic",
+ "factory",
+ "ioc",
+ "nette",
+ "static"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/di/issues",
+ "source": "https://github.com/nette/di/tree/v3.1.5"
+ },
+ "time": "2023-10-02T19:58:38+00:00"
+ }
+ }
+ ],
"minimum-stability": "dev",
"prefer-stable": true,
"bin": [
diff --git a/composer.lock b/composer.lock
index 5e67ba1ccf..1704fe88e8 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,37 +4,35 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "c1d91467e312e364a2d0be0d50163a50",
+ "content-hash": "31c7850e5e9191189f53f00131384a72",
"packages": [
{
- "name": "clue/block-react",
- "version": "v1.4.0",
+ "name": "clue/ndjson-react",
+ "version": "v1.3.0",
"source": {
"type": "git",
- "url": "https://github.com/clue/reactphp-block.git",
- "reference": "c8e7583ae55127b89d6915480ce295bac81c4f88"
+ "url": "https://github.com/clue/reactphp-ndjson.git",
+ "reference": "392dc165fce93b5bb5c637b67e59619223c931b0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/clue/reactphp-block/zipball/c8e7583ae55127b89d6915480ce295bac81c4f88",
- "reference": "c8e7583ae55127b89d6915480ce295bac81c4f88",
+ "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0",
+ "reference": "392dc165fce93b5bb5c637b67e59619223c931b0",
"shasum": ""
},
"require": {
"php": ">=5.3",
- "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
- "react/promise": "^2.7 || ^1.2.1",
- "react/promise-timer": "^1.5"
+ "react/stream": "^1.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
- "react/http": "^1.0"
+ "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
+ "react/event-loop": "^1.2"
},
"type": "library",
"autoload": {
- "files": [
- "src/functions_include.php"
- ]
+ "psr-4": {
+ "Clue\\React\\NDJson\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -46,21 +44,19 @@
"email": "christian@clue.engineering"
}
],
- "description": "Lightweight library that eases integrating async components built for ReactPHP in a traditional, blocking environment.",
- "homepage": "https://github.com/clue/reactphp-block",
+ "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.",
+ "homepage": "https://github.com/clue/reactphp-ndjson",
"keywords": [
- "async",
- "await",
- "blocking",
- "event loop",
- "promise",
+ "NDJSON",
+ "json",
+ "jsonlines",
+ "newline",
"reactphp",
- "sleep",
- "synchronous"
+ "streaming"
],
"support": {
- "issues": "https://github.com/clue/reactphp-block/issues",
- "source": "https://github.com/clue/reactphp-block/tree/v1.4.0"
+ "issues": "https://github.com/clue/reactphp-ndjson/issues",
+ "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0"
},
"funding": [
{
@@ -72,34 +68,42 @@
"type": "github"
}
],
- "time": "2020-08-21T14:09:44+00:00"
+ "time": "2022-12-23T10:58:28+00:00"
},
{
- "name": "clue/ndjson-react",
- "version": "v1.1.0",
+ "name": "composer/ca-bundle",
+ "version": "1.5.8",
"source": {
"type": "git",
- "url": "https://github.com/clue/reactphp-ndjson.git",
- "reference": "767ec9543945802b5766fab0da4520bf20626f66"
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "719026bb30813accb68271fee7e39552a58e9f65"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/767ec9543945802b5766fab0da4520bf20626f66",
- "reference": "767ec9543945802b5766fab0da4520bf20626f66",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/719026bb30813accb68271fee7e39552a58e9f65",
+ "reference": "719026bb30813accb68271fee7e39552a58e9f65",
"shasum": ""
},
"require": {
- "php": ">=5.3",
- "react/stream": "^1.0 || ^0.7 || ^0.6"
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^7.0 || ^6.0 || ^5.7 || ^4.8.35",
- "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3"
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^8 || ^9",
+ "psr/log": "^1.0 || ^2.0 || ^3.0",
+ "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "Clue\\React\\NDJson\\": "src/"
+ "Composer\\CaBundle\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -108,59 +112,75 @@
],
"authors": [
{
- "name": "Christian Lück",
- "email": "christian@clue.engineering"
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
}
],
- "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.",
- "homepage": "https://github.com/clue/reactphp-ndjson",
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
"keywords": [
- "NDJSON",
- "json",
- "jsonlines",
- "newline",
- "reactphp",
- "streaming"
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
],
"support": {
- "issues": "https://github.com/clue/reactphp-ndjson/issues",
- "source": "https://github.com/clue/reactphp-ndjson/tree/v1.1.0"
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/ca-bundle/issues",
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.8"
},
- "time": "2020-02-04T11:48:52+00:00"
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ }
+ ],
+ "time": "2025-08-20T18:49:47+00:00"
},
{
- "name": "composer/ca-bundle",
- "version": "1.2.8",
+ "name": "composer/pcre",
+ "version": "3.3.1",
"source": {
"type": "git",
- "url": "https://github.com/composer/ca-bundle.git",
- "reference": "8a7ecad675253e4654ea05505233285377405215"
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
- "reference": "8a7ecad675253e4654ea05505233285377405215",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4",
+ "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4",
"shasum": ""
},
"require": {
- "ext-openssl": "*",
- "ext-pcre": "*",
- "php": "^5.3.2 || ^7.0 || ^8.0"
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<1.11.10"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
- "psr/log": "^1.0",
- "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
+ "phpstan/phpstan": "^1.11.10",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8 || ^9"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-main": "3.x-dev"
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
}
},
"autoload": {
"psr-4": {
- "Composer\\CaBundle\\": "src"
+ "Composer\\Pcre\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -174,18 +194,16 @@
"homepage": "http://seld.be"
}
],
- "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
"keywords": [
- "cabundle",
- "cacert",
- "certificate",
- "ssl",
- "tls"
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
],
"support": {
- "irc": "irc://irc.freenode.org/composer",
- "issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.2.8"
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.3.1"
},
"funding": [
{
@@ -201,44 +219,38 @@
"type": "tidelift"
}
],
- "time": "2020-08-23T12:54:47+00:00"
+ "time": "2024-08-27T18:44:43+00:00"
},
{
- "name": "composer/package-versions-deprecated",
- "version": "1.11.99",
+ "name": "composer/semver",
+ "version": "3.4.4",
"source": {
"type": "git",
- "url": "https://github.com/composer/package-versions-deprecated.git",
- "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855"
+ "url": "https://github.com/composer/semver.git",
+ "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855",
- "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855",
+ "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
+ "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^1.1.0 || ^2.0",
- "php": "^7 || ^8"
- },
- "replace": {
- "ocramius/package-versions": "1.11.99"
+ "php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
- "composer/composer": "^1.9.3 || ^2.0@dev",
- "ext-zip": "^1.13",
- "phpunit/phpunit": "^6.5 || ^7"
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
},
- "type": "composer-plugin",
+ "type": "library",
"extra": {
- "class": "PackageVersions\\Installer",
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
- "PackageVersions\\": "src/PackageVersions"
+ "Composer\\Semver\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -247,18 +259,32 @@
],
"authors": [
{
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com"
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
},
{
"name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be"
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
}
],
- "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
"support": {
- "issues": "https://github.com/composer/package-versions-deprecated/issues",
- "source": "https://github.com/composer/package-versions-deprecated/tree/master"
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.4"
},
"funding": [
{
@@ -268,35 +294,33 @@
{
"url": "https://github.com/composer",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
}
],
- "time": "2020-08-25T05:50:16+00:00"
+ "time": "2025-08-20T19:15:30+00:00"
},
{
"name": "composer/xdebug-handler",
- "version": "2.0.1",
+ "version": "3.0.5",
"source": {
"type": "git",
"url": "https://github.com/composer/xdebug-handler.git",
- "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496"
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/964adcdd3a28bf9ed5d9ac6450064e0d71ed7496",
- "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
"shasum": ""
},
"require": {
- "php": "^5.3.2 || ^7.0 || ^8.0",
- "psr/log": "^1.0"
+ "composer/pcre": "^1 || ^2 || ^3",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
},
"require-dev": {
- "phpstan/phpstan": "^0.12.55",
- "symfony/phpunit-bridge": "^4.2 || ^5"
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
},
"type": "library",
"autoload": {
@@ -320,9 +344,9 @@
"performance"
],
"support": {
- "irc": "irc://irc.freenode.org/composer",
+ "irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/xdebug-handler/issues",
- "source": "https://github.com/composer/xdebug-handler/tree/2.0.1"
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
},
"funding": [
{
@@ -338,32 +362,32 @@
"type": "tidelift"
}
],
- "time": "2021-05-05T19:37:51+00:00"
+ "time": "2024-05-06T16:37:16+00:00"
},
{
"name": "evenement/evenement",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/igorw/evenement.git",
- "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7"
+ "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
- "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc",
+ "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
"shasum": ""
},
"require": {
"php": ">=7.0"
},
"require-dev": {
- "phpunit/phpunit": "^6.0"
+ "phpunit/phpunit": "^9 || ^6"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Evenement": "src"
+ "psr-4": {
+ "Evenement\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -383,9 +407,126 @@
],
"support": {
"issues": "https://github.com/igorw/evenement/issues",
- "source": "https://github.com/igorw/evenement/tree/master"
+ "source": "https://github.com/igorw/evenement/tree/v3.0.2"
+ },
+ "time": "2023-08-08T05:53:35+00:00"
+ },
+ {
+ "name": "fidry/cpu-core-counter",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theofidry/cpu-core-counter.git",
+ "reference": "8520451a140d3f46ac33042715115e290cf5785f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f",
+ "reference": "8520451a140d3f46ac33042715115e290cf5785f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "fidry/makefile": "^0.2.0",
+ "fidry/php-cs-fixer-config": "^1.1.2",
+ "phpstan/extension-installer": "^1.2.0",
+ "phpstan/phpstan": "^1.9.2",
+ "phpstan/phpstan-deprecation-rules": "^1.0.0",
+ "phpstan/phpstan-phpunit": "^1.2.2",
+ "phpstan/phpstan-strict-rules": "^1.4.4",
+ "phpunit/phpunit": "^8.5.31 || ^9.5.26",
+ "webmozarts/strict-phpunit": "^7.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Fidry\\CpuCoreCounter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Théo FIDRY",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Tiny utility to get the number of CPU cores.",
+ "keywords": [
+ "CPU",
+ "core"
+ ],
+ "support": {
+ "issues": "https://github.com/theofidry/cpu-core-counter/issues",
+ "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theofidry",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-06T10:04:20+00:00"
+ },
+ {
+ "name": "fig/http-message-util",
+ "version": "1.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message-util.git",
+ "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765",
+ "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0 || ^8.0"
+ },
+ "suggest": {
+ "psr/http-message": "The package containing the PSR-7 interfaces"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fig\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Utility classes and constants for use with PSR-7 (psr/http-message)",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/http-message-util/issues",
+ "source": "https://github.com/php-fig/http-message-util/tree/1.1.5"
},
- "time": "2017-07-23T21:35:13+00:00"
+ "time": "2020-11-24T22:02:12+00:00"
},
{
"name": "hoa/compiler",
@@ -475,6 +616,7 @@
"issues": "https://github.com/hoaproject/Compiler/issues",
"source": "https://central.hoa-project.net/Resource/Library/Compiler"
},
+ "abandoned": true,
"time": "2017-08-08T07:44:07+00:00"
},
{
@@ -506,12 +648,12 @@
}
},
"autoload": {
- "psr-4": {
- "Hoa\\Consistency\\": "."
- },
"files": [
"Prelude.php"
- ]
+ ],
+ "psr-4": {
+ "Hoa\\Consistency\\": "."
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -546,6 +688,7 @@
"issues": "https://github.com/hoaproject/Consistency/issues",
"source": "https://central.hoa-project.net/Resource/Library/Consistency"
},
+ "abandoned": true,
"time": "2017-05-02T12:18:12+00:00"
},
{
@@ -610,6 +753,7 @@
"issues": "https://github.com/hoaproject/Event/issues",
"source": "https://central.hoa-project.net/Resource/Library/Event"
},
+ "abandoned": true,
"time": "2017-01-13T15:30:50+00:00"
},
{
@@ -672,6 +816,7 @@
"issues": "https://github.com/hoaproject/Exception/issues",
"source": "https://central.hoa-project.net/Resource/Library/Exception"
},
+ "abandoned": true,
"time": "2017-01-16T07:53:27+00:00"
},
{
@@ -742,6 +887,7 @@
"issues": "https://github.com/hoaproject/File/issues",
"source": "https://central.hoa-project.net/Resource/Library/File"
},
+ "abandoned": true,
"time": "2017-07-11T07:42:15+00:00"
},
{
@@ -804,6 +950,7 @@
"issues": "https://github.com/hoaproject/Iterator/issues",
"source": "https://central.hoa-project.net/Resource/Library/Iterator"
},
+ "abandoned": true,
"time": "2017-01-10T10:34:47+00:00"
},
{
@@ -877,6 +1024,7 @@
"issues": "https://github.com/hoaproject/Math/issues",
"source": "https://central.hoa-project.net/Resource/Library/Math"
},
+ "abandoned": true,
"time": "2017-05-16T08:02:17+00:00"
},
{
@@ -907,12 +1055,12 @@
}
},
"autoload": {
- "psr-4": {
- "Hoa\\Protocol\\": "."
- },
"files": [
"Wrapper.php"
- ]
+ ],
+ "psr-4": {
+ "Hoa\\Protocol\\": "."
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -945,6 +1093,7 @@
"issues": "https://github.com/hoaproject/Protocol/issues",
"source": "https://central.hoa-project.net/Resource/Library/Protocol"
},
+ "abandoned": true,
"time": "2017-01-14T12:26:10+00:00"
},
{
@@ -1009,6 +1158,7 @@
"issues": "https://github.com/hoaproject/Regex/issues",
"source": "https://central.hoa-project.net/Resource/Library/Regex"
},
+ "abandoned": true,
"time": "2017-01-13T16:10:24+00:00"
},
{
@@ -1081,6 +1231,7 @@
"issues": "https://github.com/hoaproject/Stream/issues",
"source": "https://central.hoa-project.net/Resource/Library/Stream"
},
+ "abandoned": true,
"time": "2017-02-21T16:01:06+00:00"
},
{
@@ -1149,6 +1300,7 @@
"issues": "https://github.com/hoaproject/Ustring/issues",
"source": "https://central.hoa-project.net/Resource/Library/Ustring"
},
+ "abandoned": true,
"time": "2017-01-16T07:08:25+00:00"
},
{
@@ -1212,6 +1364,7 @@
"issues": "https://github.com/hoaproject/Visitor/issues",
"source": "https://central.hoa-project.net/Resource/Library/Visitor"
},
+ "abandoned": true,
"time": "2017-01-16T07:02:03+00:00"
},
{
@@ -1272,83 +1425,28 @@
"issues": "https://github.com/hoaproject/Zformat/issues",
"source": "https://central.hoa-project.net/Resource/Library/Zformat"
},
+ "abandoned": true,
"time": "2017-01-10T10:39:54+00:00"
},
- {
- "name": "jean85/pretty-package-versions",
- "version": "1.5.1",
- "source": {
- "type": "git",
- "url": "https://github.com/Jean85/pretty-package-versions.git",
- "reference": "a917488320c20057da87f67d0d40543dd9427f7a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/a917488320c20057da87f67d0d40543dd9427f7a",
- "reference": "a917488320c20057da87f67d0d40543dd9427f7a",
- "shasum": ""
- },
- "require": {
- "composer/package-versions-deprecated": "^1.8.0",
- "php": "^7.0|^8.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^6.0|^8.5|^9.2"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Jean85\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Alessandro Lai",
- "email": "alessandro.lai85@gmail.com"
- }
- ],
- "description": "A wrapper for ocramius/package-versions to get pretty versions strings",
- "keywords": [
- "composer",
- "package",
- "release",
- "versions"
- ],
- "support": {
- "issues": "https://github.com/Jean85/pretty-package-versions/issues",
- "source": "https://github.com/Jean85/pretty-package-versions/tree/1.5.1"
- },
- "time": "2020-09-14T08:43:34+00:00"
- },
{
"name": "jetbrains/phpstorm-stubs",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/JetBrains/phpstorm-stubs.git",
- "reference": "82595d7a426c4b3d1e3a7d604ad3f99534784599"
+ "reference": "d1ee5e570343bd4276a3d5959e6e1c2530b006d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/82595d7a426c4b3d1e3a7d604ad3f99534784599",
- "reference": "82595d7a426c4b3d1e3a7d604ad3f99534784599",
+ "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/d1ee5e570343bd4276a3d5959e6e1c2530b006d0",
+ "reference": "d1ee5e570343bd4276a3d5959e6e1c2530b006d0",
"shasum": ""
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "@stable",
- "nikic/php-parser": "@stable",
- "php": "^8.0",
- "phpdocumentor/reflection-docblock": "@stable",
- "phpunit/phpunit": "@stable"
+ "friendsofphp/php-cs-fixer": "^v3.86",
+ "nikic/php-parser": "^v5.6",
+ "phpdocumentor/reflection-docblock": "^5.6",
+ "phpunit/phpunit": "^12.3"
},
"default-branch": true,
"type": "library",
@@ -1376,33 +1474,33 @@
"support": {
"source": "https://github.com/JetBrains/phpstorm-stubs/tree/master"
},
- "time": "2021-09-09T16:57:58+00:00"
+ "time": "2025-09-20T07:44:45+00:00"
},
{
"name": "nette/bootstrap",
- "version": "v3.0.2",
+ "version": "v3.1.4",
"source": {
"type": "git",
"url": "https://github.com/nette/bootstrap.git",
- "reference": "67830a65b42abfb906f8e371512d336ebfb5da93"
+ "reference": "1a7965b4ee401ad0e3f673b9c016d2481afdc280"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/bootstrap/zipball/67830a65b42abfb906f8e371512d336ebfb5da93",
- "reference": "67830a65b42abfb906f8e371512d336ebfb5da93",
+ "url": "https://api.github.com/repos/nette/bootstrap/zipball/1a7965b4ee401ad0e3f673b9c016d2481afdc280",
+ "reference": "1a7965b4ee401ad0e3f673b9c016d2481afdc280",
"shasum": ""
},
"require": {
- "nette/di": "^3.0",
- "nette/utils": "^3.0",
- "php": ">=7.1"
+ "nette/di": "^3.0.5",
+ "nette/utils": "^3.2.1 || ^4.0",
+ "php": ">=7.2 <8.3"
},
"conflict": {
"tracy/tracy": "<2.6"
},
"require-dev": {
- "latte/latte": "^2.2",
- "nette/application": "^3.0",
+ "latte/latte": "^2.8",
+ "nette/application": "^3.1",
"nette/caching": "^3.0",
"nette/database": "^3.0",
"nette/forms": "^3.0",
@@ -1422,7 +1520,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "3.1-dev"
}
},
"autoload": {
@@ -1446,7 +1544,7 @@
"homepage": "https://nette.org/contributors"
}
],
- "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.",
+ "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.",
"homepage": "https://nette.org",
"keywords": [
"bootstrapping",
@@ -1455,45 +1553,42 @@
],
"support": {
"issues": "https://github.com/nette/bootstrap/issues",
- "source": "https://github.com/nette/bootstrap/tree/master"
+ "source": "https://github.com/nette/bootstrap/tree/v3.1.4"
},
- "time": "2020-05-26T08:46:23+00:00"
+ "time": "2022-12-14T15:23:02+00:00"
},
{
"name": "nette/di",
- "version": "v3.0.5",
+ "version": "v3.1.5",
"source": {
"type": "git",
"url": "https://github.com/nette/di.git",
- "reference": "766e8185196a97ded4f9128db6d79a3a124b7eb6"
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/di/zipball/766e8185196a97ded4f9128db6d79a3a124b7eb6",
- "reference": "766e8185196a97ded4f9128db6d79a3a124b7eb6",
+ "url": "https://api.github.com/repos/nette/di/zipball/00ea0afa643b3b4383a5cd1a322656c989ade498",
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
- "nette/neon": "^3.0",
- "nette/php-generator": "^3.3.3",
- "nette/robot-loader": "^3.2",
- "nette/schema": "^1.0",
- "nette/utils": "^3.1",
- "php": ">=7.1"
- },
- "conflict": {
- "nette/bootstrap": "<3.0"
+ "nette/neon": "^3.3 || ^4.0",
+ "nette/php-generator": "^3.5.4 || ^4.0",
+ "nette/robot-loader": "^3.2 || ~4.0.0",
+ "nette/schema": "^1.2",
+ "nette/utils": "^3.2.5 || ~4.0.0",
+ "php": "7.2 - 8.3"
},
"require-dev": {
- "nette/tester": "^2.2",
- "phpstan/phpstan": "^0.12",
- "tracy/tracy": "^2.3"
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "3.1-dev"
}
},
"autoload": {
@@ -1517,7 +1612,7 @@
"homepage": "https://nette.org/contributors"
}
],
- "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.",
+ "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP features.",
"homepage": "https://nette.org",
"keywords": [
"compiled",
@@ -1530,22 +1625,22 @@
],
"support": {
"issues": "https://github.com/nette/di/issues",
- "source": "https://github.com/nette/di/tree/master"
+ "source": "https://github.com/nette/di/tree/v3.1.5"
},
- "time": "2020-08-13T13:04:23+00:00"
+ "time": "2023-10-02T19:58:38+00:00"
},
{
"name": "nette/finder",
- "version": "v2.5.2",
+ "version": "v2.6.0",
"source": {
"type": "git",
"url": "https://github.com/nette/finder.git",
- "reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50"
+ "reference": "991aefb42860abeab8e003970c3809a9d83cb932"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/finder/zipball/4ad2c298eb8c687dd0e74ae84206a4186eeaed50",
- "reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50",
+ "url": "https://api.github.com/repos/nette/finder/zipball/991aefb42860abeab8e003970c3809a9d83cb932",
+ "reference": "991aefb42860abeab8e003970c3809a9d83cb932",
"shasum": ""
},
"require": {
@@ -1563,7 +1658,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.5-dev"
+ "dev-master": "2.6-dev"
}
},
"autoload": {
@@ -1574,9 +1669,9 @@
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
- "GPL-2.0",
- "GPL-3.0"
- ],
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
"authors": [
{
"name": "David Grudl",
@@ -1597,38 +1692,40 @@
],
"support": {
"issues": "https://github.com/nette/finder/issues",
- "source": "https://github.com/nette/finder/tree/v2.5.2"
+ "source": "https://github.com/nette/finder/tree/v2.6.0"
},
- "time": "2020-01-03T20:35:40+00:00"
+ "time": "2022-10-13T01:31:15+00:00"
},
{
"name": "nette/neon",
- "version": "v3.2.1",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/nette/neon.git",
- "reference": "a5b3a60833d2ef55283a82d0c30b45d136b29e75"
+ "reference": "bb88bf3a54dd21bf4dbddb5cd525d7b0c61b7cda"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/neon/zipball/a5b3a60833d2ef55283a82d0c30b45d136b29e75",
- "reference": "a5b3a60833d2ef55283a82d0c30b45d136b29e75",
+ "url": "https://api.github.com/repos/nette/neon/zipball/bb88bf3a54dd21bf4dbddb5cd525d7b0c61b7cda",
+ "reference": "bb88bf3a54dd21bf4dbddb5cd525d7b0c61b7cda",
"shasum": ""
},
"require": {
- "ext-iconv": "*",
"ext-json": "*",
- "php": ">=7.1"
+ "php": "7.1 - 8.4"
},
"require-dev": {
"nette/tester": "^2.0",
"phpstan/phpstan": "^0.12",
- "tracy/tracy": "^2.3"
+ "tracy/tracy": "^2.7"
},
+ "bin": [
+ "bin/neon-lint"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -1663,33 +1760,33 @@
],
"support": {
"issues": "https://github.com/nette/neon/issues",
- "source": "https://github.com/nette/neon/tree/master"
+ "source": "https://github.com/nette/neon/tree/v3.3.4"
},
- "time": "2020-07-31T12:28:05+00:00"
+ "time": "2024-10-04T22:17:24+00:00"
},
{
"name": "nette/php-generator",
- "version": "v3.5.0",
+ "version": "v3.6.9",
"source": {
"type": "git",
"url": "https://github.com/nette/php-generator.git",
- "reference": "9162f7455059755dcbece1b5570d1bbfc6f0ab0d"
+ "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/php-generator/zipball/9162f7455059755dcbece1b5570d1bbfc6f0ab0d",
- "reference": "9162f7455059755dcbece1b5570d1bbfc6f0ab0d",
+ "url": "https://api.github.com/repos/nette/php-generator/zipball/d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6",
+ "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6",
"shasum": ""
},
"require": {
"nette/utils": "^3.1.2",
- "php": ">=7.1"
+ "php": ">=7.2 <8.3"
},
"require-dev": {
- "nette/tester": "^2.0",
- "nikic/php-parser": "^4.4",
+ "nette/tester": "^2.4",
+ "nikic/php-parser": "^4.13",
"phpstan/phpstan": "^0.12",
- "tracy/tracy": "^2.3"
+ "tracy/tracy": "^2.8"
},
"suggest": {
"nikic/php-parser": "to use ClassType::withBodiesFrom() & GlobalFunction::withBodyFrom()"
@@ -1697,7 +1794,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.5-dev"
+ "dev-master": "3.6-dev"
}
},
"autoload": {
@@ -1721,7 +1818,7 @@
"homepage": "https://nette.org/contributors"
}
],
- "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.4 features.",
+ "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.1 features.",
"homepage": "https://nette.org",
"keywords": [
"code",
@@ -1731,22 +1828,22 @@
],
"support": {
"issues": "https://github.com/nette/php-generator/issues",
- "source": "https://github.com/nette/php-generator/tree/v3.5.0"
+ "source": "https://github.com/nette/php-generator/tree/v3.6.9"
},
- "time": "2020-11-02T16:16:58+00:00"
+ "time": "2022-10-04T11:49:47+00:00"
},
{
"name": "nette/robot-loader",
- "version": "v3.3.1",
+ "version": "v3.4.1",
"source": {
"type": "git",
"url": "https://github.com/nette/robot-loader.git",
- "reference": "15c1ecd0e6e69e8d908dfc4cca7b14f3b850a96b"
+ "reference": "e2adc334cb958164c050f485d99c44c430f51fe2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/robot-loader/zipball/15c1ecd0e6e69e8d908dfc4cca7b14f3b850a96b",
- "reference": "15c1ecd0e6e69e8d908dfc4cca7b14f3b850a96b",
+ "url": "https://api.github.com/repos/nette/robot-loader/zipball/e2adc334cb958164c050f485d99c44c430f51fe2",
+ "reference": "e2adc334cb958164c050f485d99c44c430f51fe2",
"shasum": ""
},
"require": {
@@ -1763,7 +1860,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.3-dev"
+ "dev-master": "3.4-dev"
}
},
"autoload": {
@@ -1798,36 +1895,38 @@
],
"support": {
"issues": "https://github.com/nette/robot-loader/issues",
- "source": "https://github.com/nette/robot-loader/tree/v3.3.1"
+ "source": "https://github.com/nette/robot-loader/tree/v3.4.1"
},
- "time": "2020-09-15T15:14:17+00:00"
+ "time": "2021-08-25T15:53:54+00:00"
},
{
"name": "nette/schema",
- "version": "v1.0.2",
+ "version": "v1.2.5",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
- "reference": "febf71fb4052c824046f5a33f4f769a6e7fa0cb4"
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/schema/zipball/febf71fb4052c824046f5a33f4f769a6e7fa0cb4",
- "reference": "febf71fb4052c824046f5a33f4f769a6e7fa0cb4",
+ "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a",
"shasum": ""
},
"require": {
- "nette/utils": "^3.1",
- "php": ">=7.1"
+ "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
+ "php": "7.1 - 8.3"
},
"require-dev": {
- "nette/tester": "^2.2",
- "phpstan/phpstan-nette": "^0.12",
- "tracy/tracy": "^2.3"
+ "nette/tester": "^2.3 || ^2.4",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.7"
},
"type": "library",
"extra": {
- "branch-alias": []
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
},
"autoload": {
"classmap": [
@@ -1837,8 +1936,8 @@
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
- "GPL-2.0",
- "GPL-3.0"
+ "GPL-2.0-only",
+ "GPL-3.0-only"
],
"authors": [
{
@@ -1858,30 +1957,34 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
- "source": "https://github.com/nette/schema/tree/v1.0.2"
+ "source": "https://github.com/nette/schema/tree/v1.2.5"
},
- "time": "2020-01-06T22:52:48+00:00"
+ "time": "2023-10-05T20:37:59+00:00"
},
{
"name": "nette/utils",
- "version": "v3.1.3",
+ "version": "v3.2.10",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "c09937fbb24987b2a41c6022ebe84f4f1b8eec0f"
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/c09937fbb24987b2a41c6022ebe84f4f1b8eec0f",
- "reference": "c09937fbb24987b2a41c6022ebe84f4f1b8eec0f",
+ "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2 <8.4"
+ },
+ "conflict": {
+ "nette/di": "<3.0.6"
},
"require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
"nette/tester": "~2.0",
- "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan": "^1.0",
"tracy/tracy": "^2.3"
},
"suggest": {
@@ -1896,7 +1999,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-master": "3.2-dev"
}
},
"autoload": {
@@ -1920,7 +2023,7 @@
"homepage": "https://nette.org/contributors"
}
],
- "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
"homepage": "https://nette.org",
"keywords": [
"array",
@@ -1940,31 +2043,33 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v3.1.3"
+ "source": "https://github.com/nette/utils/tree/v3.2.10"
},
- "time": "2020-08-07T10:34:21+00:00"
+ "time": "2023-07-30T15:38:18+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v4.13.0",
+ "version": "v5.6.1",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "50953a2691a922aa1769461637869a0a2faa3f53"
+ "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53",
- "reference": "50953a2691a922aa1769461637869a0a2faa3f53",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
+ "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
"shasum": ""
},
"require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
"ext-tokenizer": "*",
- "php": ">=7.0"
+ "php": ">=7.4"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ "phpunit/phpunit": "^9.0"
},
"bin": [
"bin/php-parse"
@@ -1972,7 +2077,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.9-dev"
+ "dev-master": "5.x-dev"
}
},
"autoload": {
@@ -1996,9 +2101,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1"
},
- "time": "2021-09-20T12:20:58+00:00"
+ "time": "2025-08-13T20:13:15+00:00"
},
{
"name": "ondram/ci-detector",
@@ -2074,37 +2179,39 @@
},
{
"name": "ondrejmirtes/better-reflection",
- "version": "4.3.70",
+ "version": "6.64.0.1",
"source": {
"type": "git",
"url": "https://github.com/ondrejmirtes/BetterReflection.git",
- "reference": "ec87deadc70f01c6d66ed22d653b7292cccdcbc9"
+ "reference": "d81b46b54e0d1431d2553c79763d937f99b965f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ondrejmirtes/BetterReflection/zipball/ec87deadc70f01c6d66ed22d653b7292cccdcbc9",
- "reference": "ec87deadc70f01c6d66ed22d653b7292cccdcbc9",
+ "url": "https://api.github.com/repos/ondrejmirtes/BetterReflection/zipball/d81b46b54e0d1431d2553c79763d937f99b965f4",
+ "reference": "d81b46b54e0d1431d2553c79763d937f99b965f4",
"shasum": ""
},
"require": {
"ext-json": "*",
- "jetbrains/phpstorm-stubs": "dev-master#0a73df114cdea7f30c8b5f6fbfbf8e6839a89e88",
- "nikic/php-parser": "^4.13.0",
- "php": ">=7.1.0"
+ "jetbrains/phpstorm-stubs": "dev-master#dfcad4524db603bd20bdec3aab1a31c5f5128ea3",
+ "nikic/php-parser": "^5.6.1",
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "thecodingmachine/safe": "<1.1.3"
},
"require-dev": {
- "phpstan/phpstan": "^0.12.49",
- "phpunit/phpunit": "^7.5.18"
+ "doctrine/coding-standard": "^12.0.0",
+ "phpbench/phpbench": "^1.4.1",
+ "phpstan/phpstan": "^1.10.60",
+ "phpstan/phpstan-phpunit": "^1.3.16",
+ "phpunit/phpunit": "^11.5.39",
+ "rector/rector": "1.2.10"
},
"suggest": {
"composer/composer": "Required to use the ComposerSourceLocator"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.0-dev"
- }
- },
"autoload": {
"psr-4": {
"PHPStan\\BetterReflection\\": "src"
@@ -2138,27 +2245,149 @@
],
"description": "Better Reflection - an improved code reflection API",
"support": {
- "source": "https://github.com/ondrejmirtes/BetterReflection/tree/4.3.70"
+ "source": "https://github.com/ondrejmirtes/BetterReflection/tree/6.64.0.1"
+ },
+ "time": "2025-09-19T20:49:30+00:00"
+ },
+ {
+ "name": "ondrejmirtes/composer-attribute-collector",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ondrejmirtes/composer-attribute-collector.git",
+ "reference": "48124ab07a5e19b7bd0ad20c791a8ff0bf3feab9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ondrejmirtes/composer-attribute-collector/zipball/48124ab07a5e19b7bd0ad20c791a8ff0bf3feab9",
+ "reference": "48124ab07a5e19b7bd0ad20c791a8ff0bf3feab9",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.0",
+ "nikic/php-parser": "^5.4",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "composer/composer": ">=2.4",
+ "phpstan/phpstan": "^2.0",
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "olvlvl\\ComposerAttributeCollector\\Plugin",
+ "composer-attribute-collector": {
+ "exclude": [
+ "tests/Acme/PSR4/IncompatibleSignature.php"
+ ],
+ "include": [
+ "tests"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "olvlvl\\ComposerAttributeCollector\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Olivier Laviale",
+ "email": "olivier.laviale@gmail.com",
+ "homepage": "https://olvlvl.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Ondrej Mirtes",
+ "email": "ondrej@mirtes.cz",
+ "role": "Developer"
+ }
+ ],
+ "description": "A convenient and near zero-cost way to retrieve targets of PHP 8 attributes",
+ "support": {
+ "source": "https://github.com/ondrejmirtes/composer-attribute-collector/tree/1.1.1"
+ },
+ "time": "2025-06-05T19:41:17+00:00"
+ },
+ {
+ "name": "ondrejmirtes/php-merge",
+ "version": "4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ondrejmirtes/php-merge.git",
+ "reference": "43d30f9121c9a8762d4841a2350720a7fb2b6b44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ondrejmirtes/php-merge/zipball/43d30f9121c9a8762d4841a2350720a7fb2b6b44",
+ "reference": "43d30f9121c9a8762d4841a2350720a7fb2b6b44",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "sebastian/diff": "^2.0|^3.0|^4.0|^5.0|^6.0"
+ },
+ "require-dev": {
+ "escapestudios/symfony2-coding-standard": "^3.5",
+ "phpstan/phpstan": "~1",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpunit/phpunit": "~6|~7|~8|~9|~10",
+ "squizlabs/php_codesniffer": "~3",
+ "symplify/git-wrapper": "^9.1|^10.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "PhpMerge": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabian Bircher",
+ "email": "opensource@fabianbircher.com"
+ },
+ {
+ "name": "Ondrej Mirtes",
+ "email": "ondrej@mirtes.cz"
+ }
+ ],
+ "description": "A PHP merge utility using the Diff php library or the command line git.",
+ "homepage": "https://github.com/bircher/php-merge",
+ "keywords": [
+ "git",
+ "merge",
+ "php-merge"
+ ],
+ "support": {
+ "source": "https://github.com/ondrejmirtes/php-merge/tree/4.1.1"
},
- "time": "2021-09-20T14:59:55+00:00"
+ "time": "2025-06-10T09:58:42+00:00"
},
{
"name": "phpstan/php-8-stubs",
- "version": "0.1.23",
+ "version": "0.4.32",
"source": {
"type": "git",
"url": "https://github.com/phpstan/php-8-stubs.git",
- "reference": "3882ffe35d87a7eb7a133916907a44739d020184"
+ "reference": "47732ec27550617c93605006b7793793d4c85433"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/php-8-stubs/zipball/3882ffe35d87a7eb7a133916907a44739d020184",
- "reference": "3882ffe35d87a7eb7a133916907a44739d020184",
+ "url": "https://api.github.com/repos/phpstan/php-8-stubs/zipball/47732ec27550617c93605006b7793793d4c85433",
+ "reference": "47732ec27550617c93605006b7793793d4c85433",
"shasum": ""
},
"type": "library",
"autoload": {
- "files": [
+ "classmap": [
"Php8StubsMap.php"
]
},
@@ -2170,41 +2399,39 @@
"description": "PHP stubs extracted from php-src",
"support": {
"issues": "https://github.com/phpstan/php-8-stubs/issues",
- "source": "https://github.com/phpstan/php-8-stubs/tree/0.1.23"
+ "source": "https://github.com/phpstan/php-8-stubs/tree/0.4.32"
},
- "time": "2021-08-31T00:08:55+00:00"
+ "time": "2025-09-23T00:21:29+00:00"
},
{
"name": "phpstan/phpdoc-parser",
- "version": "1.2.0",
+ "version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e"
+ "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e",
- "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495",
+ "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
"symfony/process": "^5.2"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
"autoload": {
"psr-4": {
"PHPStan\\PhpDocParser\\": [
@@ -2219,26 +2446,26 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0"
},
- "time": "2021-09-16T20:46:02+00:00"
+ "time": "2025-08-30T15:50:23+00:00"
},
{
"name": "psr/container",
- "version": "1.1.1",
+ "version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"shasum": ""
},
"require": {
- "php": ">=7.2.0"
+ "php": ">=7.4.0"
},
"type": "library",
"autoload": {
@@ -2267,31 +2494,31 @@
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/1.1.1"
+ "source": "https://github.com/php-fig/container/tree/1.1.2"
},
- "time": "2021-03-05T17:36:06+00:00"
+ "time": "2021-11-05T16:50:12+00:00"
},
{
"name": "psr/http-message",
- "version": "1.0.1",
+ "version": "1.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -2320,36 +2547,36 @@
"response"
],
"support": {
- "source": "https://github.com/php-fig/http-message/tree/master"
+ "source": "https://github.com/php-fig/http-message/tree/1.1"
},
- "time": "2016-08-06T14:39:51+00:00"
+ "time": "2023-04-04T09:50:52+00:00"
},
{
"name": "psr/log",
- "version": "1.1.3",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
- "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376",
+ "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Psr\\Log\\": "Psr/Log/"
+ "Psr\\Log\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2359,7 +2586,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
@@ -2370,22 +2597,94 @@
"psr-3"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/1.1.3"
+ "source": "https://github.com/php-fig/log/tree/2.0.0"
},
- "time": "2020-03-23T09:12:05+00:00"
+ "time": "2021-07-14T16:41:46+00:00"
+ },
+ {
+ "name": "react/async",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/async.git",
+ "reference": "bc3ef672b33e95bf814fe8377731e46888ed4b54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/async/zipball/bc3ef672b33e95bf814fe8377731e46888ed4b54",
+ "reference": "bc3ef672b33e95bf814fe8377731e46888ed4b54",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.0 || ^2.8 || ^1.2.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "1.10.39 || 1.4.10",
+ "phpunit/phpunit": "^9.6 || ^7.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async utilities for ReactPHP",
+ "keywords": [
+ "async",
+ "reactphp"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/async/issues",
+ "source": "https://github.com/reactphp/async/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2023-11-22T16:21:11+00:00"
},
{
"name": "react/cache",
- "version": "v1.1.0",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/cache.git",
- "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c"
+ "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/cache/zipball/44a568925556b0bd8cacc7b49fb0f1cf0d706a0c",
- "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c",
+ "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
+ "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
"shasum": ""
},
"require": {
@@ -2393,7 +2692,7 @@
"react/promise": "^3.0 || ^2.0 || ^1.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35"
+ "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
},
"type": "library",
"autoload": {
@@ -2436,55 +2735,74 @@
],
"support": {
"issues": "https://github.com/reactphp/cache/issues",
- "source": "https://github.com/reactphp/cache/tree/v1.1.0"
+ "source": "https://github.com/reactphp/cache/tree/v1.2.0"
},
"funding": [
{
- "url": "https://github.com/WyriHaximus",
- "type": "github"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2020-09-18T12:12:35+00:00"
+ "time": "2022-11-30T15:59:55+00:00"
},
{
"name": "react/child-process",
- "version": "v0.6.1",
+ "version": "0.7.x-dev",
"source": {
"type": "git",
"url": "https://github.com/reactphp/child-process.git",
- "reference": "6895afa583d51dc10a4b9e93cd3bce17b3b77ac3"
+ "reference": "dfc3fe92ddf58646a2a17908180db712752f23a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/child-process/zipball/6895afa583d51dc10a4b9e93cd3bce17b3b77ac3",
- "reference": "6895afa583d51dc10a4b9e93cd3bce17b3b77ac3",
+ "url": "https://api.github.com/repos/reactphp/child-process/zipball/dfc3fe92ddf58646a2a17908180db712752f23a9",
+ "reference": "dfc3fe92ddf58646a2a17908180db712752f23a9",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.0",
- "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
- "react/stream": "^1.0 || ^0.7.6"
+ "react/event-loop": "^1.2",
+ "react/stream": "^1.4"
},
"require-dev": {
- "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35",
- "react/socket": "^1.0",
- "sebastian/environment": "^3.0 || ^2.0 || ^1.0"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/socket": "^1.16",
+ "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
},
+ "default-branch": true,
"type": "library",
"autoload": {
"psr-4": {
- "React\\ChildProcess\\": "src"
+ "React\\ChildProcess\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
"description": "Event-driven library for executing child processes with ReactPHP.",
"keywords": [
"event-driven",
@@ -2493,39 +2811,45 @@
],
"support": {
"issues": "https://github.com/reactphp/child-process/issues",
- "source": "https://github.com/reactphp/child-process/tree/v0.6.1"
+ "source": "https://github.com/reactphp/child-process/tree/0.7.x"
},
- "time": "2019-02-15T13:48:16+00:00"
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-12-24T21:22:59+00:00"
},
{
"name": "react/dns",
- "version": "v1.4.0",
+ "version": "v1.13.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/dns.git",
- "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f"
+ "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/dns/zipball/665260757171e2ab17485b44e7ffffa7acb6ca1f",
- "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f",
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
+ "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
"shasum": ""
},
"require": {
"php": ">=5.3.0",
"react/cache": "^1.0 || ^0.6 || ^0.5",
- "react/event-loop": "^1.0 || ^0.5",
- "react/promise": "^3.0 || ^2.7 || ^1.2.1",
- "react/promise-timer": "^1.2"
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.2 || ^2.7 || ^1.2.1"
},
"require-dev": {
- "clue/block-react": "^1.2",
- "phpunit/phpunit": "^9.3 || ^4.8.35"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4.3 || ^3 || ^2",
+ "react/promise-timer": "^1.11"
},
"type": "library",
"autoload": {
"psr-4": {
- "React\\Dns\\": "src"
+ "React\\Dns\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2563,55 +2887,71 @@
],
"support": {
"issues": "https://github.com/reactphp/dns/issues",
- "source": "https://github.com/reactphp/dns/tree/v1.4.0"
+ "source": "https://github.com/reactphp/dns/tree/v1.13.0"
},
"funding": [
{
- "url": "https://github.com/WyriHaximus",
- "type": "github"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2020-09-18T12:12:55+00:00"
+ "time": "2024-06-13T14:18:03+00:00"
},
{
"name": "react/event-loop",
- "version": "v1.1.1",
+ "version": "v1.5.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/event-loop.git",
- "reference": "6d24de090cd59cfc830263cfba965be77b563c13"
+ "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13",
- "reference": "6d24de090cd59cfc830263cfba965be77b563c13",
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+ "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"require-dev": {
- "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"suggest": {
- "ext-event": "~1.0 for ExtEventLoop",
- "ext-pcntl": "For signal handling support when using the StreamSelectLoop",
- "ext-uv": "* for ExtUvLoop"
+ "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
},
"type": "library",
"autoload": {
"psr-4": {
- "React\\EventLoop\\": "src"
+ "React\\EventLoop\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
"description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
"keywords": [
"asynchronous",
@@ -2619,46 +2959,53 @@
],
"support": {
"issues": "https://github.com/reactphp/event-loop/issues",
- "source": "https://github.com/reactphp/event-loop/tree/v1.1.1"
+ "source": "https://github.com/reactphp/event-loop/tree/v1.5.0"
},
- "time": "2020-01-01T18:39:52+00:00"
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2023-11-13T13:48:05+00:00"
},
{
"name": "react/http",
- "version": "v1.1.0",
+ "version": "v1.11.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/http.git",
- "reference": "754b0c18545d258922ffa907f3b18598280fdecd"
+ "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/http/zipball/754b0c18545d258922ffa907f3b18598280fdecd",
- "reference": "754b0c18545d258922ffa907f3b18598280fdecd",
+ "url": "https://api.github.com/repos/reactphp/http/zipball/8db02de41dcca82037367f67a2d4be365b1c4db9",
+ "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "fig/http-message-util": "^1.1",
"php": ">=5.3.0",
"psr/http-message": "^1.0",
- "react/event-loop": "^1.0 || ^0.5",
- "react/promise": "^2.3 || ^1.2.1",
- "react/promise-stream": "^1.1",
- "react/socket": "^1.6",
- "react/stream": "^1.1",
- "ringcentral/psr7": "^1.2"
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.2 || ^2.3 || ^1.2.1",
+ "react/socket": "^1.16",
+ "react/stream": "^1.4"
},
"require-dev": {
- "clue/block-react": "^1.1",
- "clue/http-proxy-react": "^1.3",
- "clue/reactphp-ssh-proxy": "^1.0",
- "clue/socks-react": "^1.0",
- "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35"
+ "clue/http-proxy-react": "^1.8",
+ "clue/reactphp-ssh-proxy": "^1.4",
+ "clue/socks-react": "^1.4",
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4.2 || ^3 || ^2",
+ "react/promise-stream": "^1.4",
+ "react/promise-timer": "^1.11"
},
"type": "library",
"autoload": {
"psr-4": {
- "React\\Http\\": "src"
+ "React\\Http\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2703,48 +3050,45 @@
],
"support": {
"issues": "https://github.com/reactphp/http/issues",
- "source": "https://github.com/reactphp/http/tree/v1.1.0"
+ "source": "https://github.com/reactphp/http/tree/v1.11.0"
},
"funding": [
{
- "url": "https://github.com/WyriHaximus",
- "type": "github"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2020-09-11T11:01:51+00:00"
+ "time": "2024-11-20T15:24:08+00:00"
},
{
"name": "react/promise",
- "version": "v2.8.0",
+ "version": "v3.3.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise.git",
- "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4"
+ "reference": "23444f53a813a3296c1368bb104793ce8d88f04a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4",
- "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
+ "reference": "23444f53a813a3296c1368bb104793ce8d88f04a",
"shasum": ""
},
"require": {
- "php": ">=5.4.0"
+ "php": ">=7.1.0"
},
"require-dev": {
- "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36"
+ "phpstan/phpstan": "1.12.28 || 1.4.10",
+ "phpunit/phpunit": "^9.6 || ^7.5"
},
"type": "library",
"autoload": {
- "psr-4": {
- "React\\Promise\\": "src/"
- },
"files": [
"src/functions_include.php"
- ]
+ ],
+ "psr-4": {
+ "React\\Promise\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2753,169 +3097,74 @@
"authors": [
{
"name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com"
- }
- ],
- "description": "A lightweight implementation of CommonJS Promises/A for PHP",
- "keywords": [
- "promise",
- "promises"
- ],
- "support": {
- "issues": "https://github.com/reactphp/promise/issues",
- "source": "https://github.com/reactphp/promise/tree/v2.8.0"
- },
- "time": "2020-05-12T15:16:56+00:00"
- },
- {
- "name": "react/promise-stream",
- "version": "v1.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/promise-stream.git",
- "reference": "6384d8b76cf7dcc44b0bf3343fb2b2928412d1fe"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/6384d8b76cf7dcc44b0bf3343fb2b2928412d1fe",
- "reference": "6384d8b76cf7dcc44b0bf3343fb2b2928412d1fe",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3",
- "react/promise": "^2.1 || ^1.2",
- "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6"
- },
- "require-dev": {
- "clue/block-react": "^1.0",
- "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35",
- "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3",
- "react/promise-timer": "^1.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Promise\\Stream\\": "src/"
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
},
- "files": [
- "src/functions_include.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
{
"name": "Christian Lück",
- "email": "christian@lueck.tv"
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "The missing link between Promise-land and Stream-land for ReactPHP",
- "homepage": "https://github.com/reactphp/promise-stream",
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
"keywords": [
- "Buffer",
- "async",
"promise",
- "reactphp",
- "stream",
- "unwrap"
+ "promises"
],
"support": {
- "issues": "https://github.com/reactphp/promise-stream/issues",
- "source": "https://github.com/reactphp/promise-stream/tree/v1.2.0"
- },
- "time": "2019-07-03T12:29:10+00:00"
- },
- {
- "name": "react/promise-timer",
- "version": "v1.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/promise-timer.git",
- "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
- "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3",
- "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
- "react/promise": "^3.0 || ^2.7.0 || ^1.2.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.0 || ^5.7 || ^4.8.35"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Promise\\Timer\\": "src/"
- },
- "files": [
- "src/functions_include.php"
- ]
+ "issues": "https://github.com/reactphp/promise/issues",
+ "source": "https://github.com/reactphp/promise/tree/v3.3.0"
},
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
+ "funding": [
{
- "name": "Christian Lück",
- "email": "christian@lueck.tv"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.",
- "homepage": "https://github.com/reactphp/promise-timer",
- "keywords": [
- "async",
- "event-loop",
- "promise",
- "reactphp",
- "timeout",
- "timer"
- ],
- "support": {
- "issues": "https://github.com/reactphp/promise-timer/issues",
- "source": "https://github.com/reactphp/promise-timer/tree/v1.6.0"
- },
- "time": "2020-07-10T12:18:06+00:00"
+ "time": "2025-08-19T18:57:03+00:00"
},
{
"name": "react/socket",
- "version": "v1.6.0",
+ "version": "v1.16.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/socket.git",
- "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a"
+ "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/socket/zipball/e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
- "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
+ "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.0",
- "react/dns": "^1.1",
- "react/event-loop": "^1.0 || ^0.5",
- "react/promise": "^2.6.0 || ^1.2.1",
- "react/promise-timer": "^1.4.0",
- "react/stream": "^1.1"
+ "react/dns": "^1.13",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.2 || ^2.6 || ^1.2.1",
+ "react/stream": "^1.4"
},
"require-dev": {
- "clue/block-react": "^1.2",
- "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
- "react/promise-stream": "^1.2"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4.3 || ^3.3 || ^2",
+ "react/promise-stream": "^1.4",
+ "react/promise-timer": "^1.11"
},
"type": "library",
"autoload": {
"psr-4": {
- "React\\Socket\\": "src"
+ "React\\Socket\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2954,53 +3203,71 @@
],
"support": {
"issues": "https://github.com/reactphp/socket/issues",
- "source": "https://github.com/reactphp/socket/tree/v1.6.0"
+ "source": "https://github.com/reactphp/socket/tree/v1.16.0"
},
"funding": [
{
- "url": "https://github.com/WyriHaximus",
- "type": "github"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2020-08-28T12:49:05+00:00"
+ "time": "2024-07-26T10:38:09+00:00"
},
{
"name": "react/stream",
- "version": "v1.1.1",
+ "version": "v1.4.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/stream.git",
- "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a"
+ "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/stream/zipball/7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
- "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d",
+ "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.8",
- "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5"
+ "react/event-loop": "^1.2"
},
"require-dev": {
"clue/stream-filter": "~1.2",
- "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"type": "library",
"autoload": {
"psr-4": {
- "React\\Stream\\": "src"
+ "React\\Stream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
"description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
"keywords": [
"event-driven",
@@ -3014,109 +3281,125 @@
],
"support": {
"issues": "https://github.com/reactphp/stream/issues",
- "source": "https://github.com/reactphp/stream/tree/v1.1.1"
+ "source": "https://github.com/reactphp/stream/tree/v1.4.0"
},
- "time": "2020-05-04T10:17:57+00:00"
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-06-11T12:45:25+00:00"
},
{
- "name": "ringcentral/psr7",
- "version": "1.3.0",
+ "name": "sebastian/diff",
+ "version": "6.0.2",
"source": {
"type": "git",
- "url": "https://github.com/ringcentral/psr7.git",
- "reference": "360faaec4b563958b673fb52bbe94e37f14bc686"
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686",
- "reference": "360faaec4b563958b673fb52bbe94e37f14bc686",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544",
"shasum": ""
},
"require": {
- "php": ">=5.3",
- "psr/http-message": "~1.0"
- },
- "provide": {
- "psr/http-message-implementation": "1.0"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "^11.0",
+ "symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
- "psr-4": {
- "RingCentral\\Psr7\\": "src/"
- },
- "files": [
- "src/functions_include.php"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
}
],
- "description": "PSR-7 message implementation",
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
- "http",
- "message",
- "stream",
- "uri"
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
],
"support": {
- "source": "https://github.com/ringcentral/psr7/tree/master"
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2"
},
- "time": "2018-05-29T20:21:04+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:53:05+00:00"
},
{
"name": "symfony/console",
- "version": "v4.4.21",
+ "version": "v5.4.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "1ba4560dbbb9fcf5ae28b61f71f49c678086cf23"
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/1ba4560dbbb9fcf5ae28b61f71f49c678086cf23",
- "reference": "1ba4560dbbb9fcf5ae28b61f71f49c678086cf23",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php73": "^1.8",
- "symfony/polyfill-php80": "^1.15",
- "symfony/service-contracts": "^1.1|^2"
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
},
"conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/event-dispatcher": "<4.3|>=5",
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
"symfony/lock": "<4.4",
- "symfony/process": "<3.3"
+ "symfony/process": "<4.4"
},
"provide": {
- "psr/log-implementation": "1.0"
+ "psr/log-implementation": "1.0|2.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "^3.4|^4.0|^5.0",
- "symfony/dependency-injection": "^3.4|^4.0|^5.0",
- "symfony/event-dispatcher": "^4.3",
- "symfony/lock": "^4.4|^5.0",
- "symfony/process": "^3.4|^4.0|^5.0",
- "symfony/var-dumper": "^4.3|^5.0"
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/log": "For using the console logger",
@@ -3149,8 +3432,14 @@
],
"description": "Eases the creation of beautiful and testable command line interfaces",
"homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
"support": {
- "source": "https://github.com/symfony/console/tree/v4.4.21"
+ "source": "https://github.com/symfony/console/tree/v5.4.47"
},
"funding": [
{
@@ -3166,32 +3455,38 @@
"type": "tidelift"
}
],
- "time": "2021-03-26T09:23:24+00:00"
+ "time": "2024-11-06T11:30:55+00:00"
},
{
- "name": "symfony/finder",
- "version": "v4.4.16",
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.5.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/finder.git",
- "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31"
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/26f63b8d4e92f2eecd90f6791a563ebb001abe31",
- "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": ""
},
"require": {
- "php": ">=7.1.3"
+ "php": ">=8.1"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Finder\\": ""
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
},
- "exclude-from-classmap": [
- "/Tests/"
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3200,18 +3495,18 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Finder Component",
+ "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v4.4.16"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -3227,44 +3522,34 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T11:50:19+00:00"
+ "time": "2024-04-18T09:32:20+00:00"
},
{
- "name": "symfony/polyfill-mbstring",
- "version": "v1.22.1",
+ "name": "symfony/finder",
+ "version": "v5.4.45",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "63741784cd7b9967975eec610b256eed3ede022b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
- "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b",
+ "reference": "63741784cd7b9967975eec610b256eed3ede022b",
"shasum": ""
},
"require": {
- "php": ">=7.1"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.22-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
+ "Symfony\\Component\\Finder\\": ""
},
- "files": [
- "bootstrap.php"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3273,25 +3558,18 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for the Mbstring extension",
+ "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1"
+ "source": "https://github.com/symfony/finder/tree/v5.4.45"
},
"funding": [
{
@@ -3307,45 +3585,45 @@
"type": "tidelift"
}
],
- "time": "2021-01-22T09:19:47+00:00"
+ "time": "2024-09-28T13:32:08+00:00"
},
{
- "name": "symfony/polyfill-php73",
- "version": "v1.22.1",
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2"
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
- "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.22-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php73\\": ""
- },
"files": [
"bootstrap.php"
],
- "classmap": [
- "Resources/stubs"
- ]
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3353,24 +3631,24 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
+ "ctype",
"polyfill",
- "portable",
- "shim"
+ "portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
},
"funding": [
{
@@ -3386,55 +3664,48 @@
"type": "tidelift"
}
],
- "time": "2021-01-07T16:49:33+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "symfony/polyfill-php80",
- "version": "v1.22.1",
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
- "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.22-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php80\\": ""
- },
"files": [
"bootstrap.php"
],
- "classmap": [
- "Resources/stubs"
- ]
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
- {
- "name": "Ion Bazan",
- "email": "ion.bazan@gmail.com"
- },
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
@@ -3444,16 +3715,18 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "description": "Symfony polyfill for intl's grapheme_* functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
+ "grapheme",
+ "intl",
"polyfill",
"portable",
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
},
"funding": [
{
@@ -3469,39 +3742,45 @@
"type": "tidelift"
}
],
- "time": "2021-01-07T16:49:33+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "symfony/service-contracts",
- "version": "v1.1.8",
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/service-contracts.git",
- "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf"
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
- "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
- "php": "^7.1.3",
- "psr/container": "^1.0"
+ "php": ">=7.2"
},
"suggest": {
- "symfony/service-implementation": ""
+ "ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Symfony\\Contracts\\Service\\": ""
- }
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3517,75 +3796,72 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Generic abstractions related to writing services",
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
"homepage": "https://symfony.com",
"keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v1.1.8"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
},
- "time": "2019-10-14T12:27:06+00:00"
- }
- ],
- "packages-dev": [
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
{
- "name": "brianium/paratest",
- "version": "v6.2.0",
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/paratestphp/paratest.git",
- "reference": "9a94366983ce32c7724fc92e3b544327d4adb9be"
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paratestphp/paratest/zipball/9a94366983ce32c7724fc92e3b544327d4adb9be",
- "reference": "9a94366983ce32c7724fc92e3b544327d4adb9be",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-pcre": "*",
- "ext-reflection": "*",
- "ext-simplexml": "*",
- "php": "^7.3 || ^8.0",
- "phpunit/php-code-coverage": "^9.2.5",
- "phpunit/php-file-iterator": "^3.0.5",
- "phpunit/php-timer": "^5.0.3",
- "phpunit/phpunit": "^9.5.1",
- "sebastian/environment": "^5.1.3",
- "symfony/console": "^4.4 || ^5.2",
- "symfony/process": "^4.4 || ^5.2"
+ "ext-iconv": "*",
+ "php": ">=7.2"
},
- "require-dev": {
- "doctrine/coding-standard": "^8.2.0",
- "ekino/phpstan-banned-code": "^0.3.1",
- "ergebnis/phpstan-rules": "^0.15.3",
- "ext-posix": "*",
- "infection/infection": "^0.20.2",
- "phpstan/phpstan": "^0.12.70",
- "phpstan/phpstan-deprecation-rules": "^0.12.6",
- "phpstan/phpstan-phpunit": "^0.12.17",
- "phpstan/phpstan-strict-rules": "^0.12.9",
- "squizlabs/php_codesniffer": "^3.5.8",
- "symfony/filesystem": "^5.2.2",
- "thecodingmachine/phpstan-strict-rules": "^0.12.1",
- "vimeo/psalm": "^4.4.1"
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
},
- "bin": [
- "bin/paratest"
- ],
"type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "ParaTest\\": [
- "src/"
- ]
+ "Symfony\\Polyfill\\Mbstring\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3594,57 +3870,76 @@
],
"authors": [
{
- "name": "Brian Scaturro",
- "email": "scaturrob@gmail.com",
- "homepage": "http://brianscaturro.com",
- "role": "Lead"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Parallel testing for PHP",
- "homepage": "https://github.com/paratestphp/paratest",
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
"keywords": [
- "concurrent",
- "parallel",
- "phpunit",
- "testing"
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/paratestphp/paratest/issues",
- "source": "https://github.com/paratestphp/paratest/tree/v6.2.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
},
- "time": "2021-01-29T15:25:31+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
},
{
- "name": "doctrine/instantiator",
- "version": "1.4.0",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
- "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
- },
- "require-dev": {
- "doctrine/coding-standard": "^8.0",
- "ext-pdo": "*",
- "ext-phar": "*",
- "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
- "phpstan/phpstan": "^0.12",
- "phpstan/phpstan-phpunit": "^0.12",
- "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ "php": ">=7.2"
},
"type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
- }
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3652,65 +3947,79 @@
],
"authors": [
{
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com",
- "homepage": "https://ocramius.github.io/"
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
"keywords": [
- "constructor",
- "instantiate"
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/doctrine/instantiator/issues",
- "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
},
"funding": [
{
- "url": "https://www.doctrine-project.org/sponsorship.html",
+ "url": "https://symfony.com/sponsor",
"type": "custom"
},
{
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
+ "url": "https://github.com/fabpot",
+ "type": "github"
},
{
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2020-11-10T18:47:58+00:00"
+ "time": "2025-01-02T08:10:11+00:00"
},
{
- "name": "drupol/phposinfo",
- "version": "1.6.5",
+ "name": "symfony/polyfill-php81",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/drupol/phposinfo.git",
- "reference": "36b0250d38279c8a131a1898a31e359606024507"
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drupol/phposinfo/zipball/36b0250d38279c8a131a1898a31e359606024507",
- "reference": "36b0250d38279c8a131a1898a31e359606024507",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"shasum": ""
},
"require": {
- "php": ">= 7.1.3"
- },
- "require-dev": {
- "drupol/php-conventions": "^1.7.1",
- "friends-of-phpspec/phpspec-code-coverage": "^4.3.2",
- "infection/infection": "^0.13.6 || ^0.15.0",
- "phpspec/phpspec": "^5.1.2 || ^6.1.1"
+ "php": ">=7.2"
},
"type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "drupol\\phposinfo\\": "src/"
- }
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3718,111 +4027,147 @@
],
"authors": [
{
- "name": "Pol Dellaiera",
- "email": "pol.dellaiera@protonmail.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Try to guess the host operating system.",
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
"keywords": [
- "operating system detection"
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/drupol/phposinfo/issues",
- "source": "https://github.com/drupol/phposinfo/tree/master"
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0"
},
"funding": [
{
- "url": "https://github.com/drupol",
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
"type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "abandoned": "loophp/phposinfo",
- "time": "2020-05-19T14:14:28+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "myclabs/deep-copy",
- "version": "1.10.2",
+ "name": "symfony/polyfill-php83",
+ "version": "v1.33.0",
"source": {
"type": "git",
- "url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
- "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
- },
- "replace": {
- "myclabs/deep-copy": "self.version"
- },
- "require-dev": {
- "doctrine/collections": "^1.0",
- "doctrine/common": "^2.6",
- "phpunit/phpunit": "^7.1"
+ "php": ">=7.2"
},
"type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "DeepCopy\\": "src/DeepCopy/"
+ "Symfony\\Polyfill\\Php83\\": ""
},
- "files": [
- "src/DeepCopy/deep_copy.php"
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "description": "Create deep copies (clones) of your objects",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
"keywords": [
- "clone",
- "copy",
- "duplicate",
- "object",
- "object graph"
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
},
"funding": [
{
- "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2020-11-13T09:40:50+00:00"
+ "time": "2025-07-08T02:45:35+00:00"
},
{
- "name": "nategood/httpful",
- "version": "0.2.20",
+ "name": "symfony/process",
+ "version": "v5.4.46",
"source": {
"type": "git",
- "url": "https://github.com/nategood/httpful.git",
- "reference": "c1cd4d46a4b281229032cf39d4dd852f9887c0f6"
+ "url": "https://github.com/symfony/process.git",
+ "reference": "01906871cb9b5e3cf872863b91aba4ec9767daf4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nategood/httpful/zipball/c1cd4d46a4b281229032cf39d4dd852f9887c0f6",
- "reference": "c1cd4d46a4b281229032cf39d4dd852f9887c0f6",
+ "url": "https://api.github.com/repos/symfony/process/zipball/01906871cb9b5e3cf872863b91aba4ec9767daf4",
+ "reference": "01906871cb9b5e3cf872863b91aba4ec9767daf4",
"shasum": ""
},
"require": {
- "ext-curl": "*",
- "php": ">=5.3"
- },
- "require-dev": {
- "phpunit/phpunit": "*"
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Httpful": "src/"
- }
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3830,449 +4175,518 @@
],
"authors": [
{
- "name": "Nate Good",
- "email": "me@nategood.com",
- "homepage": "http://nategood.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "A Readable, Chainable, REST friendly, PHP HTTP Client",
- "homepage": "http://github.com/nategood/httpful",
- "keywords": [
- "api",
- "curl",
- "http",
- "requests",
- "rest",
- "restful"
- ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
"support": {
- "issues": "https://github.com/nategood/httpful/issues",
- "source": "https://github.com/nategood/httpful/tree/v0.2.20"
+ "source": "https://github.com/symfony/process/tree/v5.4.46"
},
- "time": "2015-10-26T16:11:30+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-06T09:18:28+00:00"
},
{
- "name": "phar-io/manifest",
- "version": "2.0.1",
+ "name": "symfony/service-contracts",
+ "version": "v2.5.4",
"source": {
"type": "git",
- "url": "https://github.com/phar-io/manifest.git",
- "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "f37b419f7aea2e9abf10abd261832cace12e3300"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
- "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",
+ "reference": "f37b419f7aea2e9abf10abd261832cace12e3300",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-phar": "*",
- "ext-xmlwriter": "*",
- "phar-io/version": "^3.0.1",
- "php": "^7.2 || ^8.0"
+ "php": ">=7.2.5",
+ "psr/container": "^1.1",
+ "symfony/deprecation-contracts": "^2.1|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
},
"type": "library",
"extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-main": "2.5-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "Developer"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
"support": {
- "issues": "https://github.com/phar-io/manifest/issues",
- "source": "https://github.com/phar-io/manifest/tree/master"
+ "source": "https://github.com/symfony/service-contracts/tree/v2.5.4"
},
- "time": "2020-06-27T14:33:11+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:11:13+00:00"
},
{
- "name": "phar-io/version",
- "version": "3.1.0",
+ "name": "symfony/string",
+ "version": "v5.4.47",
"source": {
"type": "git",
- "url": "https://github.com/phar-io/version.git",
- "reference": "bae7c545bef187884426f042434e561ab1ddb182"
+ "url": "https://github.com/symfony/string.git",
+ "reference": "136ca7d72f72b599f2631aca474a4f8e26719799"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
- "reference": "bae7c545bef187884426f042434e561ab1ddb182",
+ "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799",
+ "reference": "136ca7d72f72b599f2631aca474a4f8e26719799",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "conflict": {
+ "symfony/translation-contracts": ">=3.0"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
},
"type": "library",
"autoload": {
- "classmap": [
- "src/"
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "Developer"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Library for handling version information and constraints",
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
"support": {
- "issues": "https://github.com/phar-io/version/issues",
- "source": "https://github.com/phar-io/version/tree/3.1.0"
+ "source": "https://github.com/symfony/string/tree/v5.4.47"
},
- "time": "2021-02-23T14:00:09+00:00"
- },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-10T20:33:58+00:00"
+ }
+ ],
+ "packages-dev": [
{
- "name": "php-parallel-lint/php-parallel-lint",
- "version": "v1.2.0",
+ "name": "cweagans/composer-patches",
+ "version": "1.7.3",
"source": {
"type": "git",
- "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
- "reference": "474f18bc6cc6aca61ca40bfab55139de614e51ca"
+ "url": "https://github.com/cweagans/composer-patches.git",
+ "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/474f18bc6cc6aca61ca40bfab55139de614e51ca",
- "reference": "474f18bc6cc6aca61ca40bfab55139de614e51ca",
+ "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
+ "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "php": ">=5.4.0"
- },
- "replace": {
- "grogy/php-parallel-lint": "*",
- "jakub-onderka/php-parallel-lint": "*"
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.3.0"
},
"require-dev": {
- "nette/tester": "^1.3 || ^2.0",
- "php-parallel-lint/php-console-highlighter": "~0.3",
- "squizlabs/php_codesniffer": "~3.0"
+ "composer/composer": "~1.0 || ~2.0",
+ "phpunit/phpunit": "~4.6"
},
- "suggest": {
- "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
+ "type": "composer-plugin",
+ "extra": {
+ "class": "cweagans\\Composer\\Patches"
},
- "bin": [
- "parallel-lint"
- ],
- "type": "library",
"autoload": {
- "classmap": [
- "./"
- ]
+ "psr-4": {
+ "cweagans\\Composer\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-2-Clause"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Jakub Onderka",
- "email": "ahoj@jakubonderka.cz"
+ "name": "Cameron Eagans",
+ "email": "me@cweagans.net"
}
],
- "description": "This tool check syntax of PHP files about 20x faster than serial check.",
- "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+ "description": "Provides a way to patch Composer packages.",
"support": {
- "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
- "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/master"
+ "issues": "https://github.com/cweagans/composer-patches/issues",
+ "source": "https://github.com/cweagans/composer-patches/tree/1.7.3"
},
- "time": "2020-04-04T12:18:32+00:00"
+ "time": "2022-12-20T22:53:13+00:00"
},
{
- "name": "phpdocumentor/reflection-common",
- "version": "2.2.0",
+ "name": "myclabs/deep-copy",
+ "version": "1.13.4",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": "^7.1 || ^8.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-2.x": "2.x-dev"
- }
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
+ "type": "library",
"autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
"psr-4": {
- "phpDocumentor\\Reflection\\": "src/"
+ "DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
- }
- ],
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
+ "description": "Create deep copies (clones) of your objects",
"keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
],
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
- "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
},
- "time": "2020-06-27T09:03:43+00:00"
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-01T08:46:24+00:00"
},
{
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.2.2",
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
- "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
"shasum": ""
},
"require": {
- "ext-filter": "*",
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.3",
- "webmozart/assert": "^1.9.1"
- },
- "require-dev": {
- "mockery/mockery": "~1.3.2"
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
},
{
- "name": "Jaap van Otterdijk",
- "email": "account@ijaap.nl"
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
},
- "time": "2020-09-03T19:13:55+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
},
{
- "name": "phpdocumentor/type-resolver",
- "version": "1.4.0",
+ "name": "phar-io/version",
+ "version": "3.2.1",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
- "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.0"
- },
- "require-dev": {
- "ext-tokenizer": "*"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-1.x": "1.x-dev"
- }
- },
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "description": "Library for handling version information and constraints",
"support": {
- "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
},
- "time": "2020-09-17T18:55:26+00:00"
+ "time": "2022-02-21T01:04:05+00:00"
},
{
- "name": "phpspec/prophecy",
- "version": "1.13.0",
+ "name": "php-parallel-lint/php-parallel-lint",
+ "version": "v1.4.0",
"source": {
"type": "git",
- "url": "https://github.com/phpspec/prophecy.git",
- "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea"
+ "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
+ "reference": "6db563514f27e19595a19f45a4bf757b6401194e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea",
- "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea",
+ "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6db563514f27e19595a19f45a4bf757b6401194e",
+ "reference": "6db563514f27e19595a19f45a4bf757b6401194e",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.2",
- "php": "^7.2 || ~8.0, <8.1",
- "phpdocumentor/reflection-docblock": "^5.2",
- "sebastian/comparator": "^3.0 || ^4.0",
- "sebastian/recursion-context": "^3.0 || ^4.0"
+ "ext-json": "*",
+ "php": ">=5.3.0"
+ },
+ "replace": {
+ "grogy/php-parallel-lint": "*",
+ "jakub-onderka/php-parallel-lint": "*"
},
"require-dev": {
- "phpspec/phpspec": "^6.0",
- "phpunit/phpunit": "^8.0 || ^9.0"
+ "nette/tester": "^1.3 || ^2.0",
+ "php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
+ "squizlabs/php_codesniffer": "^3.6"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.11.x-dev"
- }
+ "suggest": {
+ "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
},
+ "bin": [
+ "parallel-lint"
+ ],
+ "type": "library",
"autoload": {
- "psr-4": {
- "Prophecy\\": "src/Prophecy"
- }
+ "classmap": [
+ "./src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-2-Clause"
],
"authors": [
{
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
- },
- {
- "name": "Marcello Duarte",
- "email": "marcello.duarte@gmail.com"
+ "name": "Jakub Onderka",
+ "email": "ahoj@jakubonderka.cz"
}
],
- "description": "Highly opinionated mocking framework for PHP 5.3+",
- "homepage": "https://github.com/phpspec/prophecy",
+ "description": "This tool checks the syntax of PHP files about 20x faster than serial check.",
+ "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
"keywords": [
- "Double",
- "Dummy",
- "fake",
- "mock",
- "spy",
- "stub"
+ "lint",
+ "static analysis"
],
"support": {
- "issues": "https://github.com/phpspec/prophecy/issues",
- "source": "https://github.com/phpspec/prophecy/tree/1.13.0"
+ "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
+ "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.4.0"
},
- "time": "2021-03-17T13:42:18+00:00"
+ "time": "2024-03-27T12:14:49+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
- "version": "dev-master",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
- "reference": "a6a1ed55749e2e39ad15b1976d523ba0af57f9c3"
+ "reference": "468e02c9176891cc901143da118f09dc9505fc2f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/a6a1ed55749e2e39ad15b1976d523ba0af57f9c3",
- "reference": "a6a1ed55749e2e39ad15b1976d523ba0af57f9c3",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f",
+ "reference": "468e02c9176891cc901143da118f09dc9505fc2f",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0",
- "phpstan/phpstan": "^1.0"
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.1.15"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/phpstan-phpunit": "^1.0",
- "phpunit/phpunit": "^9.5"
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.6"
},
- "default-branch": true,
"type": "phpstan-extension",
"extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- },
"phpstan": {
"includes": [
"rules.neon"
@@ -4291,27 +4705,27 @@
"description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
"support": {
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
- "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/master"
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3"
},
- "time": "2021-09-12T20:22:56+00:00"
+ "time": "2025-05-14T10:56:57+00:00"
},
{
"name": "phpstan/phpstan-nette",
- "version": "dev-master",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-nette.git",
- "reference": "f4654b27b107241e052755ec187a0b1964541ba6"
+ "reference": "9b629867b8e13e0afad8c8537b6541230d7b6a38"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-nette/zipball/f4654b27b107241e052755ec187a0b1964541ba6",
- "reference": "f4654b27b107241e052755ec187a0b1964541ba6",
+ "url": "https://api.github.com/repos/phpstan/phpstan-nette/zipball/9b629867b8e13e0afad8c8537b6541230d7b6a38",
+ "reference": "9b629867b8e13e0afad8c8537b6541230d7b6a38",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0",
- "phpstan/phpstan": "^1.0"
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.1.12"
},
"conflict": {
"nette/application": "<2.3.0",
@@ -4322,21 +4736,18 @@
"nette/utils": "<2.3.0"
},
"require-dev": {
+ "nette/application": "^3.0",
+ "nette/di": "^3.1.10",
"nette/forms": "^3.0",
"nette/utils": "^2.3.0 || ^3.0.0",
- "nikic/php-parser": "^4.13.0",
"php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/phpstan-php-parser": "^1.0",
- "phpstan/phpstan-phpunit": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5"
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6"
},
- "default-branch": true,
"type": "phpstan-extension",
"extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- },
"phpstan": {
"includes": [
"extension.neon",
@@ -4356,95 +4767,41 @@
"description": "Nette Framework class reflection extension for PHPStan",
"support": {
"issues": "https://github.com/phpstan/phpstan-nette/issues",
- "source": "https://github.com/phpstan/phpstan-nette/tree/master"
- },
- "time": "2021-09-20T16:12:57+00:00"
- },
- {
- "name": "phpstan/phpstan-php-parser",
- "version": "dev-master",
- "source": {
- "type": "git",
- "url": "https://github.com/phpstan/phpstan-php-parser.git",
- "reference": "b4fe8703df4841a59fd61571687e3bebe896cd6d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-php-parser/zipball/b4fe8703df4841a59fd61571687e3bebe896cd6d",
- "reference": "b4fe8703df4841a59fd61571687e3bebe896cd6d",
- "shasum": ""
- },
- "require": {
- "php": "^7.1 || ^8.0",
- "phpstan/phpstan": "^1.0"
- },
- "require-dev": {
- "php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/phpstan-phpunit": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5"
- },
- "default-branch": true,
- "type": "phpstan-extension",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- },
- "phpstan": {
- "includes": [
- "extension.neon"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "PHPStan\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "PHP-Parser extensions for PHPStan",
- "support": {
- "issues": "https://github.com/phpstan/phpstan-php-parser/issues",
- "source": "https://github.com/phpstan/phpstan-php-parser/tree/master"
+ "source": "https://github.com/phpstan/phpstan-nette/tree/2.0.4"
},
- "time": "2021-09-13T11:29:18+00:00"
+ "time": "2025-06-17T13:26:39+00:00"
},
{
"name": "phpstan/phpstan-phpunit",
- "version": "dev-master",
+ "version": "2.0.x-dev",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-phpunit.git",
- "reference": "5d501422a47e99f288a1eb07e1de141df0b1eab4"
+ "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/5d501422a47e99f288a1eb07e1de141df0b1eab4",
- "reference": "5d501422a47e99f288a1eb07e1de141df0b1eab4",
+ "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/9a9b161baee88a5f5c58d816943cff354ff233dc",
+ "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0",
- "phpstan/phpstan": "^1.0"
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.1.18"
},
"conflict": {
"phpunit/phpunit": "<7.0"
},
"require-dev": {
- "nikic/php-parser": "^4.13.0",
+ "nikic/php-parser": "^5",
"php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5"
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6"
},
"default-branch": true,
"type": "phpstan-extension",
"extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- },
"phpstan": {
"includes": [
"extension.neon",
@@ -4464,40 +4821,36 @@
"description": "PHPUnit extensions and rules for PHPStan",
"support": {
"issues": "https://github.com/phpstan/phpstan-phpunit/issues",
- "source": "https://github.com/phpstan/phpstan-phpunit/tree/master"
+ "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.x"
},
- "time": "2021-09-23T08:37:07+00:00"
+ "time": "2025-07-13T11:31:46+00:00"
},
{
"name": "phpstan/phpstan-strict-rules",
- "version": "dev-master",
+ "version": "2.0.6",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-strict-rules.git",
- "reference": "b49efedea9da854d6c6d0cd6e7802ec8d76e63b4"
+ "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b49efedea9da854d6c6d0cd6e7802ec8d76e63b4",
- "reference": "b49efedea9da854d6c6d0cd6e7802ec8d76e63b4",
+ "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/f9f77efa9de31992a832ff77ea52eb42d675b094",
+ "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0",
- "phpstan/phpstan": "^1.0"
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.0.4"
},
"require-dev": {
- "nikic/php-parser": "^4.13.0",
"php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/phpstan-phpunit": "^1.0",
- "phpunit/phpunit": "^9.5"
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.6"
},
- "default-branch": true,
"type": "phpstan-extension",
"extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- },
"phpstan": {
"includes": [
"rules.neon"
@@ -4516,50 +4869,50 @@
"description": "Extra strict and opinionated rules for PHPStan",
"support": {
"issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
- "source": "https://github.com/phpstan/phpstan-strict-rules/tree/master"
+ "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.6"
},
- "time": "2021-09-23T10:45:37+00:00"
+ "time": "2025-07-21T12:19:29+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "9.2.6",
+ "version": "11.0.11",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "f6293e1b30a2354e8428e004689671b83871edde"
+ "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde",
- "reference": "f6293e1b30a2354e8428e004689671b83871edde",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4",
+ "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.10.2",
- "php": ">=7.3",
- "phpunit/php-file-iterator": "^3.0.3",
- "phpunit/php-text-template": "^2.0.2",
- "sebastian/code-unit-reverse-lookup": "^2.0.2",
- "sebastian/complexity": "^2.0",
- "sebastian/environment": "^5.1.2",
- "sebastian/lines-of-code": "^1.0.3",
- "sebastian/version": "^3.0.1",
- "theseer/tokenizer": "^1.2.0"
+ "nikic/php-parser": "^5.4.0",
+ "php": ">=8.2",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-text-template": "^4.0.1",
+ "sebastian/code-unit-reverse-lookup": "^4.0.1",
+ "sebastian/complexity": "^4.0.1",
+ "sebastian/environment": "^7.2.0",
+ "sebastian/lines-of-code": "^3.0.1",
+ "sebastian/version": "^5.0.2",
+ "theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.5.2"
},
"suggest": {
- "ext-pcov": "*",
- "ext-xdebug": "*"
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.2-dev"
+ "dev-main": "11.0.x-dev"
}
},
"autoload": {
@@ -4587,40 +4940,53 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6"
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage",
+ "type": "tidelift"
}
],
- "time": "2021-03-28T07:26:59+00:00"
+ "time": "2025-08-27T14:37:49+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "3.0.5",
+ "version": "5.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
- "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -4647,7 +5013,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
+ "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0"
},
"funding": [
{
@@ -4655,28 +5022,28 @@
"type": "github"
}
],
- "time": "2020-09-28T05:57:25+00:00"
+ "time": "2024-08-27T05:02:59+00:00"
},
{
"name": "phpunit/php-invoker",
- "version": "3.1.1",
+ "version": "5.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git",
- "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
- "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2",
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
"ext-pcntl": "*",
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"suggest": {
"ext-pcntl": "*"
@@ -4684,7 +5051,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -4710,7 +5077,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
- "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ "security": "https://github.com/sebastianbergmann/php-invoker/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1"
},
"funding": [
{
@@ -4718,32 +5086,32 @@
"type": "github"
}
],
- "time": "2020-09-28T05:58:55+00:00"
+ "time": "2024-07-03T05:07:44+00:00"
},
{
"name": "phpunit/php-text-template",
- "version": "2.0.4",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
- "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -4769,7 +5137,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
- "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1"
},
"funding": [
{
@@ -4777,32 +5146,32 @@
"type": "github"
}
],
- "time": "2020-10-26T05:33:50+00:00"
+ "time": "2024-07-03T05:08:43+00:00"
},
{
"name": "phpunit/php-timer",
- "version": "5.0.3",
+ "version": "7.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
- "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0-dev"
+ "dev-main": "7.0-dev"
}
},
"autoload": {
@@ -4828,7 +5197,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
- "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ "security": "https://github.com/sebastianbergmann/php-timer/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1"
},
"funding": [
{
@@ -4836,59 +5206,52 @@
"type": "github"
}
],
- "time": "2020-10-26T13:16:10+00:00"
+ "time": "2024-07-03T05:09:35+00:00"
},
{
"name": "phpunit/phpunit",
- "version": "9.5.4",
+ "version": "11.5.39",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "c73c6737305e779771147af66c96ca6a7ed8a741"
+ "reference": "ad5597f79d8489d2870073ac0bc0dd0ad1fa9931"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c73c6737305e779771147af66c96ca6a7ed8a741",
- "reference": "c73c6737305e779771147af66c96ca6a7ed8a741",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ad5597f79d8489d2870073ac0bc0dd0ad1fa9931",
+ "reference": "ad5597f79d8489d2870073ac0bc0dd0ad1fa9931",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.3.1",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.1",
- "phar-io/version": "^3.0.2",
- "php": ">=7.3",
- "phpspec/prophecy": "^1.12.1",
- "phpunit/php-code-coverage": "^9.2.3",
- "phpunit/php-file-iterator": "^3.0.5",
- "phpunit/php-invoker": "^3.1.1",
- "phpunit/php-text-template": "^2.0.3",
- "phpunit/php-timer": "^5.0.2",
- "sebastian/cli-parser": "^1.0.1",
- "sebastian/code-unit": "^1.0.6",
- "sebastian/comparator": "^4.0.5",
- "sebastian/diff": "^4.0.3",
- "sebastian/environment": "^5.1.3",
- "sebastian/exporter": "^4.0.3",
- "sebastian/global-state": "^5.0.1",
- "sebastian/object-enumerator": "^4.0.3",
- "sebastian/resource-operations": "^3.0.3",
- "sebastian/type": "^2.3",
- "sebastian/version": "^3.0.2"
- },
- "require-dev": {
- "ext-pdo": "*",
- "phpspec/prophecy-phpunit": "^2.0.1"
+ "myclabs/deep-copy": "^1.13.4",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=8.2",
+ "phpunit/php-code-coverage": "^11.0.11",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-invoker": "^5.0.1",
+ "phpunit/php-text-template": "^4.0.1",
+ "phpunit/php-timer": "^7.0.1",
+ "sebastian/cli-parser": "^3.0.2",
+ "sebastian/code-unit": "^3.0.3",
+ "sebastian/comparator": "^6.3.2",
+ "sebastian/diff": "^6.0.2",
+ "sebastian/environment": "^7.2.1",
+ "sebastian/exporter": "^6.3.0",
+ "sebastian/global-state": "^7.0.2",
+ "sebastian/object-enumerator": "^6.0.1",
+ "sebastian/type": "^5.1.3",
+ "sebastian/version": "^5.0.2",
+ "staabm/side-effects-detector": "^1.0.5"
},
"suggest": {
- "ext-soap": "*",
- "ext-xdebug": "*"
+ "ext-soap": "To be able to generate mocks based on WSDL files"
},
"bin": [
"phpunit"
@@ -4896,15 +5259,15 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.5-dev"
+ "dev-main": "11.5-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ],
"files": [
"src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -4927,44 +5290,57 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4"
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.39"
},
"funding": [
{
- "url": "https://phpunit.de/donate.html",
+ "url": "https://phpunit.de/sponsors.html",
"type": "custom"
},
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
}
],
- "time": "2021-03-23T07:16:29+00:00"
+ "time": "2025-09-14T06:20:41+00:00"
},
{
"name": "sebastian/cli-parser",
- "version": "1.0.1",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180",
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -4987,7 +5363,8 @@
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2"
},
"funding": [
{
@@ -4995,32 +5372,32 @@
"type": "github"
}
],
- "time": "2020-09-28T06:08:49+00:00"
+ "time": "2024-07-03T04:41:36+00:00"
},
{
"name": "sebastian/code-unit",
- "version": "1.0.8",
+ "version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
- "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
- "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64",
+ "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -5043,7 +5420,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
- "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ "security": "https://github.com/sebastianbergmann/code-unit/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3"
},
"funding": [
{
@@ -5051,32 +5429,32 @@
"type": "github"
}
],
- "time": "2020-10-26T13:08:54+00:00"
+ "time": "2025-03-19T07:56:08+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
- "version": "2.0.3",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e",
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -5098,7 +5476,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
- "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1"
},
"funding": [
{
@@ -5106,34 +5485,39 @@
"type": "github"
}
],
- "time": "2020-09-28T05:30:19+00:00"
+ "time": "2024-07-03T04:45:54+00:00"
},
{
"name": "sebastian/comparator",
- "version": "4.0.6",
+ "version": "6.3.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
- "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8",
+ "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/diff": "^4.0",
- "sebastian/exporter": "^4.0"
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.2",
+ "sebastian/diff": "^6.0",
+ "sebastian/exporter": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.4"
+ },
+ "suggest": {
+ "ext-bcmath": "For comparing BcMath\\Number objects"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "6.3-dev"
}
},
"autoload": {
@@ -5172,41 +5556,54 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
- "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
+ "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
+ "type": "tidelift"
}
],
- "time": "2020-10-26T15:49:45+00:00"
+ "time": "2025-08-10T08:07:46+00:00"
},
{
"name": "sebastian/complexity",
- "version": "2.0.2",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0",
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.7",
- "php": ">=7.3"
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -5229,73 +5626,8 @@
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
- "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
- },
- "funding": [
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- }
- ],
- "time": "2020-10-26T15:52:27+00:00"
- },
- {
- "name": "sebastian/diff",
- "version": "4.0.4",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
- "shasum": ""
- },
- "require": {
- "php": ">=7.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.3",
- "symfony/process": "^4.2 || ^5"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
- }
- ],
- "description": "Diff implementation",
- "homepage": "https://github.com/sebastianbergmann/diff",
- "keywords": [
- "diff",
- "udiff",
- "unidiff",
- "unified diff"
- ],
- "support": {
- "issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1"
},
"funding": [
{
@@ -5303,27 +5635,27 @@
"type": "github"
}
],
- "time": "2020-10-26T13:10:38+00:00"
+ "time": "2024-07-03T04:49:50+00:00"
},
{
"name": "sebastian/environment",
- "version": "5.1.3",
+ "version": "7.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4",
+ "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.3"
},
"suggest": {
"ext-posix": "*"
@@ -5331,7 +5663,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.1-dev"
+ "dev-main": "7.2-dev"
}
},
"autoload": {
@@ -5350,7 +5682,7 @@
}
],
"description": "Provides functionality to handle HHVM/PHP environments",
- "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "homepage": "https://github.com/sebastianbergmann/environment",
"keywords": [
"Xdebug",
"environment",
@@ -5358,42 +5690,55 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
+ "security": "https://github.com/sebastianbergmann/environment/security/policy",
+ "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/environment",
+ "type": "tidelift"
}
],
- "time": "2020-09-28T05:52:38+00:00"
+ "time": "2025-05-21T11:55:47+00:00"
},
{
"name": "sebastian/exporter",
- "version": "4.0.3",
+ "version": "6.3.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
- "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3",
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/recursion-context": "^4.0"
+ "ext-mbstring": "*",
+ "php": ">=8.2",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
- "ext-mbstring": "*",
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "6.1-dev"
}
},
"autoload": {
@@ -5428,14 +5773,15 @@
}
],
"description": "Provides the functionality to export PHP variables for visualization",
- "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
+ "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0"
},
"funding": [
{
@@ -5443,38 +5789,35 @@
"type": "github"
}
],
- "time": "2020-09-28T05:24:23+00:00"
+ "time": "2024-12-05T09:17:50+00:00"
},
{
"name": "sebastian/global-state",
- "version": "5.0.2",
+ "version": "7.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
- "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7",
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/object-reflector": "^2.0",
- "sebastian/recursion-context": "^4.0"
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
"ext-dom": "*",
- "phpunit/phpunit": "^9.3"
- },
- "suggest": {
- "ext-uopz": "*"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0-dev"
+ "dev-main": "7.0-dev"
}
},
"autoload": {
@@ -5493,13 +5836,14 @@
}
],
"description": "Snapshotting of global state",
- "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "homepage": "https://www.github.com/sebastianbergmann/global-state",
"keywords": [
"global state"
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2"
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2"
},
"funding": [
{
@@ -5507,33 +5851,33 @@
"type": "github"
}
],
- "time": "2020-10-26T15:55:19+00:00"
+ "time": "2024-07-03T04:57:36+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "1.0.3",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a",
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.6",
- "php": ">=7.3"
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -5556,7 +5900,8 @@
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1"
},
"funding": [
{
@@ -5564,34 +5909,34 @@
"type": "github"
}
],
- "time": "2020-11-28T06:42:11+00:00"
+ "time": "2024-07-03T04:58:38+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "4.0.4",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
- "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa",
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/object-reflector": "^2.0",
- "sebastian/recursion-context": "^4.0"
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -5613,7 +5958,8 @@
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1"
},
"funding": [
{
@@ -5621,32 +5967,32 @@
"type": "github"
}
],
- "time": "2020-10-26T13:12:34+00:00"
+ "time": "2024-07-03T05:00:13+00:00"
},
{
"name": "sebastian/object-reflector",
- "version": "2.0.4",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
- "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9",
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -5668,7 +6014,8 @@
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
- "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ "security": "https://github.com/sebastianbergmann/object-reflector/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1"
},
"funding": [
{
@@ -5676,32 +6023,32 @@
"type": "github"
}
],
- "time": "2020-10-26T13:14:26+00:00"
+ "time": "2024-07-03T05:01:32+00:00"
},
{
"name": "sebastian/recursion-context",
- "version": "4.0.4",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16",
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -5719,74 +6066,20 @@
"email": "sebastian@phpunit.de"
},
{
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
- }
- ],
- "description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
- "support": {
- "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
- },
- "funding": [
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- }
- ],
- "time": "2020-10-26T13:17:30+00:00"
- },
- {
- "name": "sebastian/resource-operations",
- "version": "3.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
- "shasum": ""
- },
- "require": {
- "php": ">=7.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
}
],
- "description": "Provides a list of PHP built-in functions that operate on resources",
- "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
- "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
- "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ "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/6.0.2"
},
"funding": [
{
@@ -5794,32 +6087,32 @@
"type": "github"
}
],
- "time": "2020-09-28T06:45:17+00:00"
+ "time": "2024-07-03T05:10:34+00:00"
},
{
"name": "sebastian/type",
- "version": "2.3.1",
+ "version": "5.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
+ "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
- "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449",
+ "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^11.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3-dev"
+ "dev-main": "5.1-dev"
}
},
"autoload": {
@@ -5842,37 +6135,50 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/2.3.1"
+ "security": "https://github.com/sebastianbergmann/type/security/policy",
+ "source": "https://github.com/sebastianbergmann/type/tree/5.1.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/type",
+ "type": "tidelift"
}
],
- "time": "2020-10-26T13:18:59+00:00"
+ "time": "2025-08-09T06:55:48+00:00"
},
{
"name": "sebastian/version",
- "version": "3.0.2",
+ "version": "5.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
- "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -5895,7 +6201,8 @@
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
- "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ "security": "https://github.com/sebastianbergmann/version/security/policy",
+ "source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
},
"funding": [
{
@@ -5903,479 +6210,308 @@
"type": "github"
}
],
- "time": "2020-09-28T06:39:44+00:00"
+ "time": "2024-10-09T05:16:32+00:00"
},
{
- "name": "seld/jsonlint",
- "version": "1.8.3",
+ "name": "shipmonk/composer-dependency-analyser",
+ "version": "1.7.0",
"source": {
"type": "git",
- "url": "https://github.com/Seldaek/jsonlint.git",
- "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57"
+ "url": "https://github.com/shipmonk-rnd/composer-dependency-analyser.git",
+ "reference": "bca862b2830a453734aee048eb0cdab82e5c9da3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
- "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
+ "url": "https://api.github.com/repos/shipmonk-rnd/composer-dependency-analyser/zipball/bca862b2830a453734aee048eb0cdab82e5c9da3",
+ "reference": "bca862b2830a453734aee048eb0cdab82e5c9da3",
"shasum": ""
},
"require": {
- "php": "^5.3 || ^7.0 || ^8.0"
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ "editorconfig-checker/editorconfig-checker": "^10.3.0",
+ "ergebnis/composer-normalize": "^2.19",
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpstan/phpstan": "^1.10.63",
+ "phpstan/phpstan-phpunit": "^1.1.1",
+ "phpstan/phpstan-strict-rules": "^1.2.3",
+ "phpunit/phpunit": "^8.5.28 || ^9.5.20",
+ "shipmonk/name-collision-detector": "^2.0.0",
+ "slevomat/coding-standard": "^8.0.1"
},
"bin": [
- "bin/jsonlint"
+ "bin/composer-dependency-analyser"
],
"type": "library",
"autoload": {
"psr-4": {
- "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ "ShipMonk\\ComposerDependencyAnalyser\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- }
- ],
- "description": "JSON Linter",
+ "description": "Fast detection of composer dependency issues (dead dependencies, shadow dependencies, misplaced dependencies)",
"keywords": [
- "json",
- "linter",
- "parser",
- "validator"
+ "analyser",
+ "composer",
+ "composer dependency",
+ "dead code",
+ "dead dependency",
+ "detector",
+ "dev",
+ "misplaced dependency",
+ "shadow dependency",
+ "static analysis",
+ "unused code",
+ "unused dependency"
],
"support": {
- "issues": "https://github.com/Seldaek/jsonlint/issues",
- "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3"
+ "issues": "https://github.com/shipmonk-rnd/composer-dependency-analyser/issues",
+ "source": "https://github.com/shipmonk-rnd/composer-dependency-analyser/tree/1.7.0"
},
- "funding": [
- {
- "url": "https://github.com/Seldaek",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
- "type": "tidelift"
- }
- ],
- "time": "2020-11-11T09:19:24+00:00"
+ "time": "2024-08-08T08:12:32+00:00"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.22.1",
+ "name": "shipmonk/dead-code-detector",
+ "version": "0.12.2",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
+ "url": "https://github.com/shipmonk-rnd/dead-code-detector.git",
+ "reference": "71b842269e9a29634e34074e723023e4e151518b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
- "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
+ "url": "https://api.github.com/repos/shipmonk-rnd/dead-code-detector/zipball/71b842269e9a29634e34074e723023e4e151518b",
+ "reference": "71b842269e9a29634e34074e723023e4e151518b",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.1.9"
},
- "suggest": {
- "ext-ctype": "For best performance"
+ "require-dev": {
+ "composer-runtime-api": "^2.0",
+ "composer/semver": "^3.4",
+ "doctrine/orm": "^2.19 || ^3.0",
+ "editorconfig-checker/editorconfig-checker": "^10.6.0",
+ "ergebnis/composer-normalize": "^2.45.0",
+ "nette/application": "^3.1",
+ "nette/component-model": "^3.0",
+ "nette/utils": "^3.0 || ^4.0",
+ "nikic/php-parser": "^5.4.0",
+ "phpstan/phpstan-phpunit": "^2.0.4",
+ "phpstan/phpstan-strict-rules": "^2.0.3",
+ "phpstan/phpstan-symfony": "^2.0.2",
+ "phpunit/phpunit": "^9.6.22",
+ "shipmonk/composer-dependency-analyser": "^1.8.2",
+ "shipmonk/name-collision-detector": "^2.1.1",
+ "shipmonk/phpstan-rules": "^4.1.0",
+ "slevomat/coding-standard": "^8.16.0",
+ "symfony/contracts": "^2.5 || ^3.0",
+ "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0",
+ "symfony/doctrine-bridge": "^5.4 || ^6.0 || ^7.0",
+ "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
+ "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
+ "symfony/routing": "^5.4 || ^6.0 || ^7.0",
+ "symfony/validator": "^5.4 || ^6.0 || ^7.0",
+ "twig/twig": "^3.0"
},
- "type": "library",
+ "type": "phpstan-extension",
"extra": {
- "branch-alias": {
- "dev-main": "1.22-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
}
},
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
+ "ShipMonk\\PHPStan\\DeadCode\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
+ "description": "Dead code detector to find unused PHP code via PHPStan extension. Can automatically remove dead PHP code. Supports libraries like Symfony, Doctrine, PHPUnit etc. Detects dead cycles. Can detect dead code that is tested.",
"keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
+ "PHPStan",
+ "dead code",
+ "static analysis",
+ "unused code"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1"
+ "issues": "https://github.com/shipmonk-rnd/dead-code-detector/issues",
+ "source": "https://github.com/shipmonk-rnd/dead-code-detector/tree/0.12.2"
},
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2021-01-07T16:49:33+00:00"
+ "time": "2025-05-22T07:50:57+00:00"
},
{
- "name": "symfony/process",
- "version": "v5.2.4",
+ "name": "shipmonk/name-collision-detector",
+ "version": "2.1.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f"
+ "url": "https://github.com/shipmonk-rnd/name-collision-detector.git",
+ "reference": "e8c8267a9a3774450b64f4cbf0bb035108e78f07"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/313a38f09c77fbcdc1d223e57d368cea76a2fd2f",
- "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f",
+ "url": "https://api.github.com/repos/shipmonk-rnd/name-collision-detector/zipball/e8c8267a9a3774450b64f4cbf0bb035108e78f07",
+ "reference": "e8c8267a9a3774450b64f4cbf0bb035108e78f07",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/polyfill-php80": "^1.15"
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nette/schema": "^1.1.0",
+ "php": "^7.2 || ^8.0"
},
+ "require-dev": {
+ "editorconfig-checker/editorconfig-checker": "^10.3.0",
+ "ergebnis/composer-normalize": "^2.19",
+ "phpstan/phpstan": "^1.8.7",
+ "phpstan/phpstan-phpunit": "^1.1.1",
+ "phpstan/phpstan-strict-rules": "^1.2.3",
+ "phpunit/phpunit": "^8.5.28 || ^9.5.20",
+ "shipmonk/composer-dependency-analyser": "^1.0.0",
+ "slevomat/coding-standard": "^8.0.1"
+ },
+ "bin": [
+ "bin/detect-collisions"
+ ],
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Process\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "ShipMonk\\NameCollision\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
+ "description": "Simple tool to find ambiguous classes or any other name duplicates within your project.",
+ "keywords": [
+ "ambiguous",
+ "autoload",
+ "autoloading",
+ "classname",
+ "collision",
+ "namespace"
],
- "description": "Executes commands in sub-processes",
- "homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v5.2.4"
+ "issues": "https://github.com/shipmonk-rnd/name-collision-detector/issues",
+ "source": "https://github.com/shipmonk-rnd/name-collision-detector/tree/2.1.1"
},
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2021-01-27T10:15:41+00:00"
+ "time": "2024-03-01T13:26:32+00:00"
},
{
- "name": "theseer/tokenizer",
- "version": "1.2.0",
+ "name": "staabm/side-effects-detector",
+ "version": "1.0.5",
"source": {
"type": "git",
- "url": "https://github.com/theseer/tokenizer.git",
- "reference": "75a63c33a8577608444246075ea0af0d052e452a"
+ "url": "https://github.com/staabm/side-effects-detector.git",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
- "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163",
"shasum": ""
},
"require": {
- "ext-dom": "*",
"ext-tokenizer": "*",
- "ext-xmlwriter": "*",
- "php": "^7.2 || ^8.0"
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^1.12.6",
+ "phpunit/phpunit": "^9.6.21",
+ "symfony/var-dumper": "^5.4.43",
+ "tomasvotruba/type-coverage": "1.0.0",
+ "tomasvotruba/unused-public": "1.0.0"
},
"type": "library",
"autoload": {
"classmap": [
- "src/"
+ "lib/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
- "authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- }
+ "description": "A static analysis tool to detect side effects in PHP code",
+ "keywords": [
+ "static analysis"
],
- "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
- "issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/master"
+ "issues": "https://github.com/staabm/side-effects-detector/issues",
+ "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5"
},
"funding": [
{
- "url": "https://github.com/theseer",
+ "url": "https://github.com/staabm",
"type": "github"
}
],
- "time": "2020-07-12T23:59:07+00:00"
- },
- {
- "name": "vaimo/composer-patches",
- "version": "4.22.4",
- "source": {
- "type": "git",
- "url": "https://github.com/vaimo/composer-patches.git",
- "reference": "3da4cdf03fb4dc8d92b3d435de183f6044d679d6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/vaimo/composer-patches/zipball/3da4cdf03fb4dc8d92b3d435de183f6044d679d6",
- "reference": "3da4cdf03fb4dc8d92b3d435de183f6044d679d6",
- "shasum": ""
- },
- "require": {
- "composer-plugin-api": "^1.0 || ^2.0",
- "drupol/phposinfo": "^1.6",
- "ext-json": "*",
- "php": ">=5.3.0",
- "seld/jsonlint": "^1.7.1",
- "vaimo/topological-sort": "^1.0"
- },
- "require-dev": {
- "composer/composer": "^1.0 || ^2.0",
- "phpcompatibility/php-compatibility": ">=9.1.1",
- "phpmd/phpmd": ">=2.6.0",
- "sebastian/phpcpd": ">=1.4.3",
- "squizlabs/php_codesniffer": ">=2.9.2",
- "vaimo/composer-changelogs": "^0.17.0",
- "vaimo/composer-patches-proxy": "1.0.0"
- },
- "type": "composer-plugin",
- "extra": {
- "class": "Vaimo\\ComposerPatches\\Plugin",
- "changelog": {
- "source": "changelog.json",
- "output": {
- "md": "CHANGELOG.md"
- }
- }
- },
- "autoload": {
- "psr-4": {
- "Vaimo\\ComposerPatches\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Allan Paiste",
- "email": "allan.paiste@vaimo.com"
- }
- ],
- "description": "Applies a patch from a local or remote file to any package that is part of a given composer project. Patches can be defined both on project and on package level. Optional support for patch versioning, sequencing, custom patch applier configuration and patch command for testing/troubleshooting added patches.",
- "keywords": [
- "Fixes",
- "back-ports",
- "backports",
- "bulk patches",
- "bundled patches",
- "composer command",
- "composer plugin",
- "configurable patch applier",
- "development patches",
- "downloaded patches",
- "environment flags",
- "hot-fixes",
- "hotfixes",
- "indirect restrictions",
- "maintenance",
- "maintenance tools",
- "multi-version patches",
- "multiple formats",
- "os-specific config",
- "package bug-fix",
- "package patches",
- "patch branching",
- "patch command",
- "patch description",
- "patch exclusion",
- "patch header",
- "patch meta-data",
- "patch resolve",
- "patch search",
- "patch skipping",
- "patcher",
- "patching",
- "plugin",
- "remote patch files",
- "resolve patches",
- "skipped packages",
- "tools",
- "utilities",
- "utility",
- "utils",
- "version restriction"
- ],
- "support": {
- "docs": "https://github.com/vaimo/composer-patches",
- "issues": "https://github.com/vaimo/composer-patches/issues",
- "source": "https://github.com/vaimo/composer-patches"
- },
- "time": "2021-02-25T11:24:50+00:00"
+ "time": "2024-10-20T05:08:20+00:00"
},
{
- "name": "vaimo/topological-sort",
- "version": "1.0.0",
+ "name": "theseer/tokenizer",
+ "version": "1.2.3",
"source": {
"type": "git",
- "url": "https://github.com/vaimo/topological-sort.git",
- "reference": "e19b93df2bac0e995ecd4b982ec4ea2fb1131e64"
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vaimo/topological-sort/zipball/e19b93df2bac0e995ecd4b982ec4ea2fb1131e64",
- "reference": "e19b93df2bac0e995ecd4b982ec4ea2fb1131e64",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
"shasum": ""
},
"require": {
- "php": ">=5.3"
- },
- "require-dev": {
- "codeclimate/php-test-reporter": "dev-master",
- "phpcompatibility/php-compatibility": "^9.1.1",
- "phpmd/phpmd": "^2.6.0",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "^2.9.2",
- "symfony/console": "~2.5 || ~3.0 || ~4.0"
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
- "psr-4": {
- "Vaimo\\TopSort\\": "src/",
- "Vaimo\\TopSort\\Tests\\": "tests/Tests/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Marc J. Schmidt",
- "email": "marc@marcjschmidt.de"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
}
],
- "description": "High-Performance TopSort/Dependency resolving algorithm (compatibility version to work with 5.3)",
- "keywords": [
- "dependency resolving",
- "topological sort",
- "topsort"
- ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
- "source": "https://github.com/vaimo/topological-sort/tree/1.0.0"
- },
- "time": "2019-04-13T14:15:06+00:00"
- },
- {
- "name": "webmozart/assert",
- "version": "1.10.0",
- "source": {
- "type": "git",
- "url": "https://github.com/webmozarts/assert.git",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
- },
- "conflict": {
- "phpstan/phpstan": "<0.12.20",
- "vimeo/psalm": "<4.6.1 || 4.6.2"
- },
- "require-dev": {
- "phpunit/phpunit": "^8.5.13"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.10-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Webmozart\\Assert\\": "src/"
- }
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
},
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
+ "funding": [
{
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
+ "url": "https://github.com/theseer",
+ "type": "github"
}
],
- "description": "Assertions to validate method input/output with nice error messages.",
- "keywords": [
- "assert",
- "check",
- "validate"
- ],
- "support": {
- "issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.10.0"
- },
- "time": "2021-03-09T10:59:23+00:00"
+ "time": "2024-03-03T12:36:25+00:00"
}
],
"aliases": [],
@@ -6386,11 +6522,12 @@
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": "^7.4 || ^8.0"
+ "php": "^8.2",
+ "composer-runtime-api": "^2.0"
},
- "platform-dev": [],
+ "platform-dev": {},
"platform-overrides": {
- "php": "7.4.6"
+ "php": "8.2.99"
},
- "plugin-api-version": "2.1.0"
+ "plugin-api-version": "2.6.0"
}
diff --git a/conf/bleedingEdge.neon b/conf/bleedingEdge.neon
index 0ef88e1e00..45d7f03d96 100644
--- a/conf/bleedingEdge.neon
+++ b/conf/bleedingEdge.neon
@@ -1,4 +1,15 @@
parameters:
featureToggles:
bleedingEdge: true
- skipCheckGenericClasses: []
+ checkNonStringableDynamicAccess: true
+ checkParameterCastableToNumberFunctions: true
+ skipCheckGenericClasses!: []
+ stricterFunctionMap: true
+ reportPreciseLineForUnusedFunctionParameter: true
+ checkPrintfParameterTypes: true
+ internalTag: true
+ newStaticInAbstractClassStaticMethod: true
+ checkExtensionsForComparisonOperators: true
+ reportTooWideBool: true
+ rawMessageInBaseline: true
+ reportNestedTooWideType: false
diff --git a/conf/config.level0.neon b/conf/config.level0.neon
index 64ec96e8cc..805ea348a9 100644
--- a/conf/config.level0.neon
+++ b/conf/config.level0.neon
@@ -1,218 +1,29 @@
parameters:
customRulesetUsed: false
-conditionalTags:
- PHPStan\Rules\Properties\UninitializedPropertyRule:
- phpstan.rules.rule: %checkUninitializedProperties%
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 0
-rules:
- - PHPStan\Rules\Api\ApiInstantiationRule
- - PHPStan\Rules\Api\ApiClassExtendsRule
- - PHPStan\Rules\Api\ApiClassImplementsRule
- - PHPStan\Rules\Api\ApiInterfaceExtendsRule
- - PHPStan\Rules\Api\ApiMethodCallRule
- - PHPStan\Rules\Api\ApiStaticCallRule
- - PHPStan\Rules\Api\ApiTraitUseRule
- - PHPStan\Rules\Api\PhpStanNamespaceIn3rdPartyPackageRule
- - PHPStan\Rules\Arrays\DuplicateKeysInLiteralArraysRule
- - PHPStan\Rules\Arrays\EmptyArrayItemRule
- - PHPStan\Rules\Arrays\OffsetAccessWithoutDimForReadingRule
- - PHPStan\Rules\Cast\UnsetCastRule
- - PHPStan\Rules\Classes\ClassAttributesRule
- - PHPStan\Rules\Classes\ClassConstantAttributesRule
- - PHPStan\Rules\Classes\ClassConstantRule
- - PHPStan\Rules\Classes\DuplicateDeclarationRule
- - PHPStan\Rules\Classes\ExistingClassesInClassImplementsRule
- - PHPStan\Rules\Classes\ExistingClassesInInterfaceExtendsRule
- - PHPStan\Rules\Classes\ExistingClassInTraitUseRule
- - PHPStan\Rules\Classes\InstantiationRule
- - PHPStan\Rules\Classes\InvalidPromotedPropertiesRule
- - PHPStan\Rules\Classes\NewStaticRule
- - PHPStan\Rules\Classes\NonClassAttributeClassRule
- - PHPStan\Rules\Classes\TraitAttributeClassRule
- - PHPStan\Rules\Constants\FinalConstantRule
- - PHPStan\Rules\Exceptions\ThrowExpressionRule
- - PHPStan\Rules\Functions\ArrowFunctionAttributesRule
- - PHPStan\Rules\Functions\ArrowFunctionReturnNullsafeByRefRule
- - PHPStan\Rules\Functions\CallToFunctionParametersRule
- - PHPStan\Rules\Functions\ClosureAttributesRule
- - PHPStan\Rules\Functions\ExistingClassesInArrowFunctionTypehintsRule
- - PHPStan\Rules\Functions\ExistingClassesInClosureTypehintsRule
- - PHPStan\Rules\Functions\ExistingClassesInTypehintsRule
- - PHPStan\Rules\Functions\FunctionAttributesRule
- - PHPStan\Rules\Functions\InnerFunctionRule
- - PHPStan\Rules\Functions\ParamAttributesRule
- - PHPStan\Rules\Functions\PrintfParametersRule
- - PHPStan\Rules\Functions\ReturnNullsafeByRefRule
- - PHPStan\Rules\Keywords\ContinueBreakInLoopRule
- - PHPStan\Rules\Methods\AbstractMethodInNonAbstractClassRule
- - PHPStan\Rules\Methods\ExistingClassesInTypehintsRule
- - PHPStan\Rules\Methods\MissingMethodImplementationRule
- - PHPStan\Rules\Methods\MethodAttributesRule
- - PHPStan\Rules\Operators\InvalidAssignVarRule
- - PHPStan\Rules\Properties\AccessPropertiesInAssignRule
- - PHPStan\Rules\Properties\AccessStaticPropertiesInAssignRule
- - PHPStan\Rules\Properties\PropertyAttributesRule
- - PHPStan\Rules\Properties\ReadOnlyPropertyRule
- - PHPStan\Rules\Variables\UnsetRule
- - PHPStan\Rules\Whitespace\FileWhitespaceRule
+conditionalTags:
+ PHPStan\Rules\InternalTag\RestrictedInternalClassConstantUsageExtension:
+ phpstan.restrictedClassConstantUsageExtension: %featureToggles.internalTag%
+ PHPStan\Rules\InternalTag\RestrictedInternalClassNameUsageExtension:
+ phpstan.restrictedClassNameUsageExtension: %featureToggles.internalTag%
+ PHPStan\Rules\InternalTag\RestrictedInternalFunctionUsageExtension:
+ phpstan.restrictedFunctionUsageExtension: %featureToggles.internalTag%
+ PHPStan\Rules\Classes\NewStaticInAbstractClassStaticMethodRule:
+ phpstan.rules.rule: %featureToggles.newStaticInAbstractClassStaticMethod%
services:
-
- class: PHPStan\Rules\Classes\ExistingClassInClassExtendsRule
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Classes\ExistingClassInInstanceOfRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
-
- -
- class: PHPStan\Rules\Exceptions\CaughtExceptionExistenceRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
-
- -
- class: PHPStan\Rules\Functions\CallToNonExistentFunctionRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkFunctionNameCase: %checkFunctionNameCase%
-
- -
- class: PHPStan\Rules\Methods\CallMethodsRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkFunctionNameCase: %checkFunctionNameCase%
- reportMagicMethods: %reportMagicMethods%
-
- -
- class: PHPStan\Rules\Methods\CallStaticMethodsRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkFunctionNameCase: %checkFunctionNameCase%
- reportMagicMethods: %reportMagicMethods%
-
- -
- class: PHPStan\Rules\Constants\OverridingConstantRule
- arguments:
- checkPhpDocMethodSignatures: %checkPhpDocMethodSignatures%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Methods\OverridingMethodRule
- arguments:
- checkPhpDocMethodSignatures: %checkPhpDocMethodSignatures%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Missing\MissingReturnRule
- arguments:
- checkExplicitMixedMissingReturn: %checkExplicitMixedMissingReturn%
- checkPhpDocMissingReturn: %checkPhpDocMissingReturn%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Namespaces\ExistingNamesInGroupUseRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkFunctionNameCase: %checkFunctionNameCase%
-
- -
- class: PHPStan\Rules\Namespaces\ExistingNamesInUseRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkFunctionNameCase: %checkFunctionNameCase%
-
- -
- class: PHPStan\Rules\Operators\InvalidIncDecOperationRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkThisOnly: %checkThisOnly%
-
- -
- class: PHPStan\Rules\Properties\AccessPropertiesRule
- tags:
- - phpstan.rules.rule
- arguments:
- reportMagicProperties: %reportMagicProperties%
-
- -
- class: PHPStan\Rules\Properties\AccessStaticPropertiesRule
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Properties\ExistingClassesInPropertiesRule
- tags:
- - phpstan.rules.rule
- arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
- checkThisOnly: %checkThisOnly%
-
- -
- class: PHPStan\Rules\Properties\OverridingPropertyRule
- arguments:
- checkPhpDocMethodSignatures: %checkPhpDocMethodSignatures%
- reportMaybes: %reportMaybesInPropertyPhpDocTypes%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Properties\UninitializedPropertyRule
- arguments:
- additionalConstructors: %additionalConstructors%
-
- -
- class: PHPStan\Rules\Properties\WritingToReadOnlyPropertiesRule
- arguments:
- checkThisOnly: %checkThisOnly%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Properties\ReadingWriteOnlyPropertiesRule
- arguments:
- checkThisOnly: %checkThisOnly%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Variables\CompactVariablesRule
- arguments:
- checkMaybeUndefinedVariables: %checkMaybeUndefinedVariables%
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\Classes\NewStaticInAbstractClassStaticMethodRule
-
- class: PHPStan\Rules\Variables\DefinedVariableRule
- arguments:
- cliArgumentsVariablesRegistered: %cliArgumentsVariablesRegistered%
- checkMaybeUndefinedVariables: %checkMaybeUndefinedVariables%
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\InternalTag\RestrictedInternalClassConstantUsageExtension
-
- class: PHPStan\Rules\Regexp\RegularExpressionPatternRule
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\InternalTag\RestrictedInternalClassNameUsageExtension
-
- class: PHPStan\Rules\Classes\LocalTypeAliasesRule
- arguments:
- globalTypeAliases: %typeAliases%
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\InternalTag\RestrictedInternalFunctionUsageExtension
diff --git a/conf/config.level1.neon b/conf/config.level1.neon
index 3b5f68d64a..9dc4f8bc67 100644
--- a/conf/config.level1.neon
+++ b/conf/config.level1.neon
@@ -7,10 +7,6 @@ parameters:
reportMagicMethods: true
reportMagicProperties: true
-rules:
- - PHPStan\Rules\Classes\UnusedConstructorParametersRule
- - PHPStan\Rules\Constants\ConstantRule
- - PHPStan\Rules\Functions\UnusedClosureUsesRule
- - PHPStan\Rules\Variables\EmptyRule
- - PHPStan\Rules\Variables\IssetRule
- - PHPStan\Rules\Variables\NullCoalesceRule
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 1
diff --git a/conf/config.level10.neon b/conf/config.level10.neon
new file mode 100644
index 0000000000..d5cb28adcc
--- /dev/null
+++ b/conf/config.level10.neon
@@ -0,0 +1,9 @@
+includes:
+ - config.level9.neon
+
+parameters:
+ checkImplicitMixed: true
+
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 10
diff --git a/conf/config.level2.neon b/conf/config.level2.neon
index 0a4e60096b..dd50138b54 100644
--- a/conf/config.level2.neon
+++ b/conf/config.level2.neon
@@ -6,61 +6,19 @@ parameters:
checkThisOnly: false
checkPhpDocMissingReturn: true
-rules:
- - PHPStan\Rules\Cast\EchoRule
- - PHPStan\Rules\Cast\InvalidCastRule
- - PHPStan\Rules\Cast\InvalidPartOfEncapsedStringRule
- - PHPStan\Rules\Cast\PrintRule
- - PHPStan\Rules\Classes\AccessPrivateConstantThroughStaticRule
- - PHPStan\Rules\Comparison\UsageOfVoidMatchExpressionRule
- - PHPStan\Rules\Functions\IncompatibleDefaultParameterTypeRule
- - PHPStan\Rules\Generics\ClassTemplateTypeRule
- - PHPStan\Rules\Generics\FunctionTemplateTypeRule
- - PHPStan\Rules\Generics\FunctionSignatureVarianceRule
- - PHPStan\Rules\Generics\InterfaceTemplateTypeRule
- - PHPStan\Rules\Generics\MethodTemplateTypeRule
- - PHPStan\Rules\Generics\MethodSignatureVarianceRule
- - PHPStan\Rules\Generics\TraitTemplateTypeRule
- - PHPStan\Rules\Generics\UsedTraitsRule
- - PHPStan\Rules\Methods\CallPrivateMethodThroughStaticRule
- - PHPStan\Rules\Methods\IncompatibleDefaultParameterTypeRule
- - PHPStan\Rules\Operators\InvalidBinaryOperationRule
- - PHPStan\Rules\Operators\InvalidUnaryOperationRule
- - PHPStan\Rules\Operators\InvalidComparisonOperationRule
- - PHPStan\Rules\PhpDoc\IncompatibleClassConstantPhpDocTypeRule
- - PHPStan\Rules\PhpDoc\IncompatiblePhpDocTypeRule
- - PHPStan\Rules\PhpDoc\IncompatiblePropertyPhpDocTypeRule
- - PHPStan\Rules\PhpDoc\InvalidPhpDocTagValueRule
- - PHPStan\Rules\PhpDoc\InvalidPHPStanDocTagRule
- - PHPStan\Rules\PhpDoc\InvalidThrowsPhpDocValueRule
- - PHPStan\Rules\PhpDoc\WrongVariableNameInVarTagRule
- - PHPStan\Rules\Properties\AccessPrivatePropertyThroughStaticRule
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 2
+
+conditionalTags:
+ PHPStan\Rules\InternalTag\RestrictedInternalPropertyUsageExtension:
+ phpstan.restrictedPropertyUsageExtension: %featureToggles.internalTag%
+ PHPStan\Rules\InternalTag\RestrictedInternalMethodUsageExtension:
+ phpstan.restrictedMethodUsageExtension: %featureToggles.internalTag%
services:
-
- class: PHPStan\Rules\Classes\MixinRule
- arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
- tags:
- - phpstan.rules.rule
- -
- class: PHPStan\Rules\Functions\CallCallablesRule
- arguments:
- reportMaybes: %reportMaybes%
- tags:
- - phpstan.rules.rule
- -
- class: PHPStan\Rules\Generics\ClassAncestorsRule
- tags:
- - phpstan.rules.rule
- -
- class: PHPStan\Rules\Generics\InterfaceAncestorsRule
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\InternalTag\RestrictedInternalPropertyUsageExtension
+
-
- class: PHPStan\Rules\PhpDoc\InvalidPhpDocVarTagTypeRule
- arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
- checkMissingVarTagTypehint: %checkMissingVarTagTypehint%
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\InternalTag\RestrictedInternalMethodUsageExtension
diff --git a/conf/config.level3.neon b/conf/config.level3.neon
index 4f6affaa1f..b040bf3aeb 100644
--- a/conf/config.level3.neon
+++ b/conf/config.level3.neon
@@ -1,88 +1,9 @@
includes:
- config.level2.neon
-rules:
- - PHPStan\Rules\Arrays\AppendedArrayItemTypeRule
- - PHPStan\Rules\Arrays\ArrayDestructuringRule
- - PHPStan\Rules\Arrays\IterableInForeachRule
- - PHPStan\Rules\Arrays\OffsetAccessAssignmentRule
- - PHPStan\Rules\Arrays\OffsetAccessAssignOpRule
- - PHPStan\Rules\Arrays\OffsetAccessValueAssignmentRule
- - PHPStan\Rules\Arrays\UnpackIterableInArrayRule
- - PHPStan\Rules\Functions\ArrowFunctionReturnTypeRule
- - PHPStan\Rules\Functions\ClosureReturnTypeRule
- - PHPStan\Rules\Generators\YieldTypeRule
- - PHPStan\Rules\Methods\ReturnTypeRule
- - PHPStan\Rules\Properties\DefaultValueTypesAssignedToPropertiesRule
- - PHPStan\Rules\Properties\TypesAssignedToPropertiesRule
- - PHPStan\Rules\Variables\ThrowTypeRule
- - PHPStan\Rules\Variables\VariableCloningRule
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 3
parameters:
checkPhpDocMethodSignatures: true
-
-services:
- -
- class: PHPStan\Rules\Arrays\AppendedArrayKeyTypeRule
- arguments:
- checkUnionTypes: %checkUnionTypes%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Arrays\InvalidKeyInArrayDimFetchRule
- arguments:
- reportMaybes: %reportMaybes%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Arrays\InvalidKeyInArrayItemRule
- arguments:
- reportMaybes: %reportMaybes%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Arrays\NonexistentOffsetInArrayDimFetchRule
- arguments:
- reportMaybes: %reportMaybes%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Exceptions\ThrowsVoidFunctionWithExplicitThrowPointRule
- arguments:
- exceptionTypeResolver: @exceptionTypeResolver
- missingCheckedExceptionInThrows: %exceptions.check.missingCheckedExceptionInThrows%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Exceptions\ThrowsVoidMethodWithExplicitThrowPointRule
- arguments:
- exceptionTypeResolver: @exceptionTypeResolver
- missingCheckedExceptionInThrows: %exceptions.check.missingCheckedExceptionInThrows%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Functions\ReturnTypeRule
- arguments:
- functionReflector: @betterReflectionFunctionReflector
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Generators\YieldFromTypeRule
- arguments:
- reportMaybes: %reportMaybes%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Generators\YieldInGeneratorRule
- arguments:
- reportMaybes: %reportMaybes%
- tags:
- - phpstan.rules.rule
diff --git a/conf/config.level4.neon b/conf/config.level4.neon
index 61f32bd2f7..cffef56a11 100644
--- a/conf/config.level4.neon
+++ b/conf/config.level4.neon
@@ -1,164 +1,27 @@
includes:
- config.level3.neon
-rules:
- - PHPStan\Rules\Arrays\DeadForeachRule
- - PHPStan\Rules\Comparison\NumberComparisonOperatorsConstantConditionRule
- - PHPStan\Rules\DeadCode\NoopRule
- - PHPStan\Rules\DeadCode\UnreachableStatementRule
- - PHPStan\Rules\DeadCode\UnusedPrivateConstantRule
- - PHPStan\Rules\DeadCode\UnusedPrivateMethodRule
- - PHPStan\Rules\Exceptions\CatchWithUnthrownExceptionRule
- - PHPStan\Rules\Exceptions\OverwrittenExitPointByFinallyRule
- - PHPStan\Rules\Functions\CallToFunctionStatementWithoutSideEffectsRule
- - PHPStan\Rules\Methods\CallToConstructorStatementWithoutSideEffectsRule
- - PHPStan\Rules\Methods\CallToMethodStatementWithoutSideEffectsRule
- - PHPStan\Rules\Methods\CallToStaticMethodStatementWithoutSideEffectsRule
- - PHPStan\Rules\Methods\NullsafeMethodCallRule
- - PHPStan\Rules\Properties\NullsafePropertyFetchRule
- - PHPStan\Rules\TooWideTypehints\TooWideArrowFunctionReturnTypehintRule
- - PHPStan\Rules\TooWideTypehints\TooWideClosureReturnTypehintRule
- - PHPStan\Rules\TooWideTypehints\TooWideFunctionReturnTypehintRule
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] and #[RegisteredCollector] attributes
+ level: 4
+
+conditionalTags:
+ PHPStan\Rules\Exceptions\TooWideFunctionThrowTypeRule:
+ phpstan.rules.rule: %exceptions.check.tooWideThrowType%
+ PHPStan\Rules\Exceptions\TooWideMethodThrowTypeRule:
+ phpstan.rules.rule: %exceptions.check.tooWideThrowType%
+ PHPStan\Rules\Exceptions\TooWidePropertyHookThrowTypeRule:
+ phpstan.rules.rule: %exceptions.check.tooWideThrowType%
parameters:
checkAdvancedIsset: true
services:
-
- class: PHPStan\Rules\Classes\ImpossibleInstanceOfRule
- arguments:
- checkAlwaysTrueInstanceof: %checkAlwaysTrueInstanceof%
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\Exceptions\TooWideFunctionThrowTypeRule
-
- class: PHPStan\Rules\Comparison\BooleanAndConstantConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\Exceptions\TooWideMethodThrowTypeRule
-
- class: PHPStan\Rules\Comparison\BooleanOrConstantConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\BooleanNotConstantConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\DeadCode\UnusedPrivatePropertyRule
- arguments:
- alwaysWrittenTags: %propertyAlwaysWrittenTags%
- alwaysReadTags: %propertyAlwaysReadTags%
- checkUninitializedProperties: %checkUninitializedProperties%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\DoWhileLoopConstantConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\ElseIfConstantConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\IfConstantConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\ImpossibleCheckTypeFunctionCallRule
- arguments:
- checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\ImpossibleCheckTypeMethodCallRule
- arguments:
- checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\ImpossibleCheckTypeStaticMethodCallRule
- arguments:
- checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\MatchExpressionRule
- arguments:
- checkAlwaysTrueStrictComparison: %checkAlwaysTrueStrictComparison%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\StrictComparisonOfDifferentTypesRule
- arguments:
- checkAlwaysTrueStrictComparison: %checkAlwaysTrueStrictComparison%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\TernaryOperatorConstantConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\UnreachableIfBranchesRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\UnreachableTernaryElseBranchRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\WhileLoopAlwaysFalseConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\Comparison\WhileLoopAlwaysTrueConditionRule
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- tags:
- - phpstan.rules.rule
-
- -
- class: PHPStan\Rules\TooWideTypehints\TooWideMethodReturnTypehintRule
- arguments:
- checkProtectedAndPublicMethods: %checkTooWideReturnTypesInProtectedAndPublicMethods%
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\Exceptions\TooWidePropertyHookThrowTypeRule
diff --git a/conf/config.level5.neon b/conf/config.level5.neon
index c890be88ec..b4518ba7e2 100644
--- a/conf/config.level5.neon
+++ b/conf/config.level5.neon
@@ -5,14 +5,20 @@ parameters:
checkFunctionArgumentTypes: true
checkArgumentsPassedByReference: true
-rules:
- - PHPStan\Rules\DateTimeInstantiationRule
- - PHPStan\Rules\Functions\ImplodeFunctionRule
+conditionalTags:
+ PHPStan\Rules\Functions\ParameterCastableToNumberRule:
+ phpstan.rules.rule: %featureToggles.checkParameterCastableToNumberFunctions%
+ PHPStan\Rules\Functions\PrintfParameterTypeRule:
+ phpstan.rules.rule: %featureToggles.checkPrintfParameterTypes%
+
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 5
services:
-
- class: PHPStan\Rules\Functions\RandomIntParametersRule
+ class: PHPStan\Rules\Functions\ParameterCastableToNumberRule
+ -
+ class: PHPStan\Rules\Functions\PrintfParameterTypeRule
arguments:
- reportMaybes: %reportMaybes%
- tags:
- - phpstan.rules.rule
+ checkStrictPrintfPlaceholderTypes: %checkStrictPrintfPlaceholderTypes%
diff --git a/conf/config.level6.neon b/conf/config.level6.neon
index 05f3616832..9da68b2d78 100644
--- a/conf/config.level6.neon
+++ b/conf/config.level6.neon
@@ -2,15 +2,9 @@ includes:
- config.level5.neon
parameters:
- checkGenericClassInNonGenericObjectType: true
- checkMissingIterableValueType: true
checkMissingVarTagTypehint: true
checkMissingTypehints: true
-rules:
- - PHPStan\Rules\Constants\MissingClassConstantTypehintRule
- - PHPStan\Rules\Functions\MissingFunctionParameterTypehintRule
- - PHPStan\Rules\Functions\MissingFunctionReturnTypehintRule
- - PHPStan\Rules\Methods\MissingMethodParameterTypehintRule
- - PHPStan\Rules\Methods\MissingMethodReturnTypehintRule
- - PHPStan\Rules\Properties\MissingPropertyTypehintRule
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 6
diff --git a/conf/config.level7.neon b/conf/config.level7.neon
index af8dbbe8d7..9ed0bc548f 100644
--- a/conf/config.level7.neon
+++ b/conf/config.level7.neon
@@ -4,3 +4,7 @@ includes:
parameters:
checkUnionTypes: true
reportMaybes: true
+
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 7
diff --git a/conf/config.level8.neon b/conf/config.level8.neon
index fd1dbcd17c..991a4bf129 100644
--- a/conf/config.level8.neon
+++ b/conf/config.level8.neon
@@ -3,3 +3,7 @@ includes:
parameters:
checkNullables: true
+
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 8
diff --git a/conf/config.level9.neon b/conf/config.level9.neon
index efb3e30ffa..9c31364230 100644
--- a/conf/config.level9.neon
+++ b/conf/config.level9.neon
@@ -3,3 +3,7 @@ includes:
parameters:
checkExplicitMixed: true
+
+autowiredAttributeServices:
+ # registers rules with #[RegisteredRule] attribute
+ level: 9
diff --git a/conf/config.levelmax.neon b/conf/config.levelmax.neon
index da48578fe3..ce4c43f2f7 100644
--- a/conf/config.levelmax.neon
+++ b/conf/config.levelmax.neon
@@ -1,2 +1,2 @@
includes:
- - config.level9.neon
+ - config.level10.neon
diff --git a/conf/config.neon b/conf/config.neon
index f74919aafc..6f4076a3dd 100644
--- a/conf/config.neon
+++ b/conf/config.neon
@@ -1,40 +1,52 @@
includes:
- - config.stubFiles.neon
+ - parametersSchema.neon
+ - services.neon
+ - parsers.neon
+
parameters:
bootstrapFiles:
- ../stubs/runtime/ReflectionUnionType.php
- ../stubs/runtime/ReflectionAttribute.php
- - ../stubs/runtime/Attribute.php
- excludes_analyse: []
- excludePaths: null
+ - ../stubs/runtime/Attribute85.php
+ - ../stubs/runtime/ReflectionIntersectionType.php
+ excludePaths: []
level: null
paths: []
exceptions:
implicitThrows: true
+ reportUncheckedExceptionDeadCatch: true
uncheckedExceptionRegexes: []
uncheckedExceptionClasses: []
checkedExceptionRegexes: []
checkedExceptionClasses: []
check:
missingCheckedExceptionInThrows: false
- tooWideThrowType: false
+ tooWideThrowType: true
featureToggles:
bleedingEdge: false
- disableRuntimeReflectionProvider: false
- skipCheckGenericClasses: []
+ checkNonStringableDynamicAccess: false
+ checkParameterCastableToNumberFunctions: false
+ skipCheckGenericClasses:
+ - DOMNamedNodeMap
+ stricterFunctionMap: false
+ reportPreciseLineForUnusedFunctionParameter: false
+ checkPrintfParameterTypes: false
+ internalTag: false
+ newStaticInAbstractClassStaticMethod: false
+ checkExtensionsForComparisonOperators: false
+ reportTooWideBool: false
+ rawMessageInBaseline: false
+ reportNestedTooWideType: false
fileExtensions:
- php
checkAdvancedIsset: false
- checkAlwaysTrueCheckTypeFunctionCall: false
- checkAlwaysTrueInstanceof: false
- checkAlwaysTrueStrictComparison: false
+ reportAlwaysTrueInLastCondition: false
checkClassCaseSensitivity: false
checkExplicitMixed: false
+ checkImplicitMixed: false
checkFunctionArgumentTypes: false
checkFunctionNameCase: false
- checkGenericClassInNonGenericObjectType: false
checkInternalClassCaseSensitivity: false
- checkMissingIterableValueType: false
checkMissingCallableSignature: false
checkMissingVarTagTypehint: false
checkArgumentsPassedByReference: false
@@ -42,18 +54,29 @@ parameters:
checkNullables: false
checkThisOnly: true
checkUnionTypes: false
+ checkBenevolentUnionTypes: false
checkExplicitMixedMissingReturn: false
checkPhpDocMissingReturn: false
checkPhpDocMethodSignatures: false
checkExtraArguments: false
checkMissingTypehints: false
+ checkTooWideParameterOutInProtectedAndPublicMethods: false
checkTooWideReturnTypesInProtectedAndPublicMethods: false
checkUninitializedProperties: false
+ checkDynamicProperties: false
+ strictRulesInstalled: false
+ deprecationRulesInstalled: false
inferPrivatePropertyTypeFromConstructor: false
+ checkStrictPrintfPlaceholderTypes: false
reportMaybes: false
reportMaybesInMethodSignatures: false
reportMaybesInPropertyPhpDocTypes: false
reportStaticMethodSignatures: false
+ reportWrongPhpDocTypeInVarTag: false
+ reportAnyTypeWideningInVarTag: false
+ reportPossiblyNonexistentGeneralArrayOffset: false
+ reportPossiblyNonexistentConstantArrayOffset: false
+ checkMissingOverrideMethodAttribute: false
mixinExcludeClasses: []
scanFiles: []
scanDirectories: []
@@ -66,37 +89,70 @@ parameters:
phpVersion: null
polluteScopeWithLoopInitialAssignments: true
polluteScopeWithAlwaysIterableForeach: true
+ polluteScopeWithBlock: true
propertyAlwaysWrittenTags: []
propertyAlwaysReadTags: []
additionalConstructors: []
treatPhpDocTypesAsCertain: true
+ usePathConstantsAsConstantString: false
+ rememberPossiblyImpureFunctionValues: true
+ tips:
+ discoveringSymbols: true
+ treatPhpDocTypesAsCertain: true
tipsOfTheDay: true
reportMagicMethods: false
reportMagicProperties: false
ignoreErrors: []
internalErrorsCountLimit: 50
cache:
- nodesByFileCountMax: 1024
- nodesByStringCountMax: 1024
+ nodesByStringCountMax: 256
reportUnmatchedIgnoredErrors: true
- scopeClass: PHPStan\Analyser\MutatingScope
typeAliases: []
universalObjectCratesClasses:
- stdClass
+ stubFiles:
+ - ../stubs/ReflectionAttribute.stub
+ - ../stubs/ReflectionClassConstant.stub
+ - ../stubs/ReflectionFunctionAbstract.stub
+ - ../stubs/ReflectionMethod.stub
+ - ../stubs/ReflectionParameter.stub
+ - ../stubs/ReflectionProperty.stub
+ - ../stubs/iterable.stub
+ - ../stubs/ArrayObject.stub
+ - ../stubs/WeakReference.stub
+ - ../stubs/ext-ds.stub
+ - ../stubs/ImagickPixel.stub
+ - ../stubs/PDOStatement.stub
+ - ../stubs/date.stub
+ - ../stubs/ibm_db2.stub
+ - ../stubs/mysqli.stub
+ - ../stubs/zip.stub
+ - ../stubs/dom.stub
+ - ../stubs/spl.stub
+ - ../stubs/SplObjectStorage.stub
+ - ../stubs/Exception.stub
+ - ../stubs/arrayFunctions.stub
+ - ../stubs/core.stub
+ - ../stubs/typeCheckingFunctions.stub
+ - ../stubs/Countable.stub
+ - ../stubs/file.stub
+ - ../stubs/stream_socket_client.stub
+ - ../stubs/stream_socket_server.stub
earlyTerminatingMethodCalls: []
earlyTerminatingFunctionCalls: []
- memoryLimitFile: %tmpDir%/.memory_limit
- tempResultCachePath: %tmpDir%/resultCaches
resultCachePath: %tmpDir%/resultCache.php
+ resultCacheSkipIfOlderThanDays: 7
resultCacheChecksProjectExtensionFilesDependencies: false
- staticReflectionClassNamePatterns:
- - '#^PhpParser\\#'
- - '#^PHPStan\\#'
- - '#^Hoa\\#'
dynamicConstantNames:
- ICONV_IMPL
- LIBXML_VERSION
- LIBXML_DOTTED_VERSION
+ - Memcached::HAVE_ENCODING
+ - Memcached::HAVE_IGBINARY
+ - Memcached::HAVE_JSON
+ - Memcached::HAVE_MSGPACK
+ - Memcached::HAVE_SASL
+ - Memcached::HAVE_SESSION
- PHP_VERSION
- PHP_MAJOR_VERSION
- PHP_MINOR_VERSION
@@ -139,592 +195,56 @@ parameters:
- OPENSSL_VERSION_NUMBER
- ZEND_DEBUG_BUILD
- ZEND_THREAD_SAFE
+ - E_ALL # different on PHP 8.4
+ customRulesetUsed: null
editorUrl: null
+ editorUrlTitle: null
+ errorFormat: null
+ sysGetTempDir: ::sys_get_temp_dir()
+ sourceLocatorPlaygroundMode: false
+ pro:
+ dnsServers:
+ - '1.1.1.2'
+ tmpDir: %sysGetTempDir%/phpstan-fixer
+ __validate: true
+ parametersNotInvalidatingCache:
+ - [parameters, editorUrl]
+ - [parameters, editorUrlTitle]
+ - [parameters, errorFormat]
+ - [parameters, ignoreErrors]
+ - [parameters, reportUnmatchedIgnoredErrors]
+ - [parameters, tipsOfTheDay]
+ - [parameters, parallel]
+ - [parameters, internalErrorsCountLimit]
+ - [parameters, cache]
+ - [parameters, memoryLimitFile]
+ - [parameters, pro]
+ - parametersSchema
extensions:
rules: PHPStan\DependencyInjection\RulesExtension
+ expandRelativePaths: PHPStan\DependencyInjection\ExpandRelativePathExtension
conditionalTags: PHPStan\DependencyInjection\ConditionalTagsExtension
parametersSchema: PHPStan\DependencyInjection\ParametersSchemaExtension
+ validateIgnoredErrors: PHPStan\DependencyInjection\ValidateIgnoredErrorsExtension
+ validateExcludePaths: PHPStan\DependencyInjection\ValidateExcludePathsExtension
+ autowiredAttributeServices: PHPStan\DependencyInjection\AutowiredAttributeServicesExtension
+ validateServiceTags: PHPStan\DependencyInjection\ValidateServiceTagsExtension
-parametersSchema:
- bootstrapFiles: listOf(string())
- excludes_analyse: listOf(string())
- excludePaths: schema(anyOf(
- structure([
- analyse: listOf(string()),
- ]),
- structure([
- analyseAndScan: listOf(string()),
- ])
- structure([
- analyse: listOf(string()),
- analyseAndScan: listOf(string())
- ])
- ), nullable())
- level: schema(anyOf(int(), string()), nullable())
- paths: listOf(string())
- exceptions: structure([
- implicitThrows: bool(),
- uncheckedExceptionRegexes: listOf(string()),
- uncheckedExceptionClasses: listOf(string()),
- checkedExceptionRegexes: listOf(string()),
- checkedExceptionClasses: listOf(string()),
- check: structure([
- missingCheckedExceptionInThrows: bool(),
- tooWideThrowType: bool()
- ])
- ])
- featureToggles: structure([
- bleedingEdge: bool(),
- disableRuntimeReflectionProvider: bool(),
- skipCheckGenericClasses: listOf(string()),
- ])
- fileExtensions: listOf(string())
- checkAdvancedIsset: bool()
- checkAlwaysTrueCheckTypeFunctionCall: bool()
- checkAlwaysTrueInstanceof: bool()
- checkAlwaysTrueStrictComparison: bool()
- checkClassCaseSensitivity: bool()
- checkExplicitMixed: bool()
- checkFunctionArgumentTypes: bool()
- checkFunctionNameCase: bool()
- checkGenericClassInNonGenericObjectType: bool()
- checkInternalClassCaseSensitivity: bool()
- checkMissingIterableValueType: bool()
- checkMissingCallableSignature: bool()
- checkMissingVarTagTypehint: bool()
- checkArgumentsPassedByReference: bool()
- checkMaybeUndefinedVariables: bool()
- checkNullables: bool()
- checkThisOnly: bool()
- checkUnionTypes: bool()
- checkExplicitMixedMissingReturn: bool()
- checkPhpDocMissingReturn: bool()
- checkPhpDocMethodSignatures: bool()
- checkExtraArguments: bool()
- checkMissingTypehints: bool()
- checkTooWideReturnTypesInProtectedAndPublicMethods: bool()
- checkUninitializedProperties: bool()
- inferPrivatePropertyTypeFromConstructor: bool()
-
- tipsOfTheDay: bool()
- reportMaybes: bool()
- reportMaybesInMethodSignatures: bool()
- reportMaybesInPropertyPhpDocTypes: bool()
- reportStaticMethodSignatures: bool()
- parallel: structure([
- jobSize: int(),
- processTimeout: float(),
- maximumNumberOfProcesses: int(),
- minimumNumberOfJobsPerProcess: int(),
- buffer: int()
- ])
- phpVersion: schema(anyOf(schema(int(), min(70100), max(80099))), nullable())
- polluteScopeWithLoopInitialAssignments: bool()
- polluteScopeWithAlwaysIterableForeach: bool()
- propertyAlwaysWrittenTags: listOf(string())
- propertyAlwaysReadTags: listOf(string())
- additionalConstructors: listOf(string())
- treatPhpDocTypesAsCertain: bool()
- reportMagicMethods: bool()
- reportMagicProperties: bool()
- ignoreErrors: listOf(
- anyOf(
- string(),
- structure([
- message: string()
- path: string()
- ]),
- structure([
- message: string()
- count: int()
- path: string()
- ]),
- structure([
- message: string()
- paths: listOf(string())
- ])
- )
- )
- internalErrorsCountLimit: int()
- cache: structure([
- nodesByFileCountMax: int()
- nodesByStringCountMax: int()
- ])
- reportUnmatchedIgnoredErrors: bool()
- scopeClass: string()
- typeAliases: arrayOf(string())
- universalObjectCratesClasses: listOf(string())
- stubFiles: listOf(string())
- earlyTerminatingMethodCalls: arrayOf(listOf(string()))
- earlyTerminatingFunctionCalls: listOf(string())
- memoryLimitFile: string()
- tempResultCachePath: string()
- resultCachePath: string()
- resultCacheChecksProjectExtensionFilesDependencies: bool()
- staticReflectionClassNamePatterns: listOf(string())
- dynamicConstantNames: listOf(string())
- customRulesetUsed: bool()
- rootDir: string()
- tmpDir: string()
- currentWorkingDirectory: string()
- cliArgumentsVariablesRegistered: bool()
- mixinExcludeClasses: listOf(string())
- scanFiles: listOf(string())
- scanDirectories: listOf(string())
- fixerTmpDir: string()
- editorUrl: schema(string(), nullable())
-
- # irrelevant Nette parameters
- debugMode: bool()
- productionMode: bool()
- tempDir: string()
-
- # internal parameters only for DerivativeContainerFactory
- additionalConfigFiles: listOf(string())
- generateBaselineFile: schema(string(), nullable())
- analysedPaths: listOf(string())
- composerAutoloaderProjectPaths: listOf(string())
- analysedPathsFromConfig: listOf(string())
- usedLevel: string()
- cliAutoloadFile: schema(string(), nullable())
-
- # internal - static reflection
- singleReflectionFile: schema(string(), nullable())
- singleReflectionInsteadOfFile: schema(string(), nullable())
-
-rules:
- - PHPStan\Rules\Debug\DumpTypeRule
- - PHPStan\Rules\Debug\FileAssertRule
+autowiredAttributeServices:
+ level: null
conditionalTags:
PHPStan\Rules\Exceptions\MissingCheckedExceptionInFunctionThrowsRule:
phpstan.rules.rule: %exceptions.check.missingCheckedExceptionInThrows%
PHPStan\Rules\Exceptions\MissingCheckedExceptionInMethodThrowsRule:
phpstan.rules.rule: %exceptions.check.missingCheckedExceptionInThrows%
- PHPStan\Rules\Exceptions\TooWideFunctionThrowTypeRule:
- phpstan.rules.rule: %exceptions.check.tooWideThrowType%
- PHPStan\Rules\Exceptions\TooWideMethodThrowTypeRule:
- phpstan.rules.rule: %exceptions.check.tooWideThrowType%
+ PHPStan\Rules\Exceptions\MissingCheckedExceptionInPropertyHookThrowsRule:
+ phpstan.rules.rule: %exceptions.check.missingCheckedExceptionInThrows%
+ PHPStan\Rules\Properties\UninitializedPropertyRule:
+ phpstan.rules.rule: %checkUninitializedProperties%
services:
- -
- class: PhpParser\BuilderFactory
-
- -
- class: PHPStan\Parser\LexerFactory
-
- -
- class: PhpParser\NodeVisitor\NameResolver
-
- -
- class: PhpParser\NodeVisitor\NodeConnectingVisitor
-
- -
- class: PhpParser\PrettyPrinter\Standard
-
- -
- class: PHPStan\Broker\AnonymousClassNameHelper
- arguments:
- relativePathHelper: @simpleRelativePathHelper
-
- -
- class: PHPStan\Php\PhpVersion
- factory: @PHPStan\Php\PhpVersionFactory::create
-
- -
- class: PHPStan\Php\PhpVersionFactory
- factory: @PHPStan\Php\PhpVersionFactoryFactory::create
-
- -
- class: PHPStan\Php\PhpVersionFactoryFactory
- arguments:
- versionId: %phpVersion%
- composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
-
- -
- class: PHPStan\PhpDocParser\Lexer\Lexer
-
- -
- class: PHPStan\PhpDocParser\Parser\TypeParser
-
- -
- class: PHPStan\PhpDocParser\Parser\ConstExprParser
-
- -
- class: PHPStan\PhpDocParser\Parser\PhpDocParser
-
- -
- class: PHPStan\PhpDoc\PhpDocInheritanceResolver
-
- -
- class: PHPStan\PhpDoc\PhpDocNodeResolver
-
- -
- class: PHPStan\PhpDoc\PhpDocStringResolver
-
- -
- class: PHPStan\PhpDoc\ConstExprNodeResolver
-
- -
- class: PHPStan\PhpDoc\TypeNodeResolver
-
- -
- class: PHPStan\PhpDoc\TypeNodeResolverExtensionRegistryProvider
- factory: PHPStan\PhpDoc\LazyTypeNodeResolverExtensionRegistryProvider
-
- -
- class: PHPStan\PhpDoc\TypeStringResolver
-
- -
- class: PHPStan\PhpDoc\StubValidator
-
- -
- class: PHPStan\Analyser\Analyser
- arguments:
- internalErrorsCountLimit: %internalErrorsCountLimit%
-
- -
- class: PHPStan\Analyser\FileAnalyser
- arguments:
- reportUnmatchedIgnoredErrors: %reportUnmatchedIgnoredErrors%
-
- -
- class: PHPStan\Analyser\IgnoredErrorHelper
- arguments:
- ignoreErrors: %ignoreErrors%
- reportUnmatchedIgnoredErrors: %reportUnmatchedIgnoredErrors%
-
- -
- class: PHPStan\Analyser\LazyScopeFactory
- arguments:
- scopeClass: %scopeClass%
- autowired:
- - PHPStan\Analyser\ScopeFactory
-
- -
- class: PHPStan\Analyser\NodeScopeResolver
- arguments:
- classReflector: @nodeScopeResolverClassReflector
- polluteScopeWithLoopInitialAssignments: %polluteScopeWithLoopInitialAssignments%
- polluteScopeWithAlwaysIterableForeach: %polluteScopeWithAlwaysIterableForeach%
- earlyTerminatingMethodCalls: %earlyTerminatingMethodCalls%
- earlyTerminatingFunctionCalls: %earlyTerminatingFunctionCalls%
- implicitThrows: %exceptions.implicitThrows%
-
- -
- implement: PHPStan\Analyser\ResultCache\ResultCacheManagerFactory
- arguments:
- scanFileFinder: @fileFinderScan
- cacheFilePath: %resultCachePath%
- tempResultCachePath: %tempResultCachePath%
- analysedPaths: %analysedPaths%
- composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
- stubFiles: %stubFiles%
- usedLevel: %usedLevel%
- cliAutoloadFile: %cliAutoloadFile%
- bootstrapFiles: %bootstrapFiles%
- scanFiles: %scanFiles%
- scanDirectories: %scanDirectories%
- checkDependenciesOfProjectExtensionFiles: %resultCacheChecksProjectExtensionFilesDependencies%
-
- -
- class: PHPStan\Analyser\ResultCache\ResultCacheClearer
- arguments:
- cacheFilePath: %resultCachePath%
- tempResultCachePath: %tempResultCachePath%
-
- -
- class: PHPStan\Cache\Cache
- arguments:
- storage: @cacheStorage
-
- -
- class: PHPStan\Command\AnalyseApplication
- arguments:
- memoryLimitFile: %memoryLimitFile%
- internalErrorsCountLimit: %internalErrorsCountLimit%
-
- -
- class: PHPStan\Command\AnalyserRunner
-
- -
- class: PHPStan\Command\FixerApplication
- arguments:
- analysedPaths: %analysedPaths%
- currentWorkingDirectory: %currentWorkingDirectory%
- fixerTmpDir: %fixerTmpDir%
- maximumNumberOfProcesses: %parallel.maximumNumberOfProcesses%
-
- -
- class: PHPStan\Command\IgnoredRegexValidator
- arguments:
- parser: @regexParser
-
- -
- class: PHPStan\Dependency\DependencyResolver
-
- -
- class: PHPStan\Dependency\ExportedNodeFetcher
-
- -
- class: PHPStan\Dependency\ExportedNodeResolver
-
- -
- class: PHPStan\Dependency\ExportedNodeVisitor
-
- -
- class: PHPStan\DependencyInjection\Container
- factory: PHPStan\DependencyInjection\MemoizingContainer
- arguments:
- originalContainer: @PHPStan\DependencyInjection\Nette\NetteContainer
-
- -
- class: PHPStan\DependencyInjection\Nette\NetteContainer
- autowired:
- - PHPStan\DependencyInjection\Nette\NetteContainer
-
- -
- class: PHPStan\DependencyInjection\DerivativeContainerFactory
- arguments:
- currentWorkingDirectory: %currentWorkingDirectory%
- tempDirectory: %tempDir%
- additionalConfigFiles: %additionalConfigFiles%
- analysedPaths: %analysedPaths%
- composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
- analysedPathsFromConfig: %analysedPathsFromConfig%
- usedLevel: %usedLevel%
- generateBaselineFile: %generateBaselineFile%
-
- -
- class: PHPStan\DependencyInjection\Reflection\ClassReflectionExtensionRegistryProvider
- factory: PHPStan\DependencyInjection\Reflection\LazyClassReflectionExtensionRegistryProvider
-
- -
- class: PHPStan\DependencyInjection\Type\DynamicReturnTypeExtensionRegistryProvider
- factory: PHPStan\DependencyInjection\Type\LazyDynamicReturnTypeExtensionRegistryProvider
-
- -
- class: PHPStan\DependencyInjection\Type\OperatorTypeSpecifyingExtensionRegistryProvider
- factory: PHPStan\DependencyInjection\Type\LazyOperatorTypeSpecifyingExtensionRegistryProvider
-
- -
- class: PHPStan\DependencyInjection\Type\DynamicThrowTypeExtensionProvider
- factory: PHPStan\DependencyInjection\Type\LazyDynamicThrowTypeExtensionProvider
-
- -
- class: PHPStan\File\FileHelper
- arguments:
- workingDirectory: %currentWorkingDirectory%
-
- -
- class: PHPStan\File\FileExcluderFactory
- arguments:
- obsoleteExcludesAnalyse: %excludes_analyse%
- excludePaths: %excludePaths%
-
- -
- implement: PHPStan\File\FileExcluderRawFactory
- arguments:
- stubFiles: %stubFiles%
-
- fileExcluderAnalyse:
- class: PHPStan\File\FileExcluder
- factory: @PHPStan\File\FileExcluderFactory::createAnalyseFileExcluder()
- autowired: false
-
- fileExcluderScan:
- class: PHPStan\File\FileExcluder
- factory: @PHPStan\File\FileExcluderFactory::createScanFileExcluder()
- autowired: false
-
- fileFinderAnalyse:
- class: PHPStan\File\FileFinder
- arguments:
- fileExcluder: @fileExcluderAnalyse
- fileExtensions: %fileExtensions%
- autowired: false
-
- fileFinderScan:
- class: PHPStan\File\FileFinder
- arguments:
- fileExcluder: @fileExcluderScan
- fileExtensions: %fileExtensions%
- autowired: false
-
- -
- class: PHPStan\File\FileMonitor
- arguments:
- fileFinder: @fileFinderAnalyse
-
- -
- class: PHPStan\NodeVisitor\StatementOrderVisitor
-
- -
- class: PHPStan\Parallel\ParallelAnalyser
- arguments:
- internalErrorsCountLimit: %internalErrorsCountLimit%
- processTimeout: %parallel.processTimeout%
- decoderBufferSize: %parallel.buffer%
-
- -
- class: PHPStan\Parallel\Scheduler
- arguments:
- jobSize: %parallel.jobSize%
- maximumNumberOfProcesses: %parallel.maximumNumberOfProcesses%
- minimumNumberOfJobsPerProcess: %parallel.minimumNumberOfJobsPerProcess%
-
- -
- class: PHPStan\Parser\CachedParser
- arguments:
- originalParser: @pathRoutingParser
- cachedNodesByStringCountMax: %cache.nodesByStringCountMax%
-
- -
- class: PHPStan\Parser\FunctionCallStatementFinder
-
- -
- class: PHPStan\Process\CpuCoreCounter
-
- -
- implement: PHPStan\Reflection\FunctionReflectionFactory
-
- -
- class: PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension
-
- -
- class: PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\CachingVisitor
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\FileNodesFetcher
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\AutoloadSourceLocator
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\ComposerJsonAndInstalledJsonSourceLocatorMaker
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorFactory
- arguments:
- fileFinder: @fileFinderScan
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorRepository
-
- -
- implement: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedPsrAutoloaderLocatorFactory
-
- -
- implement: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedSingleFileSourceLocatorFactory
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedSingleFileSourceLocatorRepository
-
- -
- class: PHPStan\Reflection\Mixin\MixinMethodsClassReflectionExtension
- tags:
- - phpstan.broker.methodsClassReflectionExtension
- arguments:
- mixinExcludeClasses: %mixinExcludeClasses%
-
- -
- class: PHPStan\Reflection\Mixin\MixinPropertiesClassReflectionExtension
- tags:
- - phpstan.broker.propertiesClassReflectionExtension
- arguments:
- mixinExcludeClasses: %mixinExcludeClasses%
-
- -
- class: PHPStan\Reflection\Php\PhpClassReflectionExtension
- arguments:
- inferPrivatePropertyTypeFromConstructor: %inferPrivatePropertyTypeFromConstructor%
- universalObjectCratesClasses: %universalObjectCratesClasses%
-
- -
- implement: PHPStan\Reflection\Php\PhpMethodReflectionFactory
-
- -
- class: PHPStan\Reflection\Php\Soap\SoapClientMethodsClassReflectionExtension
- tags:
- - phpstan.broker.methodsClassReflectionExtension
-
- -
- class: PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension
- tags:
- - phpstan.broker.propertiesClassReflectionExtension
- arguments:
- classes: %universalObjectCratesClasses%
-
- -
- class: PHPStan\Reflection\ReflectionProvider\ReflectionProviderProvider
- factory: PHPStan\Reflection\ReflectionProvider\LazyReflectionProviderProvider
-
- -
- class: PHPStan\Reflection\SignatureMap\NativeFunctionReflectionProvider
- arguments:
- functionReflector: @betterReflectionFunctionReflector
-
- -
- class: PHPStan\Reflection\SignatureMap\SignatureMapParser
-
- -
- class: PHPStan\Reflection\SignatureMap\FunctionSignatureMapProvider
- autowired:
- - PHPStan\Reflection\SignatureMap\FunctionSignatureMapProvider
-
- -
- class: PHPStan\Reflection\SignatureMap\Php8SignatureMapProvider
- autowired:
- - PHPStan\Reflection\SignatureMap\Php8SignatureMapProvider
-
- -
- class: PHPStan\Reflection\SignatureMap\SignatureMapProviderFactory
-
- -
- class: PHPStan\Reflection\SignatureMap\SignatureMapProvider
- factory: @PHPStan\Reflection\SignatureMap\SignatureMapProviderFactory::create()
-
- -
- class: PHPStan\Rules\Api\ApiRuleHelper
-
- -
- class: PHPStan\Rules\AttributesCheck
-
- -
- class: PHPStan\Rules\Arrays\NonexistentOffsetInArrayDimFetchCheck
- arguments:
- reportMaybes: %reportMaybes%
-
- -
- class: PHPStan\Rules\ClassCaseSensitivityCheck
- arguments:
- checkInternalClassCaseSensitivity: %checkInternalClassCaseSensitivity%
-
- -
- class: PHPStan\Rules\Comparison\ConstantConditionRuleHelper
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
-
- -
- class: PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper
- arguments:
- universalObjectCratesClasses: %universalObjectCratesClasses%
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
-
- -
- class: PHPStan\Rules\Exceptions\DefaultExceptionTypeResolver
- arguments:
- uncheckedExceptionRegexes: %exceptions.uncheckedExceptionRegexes%
- uncheckedExceptionClasses: %exceptions.uncheckedExceptionClasses%
- checkedExceptionRegexes: %exceptions.checkedExceptionRegexes%
- checkedExceptionClasses: %exceptions.checkedExceptionClasses%
- autowired:
- - PHPStan\Rules\Exceptions\DefaultExceptionTypeResolver
-
-
class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInFunctionThrowsRule
@@ -732,986 +252,12 @@ services:
class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInMethodThrowsRule
-
- class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInThrowsCheck
- arguments:
- exceptionTypeResolver: @exceptionTypeResolver
-
- -
- class: PHPStan\Rules\Exceptions\TooWideFunctionThrowTypeRule
-
- -
- class: PHPStan\Rules\Exceptions\TooWideMethodThrowTypeRule
-
- -
- class: PHPStan\Rules\Exceptions\TooWideThrowTypeCheck
-
- -
- class: PHPStan\Rules\FunctionCallParametersCheck
- arguments:
- checkArgumentTypes: %checkFunctionArgumentTypes%
- checkArgumentsPassedByReference: %checkArgumentsPassedByReference%
- checkExtraArguments: %checkExtraArguments%
- checkMissingTypehints: %checkMissingTypehints%
-
- -
- class: PHPStan\Rules\FunctionDefinitionCheck
- arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
- checkThisOnly: %checkThisOnly%
-
- -
- class: PHPStan\Rules\FunctionReturnTypeCheck
-
- -
- class: PHPStan\Rules\Generics\CrossCheckInterfacesHelper
-
- -
- class: PHPStan\Rules\Generics\GenericAncestorsCheck
- arguments:
- checkGenericClassInNonGenericObjectType: %checkGenericClassInNonGenericObjectType%
- skipCheckGenericClasses: %featureToggles.skipCheckGenericClasses%
-
- -
- class: PHPStan\Rules\Generics\GenericObjectTypeCheck
-
- -
- class: PHPStan\Rules\Generics\TemplateTypeCheck
- arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
-
- -
- class: PHPStan\Rules\Generics\VarianceCheck
-
- -
- class: PHPStan\Rules\IssetCheck
- arguments:
- checkAdvancedIsset: %checkAdvancedIsset%
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
-
- -
- # checked as part of OverridingMethodRule
- class: PHPStan\Rules\Methods\MethodSignatureRule
- arguments:
- reportMaybes: %reportMaybesInMethodSignatures%
- reportStatic: %reportStaticMethodSignatures%
-
- -
- class: PHPStan\Rules\MissingTypehintCheck
- arguments:
- checkMissingIterableValueType: %checkMissingIterableValueType%
- checkGenericClassInNonGenericObjectType: %checkGenericClassInNonGenericObjectType%
- checkMissingCallableSignature: %checkMissingCallableSignature%
- skipCheckGenericClasses: %featureToggles.skipCheckGenericClasses%
-
- -
- class: PHPStan\Rules\NullsafeCheck
-
- -
- class: PHPStan\Rules\Constants\LazyAlwaysUsedClassConstantsExtensionProvider
-
- -
- class: PHPStan\Rules\PhpDoc\UnresolvableTypeHelper
-
- -
- class: PHPStan\Rules\Properties\LazyReadWritePropertiesExtensionProvider
-
- -
- class: PHPStan\Rules\Properties\PropertyDescriptor
-
- -
- class: PHPStan\Rules\Properties\PropertyReflectionFinder
-
- -
- class: PHPStan\Rules\RegistryFactory
-
- -
- class: PHPStan\Rules\RuleLevelHelper
- arguments:
- checkNullables: %checkNullables%
- checkThisOnly: %checkThisOnly%
- checkUnionTypes: %checkUnionTypes%
- checkExplicitMixed: %checkExplicitMixed%
-
- -
- class: PHPStan\Rules\UnusedFunctionParametersCheck
-
- -
- class: PHPStan\Type\FileTypeMapper
-
- -
- class: PHPStan\Type\TypeAliasResolver
- arguments:
- globalTypeAliases: %typeAliases%
-
- -
- class: PHPStan\Type\Php\ArgumentBasedFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayCombineFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayCurrentDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayFillFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayFillKeysFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayFilterFunctionReturnTypeReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayFlipFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayKeyDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayKeyExistsFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\ArrayKeyFirstDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayKeyLastDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInPropertyHookThrowsRule
-
- class: PHPStan\Type\Php\ArrayKeysFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayMapFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayMergeFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayNextDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayPopFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayRandFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayReduceFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayReverseFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayShiftFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArraySliceFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArraySpliceFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArraySearchFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayValuesFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArraySumFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\Base64DecodeDynamicFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\BcMathStringOrNullReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ClosureBindDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicStaticMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ClosureBindToDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ClosureFromCallableDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicStaticMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\CompactFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
- arguments:
- checkMaybeUndefinedVariables: %checkMaybeUndefinedVariables%
-
- -
- class: PHPStan\Type\Php\CountFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\CountFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\CurlInitReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\DateFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\DateIntervalConstructorThrowTypeExtension
- tags:
- - phpstan.dynamicStaticMethodThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\DateTimeDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\DateTimeConstructorThrowTypeExtension
- tags:
- - phpstan.dynamicStaticMethodThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\DsMapDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\DioStatDynamicFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ExplodeFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\FilterVarDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\GetCalledClassDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\GetClassDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\GetoptFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\GettimeofdayDynamicFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
- -
- class: PHPStan\Type\Php\HashHmacFunctionsReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\HashFunctionsReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\IntdivThrowTypeExtension
- tags:
- - phpstan.dynamicFunctionThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\JsonThrowTypeExtension
- tags:
- - phpstan.dynamicFunctionThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionClassConstructorThrowTypeExtension
- tags:
- - phpstan.dynamicStaticMethodThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionFunctionConstructorThrowTypeExtension
- tags:
- - phpstan.dynamicStaticMethodThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionMethodConstructorThrowTypeExtension
- tags:
- - phpstan.dynamicStaticMethodThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionPropertyConstructorThrowTypeExtension
- tags:
- - phpstan.dynamicStaticMethodThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\SimpleXMLElementClassPropertyReflectionExtension
- tags:
- - phpstan.broker.propertiesClassReflectionExtension
-
- -
- class: PHPStan\Type\Php\SimpleXMLElementConstructorThrowTypeExtension
- tags:
- - phpstan.dynamicStaticMethodThrowTypeExtension
-
- -
- class: PHPStan\Type\Php\StatDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\MethodExistsTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\PropertyExistsTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\MinMaxFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\NumberFormatFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\PathinfoFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\PregSplitDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionClassIsSubclassOfTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.methodTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\ReplaceFunctionsDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ArrayPointerFunctionsDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\VarExportFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\MbFunctionsReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\MbConvertEncodingFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\MbSubstituteCharacterDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\MicrotimeFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\HrtimeFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ImplodeFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\NonEmptyStringFunctionsReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrlenFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrPadFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrRepeatFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\SubstrDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ParseUrlFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\VersionCompareFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\PowFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrtotimeFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\RandomIntFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\RangeFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\AssertFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\ClassExistsFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\DefineConstantTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\DefinedConstantTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\InArrayFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsIntFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsFloatFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsNullFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsArrayFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsBoolFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsCallableFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsCountableFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsResourceFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsIterableFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsStringFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsSubclassOfFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsObjectFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsNumericFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsScalarFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\IsAFunctionTypeSpecifyingExtension
- tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- -
- class: PHPStan\Type\Php\JsonThrowOnErrorDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\TypeSpecifyingFunctionsDynamicReturnTypeExtension
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
- universalObjectCratesClasses: %universalObjectCratesClasses%
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\SimpleXMLElementAsXMLMethodReturnTypeExtension
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\SimpleXMLElementXpathMethodReturnTypeExtension
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrSplitFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrTokFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\SprintfFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrvalFamilyFunctionReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\StrWordCountFunctionDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\XMLReaderOpenReturnTypeExtension
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
- - phpstan.broker.dynamicStaticMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
- arguments:
- className: ReflectionClass
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
- arguments:
- className: ReflectionClassConstant
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
- arguments:
- className: ReflectionFunctionAbstract
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
- arguments:
- className: ReflectionParameter
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
- arguments:
- className: ReflectionProperty
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
-
- exceptionTypeResolver:
- class: PHPStan\Rules\Exceptions\ExceptionTypeResolver
- factory: @PHPStan\Rules\Exceptions\DefaultExceptionTypeResolver
-
- typeSpecifier:
- class: PHPStan\Analyser\TypeSpecifier
- factory: @typeSpecifierFactory::create
-
- typeSpecifierFactory:
- class: PHPStan\Analyser\TypeSpecifierFactory
-
- relativePathHelper:
- class: PHPStan\File\RelativePathHelper
- factory: PHPStan\File\FuzzyRelativePathHelper
- arguments:
- currentWorkingDirectory: %currentWorkingDirectory%
- analysedPaths: %analysedPaths%
- fallbackRelativePathHelper: @parentDirectoryRelativePathHelper
-
- simpleRelativePathHelper:
- class: PHPStan\File\RelativePathHelper
- factory: PHPStan\File\SimpleRelativePathHelper
- arguments:
- currentWorkingDirectory: %currentWorkingDirectory%
- autowired: false
-
- parentDirectoryRelativePathHelper:
- class: PHPStan\File\ParentDirectoryRelativePathHelper
- arguments:
- parentDirectory: %currentWorkingDirectory%
- autowired: false
-
- broker:
- class: PHPStan\Broker\Broker
- factory: @brokerFactory::create
- autowired:
- - PHPStan\Broker\Broker
-
- brokerFactory:
- class: PHPStan\Broker\BrokerFactory
-
- cacheStorage:
- class: PHPStan\Cache\FileCacheStorage
- arguments:
- directory: %tmpDir%/cache/PHPStan
- autowired: no
-
- currentPhpVersionRichParser:
- class: PHPStan\Parser\RichParser
- arguments:
- parser: @currentPhpVersionPhpParser
- autowired: no
-
- currentPhpVersionSimpleParser:
- class: PHPStan\Parser\SimpleParser
- arguments:
- parser: @currentPhpVersionPhpParser
- autowired: no
-
- phpParserDecorator:
- class: PHPStan\Parser\PhpParserDecorator
- arguments:
- wrappedParser: @PHPStan\Parser\Parser
- autowired:
- - PhpParser\Parser
-
- currentPhpVersionLexer:
- class: PhpParser\Lexer
- factory: @PHPStan\Parser\LexerFactory::create()
- autowired: false
-
- currentPhpVersionPhpParser:
- class: PhpParser\Parser\Php7
- arguments:
- lexer: @currentPhpVersionLexer
- autowired: false
-
- registry:
- class: PHPStan\Rules\Registry
- factory: @PHPStan\Rules\RegistryFactory::create
-
- stubPhpDocProvider:
- class: PHPStan\PhpDoc\StubPhpDocProvider
- arguments:
- stubFiles: %stubFiles%
-
- # Reflection providers
-
- reflectionProviderFactory:
- class: PHPStan\Reflection\ReflectionProvider\ReflectionProviderFactory
- arguments:
- runtimeReflectionProvider: @runtimeReflectionProvider
- staticReflectionProvider: @betterReflectionProvider
- disableRuntimeReflectionProvider: %featureToggles.disableRuntimeReflectionProvider%
-
- reflectionProvider:
- factory: @PHPStan\Reflection\ReflectionProvider\ReflectionProviderFactory::create
- autowired:
- - PHPStan\Reflection\ReflectionProvider
-
- betterReflectionSourceLocator:
- class: PHPStan\BetterReflection\SourceLocator\Type\SourceLocator
- factory: @PHPStan\Reflection\BetterReflection\BetterReflectionSourceLocatorFactory::create
- autowired: false
-
- betterReflectionClassReflector:
- class: PHPStan\Reflection\BetterReflection\Reflector\MemoizingClassReflector
- arguments:
- sourceLocator: @betterReflectionSourceLocator
- autowired: false
-
- nodeScopeResolverClassReflector:
- factory: @betterReflectionClassReflector
- autowired: false
-
- betterReflectionFunctionReflector:
- class: PHPStan\Reflection\BetterReflection\Reflector\MemoizingFunctionReflector
- arguments:
- classReflector: @betterReflectionClassReflector
- sourceLocator: @betterReflectionSourceLocator
- autowired: false
-
- betterReflectionConstantReflector:
- class: PHPStan\Reflection\BetterReflection\Reflector\MemoizingConstantReflector
- arguments:
- classReflector: @betterReflectionClassReflector
- sourceLocator: @betterReflectionSourceLocator
- autowired: false
-
- betterReflectionProvider:
- class: PHPStan\Reflection\BetterReflection\BetterReflectionProvider
- arguments:
- classReflector: @betterReflectionClassReflector
- functionReflector: @betterReflectionFunctionReflector
- constantReflector: @betterReflectionConstantReflector
- autowired: false
-
- regexParser:
- class: Hoa\Compiler\Llk\Parser
- factory: Hoa\Compiler\Llk\Llk::load(@regexGrammarStream)
-
- regexGrammarStream:
- class: Hoa\File\Read
- arguments:
- streamName: 'hoa://Library/Regex/Grammar.pp'
-
- runtimeReflectionProvider:
- class: PHPStan\Reflection\ReflectionProvider\ClassBlacklistReflectionProvider
- arguments:
- reflectionProvider: @innerRuntimeReflectionProvider
- patterns: %staticReflectionClassNamePatterns%
- singleReflectionInsteadOfFile: %singleReflectionInsteadOfFile%
- autowired: false
-
- innerRuntimeReflectionProvider:
- class: PHPStan\Reflection\Runtime\RuntimeReflectionProvider
-
- -
- class: PHPStan\Reflection\BetterReflection\BetterReflectionSourceLocatorFactory
- arguments:
- parser: @phpParserDecorator
- php8Parser: @php8PhpParser
- scanFiles: %scanFiles%
- scanDirectories: %scanDirectories%
- analysedPaths: %analysedPaths%
- composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
- analysedPathsFromConfig: %analysedPathsFromConfig%
- singleReflectionFile: %singleReflectionFile%
- staticReflectionClassNamePatterns: %staticReflectionClassNamePatterns%
-
- -
- implement: PHPStan\Reflection\BetterReflection\BetterReflectionProviderFactory
-
- -
- class: PHPStan\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsSourceStubber
- arguments:
- phpParser: @php8PhpParser
- phpVersionId: %phpVersion%
- autowired:
- - PHPStan\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsSourceStubber
-
- -
- class: PHPStan\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber
- autowired:
- - PHPStan\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber
-
- php8Lexer:
- class: PhpParser\Lexer\Emulative
- autowired: false
-
- php8PhpParser:
- class: PhpParser\Parser\Php7
- arguments:
- lexer: @php8Lexer
- autowired: false
-
- php8Parser:
- class: PHPStan\Parser\SimpleParser
- arguments:
- parser: @php8PhpParser
- autowired: false
-
- pathRoutingParser:
- class: PHPStan\Parser\PathRoutingParser
- arguments:
- currentPhpVersionRichParser: @currentPhpVersionRichParser
- currentPhpVersionSimpleParser: @currentPhpVersionSimpleParser
- php8Parser: @php8Parser
- autowired: false
-
- # Error formatters
-
- errorFormatter.raw:
- class: PHPStan\Command\ErrorFormatter\RawErrorFormatter
-
- errorFormatter.table:
- class: PHPStan\Command\ErrorFormatter\TableErrorFormatter
- arguments:
- showTipsOfTheDay: %tipsOfTheDay%
- editorUrl: %editorUrl%
-
- errorFormatter.checkstyle:
- class: PHPStan\Command\ErrorFormatter\CheckstyleErrorFormatter
- arguments:
- relativePathHelper: @simpleRelativePathHelper
-
- errorFormatter.json:
- class: PHPStan\Command\ErrorFormatter\JsonErrorFormatter
- arguments:
- pretty: false
-
- errorFormatter.junit:
- class: PHPStan\Command\ErrorFormatter\JunitErrorFormatter
- arguments:
- relativePathHelper: @simpleRelativePathHelper
-
- errorFormatter.prettyJson:
- class: PHPStan\Command\ErrorFormatter\JsonErrorFormatter
- arguments:
- pretty: true
-
- errorFormatter.gitlab:
- class: PHPStan\Command\ErrorFormatter\GitlabErrorFormatter
- arguments:
- relativePathHelper: @simpleRelativePathHelper
+ class: PHPStan\Rules\Properties\UninitializedPropertyRule
- errorFormatter.github:
- class: PHPStan\Command\ErrorFormatter\GithubErrorFormatter
- arguments:
- relativePathHelper: @simpleRelativePathHelper
+ # autowired services are now registered with the help of attributes
+ # like #[PHPStan\DependencyInjection\AutowiredService] or #[PHPStan\DependencyInjection\GenerateFactory]
- errorFormatter.teamcity:
- class: PHPStan\Command\ErrorFormatter\TeamcityErrorFormatter
- arguments:
- relativePathHelper: @simpleRelativePathHelper
+ # non-autowired services are now registered in services.neon
diff --git a/conf/config.stubFiles.neon b/conf/config.stubFiles.neon
deleted file mode 100644
index 1c90d8cdf1..0000000000
--- a/conf/config.stubFiles.neon
+++ /dev/null
@@ -1,20 +0,0 @@
-parameters:
- stubFiles:
- - ../stubs/ReflectionAttribute.stub
- - ../stubs/ReflectionClass.stub
- - ../stubs/ReflectionClassConstant.stub
- - ../stubs/ReflectionFunctionAbstract.stub
- - ../stubs/ReflectionParameter.stub
- - ../stubs/ReflectionProperty.stub
- - ../stubs/iterable.stub
- - ../stubs/ArrayObject.stub
- - ../stubs/WeakReference.stub
- - ../stubs/ext-ds.stub
- - ../stubs/PDOStatement.stub
- - ../stubs/date.stub
- - ../stubs/zip.stub
- - ../stubs/dom.stub
- - ../stubs/spl.stub
- - ../stubs/SplObjectStorage.stub
- - ../stubs/Exception.stub
- - ../stubs/arrayFunctions.stub
diff --git a/conf/config.stubValidator.neon b/conf/config.stubValidator.neon
index 2f8d462dec..ad90340a64 100644
--- a/conf/config.stubValidator.neon
+++ b/conf/config.stubValidator.neon
@@ -1,46 +1,50 @@
parameters:
checkThisOnly: false
checkClassCaseSensitivity: true
- checkGenericClassInNonGenericObjectType: true
- checkMissingIterableValueType: true
checkMissingTypehints: true
checkMissingCallableSignature: false
+ __validate: false
services:
-
class: PHPStan\PhpDoc\StubSourceLocatorFactory
arguments:
php8Parser: @php8PhpParser
- stubFiles: %stubFiles%
- nodeScopeResolverClassReflector:
- factory: @stubClassReflector
+ # overrides service from parsers.neon
+ defaultAnalysisParser!:
+ factory: @stubParser
- stubBetterReflectionProvider:
- class: PHPStan\Reflection\BetterReflection\BetterReflectionProvider
- arguments:
- classReflector: @stubClassReflector
- functionReflector: @stubFunctionReflector
- constantReflector: @stubConstantReflector
+ # overrides service from services.neon
+ nodeScopeResolverReflector:
+ factory: @stubReflector
+
+ # overrides service from services.neon
+ reflectionProvider:
+ factory: @stubBetterReflectionProvider
+ autowired:
+ - PHPStan\Reflection\ReflectionProvider
+
+ # overrides service from parsers.neon
+ currentPhpVersionLexer:
+ factory: @php8Lexer
autowired: false
- stubClassReflector:
- class: PHPStan\BetterReflection\Reflector\ClassReflector
- arguments:
- sourceLocator: @stubSourceLocator
+ # overrides service from parsers.neon
+ currentPhpVersionPhpParser:
+ factory: @php8PhpParser
autowired: false
- stubFunctionReflector:
- class: PHPStan\BetterReflection\Reflector\FunctionReflector
+ stubBetterReflectionProvider:
+ class: PHPStan\Reflection\BetterReflection\BetterReflectionProvider
arguments:
- classReflector: @stubClassReflector
- sourceLocator: @stubSourceLocator
+ reflector: @stubReflector
+ universalObjectCratesClasses: %universalObjectCratesClasses%
autowired: false
- stubConstantReflector:
- class: PHPStan\BetterReflection\Reflector\ConstantReflector
+ stubReflector:
+ class: PHPStan\BetterReflection\Reflector\DefaultReflector
arguments:
- classReflector: @stubClassReflector
sourceLocator: @stubSourceLocator
autowired: false
@@ -48,8 +52,3 @@ services:
class: PHPStan\BetterReflection\SourceLocator\Type\SourceLocator
factory: @PHPStan\PhpDoc\StubSourceLocatorFactory::create()
autowired: false
-
- reflectionProvider:
- factory: @stubBetterReflectionProvider
- autowired:
- - PHPStan\Reflection\ReflectionProvider
diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon
new file mode 100644
index 0000000000..2654a3345b
--- /dev/null
+++ b/conf/parametersSchema.neon
@@ -0,0 +1,206 @@
+parametersSchema:
+ bootstrapFiles: listOf(string())
+ excludePaths: anyOf(
+ structure([
+ analyse: listOf(string()),
+ ]),
+ structure([
+ analyseAndScan: listOf(string()),
+ ])
+ structure([
+ analyse: listOf(string()),
+ analyseAndScan: listOf(string())
+ ])
+ )
+ level: schema(anyOf(int(), string()), nullable())
+ paths: listOf(string())
+ exceptions: structure([
+ implicitThrows: bool(),
+ reportUncheckedExceptionDeadCatch: bool(),
+ uncheckedExceptionRegexes: listOf(string()),
+ uncheckedExceptionClasses: listOf(string()),
+ checkedExceptionRegexes: listOf(string()),
+ checkedExceptionClasses: listOf(string()),
+ check: structure([
+ missingCheckedExceptionInThrows: bool(),
+ tooWideThrowType: bool()
+ ])
+ ])
+ featureToggles: structure([
+ bleedingEdge: bool(),
+ checkNonStringableDynamicAccess: bool(),
+ checkParameterCastableToNumberFunctions: bool(),
+ skipCheckGenericClasses: listOf(string()),
+ stricterFunctionMap: bool()
+ reportPreciseLineForUnusedFunctionParameter: bool()
+ checkPrintfParameterTypes: bool()
+ internalTag: bool()
+ newStaticInAbstractClassStaticMethod: bool()
+ checkExtensionsForComparisonOperators: bool()
+ reportTooWideBool: bool()
+ rawMessageInBaseline: bool()
+ reportNestedTooWideType: bool()
+ ])
+ fileExtensions: listOf(string())
+ checkAdvancedIsset: bool()
+ reportAlwaysTrueInLastCondition: bool()
+ checkClassCaseSensitivity: bool()
+ checkExplicitMixed: bool()
+ checkImplicitMixed: bool()
+ checkFunctionArgumentTypes: bool()
+ checkFunctionNameCase: bool()
+ checkInternalClassCaseSensitivity: bool()
+ checkMissingCallableSignature: bool()
+ checkMissingVarTagTypehint: bool()
+ checkArgumentsPassedByReference: bool()
+ checkMaybeUndefinedVariables: bool()
+ checkNullables: bool()
+ checkThisOnly: bool()
+ checkUnionTypes: bool()
+ checkBenevolentUnionTypes: bool()
+ checkExplicitMixedMissingReturn: bool()
+ checkPhpDocMissingReturn: bool()
+ checkPhpDocMethodSignatures: bool()
+ checkExtraArguments: bool()
+ checkMissingTypehints: bool()
+ checkTooWideParameterOutInProtectedAndPublicMethods: bool()
+ checkTooWideReturnTypesInProtectedAndPublicMethods: bool()
+ checkUninitializedProperties: bool()
+ checkDynamicProperties: bool()
+ strictRulesInstalled: bool()
+ deprecationRulesInstalled: bool()
+ inferPrivatePropertyTypeFromConstructor: bool()
+ checkStrictPrintfPlaceholderTypes: bool()
+
+ tips: structure([
+ discoveringSymbols: bool()
+ treatPhpDocTypesAsCertain: bool()
+ ])
+ tipsOfTheDay: bool()
+ reportMaybes: bool()
+ reportMaybesInMethodSignatures: bool()
+ reportMaybesInPropertyPhpDocTypes: bool()
+ reportStaticMethodSignatures: bool()
+ reportWrongPhpDocTypeInVarTag: bool()
+ reportAnyTypeWideningInVarTag: bool()
+ reportPossiblyNonexistentGeneralArrayOffset: bool()
+ reportPossiblyNonexistentConstantArrayOffset: bool()
+ checkMissingOverrideMethodAttribute: bool()
+ parallel: structure([
+ jobSize: int(),
+ processTimeout: float(),
+ maximumNumberOfProcesses: int(),
+ minimumNumberOfJobsPerProcess: int(),
+ buffer: int()
+ ])
+ phpVersion: schema(anyOf(
+ schema(int(), min(70100), max(80599)),
+ structure([
+ min: schema(int(), min(70100), max(80599)),
+ max: schema(int(), min(70100), max(80599))
+ ])
+ ), nullable())
+ polluteScopeWithLoopInitialAssignments: bool()
+ polluteScopeWithAlwaysIterableForeach: bool()
+ polluteScopeWithBlock: bool()
+ propertyAlwaysWrittenTags: listOf(string())
+ propertyAlwaysReadTags: listOf(string())
+ additionalConstructors: listOf(string())
+ treatPhpDocTypesAsCertain: bool()
+ usePathConstantsAsConstantString: bool()
+ rememberPossiblyImpureFunctionValues: bool()
+ reportMagicMethods: bool()
+ reportMagicProperties: bool()
+ ignoreErrors: listOf(
+ anyOf(
+ string(),
+ structure([
+ ?message: string()
+ ?messages: listOf(string())
+ ?rawMessage: string()
+ ?identifier: string()
+ ?identifiers: listOf(string())
+ ?path: string()
+ ?paths: listOf(string())
+ ?count: int()
+ ?reportUnmatched: bool()
+ ]),
+ )
+ )
+ internalErrorsCountLimit: int()
+ cache: structure([
+ nodesByStringCountMax: int()
+ ])
+ reportUnmatchedIgnoredErrors: bool()
+ typeAliases: arrayOf(string())
+ universalObjectCratesClasses: listOf(string())
+ stubFiles: listOf(string())
+ earlyTerminatingMethodCalls: arrayOf(listOf(string()))
+ earlyTerminatingFunctionCalls: listOf(string())
+ resultCachePath: string()
+ resultCacheSkipIfOlderThanDays: int()
+ resultCacheChecksProjectExtensionFilesDependencies: bool()
+ dynamicConstantNames: arrayOf(string())
+ customRulesetUsed: schema(bool(), nullable())
+ rootDir: string()
+ tmpDir: string()
+ currentWorkingDirectory: string()
+ cliArgumentsVariablesRegistered: bool()
+ mixinExcludeClasses: listOf(string())
+ scanFiles: listOf(string())
+ scanDirectories: listOf(string())
+ editorUrl: schema(string(), nullable())
+ editorUrlTitle: schema(string(), nullable())
+ errorFormat: schema(string(), nullable())
+ pro: structure([
+ dnsServers: schema(listOf(string()), min(1)),
+ tmpDir: string()
+ ])
+ env: arrayOf(string(), anyOf(int(), string()))
+ sysGetTempDir: string()
+ parametersNotInvalidatingCache: listOf(schema(anyOf(
+ string(),
+ listOf(string()),
+ )))
+
+ # playground mode
+ sourceLocatorPlaygroundMode: bool()
+
+ # irrelevant Nette parameters
+ debugMode: bool()
+ productionMode: bool()
+ tempDir: string()
+ __validate: bool()
+
+ # internal parameters only for DerivativeContainerFactory
+ additionalConfigFiles: listOf(string())
+ generateBaselineFile: schema(string(), nullable())
+ analysedPaths: listOf(string())
+ allConfigFiles: listOf(string())
+ composerAutoloaderProjectPaths: listOf(string())
+ analysedPathsFromConfig: listOf(string())
+ usedLevel: string()
+ cliAutoloadFile: schema(string(), nullable())
+
+ # internal - editor mode
+ singleReflectionFile: schema(string(), nullable())
+ singleReflectionInsteadOfFile: schema(string(), nullable())
+
+expandRelativePaths:
+ - '[parameters][paths][]'
+ - '[parameters][excludePaths][]'
+ - '[parameters][excludePaths][analyse][]'
+ - '[parameters][excludePaths][analyseAndScan][]'
+ - '[parameters][ignoreErrors][][paths][]'
+ - '[parameters][ignoreErrors][][path]'
+ - '[parameters][bootstrapFiles][]'
+ - '[parameters][scanFiles][]'
+ - '[parameters][scanDirectories][]'
+ - '[parameters][tmpDir]'
+ - '[parameters][pro][tmpDir]'
+ - '[parameters][memoryLimitFile]'
+ - '[parameters][benchmarkFile]'
+ - '[parameters][stubFiles][]'
+ - '[parameters][symfony][consoleApplicationLoader]'
+ - '[parameters][symfony][containerXmlPath]'
+ - '[parameters][doctrine][objectManagerLoader]'
diff --git a/conf/parsers.neon b/conf/parsers.neon
new file mode 100644
index 0000000000..450df00487
--- /dev/null
+++ b/conf/parsers.neon
@@ -0,0 +1,85 @@
+services:
+ php8Parser:
+ class: PHPStan\Parser\SimpleParser
+ arguments:
+ parser: @php8PhpParser
+ autowired: false
+
+ php8Lexer:
+ class: PhpParser\Lexer\Emulative
+ factory: @PHPStan\Parser\LexerFactory::createEmulative()
+ autowired: false
+
+ php8PhpParser:
+ class: PhpParser\Parser\Php8
+ arguments:
+ lexer: @php8Lexer
+ autowired: false
+
+ currentPhpVersionLexer:
+ class: PhpParser\Lexer
+ factory: @PHPStan\Parser\LexerFactory::create()
+ autowired: false
+
+ currentPhpVersionPhpParser:
+ factory: @currentPhpVersionPhpParserFactory::create()
+ autowired: false
+
+ currentPhpVersionPhpParserFactory:
+ class: PHPStan\Parser\PhpParserFactory
+ arguments:
+ lexer: @currentPhpVersionLexer
+ autowired: false
+
+ currentPhpVersionSimpleDirectParser:
+ class: PHPStan\Parser\SimpleParser
+ arguments:
+ parser: @currentPhpVersionPhpParser
+ autowired: no
+
+ currentPhpVersionSimpleParser:
+ class: PHPStan\Parser\CleaningParser
+ arguments:
+ wrappedParser: @currentPhpVersionSimpleDirectParser
+ autowired: no
+
+ currentPhpVersionRichParser:
+ class: PHPStan\Parser\RichParser
+ arguments:
+ parser: @currentPhpVersionPhpParser
+ autowired: no
+
+ pathRoutingParser:
+ class: PHPStan\Parser\PathRoutingParser
+ arguments:
+ currentPhpVersionRichParser: @currentPhpVersionRichParser
+ currentPhpVersionSimpleParser: @currentPhpVersionSimpleParser
+ php8Parser: @php8Parser
+ singleReflectionFile: %singleReflectionFile%
+ autowired: false
+
+ phpParserDecorator:
+ class: PHPStan\Parser\PhpParserDecorator
+ arguments:
+ wrappedParser: @defaultAnalysisParser
+ autowired: false
+
+ defaultAnalysisParser:
+ class: PHPStan\Parser\CachedParser
+ arguments:
+ originalParser: @pathRoutingParser
+ cachedNodesByStringCountMax: %cache.nodesByStringCountMax%
+ autowired: false
+
+ freshStubParser:
+ class: PHPStan\Parser\StubParser
+ arguments:
+ parser: @php8PhpParser
+ autowired: false
+
+ stubParser:
+ class: PHPStan\Parser\CachedParser
+ arguments:
+ originalParser: @freshStubParser
+ cachedNodesByStringCountMax: %cache.nodesByStringCountMax%
+ autowired: false
diff --git a/conf/services.neon b/conf/services.neon
new file mode 100644
index 0000000000..0e1382d4b3
--- /dev/null
+++ b/conf/services.neon
@@ -0,0 +1,255 @@
+# these services are not registered using an attribute for one reason or another
+
+services:
+ # not registered using attributes because it's in vendor/
+ -
+ class: PhpParser\BuilderFactory
+
+ -
+ class: PhpParser\NodeVisitor\NameResolver
+ arguments:
+ options:
+ preserveOriginalNames: true
+
+ -
+ class: PHPStan\PhpDocParser\ParserConfig
+ arguments:
+ usedAttributes:
+ lines: true
+
+ -
+ class: PHPStan\PhpDocParser\Lexer\Lexer
+
+ -
+ class: PHPStan\PhpDocParser\Parser\TypeParser
+
+ -
+ class: PHPStan\PhpDocParser\Parser\ConstExprParser
+
+ -
+ class: PHPStan\PhpDocParser\Parser\PhpDocParser
+
+ -
+ class: PHPStan\PhpDocParser\Printer\Printer
+
+ -
+ factory: @PHPStan\Reflection\BetterReflection\SourceStubber\PhpStormStubsSourceStubberFactory::create()
+ autowired:
+ - PHPStan\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsSourceStubber
+
+ -
+ factory: @PHPStan\Reflection\BetterReflection\SourceStubber\ReflectionSourceStubberFactory::create()
+ autowired:
+ - PHPStan\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber
+
+ originalBetterReflectionReflector:
+ class: PHPStan\BetterReflection\Reflector\DefaultReflector
+ arguments:
+ sourceLocator: @betterReflectionSourceLocator
+ autowired: false
+
+
+ # not registered using attributes because we don't want to apply service tags automatically
+ -
+ class: PHPStan\Dependency\ExportedNodeVisitor
+
+ -
+ class: PHPStan\Reflection\BetterReflection\SourceLocator\CachingVisitor
+
+ -
+ class: PHPStan\Reflection\Php\PhpClassReflectionExtension
+ arguments:
+ parser: @defaultAnalysisParser
+ inferPrivatePropertyTypeFromConstructor: %inferPrivatePropertyTypeFromConstructor%
+
+ -
+ class: PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension
+
+ -
+ class: PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension
+
+ -
+ class: PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension
+ arguments:
+ classes: %universalObjectCratesClasses%
+
+ -
+ class: PHPStan\Reflection\Mixin\MixinMethodsClassReflectionExtension
+ arguments:
+ mixinExcludeClasses: %mixinExcludeClasses%
+
+ -
+ class: PHPStan\Reflection\Mixin\MixinPropertiesClassReflectionExtension
+ arguments:
+ mixinExcludeClasses: %mixinExcludeClasses%
+
+ -
+ class: PHPStan\Reflection\Php\Soap\SoapClientMethodsClassReflectionExtension
+
+ -
+ class: PHPStan\Reflection\RequireExtension\RequireExtendsMethodsClassReflectionExtension
+
+ -
+ class: PHPStan\Reflection\RequireExtension\RequireExtendsPropertiesClassReflectionExtension
+
+ -
+ # checked as part of OverridingMethodRule
+ class: PHPStan\Rules\Methods\MethodSignatureRule
+ arguments:
+ reportMaybes: %reportMaybesInMethodSignatures%
+ reportStatic: %reportStaticMethodSignatures%
+
+ phpstanDiagnoseExtension:
+ class: PHPStan\Diagnose\PHPStanDiagnoseExtension
+ arguments:
+ composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
+ allConfigFiles: %allConfigFiles%
+ configPhpVersion: %phpVersion%
+ autowired: false
+
+ # not registered using attributes because there is 2+ instances
+ -
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionClass
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionClassConstant
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionFunctionAbstract
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionParameter
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionProperty
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateTimeModifyReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ dateTimeClass: DateTime
+
+ -
+ class: PHPStan\Type\Php\DateTimeModifyReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ dateTimeClass: DateTimeImmutable
+
+ -
+ class: PHPStan\Reflection\PHPStan\NativeReflectionEnumReturnDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ className: PHPStan\Reflection\ClassReflection
+ methodName: getNativeReflection
+
+ -
+ class: PHPStan\Reflection\PHPStan\NativeReflectionEnumReturnDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ className: PHPStan\Reflection\Php\BuiltinMethodReflection
+ methodName: getDeclaringClass
+
+ -
+ class: PHPStan\Reflection\BetterReflection\Type\AdapterReflectionEnumCaseDynamicReturnTypeExtension
+ arguments:
+ class: PHPStan\BetterReflection\Reflection\Adapter\ReflectionEnumBackedCase
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Reflection\BetterReflection\Type\AdapterReflectionEnumCaseDynamicReturnTypeExtension
+ arguments:
+ class: PHPStan\BetterReflection\Reflection\Adapter\ReflectionEnumUnitCase
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ errorFormatter.json:
+ class: PHPStan\Command\ErrorFormatter\JsonErrorFormatter
+ arguments:
+ pretty: false
+
+ errorFormatter.prettyJson:
+ class: PHPStan\Command\ErrorFormatter\JsonErrorFormatter
+ arguments:
+ pretty: true
+
+ stubFileTypeMapper:
+ class: PHPStan\Type\FileTypeMapper
+ arguments:
+ phpParser: @stubParser
+ autowired: false
+
+ fileExcluderAnalyse:
+ class: PHPStan\File\FileExcluder
+ factory: @PHPStan\File\FileExcluderFactory::createAnalyseFileExcluder()
+ autowired: false
+
+ fileExcluderScan:
+ class: PHPStan\File\FileExcluder
+ factory: @PHPStan\File\FileExcluderFactory::createScanFileExcluder()
+ autowired: false
+
+ fileFinderAnalyse:
+ class: PHPStan\File\FileFinder
+ arguments:
+ fileExcluder: @fileExcluderAnalyse
+ fileExtensions: %fileExtensions%
+ autowired: false
+
+ fileFinderScan:
+ class: PHPStan\File\FileFinder
+ arguments:
+ fileExcluder: @fileExcluderScan
+ fileExtensions: %fileExtensions%
+ autowired: false
+
+ # not registered using attributes because it's overriden in TestCase.neon or config.stubValidator.neon
+
+ cacheStorage:
+ class: PHPStan\Cache\FileCacheStorage
+ arguments:
+ directory: %tmpDir%/cache/PHPStan
+ autowired: no
+
+ betterReflectionSourceLocator:
+ factory: @PHPStan\Reflection\BetterReflection\BetterReflectionSourceLocatorFactory::create
+ autowired: false
+
+ reflectionProvider:
+ factory: @PHPStan\Reflection\ReflectionProvider\ReflectionProviderFactory::create
+ autowired:
+ - PHPStan\Reflection\ReflectionProvider
+
+ nodeScopeResolverReflector:
+ factory: @betterReflectionReflector
+ autowired: false
+
+ # not registered using attributes because people often override it
+
+ exceptionTypeResolver:
+ class: PHPStan\Rules\Exceptions\ExceptionTypeResolver
+ factory: @PHPStan\Rules\Exceptions\DefaultExceptionTypeResolver
diff --git a/conf/staticReflection.neon b/conf/staticReflection.neon
deleted file mode 100644
index 7fe9268c0b..0000000000
--- a/conf/staticReflection.neon
+++ /dev/null
@@ -1,5 +0,0 @@
-# WARNING - This isn't ready for use
-
-parameters:
- featureToggles:
- disableRuntimeReflectionProvider: true
diff --git a/e2e/PHPStanErrorPatch.patch b/e2e/PHPStanErrorPatch.patch
new file mode 100644
index 0000000000..3d23608791
--- /dev/null
+++ b/e2e/PHPStanErrorPatch.patch
@@ -0,0 +1,11 @@
+--- Error.php 2022-09-28 15:43:03.000000000 +0200
++++ Error.php 2022-10-17 20:47:54.000000000 +0200
+@@ -105,7 +105,7 @@
+
+ public function canBeIgnored(): bool
+ {
+- return $this->canBeIgnored === true;
++ return !$this->canBeIgnored instanceof Throwable;
+ }
+
+ public function hasNonIgnorableException(): bool
diff --git a/e2e/bad-exclude-paths/excludePaths.neon b/e2e/bad-exclude-paths/excludePaths.neon
new file mode 100644
index 0000000000..14ed59cad4
--- /dev/null
+++ b/e2e/bad-exclude-paths/excludePaths.neon
@@ -0,0 +1,9 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ excludePaths:
+ - tests
diff --git a/e2e/bad-exclude-paths/ignore.neon b/e2e/bad-exclude-paths/ignore.neon
new file mode 100644
index 0000000000..26d56b4b57
--- /dev/null
+++ b/e2e/bad-exclude-paths/ignore.neon
@@ -0,0 +1,11 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ ignoreErrors:
+ -
+ message: '#aaa#'
+ path: tests
diff --git a/e2e/bad-exclude-paths/ignoreNonexistentExcludePath.neon b/e2e/bad-exclude-paths/ignoreNonexistentExcludePath.neon
new file mode 100644
index 0000000000..b78c536f97
--- /dev/null
+++ b/e2e/bad-exclude-paths/ignoreNonexistentExcludePath.neon
@@ -0,0 +1,10 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - .
+ excludePaths:
+ - node_modules (?)
+ - tmp-node-modules
diff --git a/e2e/bad-exclude-paths/ignoreReportUnmatchedFalse.neon b/e2e/bad-exclude-paths/ignoreReportUnmatchedFalse.neon
new file mode 100644
index 0000000000..2206595e61
--- /dev/null
+++ b/e2e/bad-exclude-paths/ignoreReportUnmatchedFalse.neon
@@ -0,0 +1,12 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ reportUnmatchedIgnoredErrors: false
+ ignoreErrors:
+ -
+ message: '#aaa#'
+ path: tests
diff --git a/e2e/bad-exclude-paths/phpneon.php b/e2e/bad-exclude-paths/phpneon.php
new file mode 100644
index 0000000000..92ebd989a1
--- /dev/null
+++ b/e2e/bad-exclude-paths/phpneon.php
@@ -0,0 +1,17 @@
+ [
+ __DIR__ . '/../../conf/bleedingEdge.neon',
+ ],
+ 'parameters' => [
+ 'level' => '8',
+ 'paths' => [__DIR__ . '/src'],
+ 'ignoreErrors' => [
+ [
+ 'message' => '#aaa#',
+ 'path' => 'src/test.php', // not absolute path - invalid in .php config
+ ],
+ ],
+ ],
+];
diff --git a/e2e/bad-exclude-paths/phpneon2.php b/e2e/bad-exclude-paths/phpneon2.php
new file mode 100644
index 0000000000..4c06f1f310
--- /dev/null
+++ b/e2e/bad-exclude-paths/phpneon2.php
@@ -0,0 +1,16 @@
+ [
+ __DIR__ . '/../../conf/bleedingEdge.neon',
+ ],
+ 'parameters' => [
+ 'level' => '8',
+ 'paths' => [__DIR__ . '/src'],
+ 'excludePaths' => [
+ 'analyse' => [
+ 'src/test.php', // not absolute path - invalid in .php config
+ ],
+ ],
+ ],
+];
diff --git a/e2e/bad-exclude-paths/src/test.php b/e2e/bad-exclude-paths/src/test.php
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bad-exclude-paths/tmp-node-modules/test.php b/e2e/bad-exclude-paths/tmp-node-modules/test.php
new file mode 100644
index 0000000000..c24b518fb0
--- /dev/null
+++ b/e2e/bad-exclude-paths/tmp-node-modules/test.php
@@ -0,0 +1,3 @@
+x;
+ }
+
+ public function init(): void
+ {
+ $this->x = rand();
+ }
+}
diff --git a/e2e/baseline-uninit-prop-trait/src/HelloWorld.php b/e2e/baseline-uninit-prop-trait/src/HelloWorld.php
new file mode 100644
index 0000000000..f7ad689a59
--- /dev/null
+++ b/e2e/baseline-uninit-prop-trait/src/HelloWorld.php
@@ -0,0 +1,14 @@
+init();
+ $this->foo();
+ }
+}
diff --git a/e2e/baseline-uninit-prop-trait/test-no-baseline.neon b/e2e/baseline-uninit-prop-trait/test-no-baseline.neon
new file mode 100644
index 0000000000..3e639cd0d2
--- /dev/null
+++ b/e2e/baseline-uninit-prop-trait/test-no-baseline.neon
@@ -0,0 +1,4 @@
+parameters:
+ level: 9
+ paths:
+ - src
diff --git a/e2e/baseline-uninit-prop-trait/test.neon b/e2e/baseline-uninit-prop-trait/test.neon
new file mode 100644
index 0000000000..9b21d7b642
--- /dev/null
+++ b/e2e/baseline-uninit-prop-trait/test.neon
@@ -0,0 +1,3 @@
+includes:
+ - test-baseline.neon
+ - test-no-baseline.neon
diff --git a/e2e/bug-10483/bug-10483.php b/e2e/bug-10483/bug-10483.php
new file mode 100644
index 0000000000..df3867ef78
--- /dev/null
+++ b/e2e/bug-10483/bug-10483.php
@@ -0,0 +1,10 @@
+
+ */
+class DummyRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return InClassNode::class;
+ }
+
+ /**
+ * @param InClassNode $node
+ * @return list
+ */
+ public function processNode(
+ Node $node,
+ Scope $scope,
+ ): array
+ {
+ return [FatalErrorWhenAutoloaded::AUTOLOAD];
+ }
+
+}
diff --git a/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php b/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php
new file mode 100644
index 0000000000..a75127a356
--- /dev/null
+++ b/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php
@@ -0,0 +1,11 @@
+getName() === 'belongsTo';
+ }
+
+ public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type {
+ $returnType = $methodReflection->getVariants()[0]->getReturnType();
+ $argType = $scope->getType($methodCall->getArgs()[0]->value);
+ $modelClass = $argType->getClassStringObjectType()->getObjectClassNames()[0];
+
+ return new GenericObjectType($returnType->getObjectClassNames()[0], [
+ new ObjectType($modelClass),
+ $scope->getType($methodCall->var),
+ ]);
+ }
+}
+
diff --git a/e2e/bug-11857/src/test.php b/e2e/bug-11857/src/test.php
new file mode 100644
index 0000000000..5c237f25e8
--- /dev/null
+++ b/e2e/bug-11857/src/test.php
@@ -0,0 +1,70 @@
+ */
+ public function belongsTo(string $related): BelongsTo
+ {
+ return new BelongsTo();
+ }
+}
+
+/**
+ * @template TRelatedModel of Model
+ * @template TDeclaringModel of Model
+ */
+class BelongsTo {}
+
+class User extends Model {}
+
+class Post extends Model
+{
+ /** @return BelongsTo */
+ public function user(): BelongsTo
+ {
+ return $this->belongsTo(User::class);
+ }
+
+ /** @return BelongsTo */
+ public function userSelf(): BelongsTo
+ {
+ /** @phpstan-ignore return.type */
+ return $this->belongsTo(User::class);
+ }
+}
+
+class ChildPost extends Post {}
+
+final class Comment extends Model
+{
+ // This model is final, so either of these
+ // two methods would work. It seems that
+ // PHPStan is automatically converting the
+ // `$this` to a `self` type in the user docblock,
+ // but it is not doing so likewise for the `$this`
+ // that is returned by the dynamic return extension.
+
+ /** @return BelongsTo */
+ public function user(): BelongsTo
+ {
+ return $this->belongsTo(User::class);
+ }
+
+ /** @return BelongsTo */
+ public function user2(): BelongsTo
+ {
+ /** @phpstan-ignore return.type */
+ return $this->belongsTo(User::class);
+ }
+}
+
+function test(ChildPost $child): void
+{
+ assertType('Bug11857\BelongsTo', $child->user());
+ // This demonstrates why `$this` is needed in non-final models
+ assertType('Bug11857\BelongsTo', $child->userSelf()); // should be: Bug11857\BelongsTo
+}
diff --git a/e2e/bug-12606/phpstan.neon b/e2e/bug-12606/phpstan.neon
new file mode 100644
index 0000000000..1557144b26
--- /dev/null
+++ b/e2e/bug-12606/phpstan.neon
@@ -0,0 +1,2 @@
+includes:
+ - %env.CONFIGTEST%.neon
diff --git a/e2e/bug-12606/src/empty.php b/e2e/bug-12606/src/empty.php
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bug-12606/test.neon b/e2e/bug-12606/test.neon
new file mode 100644
index 0000000000..c308dcf542
--- /dev/null
+++ b/e2e/bug-12606/test.neon
@@ -0,0 +1,4 @@
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/bug-12606/test.php b/e2e/bug-12606/test.php
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bug-9622-trait/baseline-1.neon b/e2e/bug-9622-trait/baseline-1.neon
new file mode 100644
index 0000000000..caa24d89e8
--- /dev/null
+++ b/e2e/bug-9622-trait/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Offset 'foo' might not exist on array\\{foo\\?\\: int\\}\\.$#"
+ count: 1
+ path: src/UsesBar.php
diff --git a/e2e/bug-9622-trait/patch-1.patch b/e2e/bug-9622-trait/patch-1.patch
new file mode 100644
index 0000000000..cc2a6a622d
--- /dev/null
+++ b/e2e/bug-9622-trait/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Foo.php 2023-07-13 09:01:37
++++ src/Foo.php 2023-07-13 09:02:20
+@@ -3,7 +3,7 @@
+ namespace Bug9622Trait;
+
+ /**
+- * @phpstan-type AnArray array{foo: int}
++ * @phpstan-type AnArray array{foo?: int}
+ */
+ class Foo
+ {
diff --git a/e2e/bug-9622-trait/phpstan-baseline.neon b/e2e/bug-9622-trait/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bug-9622-trait/phpstan.neon b/e2e/bug-9622-trait/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/bug-9622-trait/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/bug-9622-trait/src/Bar.php b/e2e/bug-9622-trait/src/Bar.php
new file mode 100644
index 0000000000..082a948bd5
--- /dev/null
+++ b/e2e/bug-9622-trait/src/Bar.php
@@ -0,0 +1,19 @@
+ $query
+ *
+ * @return T
+ */
+ public function handle(QueryInterface $query);
+}
\ No newline at end of file
diff --git a/e2e/bug10449/src/Bus/QueryHandlerInterface.php b/e2e/bug10449/src/Bus/QueryHandlerInterface.php
new file mode 100644
index 0000000000..88faa0164a
--- /dev/null
+++ b/e2e/bug10449/src/Bus/QueryHandlerInterface.php
@@ -0,0 +1,9 @@
+queryBus->handle(new Query\ExampleQuery());
+ $this->needsString($value);
+ return $value;
+ }
+
+ private function needsString(string $s):void {}
+}
\ No newline at end of file
diff --git a/e2e/bug10449/src/Query/ExampleQuery.php b/e2e/bug10449/src/Query/ExampleQuery.php
new file mode 100644
index 0000000000..a5c7637793
--- /dev/null
+++ b/e2e/bug10449/src/Query/ExampleQuery.php
@@ -0,0 +1,15 @@
+
+ */
+final class ExampleQuery implements QueryInterface
+{
+}
\ No newline at end of file
diff --git a/e2e/bug10449/src/Query/ExampleQueryHandler.php b/e2e/bug10449/src/Query/ExampleQueryHandler.php
new file mode 100644
index 0000000000..e9bc1d59f0
--- /dev/null
+++ b/e2e/bug10449/src/Query/ExampleQueryHandler.php
@@ -0,0 +1,19 @@
+ $query
+ *
+ * @return T
+ */
+ public function handle(QueryInterface $query);
+}
\ No newline at end of file
diff --git a/e2e/bug10449b/src/Bus/QueryHandlerInterface.php b/e2e/bug10449b/src/Bus/QueryHandlerInterface.php
new file mode 100644
index 0000000000..88faa0164a
--- /dev/null
+++ b/e2e/bug10449b/src/Bus/QueryHandlerInterface.php
@@ -0,0 +1,9 @@
+queryBus->handle($x);
+ $this->needsString($value);
+ return $value;
+ }
+
+ return 'hello';
+ }
+
+ private function needsString(string $s):void {}
+}
\ No newline at end of file
diff --git a/e2e/bug10449b/src/Query/ExampleQuery.php b/e2e/bug10449b/src/Query/ExampleQuery.php
new file mode 100644
index 0000000000..a5c7637793
--- /dev/null
+++ b/e2e/bug10449b/src/Query/ExampleQuery.php
@@ -0,0 +1,15 @@
+
+ */
+final class ExampleQuery implements QueryInterface
+{
+}
\ No newline at end of file
diff --git a/e2e/bug10449b/src/Query/ExampleQueryHandler.php b/e2e/bug10449b/src/Query/ExampleQueryHandler.php
new file mode 100644
index 0000000000..e9bc1d59f0
--- /dev/null
+++ b/e2e/bug10449b/src/Query/ExampleQueryHandler.php
@@ -0,0 +1,19 @@
+eventDispatcher = sfContext::getInstance()->getEventDispatcher();
+ }
+
+ /**
+ * Calls methods defined via sfEventDispatcher.
+ *
+ * If a method cannot be found via sfEventDispatcher, the method name will
+ * be parsed to magically handle getMyFactory() and setMyFactory() methods.
+ *
+ * @param string $method The method name
+ * @param array $arguments The method arguments
+ *
+ * @return mixed The returned value of the called method
+ *
+ * @throws sfException if call fails
+ */
+ public function __call($method, $arguments)
+ {
+ $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'context.method_not_found', ['method' => $method, 'arguments' => $arguments]));
+ if (!$event->isProcessed()) {
+ $verb = substr($method, 0, 3); // get | set
+ $factory = strtolower(substr($method, 3)); // factory name
+
+ if ('get' == $verb && $this->has($factory)) {
+ return $this->factories[$factory];
+ }
+ if ('set' == $verb && isset($arguments[0])) {
+ return $this->set($factory, $arguments[0]);
+ }
+
+ throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
+ }
+
+ return $event->getReturnValue();
+ }
+
+ /**
+ * Creates a new context instance.
+ *
+ * @param sfApplicationConfiguration $configuration An sfApplicationConfiguration instance
+ * @param string $name A name for this context (application name by default)
+ * @param string $class The context class to use (sfContext by default)
+ *
+ * @return sfContext An sfContext instance
+ *
+ * @throws sfFactoryException
+ */
+ public static function createInstance(sfApplicationConfiguration $configuration, $name = null, $class = __CLASS__)
+ {
+ if (null === $name) {
+ $name = $configuration->getApplication();
+ }
+
+ self::$current = $name;
+
+ self::$instances[$name] = new $class();
+
+ if (!self::$instances[$name] instanceof sfContext) {
+ throw new sfFactoryException(sprintf('Class "%s" is not of the type sfContext.', $class));
+ }
+
+ self::$instances[$name]->initialize($configuration);
+
+ return self::$instances[$name];
+ }
+
+ /**
+ * Initializes the current sfContext instance.
+ *
+ * @param sfApplicationConfiguration $configuration An sfApplicationConfiguration instance
+ */
+ public function initialize(sfApplicationConfiguration $configuration)
+ {
+ $this->configuration = $configuration;
+ $this->dispatcher = $configuration->getEventDispatcher();
+
+ try {
+ $this->loadFactories();
+ } catch (sfException $e) {
+ $e->printStackTrace();
+ } catch (Exception $e) {
+ sfException::createFromException($e)->printStackTrace();
+ }
+
+ $this->dispatcher->connect('template.filter_parameters', [$this, 'filterTemplateParameters']);
+ $this->dispatcher->connect('response.fastcgi_finish_request', [$this, 'shutdownUserAndStorage']);
+
+ // register our shutdown function
+ register_shutdown_function([$this, 'shutdown']);
+ }
+
+ /**
+ * Retrieves the singleton instance of this class.
+ *
+ * @param string $name the name of the sfContext to retrieve
+ * @param string $class The context class to use (sfContext by default)
+ *
+ * @return sfContext an sfContext implementation instance
+ *
+ * @throws sfException
+ */
+ public static function getInstance($name = null, $class = __CLASS__)
+ {
+ if (null === $name) {
+ $name = self::$current;
+ }
+
+ if (!isset(self::$instances[$name])) {
+ throw new sfException(sprintf('The "%s" context does not exist.', $name));
+ }
+
+ return self::$instances[$name];
+ }
+
+ /**
+ * Checks to see if there has been a context created.
+ *
+ * @param string $name The name of the sfContext to check for
+ *
+ * @return bool true is instanced, otherwise false
+ */
+ public static function hasInstance($name = null)
+ {
+ if (null === $name) {
+ $name = self::$current;
+ }
+
+ return isset(self::$instances[$name]);
+ }
+
+ /**
+ * Loads the symfony factories.
+ */
+ public function loadFactories()
+ {
+ if (sfConfig::get('sf_use_database')) {
+ // setup our database connections
+ $this->factories['databaseManager'] = new sfDatabaseManager($this->configuration, ['auto_shutdown' => false]);
+ }
+
+ // create a new action stack
+ $this->factories['actionStack'] = new sfActionStack();
+
+ if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled')) {
+ $timer = sfTimerManager::getTimer('Factories');
+ }
+
+ // include the factories configuration
+ require $this->configuration->getConfigCache()->checkConfig('config/factories.yml');
+
+ $this->dispatcher->notify(new sfEvent($this, 'context.load_factories'));
+
+ if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled')) {
+ // @var $timer sfTimer
+ $timer->addTime();
+ }
+ }
+
+ /**
+ * Dispatches the current request.
+ */
+ public function dispatch()
+ {
+ $this->getController()->dispatch();
+ }
+
+ /**
+ * Sets the current context to something else.
+ *
+ * @param string $name The name of the context to switch to
+ */
+ public static function switchTo($name)
+ {
+ if (!isset(self::$instances[$name])) {
+ $currentConfiguration = sfContext::getInstance()->getConfiguration();
+ sfContext::createInstance(ProjectConfiguration::getApplicationConfiguration($name, $currentConfiguration->getEnvironment(), $currentConfiguration->isDebug()));
+ }
+
+ self::$current = $name;
+
+ sfContext::getInstance()->getConfiguration()->activate();
+ }
+
+ /**
+ * Returns the configuration instance.
+ *
+ * @return sfApplicationConfiguration The current application configuration instance
+ */
+ public function getConfiguration()
+ {
+ return $this->configuration;
+ }
+
+ /**
+ * Retrieves the current event dispatcher.
+ *
+ * @return sfEventDispatcher An sfEventDispatcher instance
+ */
+ public function getEventDispatcher()
+ {
+ return $this->dispatcher;
+ }
+
+ /**
+ * Retrieve the action name for this context.
+ *
+ * @return string|null the currently executing action name if one is set, null otherwise
+ */
+ public function getActionName()
+ {
+ // get the last action stack entry
+ if ($this->factories['actionStack'] && $lastEntry = $this->factories['actionStack']->getLastEntry()) {
+ // @var $lastEntry sfActionStackEntry
+ return $lastEntry->getActionName();
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve the ActionStack.
+ *
+ * @return sfActionStack the sfActionStack instance
+ */
+ public function getActionStack()
+ {
+ return $this->factories['actionStack'];
+ }
+
+ /**
+ * Retrieve the controller.
+ *
+ * @return sfFrontWebController the current sfController implementation instance
+ */
+ public function getController()
+ {
+ return isset($this->factories['controller']) ? $this->factories['controller'] : null;
+ }
+
+ /**
+ * Retrieves the mailer.
+ *
+ * @return sfMailer the current sfMailer implementation instance
+ */
+ public function getMailer()
+ {
+ if (!isset($this->factories['mailer'])) {
+ $this->factories['mailer'] = new $this->mailerConfiguration['class']($this->dispatcher, $this->mailerConfiguration);
+ }
+
+ return $this->factories['mailer'];
+ }
+
+ /**
+ * Set mailer configuration.
+ *
+ * @param array $configuration
+ */
+ public function setMailerConfiguration($configuration)
+ {
+ $this->mailerConfiguration = $configuration;
+ }
+
+ /**
+ * Retrieve the logger.
+ *
+ * @return sfLogger the current sfLogger implementation instance
+ */
+ public function getLogger()
+ {
+ if (!isset($this->factories['logger'])) {
+ $this->factories['logger'] = new sfNoLogger($this->dispatcher);
+ }
+
+ return $this->factories['logger'];
+ }
+
+ /**
+ * Retrieve a database connection from the database manager.
+ *
+ * This is a shortcut to manually getting a connection from an existing
+ * database implementation instance.
+ *
+ * If the [sf_use_database] setting is off, this will return null.
+ *
+ * @param string $name a database name
+ *
+ * @return mixed a database instance
+ *
+ * @throws sfDatabaseException if the requested database name does not exist
+ */
+ public function getDatabaseConnection($name = 'default')
+ {
+ if (null !== $this->factories['databaseManager']) {
+ return $this->factories['databaseManager']->getDatabase($name)->getConnection();
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve the database manager.
+ *
+ * @return sfDatabaseManager the current sfDatabaseManager instance
+ */
+ public function getDatabaseManager()
+ {
+ return isset($this->factories['databaseManager']) ? $this->factories['databaseManager'] : null;
+ }
+
+ /**
+ * Retrieve the module directory for this context.
+ *
+ * @return string|null an absolute filesystem path to the directory of the currently executing module if one is set, null otherwise
+ */
+ public function getModuleDirectory()
+ {
+ // get the last action stack entry
+ if (isset($this->factories['actionStack']) && $lastEntry = $this->factories['actionStack']->getLastEntry()) {
+ // @var $lastEntry sfActionStackEntry
+ return sfConfig::get('sf_app_module_dir').'/'.$lastEntry->getModuleName();
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve the module name for this context.
+ *
+ * @return string|null the currently executing module name if one is set, null otherwise
+ */
+ public function getModuleName()
+ {
+ // get the last action stack entry
+ if (isset($this->factories['actionStack']) && $lastEntry = $this->factories['actionStack']->getLastEntry()) {
+ // @var $lastEntry sfActionStackEntry
+ return $lastEntry->getModuleName();
+ }
+
+ return null;
+ }
+
+ /**
+ * Retrieve the request.
+ *
+ * @return sfRequest the current sfRequest implementation instance
+ */
+ public function getRequest()
+ {
+ return isset($this->factories['request']) ? $this->factories['request'] : null;
+ }
+
+ /**
+ * Retrieve the response.
+ *
+ * @return sfResponse the current sfResponse implementation instance
+ */
+ public function getResponse()
+ {
+ return isset($this->factories['response']) ? $this->factories['response'] : null;
+ }
+
+ /**
+ * Set the response object.
+ *
+ * @param sfResponse $response an sfResponse instance
+ */
+ public function setResponse($response)
+ {
+ $this->factories['response'] = $response;
+ }
+
+ /**
+ * Retrieve the storage.
+ *
+ * @return sfStorage the current sfStorage implementation instance
+ */
+ public function getStorage()
+ {
+ return isset($this->factories['storage']) ? $this->factories['storage'] : null;
+ }
+
+ /**
+ * Retrieve the view cache manager.
+ *
+ * @return sfViewCacheManager the current sfViewCacheManager implementation instance
+ */
+ public function getViewCacheManager()
+ {
+ return isset($this->factories['viewCacheManager']) ? $this->factories['viewCacheManager'] : null;
+ }
+
+ /**
+ * Retrieve the i18n instance.
+ *
+ * @return sfI18N the current sfI18N implementation instance
+ *
+ * @throws sfConfigurationException
+ */
+ public function getI18N()
+ {
+ if (!sfConfig::get('sf_i18n')) {
+ throw new sfConfigurationException('You must enable i18n support in your settings.yml configuration file.');
+ }
+
+ return $this->factories['i18n'];
+ }
+
+ /**
+ * Retrieve the routing instance.
+ *
+ * @return sfRouting the current sfRouting implementation instance
+ */
+ public function getRouting()
+ {
+ return isset($this->factories['routing']) ? $this->factories['routing'] : null;
+ }
+
+ /**
+ * Retrieve the user.
+ *
+ * @return sfUser the current sfUser implementation instance
+ */
+ public function getUser()
+ {
+ return isset($this->factories['user']) ? $this->factories['user'] : null;
+ }
+
+ /**
+ * Retrieves the service container.
+ *
+ * @return sfServiceContainer the current sfServiceContainer implementation instance
+ */
+ public function getServiceContainer()
+ {
+ if (!isset($this->factories['serviceContainer'])) {
+ $this->factories['serviceContainer'] = new $this->serviceContainerConfiguration['class']();
+ $this->factories['serviceContainer']->setService('sf_event_dispatcher', $this->configuration->getEventDispatcher());
+ $this->factories['serviceContainer']->setService('sf_formatter', new sfFormatter());
+ $this->factories['serviceContainer']->setService('sf_user', $this->getUser());
+ $this->factories['serviceContainer']->setService('sf_routing', $this->getRouting());
+ }
+
+ return $this->factories['serviceContainer'];
+ }
+
+ /**
+ * Set service ontainer configuration.
+ */
+ public function setServiceContainerConfiguration(array $config)
+ {
+ $this->serviceContainerConfiguration = $config;
+ }
+
+ /**
+ * Retrieves a service from the service container.
+ *
+ * @param string $id The service identifier
+ *
+ * @return object The service instance
+ */
+ public function getService($id)
+ {
+ return $this->getServiceContainer()->getService($id);
+ }
+
+ /**
+ * Returns the configuration cache.
+ *
+ * @return sfConfigCache A sfConfigCache instance
+ */
+ public function getConfigCache()
+ {
+ return $this->configuration->getConfigCache();
+ }
+
+ /**
+ * Returns true if the context object exists (implements the ArrayAccess interface).
+ *
+ * @param string $name The name of the context object
+ *
+ * @return bool true if the context object exists, false otherwise
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetExists($name)
+ {
+ return $this->has($name);
+ }
+
+ /**
+ * Returns the context object associated with the name (implements the ArrayAccess interface).
+ *
+ * @param string $name The offset of the value to get
+ *
+ * @return mixed The context object if exists, null otherwise
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($name)
+ {
+ return $this->get($name);
+ }
+
+ /**
+ * Sets the context object associated with the offset (implements the ArrayAccess interface).
+ *
+ * @param string $offset Service name
+ * @param mixed $value Service
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetSet($offset, $value)
+ {
+ $this->set($offset, $value);
+ }
+
+ /**
+ * Unsets the context object associated with the offset (implements the ArrayAccess interface).
+ *
+ * @param string $offset The parameter name
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetUnset($offset)
+ {
+ unset($this->factories[$offset]);
+ }
+
+ /**
+ * Gets an object from the current context.
+ *
+ * @param string $name The name of the object to retrieve
+ *
+ * @return object The object associated with the given name
+ */
+ public function get($name)
+ {
+ if (!$this->has($name)) {
+ throw new sfException(sprintf('The "%s" object does not exist in the current context.', $name));
+ }
+
+ return $this->factories[$name];
+ }
+
+ /**
+ * Puts an object in the current context.
+ *
+ * @param string $name The name of the object to store
+ * @param mixed $object The object to store
+ */
+ public function set($name, $object)
+ {
+ $this->factories[$name] = $object;
+ }
+
+ /**
+ * Returns true if an object is currently stored in the current context with the given name, false otherwise.
+ *
+ * @param string $name The object name
+ *
+ * @return bool true if the object is not null, false otherwise
+ */
+ public function has($name)
+ {
+ return isset($this->factories[$name]);
+ }
+
+ /**
+ * Listens to the template.filter_parameters event.
+ *
+ * @param sfEvent $event An sfEvent instance
+ * @param array $parameters An array of template parameters to filter
+ *
+ * @return array The filtered parameters array
+ */
+ public function filterTemplateParameters(sfEvent $event, $parameters)
+ {
+ $parameters['sf_context'] = $this;
+ $parameters['sf_request'] = $this->factories['request'];
+ $parameters['sf_params'] = $this->factories['request']->getParameterHolder();
+ $parameters['sf_response'] = $this->factories['response'];
+ $parameters['sf_user'] = $this->factories['user'];
+
+ return $parameters;
+ }
+
+ /**
+ * Shuts the user/storage down.
+ *
+ * @internal Should be called only via invoking "response.fastcgi_finish_request" or context shutting down.
+ */
+ public function shutdownUserAndStorage()
+ {
+ if (!$this->hasShutdownUserAndStorage && $this->has('user')) {
+ $this->getUser()->shutdown();
+ $this->getStorage()->shutdown();
+
+ $this->hasShutdownUserAndStorage = true;
+ }
+ }
+
+ /**
+ * Execute the shutdown procedure.
+ */
+ public function shutdown()
+ {
+ $this->shutdownUserAndStorage();
+
+ if ($this->has('routing')) {
+ $this->getRouting()->shutdown();
+ }
+
+ if (sfConfig::get('sf_use_database')) {
+ $this->getDatabaseManager()->shutdown();
+ }
+
+ if (sfConfig::get('sf_logging_enabled')) {
+ $this->getLogger()->shutdown();
+ }
+ }
+
+ /**
+ * Extract the class or interface name from filename.
+ *
+ * @param string $filename a filename
+ *
+ * @return string a class or interface name, if one can be extracted, otherwise null
+ */
+ public static function extractClassName($filename)
+ {
+ $retval = null;
+
+ if (self::isPathAbsolute($filename)) {
+ $filename = basename($filename);
+ }
+
+ $pattern = '/(.*?)\.(class|interface)\.php/i';
+
+ if (preg_match($pattern, $filename, $match)) {
+ $retval = $match[1];
+ }
+
+ return $retval;
+ }
+
+ /**
+ * Clear all files in a given directory.
+ *
+ * @param string $directory an absolute filesystem path to a directory
+ */
+ public static function clearDirectory($directory)
+ {
+ if (!is_dir($directory)) {
+ return;
+ }
+
+ // open a file point to the cache dir
+ $fp = opendir($directory);
+
+ // ignore names
+ $ignore = ['.', '..', 'CVS', '.svn'];
+
+ while (($file = readdir($fp)) !== false) {
+ if (!in_array($file, $ignore)) {
+ if (is_link($directory.'/'.$file)) {
+ // delete symlink
+ unlink($directory.'/'.$file);
+ } elseif (is_dir($directory.'/'.$file)) {
+ // recurse through directory
+ self::clearDirectory($directory.'/'.$file);
+
+ // delete the directory
+ rmdir($directory.'/'.$file);
+ } else {
+ // delete the file
+ unlink($directory.'/'.$file);
+ }
+ }
+ }
+
+ // close file pointer
+ closedir($fp);
+ }
+
+ /**
+ * Clear all files and directories corresponding to a glob pattern.
+ *
+ * @param string $pattern an absolute filesystem pattern
+ */
+ public static function clearGlob($pattern)
+ {
+ if (false === $files = glob($pattern)) {
+ return;
+ }
+
+ // order is important when removing directories
+ sort($files);
+
+ foreach ($files as $file) {
+ if (is_dir($file)) {
+ // delete directory
+ self::clearDirectory($file);
+ } else {
+ // delete file
+ unlink($file);
+ }
+ }
+ }
+
+ /**
+ * Determine if a filesystem path is absolute.
+ *
+ * @param string $path a filesystem path
+ *
+ * @return bool true, if the path is absolute, otherwise false
+ */
+ public static function isPathAbsolute($path)
+ {
+ if ('/' == $path[0] || '\\' == $path[0]
+ || (
+ strlen($path) > 3 && ctype_alpha($path[0])
+ && ':' == $path[1]
+ && ('\\' == $path[2] || '/' == $path[2])
+ )
+ ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Strips comments from php source code.
+ *
+ * @param string $source PHP source code
+ *
+ * @return string comment free source code
+ */
+ public static function stripComments($source)
+ {
+ if (!function_exists('token_get_all')) {
+ return $source;
+ }
+
+ $ignore = [T_COMMENT => true, T_DOC_COMMENT => true];
+ $output = '';
+
+ foreach (token_get_all($source) as $token) {
+ // array
+ if (isset($token[1])) {
+ // no action on comments
+ if (!isset($ignore[$token[0]])) {
+ // anything else -> output "as is"
+ $output .= $token[1];
+ }
+ } else {
+ // simple 1-character token
+ $output .= $token;
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * Strip slashes recursively from array.
+ *
+ * @param array $value the value to strip
+ *
+ * @return array clean value with slashes stripped
+ */
+ public static function stripslashesDeep($value)
+ {
+ return is_array($value) ? array_map(['sfToolkit', 'stripslashesDeep'], $value) : stripslashes($value);
+ }
+
+ // code from php at moechofe dot com (array_merge comment on php.net)
+ /*
+ * array arrayDeepMerge ( array array1 [, array array2 [, array ...]] )
+ *
+ * Like array_merge
+ *
+ * arrayDeepMerge() merges the elements of one or more arrays together so
+ * that the values of one are appended to the end of the previous one. It
+ * returns the resulting array.
+ * If the input arrays have the same string keys, then the later value for
+ * that key will overwrite the previous one. If, however, the arrays contain
+ * numeric keys, the later value will not overwrite the original value, but
+ * will be appended.
+ * If only one array is given and the array is numerically indexed, the keys
+ * get reindexed in a continuous way.
+ *
+ * Different from array_merge
+ * If string keys have arrays for values, these arrays will merge recursively.
+ */
+ public static function arrayDeepMerge()
+ {
+ switch (func_num_args()) {
+ case 0:
+ return false;
+
+ case 1:
+ return func_get_arg(0);
+
+ case 2:
+ $args = func_get_args();
+ $args[2] = [];
+ if (is_array($args[0]) && is_array($args[1])) {
+ foreach (array_unique(array_merge(array_keys($args[0]), array_keys($args[1]))) as $key) {
+ $isKey0 = array_key_exists($key, $args[0]);
+ $isKey1 = array_key_exists($key, $args[1]);
+ if ($isKey0 && $isKey1 && is_array($args[0][$key]) && is_array($args[1][$key])) {
+ $args[2][$key] = self::arrayDeepMerge($args[0][$key], $args[1][$key]);
+ } elseif ($isKey0 && $isKey1) {
+ $args[2][$key] = $args[1][$key];
+ } elseif (!$isKey1) {
+ $args[2][$key] = $args[0][$key];
+ } elseif (!$isKey0) {
+ $args[2][$key] = $args[1][$key];
+ }
+ }
+
+ return $args[2];
+ }
+
+ return $args[1];
+
+ default:
+ $args = func_get_args();
+ $args[1] = sfToolkit::arrayDeepMerge($args[0], $args[1]);
+ array_shift($args);
+
+ return call_user_func_array(['sfToolkit', 'arrayDeepMerge'], $args);
+
+ break;
+ }
+ }
+
+ /**
+ * Converts string to array.
+ *
+ * @param string $string the value to convert to array
+ *
+ * @return array
+ */
+ public static function stringToArray($string)
+ {
+ preg_match_all('/
+ \s*((?:\w+-)*\w+) # key \\1
+ \s*=\s* # =
+ (\'|")? # values may be included in \' or " \\2
+ (.*?) # value \\3
+ (?(2) \\2) # matching \' or " if needed \\4
+ \s*(?:
+ (?=\w+\s*=) | \s*$ # followed by another key= or the end of the string
+ )
+ /x', (string) $string, $matches, PREG_SET_ORDER);
+
+ $attributes = [];
+ foreach ($matches as $val) {
+ $attributes[$val[1]] = self::literalize($val[3]);
+ }
+
+ return $attributes;
+ }
+
+ /**
+ * Finds the type of the passed value, returns the value as the new type.
+ *
+ * @param string $value
+ * @param bool $quoted Quote?
+ */
+ public static function literalize($value, $quoted = false)
+ {
+ // lowercase our value for comparison
+ $value = trim($value);
+ $lvalue = strtolower($value);
+
+ if (in_array($lvalue, ['null', '~', ''])) {
+ $value = null;
+ } elseif (in_array($lvalue, ['true', 'on', '+', 'yes'])) {
+ $value = true;
+ } elseif (in_array($lvalue, ['false', 'off', '-', 'no'])) {
+ $value = false;
+ } elseif (ctype_digit($value)) {
+ $value = (int) $value;
+ } elseif (is_numeric($value)) {
+ $value = (float) $value;
+ } else {
+ $value = self::replaceConstants($value);
+ if ($quoted) {
+ $value = '\''.str_replace('\'', '\\\'', $value).'\'';
+ }
+ }
+
+ return $value;
+ }
+
+ /**
+ * Replaces constant identifiers in a scalar value.
+ *
+ * @param string $value the value to perform the replacement on
+ *
+ * @return string the value with substitutions made
+ */
+ public static function replaceConstants($value)
+ {
+ if (!is_string($value)) {
+ return $value;
+ }
+
+ return preg_replace_callback('/%(.+?)%/', function ($v) {
+ return sfConfig::has(strtolower($v[1])) ? sfConfig::get(strtolower($v[1])) : '%'.$v[1].'%';
+ }, $value);
+ }
+
+ /**
+ * Returns subject replaced with regular expression matchs.
+ *
+ * @param mixed $search subject to search
+ * @param array $replacePairs array of search => replace pairs
+ */
+ public static function pregtr($search, $replacePairs)
+ {
+ return preg_replace(array_keys($replacePairs), array_values($replacePairs), (string) $search);
+ }
+
+ /**
+ * Checks if array values are empty.
+ *
+ * @param array $array the array to check
+ *
+ * @return bool true if empty, otherwise false
+ */
+ public static function isArrayValuesEmpty($array)
+ {
+ static $isEmpty = true;
+ foreach ($array as $value) {
+ $isEmpty = is_array($value) ? self::isArrayValuesEmpty($value) : '' === (string) $value;
+ if (!$isEmpty) {
+ break;
+ }
+ }
+
+ return $isEmpty;
+ }
+
+ /**
+ * Checks if a string is an utf8.
+ *
+ * Yi Stone Li
+ * Copyright (c) 2007 Yahoo! Inc. All rights reserved.
+ * Licensed under the BSD open source license
+ *
+ * @param string
+ *
+ * @return bool true if $string is valid UTF-8 and false otherwise
+ */
+ public static function isUTF8($string)
+ {
+ for ($idx = 0, $strlen = strlen($string); $idx < $strlen; ++$idx) {
+ $byte = ord($string[$idx]);
+
+ if ($byte & 0x80) {
+ if (($byte & 0xE0) == 0xC0) {
+ // 2 byte char
+ $bytes_remaining = 1;
+ } elseif (($byte & 0xF0) == 0xE0) {
+ // 3 byte char
+ $bytes_remaining = 2;
+ } elseif (($byte & 0xF8) == 0xF0) {
+ // 4 byte char
+ $bytes_remaining = 3;
+ } else {
+ return false;
+ }
+
+ if ($idx + $bytes_remaining >= $strlen) {
+ return false;
+ }
+
+ while ($bytes_remaining--) {
+ if ((ord($string[++$idx]) & 0xC0) != 0x80) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns an array value for a path.
+ *
+ * @param array $values The values to search
+ * @param string $name The token name
+ * @param array $default Default if not found
+ *
+ * @return array
+ */
+ public static function getArrayValueForPath($values, $name, $default = null)
+ {
+ if (false === $offset = strpos($name, '[')) {
+ return isset($values[$name]) ? $values[$name] : $default;
+ }
+
+ if (!isset($values[substr($name, 0, $offset)])) {
+ return $default;
+ }
+
+ $array = $values[substr($name, 0, $offset)];
+
+ while (false !== $pos = strpos($name, '[', $offset)) {
+ $end = strpos($name, ']', $pos);
+ if ($end == $pos + 1) {
+ // reached a []
+ if (!is_array($array)) {
+ return $default;
+ }
+
+ break;
+ }
+ if (!isset($array[substr($name, $pos + 1, $end - $pos - 1)])) {
+ return $default;
+ }
+ if (is_array($array)) {
+ $array = $array[substr($name, $pos + 1, $end - $pos - 1)];
+ $offset = $end;
+ } else {
+ return $default;
+ }
+ }
+
+ return $array;
+ }
+
+ /**
+ * Get path to php cli.
+ *
+ * @return string
+ *
+ * @throws sfException If no php cli found
+ */
+ public static function getPhpCli()
+ {
+ $path = getenv('PATH') ?: getenv('Path');
+ $suffixes = DIRECTORY_SEPARATOR == '\\' ? (getenv('PATHEXT') ? explode(PATH_SEPARATOR, getenv('PATHEXT')) : ['.exe', '.bat', '.cmd', '.com']) : [''];
+ foreach (['php5', 'php'] as $phpCli) {
+ foreach ($suffixes as $suffix) {
+ foreach (explode(PATH_SEPARATOR, $path) as $dir) {
+ if (is_file($file = $dir.DIRECTORY_SEPARATOR.$phpCli.$suffix) && is_executable($file)) {
+ return $file;
+ }
+ }
+ }
+ }
+
+ throw new sfException('Unable to find PHP executable.');
+ }
+
+ /**
+ * Converts strings to UTF-8 via iconv. NB, the result may not by UTF-8 if the conversion failed.
+ *
+ * This file comes from Prado (BSD License)
+ *
+ * @param string $string string to convert to UTF-8
+ * @param string $from current encoding
+ *
+ * @return string UTF-8 encoded string, original string if iconv failed
+ */
+ public static function I18N_toUTF8($string, $from)
+ {
+ $from = strtoupper($from);
+ if ('UTF-8' != $from) {
+ $s = iconv($from, 'UTF-8', $string); // to UTF-8
+
+ return false !== $s ? $s : $string; // it could return false
+ }
+
+ return $string;
+ }
+
+ /**
+ * Converts UTF-8 strings to a different encoding. NB. The result may not have been encoded if iconv fails.
+ *
+ * This file comes from Prado (BSD License)
+ *
+ * @param string $string the UTF-8 string for conversion
+ * @param string $to new encoding
+ *
+ * @return string encoded string
+ */
+ public static function I18N_toEncoding($string, $to)
+ {
+ $to = strtoupper($to);
+ if ('UTF-8' != $to) {
+ $s = iconv('UTF-8', $to, $string);
+
+ return false !== $s ? $s : $string;
+ }
+
+ return $string;
+ }
+
+ /**
+ * Adds a path to the PHP include_path setting.
+ *
+ * @param mixed $path Single string path or an array of paths
+ * @param string $position Either 'front' or 'back'
+ *
+ * @return string The old include path
+ */
+ public static function addIncludePath($path, $position = 'front')
+ {
+ if (is_array($path)) {
+ foreach ('front' == $position ? array_reverse($path) : $path as $p) {
+ self::addIncludePath($p, $position);
+ }
+
+ return;
+ }
+
+ $paths = explode(PATH_SEPARATOR, get_include_path());
+
+ // remove what's already in the include_path
+ if (false !== $key = array_search(realpath($path), array_map('realpath', $paths))) {
+ unset($paths[$key]);
+ }
+
+ switch ($position) {
+ case 'front':
+ array_unshift($paths, $path);
+
+ break;
+
+ case 'back':
+ $paths[] = $path;
+
+ break;
+
+ default:
+ throw new InvalidArgumentException(sprintf('Unrecognized position: "%s"', $position));
+ }
+
+ return set_include_path(implode(PATH_SEPARATOR, $paths));
+ }
+
+ protected $type = 'file';
+ protected $names = [];
+ protected $prunes = [];
+ protected $discards = [];
+ protected $execs = [];
+ protected $mindepth = 0;
+ protected $sizes = [];
+ protected $maxdepth = 1000000;
+ protected $relative = false;
+ protected $follow_link = false;
+ protected $sort = false;
+ protected $ignore_version_control = true;
+
+ /**
+ * Sets maximum directory depth.
+ *
+ * Finder will descend at most $level levels of directories below the starting point.
+ *
+ * @param int $level
+ *
+ * @return sfFinder current sfFinder object
+ */
+ public function maxdepth($level)
+ {
+ $this->maxdepth = $level;
+
+ return $this;
+ }
+
+ /**
+ * Sets minimum directory depth.
+ *
+ * Finder will start applying tests at level $level.
+ *
+ * @param int $level
+ *
+ * @return sfFinder current sfFinder object
+ */
+ public function mindepth($level)
+ {
+ $this->mindepth = $level;
+
+ return $this;
+ }
+
+ public function get_type()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Sets the type of elements to returns.
+ *
+ * @param string $name directory or file or any (for both file and directory)
+ *
+ * @return sfFinder new sfFinder object
+ */
+ public static function type($name)
+ {
+ $finder = new self();
+
+ return $finder->setType($name);
+ }
+
+ /**
+ * Sets the type of elements to returns.
+ *
+ * @param string $name directory or file or any (for both file and directory)
+ *
+ * @return sfFinder Current object
+ */
+ public function setType($name)
+ {
+ $name = strtolower($name);
+
+ if ('dir' === substr($name, 0, 3)) {
+ $this->type = 'directory';
+
+ return $this;
+ }
+ if ('any' === $name) {
+ $this->type = 'any';
+
+ return $this;
+ }
+
+ $this->type = 'file';
+
+ return $this;
+ }
+
+ /**
+ * Adds rules that files must match.
+ *
+ * You can use patterns (delimited with / sign), globs or simple strings.
+ *
+ * $finder->name('*.php')
+ * $finder->name('/\.php$/') // same as above
+ * $finder->name('test.php')
+ *
+ * @param list a list of patterns, globs or strings
+ *
+ * @return sfFinder Current object
+ */
+ public function name()
+ {
+ $args = func_get_args();
+ $this->names = array_merge($this->names, $this->args_to_array($args));
+
+ return $this;
+ }
+
+ /**
+ * Adds rules that files must not match.
+ *
+ * @see ->name()
+ *
+ * @param list a list of patterns, globs or strings
+ *
+ * @return sfFinder Current object
+ */
+ public function not_name()
+ {
+ $args = func_get_args();
+ $this->names = array_merge($this->names, $this->args_to_array($args, true));
+
+ return $this;
+ }
+
+ /**
+ * Adds tests for file sizes.
+ *
+ * $finder->size('> 10K');
+ * $finder->size('<= 1Ki');
+ * $finder->size(4);
+ *
+ * @param list a list of comparison strings
+ *
+ * @return sfFinder Current object
+ */
+ public function size()
+ {
+ $args = func_get_args();
+ $numargs = count($args);
+ for ($i = 0; $i < $numargs; ++$i) {
+ $this->sizes[] = new sfNumberCompare($args[$i]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Traverses no further.
+ *
+ * @param list a list of patterns, globs to match
+ *
+ * @return sfFinder Current object
+ */
+ public function prune()
+ {
+ $args = func_get_args();
+ $this->prunes = array_merge($this->prunes, $this->args_to_array($args));
+
+ return $this;
+ }
+
+ /**
+ * Discards elements that matches.
+ *
+ * @param list a list of patterns, globs to match
+ *
+ * @return sfFinder Current object
+ */
+ public function discard()
+ {
+ $args = func_get_args();
+ $this->discards = array_merge($this->discards, $this->args_to_array($args));
+
+ return $this;
+ }
+
+ /**
+ * Ignores version control directories.
+ *
+ * Currently supports Subversion, CVS, DARCS, Gnu Arch, Monotone, Bazaar-NG, GIT, Mercurial
+ *
+ * @param bool $ignore falase when version control directories shall be included (default is true)
+ *
+ * @return sfFinder Current object
+ */
+ public function ignore_version_control($ignore = true)
+ {
+ $this->ignore_version_control = $ignore;
+
+ return $this;
+ }
+
+ /**
+ * Returns files and directories ordered by name.
+ *
+ * @return sfFinder Current object
+ */
+ public function sort_by_name()
+ {
+ $this->sort = 'name';
+
+ return $this;
+ }
+
+ /**
+ * Returns files and directories ordered by type (directories before files), then by name.
+ *
+ * @return sfFinder Current object
+ */
+ public function sort_by_type()
+ {
+ $this->sort = 'type';
+
+ return $this;
+ }
+
+ /**
+ * Executes function or method for each element.
+ *
+ * Element match if functino or method returns true.
+ *
+ * $finder->exec('myfunction');
+ * $finder->exec(array($object, 'mymethod'));
+ *
+ * @param mixed function or method to call
+ *
+ * @return sfFinder Current object
+ */
+ public function exec()
+ {
+ $args = func_get_args();
+ $numargs = count($args);
+ for ($i = 0; $i < $numargs; ++$i) {
+ if (is_array($args[$i]) && !method_exists($args[$i][0], $args[$i][1])) {
+ throw new sfException(sprintf('method "%s" does not exist for object "%s".', $args[$i][1], $args[$i][0]));
+ }
+ if (!is_array($args[$i]) && !function_exists($args[$i])) {
+ throw new sfException(sprintf('function "%s" does not exist.', $args[$i]));
+ }
+
+ $this->execs[] = $args[$i];
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns relative paths for all files and directories.
+ *
+ * @return sfFinder Current object
+ */
+ public function relative()
+ {
+ $this->relative = true;
+
+ return $this;
+ }
+
+ /**
+ * Symlink following.
+ *
+ * @return sfFinder Current object
+ */
+ public function follow_link()
+ {
+ $this->follow_link = true;
+
+ return $this;
+ }
+
+ /**
+ * Searches files and directories which match defined rules.
+ *
+ * @return array list of files and directories
+ */
+ public function in()
+ {
+ $files = [];
+ $here_dir = getcwd();
+
+ $finder = clone $this;
+
+ if ($this->ignore_version_control) {
+ $ignores = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg'];
+
+ $finder->discard($ignores)->prune($ignores);
+ }
+
+ // first argument is an array?
+ $numargs = func_num_args();
+ $arg_list = func_get_args();
+ if (1 === $numargs && is_array($arg_list[0])) {
+ $arg_list = $arg_list[0];
+ $numargs = count($arg_list);
+ }
+
+ for ($i = 0; $i < $numargs; ++$i) {
+ $dir = realpath($arg_list[$i]);
+
+ if (!is_dir($dir)) {
+ continue;
+ }
+
+ $dir = str_replace('\\', '/', $dir);
+
+ // absolute path?
+ if (!self::isPathAbsolute($dir)) {
+ $dir = $here_dir.'/'.$dir;
+ }
+
+ $new_files = str_replace('\\', '/', $finder->search_in($dir));
+
+ if ($this->relative) {
+ $new_files = preg_replace('#^'.preg_quote(rtrim($dir, '/'), '#').'/#', '', $new_files);
+ }
+
+ $files = array_merge($files, $new_files);
+ }
+
+ if ('name' === $this->sort) {
+ sort($files);
+ }
+
+ return array_unique($files);
+ }
+
+ public static function isPathAbsolute($path)
+ {
+ if ('/' === $path[0] || '\\' === $path[0]
+ || (
+ strlen($path) > 3 && ctype_alpha($path[0])
+ && ':' === $path[1]
+ && ('\\' === $path[2] || '/' === $path[2])
+ )
+ ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ // glob, patterns (must be //) or strings
+ protected function to_regex($str)
+ {
+ if (preg_match('/^(!)?([^a-zA-Z0-9\\\\]).+?\\2[ims]?$/', $str)) {
+ return $str;
+ }
+
+ return sfGlobToRegex::glob_to_regex($str);
+ }
+
+ protected function args_to_array($arg_list, $not = false)
+ {
+ $list = [];
+ $nbArgList = count($arg_list);
+ for ($i = 0; $i < $nbArgList; ++$i) {
+ if (is_array($arg_list[$i])) {
+ foreach ($arg_list[$i] as $arg) {
+ $list[] = [$not, $this->to_regex($arg)];
+ }
+ } else {
+ $list[] = [$not, $this->to_regex($arg_list[$i])];
+ }
+ }
+
+ return $list;
+ }
+
+ protected function search_in($dir, $depth = 0)
+ {
+ if ($depth > $this->maxdepth) {
+ return [];
+ }
+
+ $dir = realpath($dir);
+
+ if ((!$this->follow_link) && is_link($dir)) {
+ return [];
+ }
+
+ $files = [];
+ $temp_files = [];
+ $temp_folders = [];
+ if (is_dir($dir) && is_readable($dir)) {
+ $current_dir = opendir($dir);
+ while (false !== $entryname = readdir($current_dir)) {
+ if ('.' == $entryname || '..' == $entryname) {
+ continue;
+ }
+
+ $current_entry = $dir.DIRECTORY_SEPARATOR.$entryname;
+ if ((!$this->follow_link) && is_link($current_entry)) {
+ continue;
+ }
+
+ if (is_dir($current_entry)) {
+ if ('type' === $this->sort) {
+ $temp_folders[$entryname] = $current_entry;
+ } else {
+ if (('directory' === $this->type || 'any' === $this->type) && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->exec_ok($dir, $entryname)) {
+ $files[] = $current_entry;
+ }
+
+ if (!$this->is_pruned($dir, $entryname)) {
+ $files = array_merge($files, $this->search_in($current_entry, $depth + 1));
+ }
+ }
+ } else {
+ if (('directory' !== $this->type || 'any' === $this->type) && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->size_ok($dir, $entryname) && $this->exec_ok($dir, $entryname)) {
+ if ('type' === $this->sort) {
+ $temp_files[] = $current_entry;
+ } else {
+ $files[] = $current_entry;
+ }
+ }
+ }
+ }
+
+ if ('type' === $this->sort) {
+ ksort($temp_folders);
+ foreach ($temp_folders as $entryname => $current_entry) {
+ if (('directory' === $this->type || 'any' === $this->type) && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->exec_ok($dir, $entryname)) {
+ $files[] = $current_entry;
+ }
+
+ if (!$this->is_pruned($dir, $entryname)) {
+ $files = array_merge($files, $this->search_in($current_entry, $depth + 1));
+ }
+ }
+
+ sort($temp_files);
+ $files = array_merge($files, $temp_files);
+ }
+
+ closedir($current_dir);
+ }
+
+ return $files;
+ }
+
+ protected function match_names($dir, $entry)
+ {
+ if (!count($this->names)) {
+ return true;
+ }
+
+ // Flags indicating that there was attempts to match
+ // at least one "not_name" or "name" rule respectively
+ // to following variables:
+ $one_not_name_rule = false;
+ $one_name_rule = false;
+
+ foreach ($this->names as $args) {
+ list($not, $regex) = $args;
+ $not ? $one_not_name_rule = true : $one_name_rule = true;
+ if (preg_match($regex, $entry)) {
+ // We must match ONLY ONE "not_name" or "name" rule:
+ // if "not_name" rule matched then we return "false"
+ // if "name" rule matched then we return "true"
+ return $not ? false : true;
+ }
+ }
+
+ if ($one_not_name_rule && $one_name_rule) {
+ return false;
+ }
+ if ($one_not_name_rule) {
+ return true;
+ }
+ if ($one_name_rule) {
+ return false;
+ }
+
+ return true;
+ }
+
+ protected function size_ok($dir, $entry)
+ {
+ if (0 === count($this->sizes)) {
+ return true;
+ }
+
+ if (!is_file($dir.DIRECTORY_SEPARATOR.$entry)) {
+ return true;
+ }
+
+ $filesize = filesize($dir.DIRECTORY_SEPARATOR.$entry);
+ foreach ($this->sizes as $number_compare) {
+ if (!$number_compare->test($filesize)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected function is_pruned($dir, $entry)
+ {
+ if (0 === count($this->prunes)) {
+ return false;
+ }
+
+ foreach ($this->prunes as $args) {
+ $regex = $args[1];
+ if (preg_match($regex, $entry)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected function is_discarded($dir, $entry)
+ {
+ if (0 === count($this->discards)) {
+ return false;
+ }
+
+ foreach ($this->discards as $args) {
+ $regex = $args[1];
+ if (preg_match($regex, $entry)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected function exec_ok($dir, $entry)
+ {
+ if (0 === count($this->execs)) {
+ return true;
+ }
+
+ foreach ($this->execs as $exec) {
+ if (!call_user_func_array($exec, [$dir, $entry])) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Executes an application defined process prior to execution of this sfAction object.
+ *
+ * By default, this method is empty.
+ */
+ public function preExecute()
+ {
+ }
+
+ /**
+ * Execute an application defined process immediately after execution of this sfAction object.
+ *
+ * By default, this method is empty.
+ */
+ public function postExecute()
+ {
+ }
+
+ /**
+ * Forwards current action to the default 404 error action.
+ *
+ * @param string $message Message of the generated exception
+ *
+ * @throws sfError404Exception
+ */
+ public function forward404($message = null)
+ {
+ throw new sfError404Exception($this->get404Message($message));
+ }
+
+ /**
+ * Forwards current action to the default 404 error action unless the specified condition is true.
+ *
+ * @param bool $condition A condition that evaluates to true or false
+ * @param string $message Message of the generated exception
+ *
+ * @throws sfError404Exception
+ */
+ public function forward404Unless($condition, $message = null)
+ {
+ if (!$condition) {
+ throw new sfError404Exception($this->get404Message($message));
+ }
+ }
+
+ /**
+ * Forwards current action to the default 404 error action if the specified condition is true.
+ *
+ * @param bool $condition A condition that evaluates to true or false
+ * @param string $message Message of the generated exception
+ *
+ * @throws sfError404Exception
+ */
+ public function forward404If($condition, $message = null)
+ {
+ if ($condition) {
+ throw new sfError404Exception($this->get404Message($message));
+ }
+ }
+
+ /**
+ * Redirects current action to the default 404 error action (with browser redirection).
+ *
+ * This method stops the current code flow.
+ */
+ public function redirect404()
+ {
+ return $this->redirect('/'.sfConfig::get('sf_error_404_module').'/'.sfConfig::get('sf_error_404_action'));
+ }
+
+ /**
+ * Forwards current action to a new one (without browser redirection).
+ *
+ * This method stops the action. So, no code is executed after a call to this method.
+ *
+ * @param string $module A module name
+ * @param string $action An action name
+ *
+ * @throws sfStopException
+ */
+ public function forward($module, $action)
+ {
+ if (sfConfig::get('sf_logging_enabled')) {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', [sprintf('Forward to action "%s/%s"', $module, $action)]));
+ }
+
+ $this->getController()->forward($module, $action);
+
+ throw new sfStopException();
+ }
+
+ /**
+ * If the condition is true, forwards current action to a new one (without browser redirection).
+ *
+ * This method stops the action. So, no code is executed after a call to this method.
+ *
+ * @param bool $condition A condition that evaluates to true or false
+ * @param string $module A module name
+ * @param string $action An action name
+ *
+ * @throws sfStopException
+ */
+ public function forwardIf($condition, $module, $action)
+ {
+ if ($condition) {
+ $this->forward($module, $action);
+ }
+ }
+
+ /**
+ * Unless the condition is true, forwards current action to a new one (without browser redirection).
+ *
+ * This method stops the action. So, no code is executed after a call to this method.
+ *
+ * @param bool $condition A condition that evaluates to true or false
+ * @param string $module A module name
+ * @param string $action An action name
+ *
+ * @throws sfStopException
+ */
+ public function forwardUnless($condition, $module, $action)
+ {
+ if (!$condition) {
+ $this->forward($module, $action);
+ }
+ }
+
+ /**
+ * Redirects current request to a new URL.
+ *
+ * 2 URL formats are accepted :
+ * - a full URL: http://www.google.com/
+ * - an internal URL (url_for() format): module/action
+ *
+ * This method stops the action. So, no code is executed after a call to this method.
+ *
+ * @param string $url Url
+ * @param int $statusCode Status code (default to 302)
+ *
+ * @throws sfStopException
+ */
+ public function redirect($url, $statusCode = 302)
+ {
+ // compatibility with url_for2() style signature
+ if (is_object($statusCode) || is_array($statusCode)) {
+ $url = array_merge(['sf_route' => $url], is_object($statusCode) ? ['sf_subject' => $statusCode] : $statusCode);
+ $statusCode = func_num_args() >= 3 ? func_get_arg(2) : 302;
+ }
+
+ $this->getController()->redirect($url, 0, $statusCode);
+
+ throw new sfStopException();
+ }
+
+ /**
+ * Redirects current request to a new URL, only if specified condition is true.
+ *
+ * This method stops the action. So, no code is executed after a call to this method.
+ *
+ * @param bool $condition A condition that evaluates to true or false
+ * @param string $url Url
+ * @param int $statusCode Status code (default to 302)
+ *
+ * @throws sfStopException
+ *
+ * @see redirect
+ */
+ public function redirectIf($condition, $url, $statusCode = 302)
+ {
+ if ($condition) {
+ // compatibility with url_for2() style signature
+ $arguments = func_get_args();
+ call_user_func_array([$this, 'redirect'], array_slice($arguments, 1));
+ }
+ }
+
+ /**
+ * Redirects current request to a new URL, unless specified condition is true.
+ *
+ * This method stops the action. So, no code is executed after a call to this method.
+ *
+ * @param bool $condition A condition that evaluates to true or false
+ * @param string $url Url
+ * @param int $statusCode Status code (default to 302)
+ *
+ * @throws sfStopException
+ *
+ * @see redirect
+ */
+ public function redirectUnless($condition, $url, $statusCode = 302)
+ {
+ if (!$condition) {
+ // compatibility with url_for2() style signature
+ $arguments = func_get_args();
+ call_user_func_array([$this, 'redirect'], array_slice($arguments, 1));
+ }
+ }
+
+ /**
+ * Appends the given text to the response content and bypasses the built-in view system.
+ *
+ * This method must be called as with a return:
+ *
+ * return $this->renderText('some text')
+ *
+ * @param string $text Text to append to the response
+ *
+ * @return string sfView::NONE
+ */
+ public function renderText($text)
+ {
+ $this->getResponse()->setContent($this->getResponse()->getContent().$text);
+
+ return sfView::NONE;
+ }
+
+ /**
+ * Convert the given data into a JSON response.
+ *
+ * return $this->renderJson(array('username' => 'john'))
+ *
+ * @param mixed $data Data to encode as JSON
+ *
+ * @return string sfView::NONE
+ */
+ public function renderJson($data)
+ {
+ $this->getResponse()->setContentType('application/json');
+ $this->getResponse()->setContent(json_encode($data));
+
+ return sfView::NONE;
+ }
+
+ /**
+ * Returns the partial rendered content.
+ *
+ * If the vars parameter is omitted, the action's internal variables
+ * will be passed, just as it would to a normal template.
+ *
+ * If the vars parameter is set then only those values are
+ * available in the partial.
+ *
+ * @param string $templateName partial name
+ * @param array $vars vars
+ *
+ * @return string The partial content
+ */
+ public function getPartial($templateName, $vars = null)
+ {
+ $this->getContext()->getConfiguration()->loadHelpers('Partial');
+
+ $vars = null !== $vars ? $vars : $this->varHolder->getAll();
+
+ return get_partial($templateName, $vars);
+ }
+
+ /**
+ * Appends the result of the given partial execution to the response content.
+ *
+ * This method must be called as with a return:
+ *
+ * return $this->renderPartial('foo/bar')
+ *
+ * @param string $templateName partial name
+ * @param array $vars vars
+ *
+ * @return string sfView::NONE
+ *
+ * @see getPartial
+ */
+ public function renderPartial($templateName, $vars = null)
+ {
+ return $this->renderText($this->getPartial($templateName, $vars));
+ }
+
+ /**
+ * Returns the component rendered content.
+ *
+ * If the vars parameter is omitted, the action's internal variables
+ * will be passed, just as it would to a normal template.
+ *
+ * If the vars parameter is set then only those values are
+ * available in the component.
+ *
+ * @param string $moduleName module name
+ * @param string $componentName component name
+ * @param array $vars vars
+ *
+ * @return string The component rendered content
+ */
+ public function getComponent($moduleName, $componentName, $vars = null)
+ {
+ $this->getContext()->getConfiguration()->loadHelpers('Partial');
+
+ $vars = null !== $vars ? $vars : $this->varHolder->getAll();
+
+ return get_component($moduleName, $componentName, $vars);
+ }
+
+ /**
+ * Appends the result of the given component execution to the response content.
+ *
+ * This method must be called as with a return:
+ *
+ * return $this->renderComponent('foo', 'bar')
+ *
+ * @param string $moduleName module name
+ * @param string $componentName component name
+ * @param array $vars vars
+ *
+ * @return string sfView::NONE
+ *
+ * @see getComponent
+ */
+ public function renderComponent($moduleName, $componentName, $vars = null)
+ {
+ return $this->renderText($this->getComponent($moduleName, $componentName, $vars));
+ }
+
+ /**
+ * Returns the security configuration for this module.
+ *
+ * @return string Current security configuration as an array
+ */
+ public function getSecurityConfiguration()
+ {
+ return $this->security;
+ }
+
+ /**
+ * Overrides the current security configuration for this module.
+ *
+ * @param array $security The new security configuration
+ */
+ public function setSecurityConfiguration($security)
+ {
+ $this->security = $security;
+ }
+
+ /**
+ * Returns a value from security.yml.
+ *
+ * @param string $name The name of the value to pull from security.yml
+ * @param mixed $default The default value to return if none is found in security.yml
+ */
+ public function getSecurityValue($name, $default = null)
+ {
+ $actionName = strtolower($this->getActionName());
+
+ if (isset($this->security[$actionName][$name])) {
+ return $this->security[$actionName][$name];
+ }
+
+ if (isset($this->security['all'][$name])) {
+ return $this->security['all'][$name];
+ }
+
+ return $default;
+ }
+
+ /**
+ * Indicates that this action requires security.
+ *
+ * @return bool true, if this action requires security, otherwise false
+ */
+ public function isSecure()
+ {
+ return $this->getSecurityValue('is_secure', false);
+ }
+
+ /**
+ * Gets credentials the user must have to access this action.
+ *
+ * @return mixed An array or a string describing the credentials the user must have to access this action
+ */
+ public function getCredential()
+ {
+ return $this->getSecurityValue('credentials');
+ }
+
+ /**
+ * Sets an alternate template for this sfAction.
+ *
+ * See 'Naming Conventions' in the 'Symfony View' documentation.
+ *
+ * @param string $name Template name
+ * @param string $module The module (current if null)
+ */
+ public function setTemplate($name, $module = null)
+ {
+ if (sfConfig::get('sf_logging_enabled')) {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', [sprintf('Change template to "%s/%s"', null === $module ? 'CURRENT' : $module, $name)]));
+ }
+
+ if (null !== $module) {
+ $dir = $this->context->getConfiguration()->getTemplateDir($module, $name.sfView::SUCCESS.'.php');
+ $name = $dir.'/'.$name;
+ }
+
+ sfConfig::set('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_template', $name);
+ }
+
+ /**
+ * Gets the name of the alternate template for this sfAction.
+ *
+ * WARNING: It only returns the template you set with the setTemplate() method,
+ * and does not return the template that you configured in your view.yml.
+ *
+ * See 'Naming Conventions' in the 'Symfony View' documentation.
+ *
+ * @return string Template name. Returns null if no template has been set within the action
+ */
+ public function getTemplate()
+ {
+ return sfConfig::get('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_template');
+ }
+
+ /**
+ * Sets an alternate layout for this sfAction.
+ *
+ * To de-activate the layout, set the layout name to false.
+ *
+ * To revert the layout to the one configured in the view.yml, set the template name to null.
+ *
+ * @param mixed $name Layout name or false to de-activate the layout
+ */
+ public function setLayout($name)
+ {
+ if (sfConfig::get('sf_logging_enabled')) {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', [sprintf('Change layout to "%s"', $name)]));
+ }
+
+ sfConfig::set('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_layout', $name);
+ }
+
+ /**
+ * Gets the name of the alternate layout for this sfAction.
+ *
+ * WARNING: It only returns the layout you set with the setLayout() method,
+ * and does not return the layout that you configured in your view.yml.
+ *
+ * @return mixed Layout name. Returns null if no layout has been set within the action
+ */
+ public function getLayout()
+ {
+ return sfConfig::get('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_layout');
+ }
+
+ /**
+ * Changes the default view class used for rendering the template associated with the current action.
+ *
+ * @param string $class View class name
+ */
+ public function setViewClass($class)
+ {
+ sfConfig::set('mod_'.strtolower($this->getModuleName()).'_view_class', $class);
+ }
+
+ /**
+ * Returns the current route for this request.
+ *
+ * @return sfRoute The route for the request
+ */
+ public function getRoute()
+ {
+ return $this->getRequest()->getAttribute('sf_route');
+ }
+
+ /**
+ * Returns a formatted message for a 404 error.
+ *
+ * @param string $message An error message (null by default)
+ *
+ * @return string The error message or a default one if null
+ */
+ protected function get404Message($message = null)
+ {
+ return null === $message ? sprintf('This request has been forwarded to a 404 error page by the action "%s/%s".', $this->getModuleName(), $this->getActionName()) : $message;
+ }
+}
diff --git a/e2e/bug13425/src/Bundle/TICKeosMobileBundle/Service/V2019_09/MobileServiceApi.php b/e2e/bug13425/src/Bundle/TICKeosMobileBundle/Service/V2019_09/MobileServiceApi.php
new file mode 100644
index 0000000000..0ee3650ba8
--- /dev/null
+++ b/e2e/bug13425/src/Bundle/TICKeosMobileBundle/Service/V2019_09/MobileServiceApi.php
@@ -0,0 +1,93 @@
+accessTokenService = sfContext::getInstance()->getContainer()->get(AccessToken::class, ContainerInterface::NULL_ON_INVALID_REFERENCE);
+ }
+
+
+}
diff --git a/e2e/bug13425/src/Bundle/TICKeosMobileBundle/Service/V2024_3/MobileServiceApi.php b/e2e/bug13425/src/Bundle/TICKeosMobileBundle/Service/V2024_3/MobileServiceApi.php
new file mode 100644
index 0000000000..92655820dd
--- /dev/null
+++ b/e2e/bug13425/src/Bundle/TICKeosMobileBundle/Service/V2024_3/MobileServiceApi.php
@@ -0,0 +1,88 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 3>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('false', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('true', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/composer-max-version/.gitignore b/e2e/composer-max-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-max-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-max-version/composer.json b/e2e/composer-max-version/composer.json
new file mode 100644
index 0000000000..4d4ca141ef
--- /dev/null
+++ b/e2e/composer-max-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "<=8.3"
+ }
+}
diff --git a/e2e/composer-max-version/test.php b/e2e/composer-max-version/test.php
new file mode 100644
index 0000000000..038f559122
--- /dev/null
+++ b/e2e/composer-max-version/test.php
@@ -0,0 +1,10 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('int<5, 8>', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('-1|0|1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('bool', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('bool', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/composer-min-max-version/.gitignore b/e2e/composer-min-max-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-max-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-max-version/composer.json b/e2e/composer-min-max-version/composer.json
new file mode 100644
index 0000000000..869fd2ce42
--- /dev/null
+++ b/e2e/composer-min-max-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": ">=8.1, <=8.2.99"
+ }
+}
diff --git a/e2e/composer-min-max-version/test.php b/e2e/composer-min-max-version/test.php
new file mode 100644
index 0000000000..28d770f3bb
--- /dev/null
+++ b/e2e/composer-min-max-version/test.php
@@ -0,0 +1,10 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 2>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('false', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('true', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/composer-min-open-end-version/.gitignore b/e2e/composer-min-open-end-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-open-end-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-open-end-version/composer.json b/e2e/composer-min-open-end-version/composer.json
new file mode 100644
index 0000000000..b6303c6b77
--- /dev/null
+++ b/e2e/composer-min-open-end-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": ">= 8.1"
+ }
+}
diff --git a/e2e/composer-min-open-end-version/test.php b/e2e/composer-min-open-end-version/test.php
new file mode 100644
index 0000000000..9ed998185b
--- /dev/null
+++ b/e2e/composer-min-open-end-version/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 5>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-min-version-v5/.gitignore b/e2e/composer-min-version-v5/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-version-v5/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-version-v5/composer.json b/e2e/composer-min-version-v5/composer.json
new file mode 100644
index 0000000000..b73464d219
--- /dev/null
+++ b/e2e/composer-min-version-v5/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^5.6"
+ }
+}
diff --git a/e2e/composer-min-version-v5/test.php b/e2e/composer-min-version-v5/test.php
new file mode 100644
index 0000000000..2f652079a6
--- /dev/null
+++ b/e2e/composer-min-version-v5/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('5', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('6', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, 99>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-min-version-v7/.gitignore b/e2e/composer-min-version-v7/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-version-v7/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-version-v7/composer.json b/e2e/composer-min-version-v7/composer.json
new file mode 100644
index 0000000000..9f9b263871
--- /dev/null
+++ b/e2e/composer-min-version-v7/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^7"
+ }
+}
diff --git a/e2e/composer-min-version-v7/test.php b/e2e/composer-min-version-v7/test.php
new file mode 100644
index 0000000000..e8876bd78f
--- /dev/null
+++ b/e2e/composer-min-version-v7/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('7', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<0, 4>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-min-version/.gitignore b/e2e/composer-min-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-version/composer.json b/e2e/composer-min-version/composer.json
new file mode 100644
index 0000000000..9be64619f1
--- /dev/null
+++ b/e2e/composer-min-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^8.1"
+ }
+}
diff --git a/e2e/composer-min-version/test.php b/e2e/composer-min-version/test.php
new file mode 100644
index 0000000000..9ed998185b
--- /dev/null
+++ b/e2e/composer-min-version/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 5>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-no-versions/.gitignore b/e2e/composer-no-versions/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-no-versions/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-no-versions/composer.json b/e2e/composer-no-versions/composer.json
new file mode 100644
index 0000000000..2c63c08510
--- /dev/null
+++ b/e2e/composer-no-versions/composer.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/e2e/composer-no-versions/test.php b/e2e/composer-no-versions/test.php
new file mode 100644
index 0000000000..3cae7a0628
--- /dev/null
+++ b/e2e/composer-no-versions/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('int<5, 8>', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-version-config-invalid/phpstan.neon b/e2e/composer-version-config-invalid/phpstan.neon
new file mode 100644
index 0000000000..96977def5f
--- /dev/null
+++ b/e2e/composer-version-config-invalid/phpstan.neon
@@ -0,0 +1,5 @@
+parameters:
+ phpVersion:
+ min: 80303
+ max: 80104
+
diff --git a/e2e/composer-version-config-patch/.gitignore b/e2e/composer-version-config-patch/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-version-config-patch/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-version-config-patch/composer.json b/e2e/composer-version-config-patch/composer.json
new file mode 100644
index 0000000000..d6103988c8
--- /dev/null
+++ b/e2e/composer-version-config-patch/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": ">=8.0.2, <8.0.15"
+ }
+}
diff --git a/e2e/composer-version-config-patch/test.php b/e2e/composer-version-config-patch/test.php
new file mode 100644
index 0000000000..3f201eadab
--- /dev/null
+++ b/e2e/composer-version-config-patch/test.php
@@ -0,0 +1,7 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('0', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<2, 15>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-version-config/.gitignore b/e2e/composer-version-config/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-version-config/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-version-config/composer.json b/e2e/composer-version-config/composer.json
new file mode 100644
index 0000000000..2da0adaf1c
--- /dev/null
+++ b/e2e/composer-version-config/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^8.0"
+ }
+}
diff --git a/e2e/composer-version-config/phpstan.neon b/e2e/composer-version-config/phpstan.neon
new file mode 100644
index 0000000000..003e5e1484
--- /dev/null
+++ b/e2e/composer-version-config/phpstan.neon
@@ -0,0 +1,4 @@
+parameters:
+ phpVersion:
+ min: 80103
+ max: 80304
diff --git a/e2e/composer-version-config/test.php b/e2e/composer-version-config/test.php
new file mode 100644
index 0000000000..a9afaa4b65
--- /dev/null
+++ b/e2e/composer-version-config/test.php
@@ -0,0 +1,11 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 3>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('false', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('true', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/discussion-11362/.gitignore b/e2e/discussion-11362/.gitignore
new file mode 100644
index 0000000000..61ead86667
--- /dev/null
+++ b/e2e/discussion-11362/.gitignore
@@ -0,0 +1 @@
+/vendor
diff --git a/e2e/discussion-11362/composer.json b/e2e/discussion-11362/composer.json
new file mode 100644
index 0000000000..114bec3040
--- /dev/null
+++ b/e2e/discussion-11362/composer.json
@@ -0,0 +1,24 @@
+{
+ "config": {
+ "preferred-install": {
+ "*": "dist",
+ "repro/*": "source"
+ },
+ "sort-packages": true
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "repositories": [
+ {
+ "type": "path",
+ "url": "./packages/*/"
+ }
+ ],
+ "require": {
+ "repro/site": "@dev",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "1.11.7"
+ }
+}
diff --git a/e2e/discussion-11362/composer.lock b/e2e/discussion-11362/composer.lock
new file mode 100644
index 0000000000..b893bfb8cc
--- /dev/null
+++ b/e2e/discussion-11362/composer.lock
@@ -0,0 +1,103 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "49a30c2374c218ffcab0e58fd0628fab",
+ "packages": [
+ {
+ "name": "repro/site",
+ "version": "dev-main",
+ "dist": {
+ "type": "path",
+ "url": "./packages/site",
+ "reference": "0f4b564a39e8ff3758c1d96a2a5d4b72dea08b23"
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Repro\\Site\\": "Classes"
+ }
+ },
+ "transport-options": {
+ "relative": true
+ }
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.11.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/52d2bbfdcae7f895915629e4694e9497d0f8e28d",
+ "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-06T11:17:41+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": {
+ "repro/site": 20
+ },
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/ContentPage.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/ContentPage.php
new file mode 100644
index 0000000000..4ca5833958
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/ContentPage.php
@@ -0,0 +1,59 @@
+parentIssue;
+ }
+
+ public function getParentLesson(): ?Lesson
+ {
+ return $this->parentLesson;
+ }
+
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ public function getType(): string
+ {
+ return $this->type;
+ }
+
+ public function getNavigationVisible(): bool
+ {
+ return $this->navigationVisible;
+ }
+
+ public function getNavigationColor(): string
+ {
+ return $this->navigationColor;
+ }
+}
+
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/Issue.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Issue.php
new file mode 100644
index 0000000000..8343551215
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Issue.php
@@ -0,0 +1,45 @@
+parentSchoolYear;
+ }
+
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ public function getStartDate(): int
+ {
+ return $this->startDate;
+ }
+
+ public function getHolidayTitle(): string
+ {
+ return $this->holidayTitle;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/Lesson.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Lesson.php
new file mode 100644
index 0000000000..e00f2f0efb
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Lesson.php
@@ -0,0 +1,29 @@
+schoolLevel;
+ }
+
+ public function getParentIssue(): ?Issue
+ {
+ return $this->parentIssue;
+ }
+
+ public function getLessonNumber(): int
+ {
+ return $this->lessonNumber;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolLevel.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolLevel.php
new file mode 100644
index 0000000000..5c326ca596
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolLevel.php
@@ -0,0 +1,15 @@
+title;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolYear.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolYear.php
new file mode 100644
index 0000000000..a86f5bf575
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolYear.php
@@ -0,0 +1,40 @@
+startDate;
+ }
+
+ public function getEndDate(): int
+ {
+ return $this->endDate;
+ }
+
+ public function getIntroStartDate(): int
+ {
+ return $this->introStartDate;
+ }
+
+ public function getIntroEndDate(): int
+ {
+ return $this->introEndDate;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/composer.json b/e2e/discussion-11362/packages/site/composer.json
new file mode 100644
index 0000000000..ca413c1c8d
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/composer.json
@@ -0,0 +1,11 @@
+{
+ "autoload": {
+ "psr-4": {
+ "Repro\\Site\\": "Classes"
+ }
+ },
+ "name": "repro/site",
+ "require": {
+ "php": "^8.1"
+ }
+}
diff --git a/e2e/discussion-11362/phpstan.neon b/e2e/discussion-11362/phpstan.neon
new file mode 100644
index 0000000000..2e6178c1a7
--- /dev/null
+++ b/e2e/discussion-11362/phpstan.neon
@@ -0,0 +1,9 @@
+parameters:
+ excludePaths:
+ analyse:
+ - vendor
+
+ level: 1
+
+ paths:
+ - .
diff --git a/e2e/editor-mode/differentFoo.php b/e2e/editor-mode/differentFoo.php
new file mode 100644
index 0000000000..f6908fca5f
--- /dev/null
+++ b/e2e/editor-mode/differentFoo.php
@@ -0,0 +1,13 @@
+requireString($foo->doFoo());
+ }
+
+ public function requireString(string $s): void
+ {
+
+ }
+
+}
diff --git a/e2e/editor-mode/src/Foo.php b/e2e/editor-mode/src/Foo.php
new file mode 100644
index 0000000000..a91890871f
--- /dev/null
+++ b/e2e/editor-mode/src/Foo.php
@@ -0,0 +1,13 @@
+
+ */
+final class ClassCollector implements Collector
+{
+ public function getNodeType(): string
+ {
+ return Node\Stmt\Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope) : ?array
+ {
+ if ($node->name === null) {
+ return null;
+ }
+
+ return [$node->name->name, $node->getStartLine()];
+ }
+}
diff --git a/e2e/ignore-error-extension/src/ClassRule.php b/e2e/ignore-error-extension/src/ClassRule.php
new file mode 100644
index 0000000000..17283bafe5
--- /dev/null
+++ b/e2e/ignore-error-extension/src/ClassRule.php
@@ -0,0 +1,43 @@
+
+ */
+final class ClassRule implements Rule
+{
+ #[Override]
+ public function getNodeType() : string
+ {
+ return CollectedDataNode::class;
+ }
+
+ #[Override]
+ public function processNode(Node $node, Scope $scope) : array
+ {
+ $errors = [];
+
+ foreach ($node->get(ClassCollector::class) as $file => $data) {
+ foreach ($data as [$className, $line]) {
+ $errors[] = RuleErrorBuilder::message('This is an error from a rule that uses a collector')
+ ->file($file)
+ ->line($line)
+ ->identifier('class.name')
+ ->build();
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/e2e/ignore-error-extension/src/ControllerActionReturnTypeIgnoreExtension.php b/e2e/ignore-error-extension/src/ControllerActionReturnTypeIgnoreExtension.php
new file mode 100644
index 0000000000..dc7b0dab5a
--- /dev/null
+++ b/e2e/ignore-error-extension/src/ControllerActionReturnTypeIgnoreExtension.php
@@ -0,0 +1,41 @@
+getIdentifier() !== 'missingType.iterableValue') {
+ return false;
+ }
+
+ // @phpstan-ignore phpstanApi.instanceofAssumption
+ if (! $node instanceof InClassMethodNode) {
+ return false;
+ }
+
+ if (! str_ends_with($node->getClassReflection()->getName(), 'Controller')) {
+ return false;
+ }
+
+ if (! str_ends_with($node->getMethodReflection()->getName(), 'Action')) {
+ return false;
+ }
+
+ if (! $node->getMethodReflection()->isPublic()) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/e2e/ignore-error-extension/src/ControllerClassNameIgnoreExtension.php b/e2e/ignore-error-extension/src/ControllerClassNameIgnoreExtension.php
new file mode 100644
index 0000000000..b52b4f7ef1
--- /dev/null
+++ b/e2e/ignore-error-extension/src/ControllerClassNameIgnoreExtension.php
@@ -0,0 +1,34 @@
+getIdentifier() !== 'class.name') {
+ return false;
+ }
+
+ // @phpstan-ignore phpstanApi.instanceofAssumption
+ if (!$node instanceof CollectedDataNode) {
+ return false;
+ }
+
+ if (!str_ends_with($error->getFile(), 'Controller.php')) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/e2e/ignore-error-extension/src/HomepageController.php b/e2e/ignore-error-extension/src/HomepageController.php
new file mode 100644
index 0000000000..d55c955157
--- /dev/null
+++ b/e2e/ignore-error-extension/src/HomepageController.php
@@ -0,0 +1,29 @@
+ 'Homepage',
+ 'something' => $this->getSomething(),
+ ];
+ }
+
+ public function contactAction($someUnrelatedError): array
+ {
+ return [
+ 'title' => 'Contact',
+ 'something' => $this->getSomething(),
+ ];
+ }
+
+ private function getSomething(): array
+ {
+ return [];
+ }
+}
diff --git a/e2e/only-files-not-analysed-trait/ignore.neon b/e2e/only-files-not-analysed-trait/ignore.neon
new file mode 100644
index 0000000000..e0257ac498
--- /dev/null
+++ b/e2e/only-files-not-analysed-trait/ignore.neon
@@ -0,0 +1,10 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ ignoreErrors:
+ -
+ message: "#^Trait OnlyFilesNotAnalysedTrait\\\\BarTrait is used zero times and is not analysed\\.$#"
+ count: 1
+ path: src/BarTrait.php
diff --git a/e2e/only-files-not-analysed-trait/no-ignore.neon b/e2e/only-files-not-analysed-trait/no-ignore.neon
new file mode 100644
index 0000000000..899fee922c
--- /dev/null
+++ b/e2e/only-files-not-analysed-trait/no-ignore.neon
@@ -0,0 +1,5 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
diff --git a/e2e/only-files-not-analysed-trait/src/BarTrait.php b/e2e/only-files-not-analysed-trait/src/BarTrait.php
new file mode 100644
index 0000000000..efb6e5abb5
--- /dev/null
+++ b/e2e/only-files-not-analysed-trait/src/BarTrait.php
@@ -0,0 +1,8 @@
+= 8.1
+
+namespace PhpstanPhpUnit190;
+
+class FoobarTest
+{
+ public function testBaz(): int
+ {
+ $matcher = new self();
+ $this->acceptCallback(static function (string $test) use ($matcher): string {
+ match ($matcher->testBaz()) {
+ 1 => 1,
+ 2 => 2,
+ default => new \LogicException()
+ };
+
+ return $test;
+ });
+
+ return 1;
+ }
+
+ public function acceptCallback(callable $cb): void
+ {
+
+ }
+}
diff --git a/e2e/result-cache-1/baseline-1.neon b/e2e/result-cache-1/baseline-1.neon
new file mode 100644
index 0000000000..ff4bda03bd
--- /dev/null
+++ b/e2e/result-cache-1/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Call to an undefined method TestResultCache1\\\\Foo\\:\\:doFoo\\(\\)\\.$#"
+ count: 1
+ path: src/Baz.php
diff --git a/e2e/result-cache-1/patch-1.patch b/e2e/result-cache-1/patch-1.patch
new file mode 100644
index 0000000000..55f8d3c2be
--- /dev/null
+++ b/e2e/result-cache-1/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Bar.php 2022-10-17 20:57:35.000000000 +0200
++++ src/Bar2.php 2022-10-17 20:57:47.000000000 +0200
+@@ -5,7 +5,7 @@
+ class Bar
+ {
+
+- public function doFoo(): void
++ public function doFooo(): void
+ {
+
+ }
diff --git a/e2e/result-cache-1/phpstan-baseline.neon b/e2e/result-cache-1/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-1/phpstan.neon b/e2e/result-cache-1/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-1/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-1/src/Bar.php b/e2e/result-cache-1/src/Bar.php
new file mode 100644
index 0000000000..713500e65d
--- /dev/null
+++ b/e2e/result-cache-1/src/Bar.php
@@ -0,0 +1,13 @@
+doFoo();
+ }
+
+}
diff --git a/e2e/result-cache-1/src/Foo.php b/e2e/result-cache-1/src/Foo.php
new file mode 100644
index 0000000000..f51ae8be5a
--- /dev/null
+++ b/e2e/result-cache-1/src/Foo.php
@@ -0,0 +1,11 @@
+ in PHPDoc tag @use is not subtype of template type T of Exception of trait TestResultCache3\\\\BarTrait\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-3/patch-1.patch b/e2e/result-cache-3/patch-1.patch
new file mode 100644
index 0000000000..6507669199
--- /dev/null
+++ b/e2e/result-cache-3/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Baz.php 2022-10-24 14:28:45.000000000 +0200
++++ src/Baz.php 2022-10-24 14:30:02.000000000 +0200
+@@ -2,7 +2,7 @@
+
+ namespace TestResultCache3;
+
+-class Baz extends \Exception
++class Baz extends \stdClass
+ {
+
+ }
diff --git a/e2e/result-cache-3/phpstan-baseline.neon b/e2e/result-cache-3/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-3/phpstan.neon b/e2e/result-cache-3/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-3/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-3/src/BarTrait.php b/e2e/result-cache-3/src/BarTrait.php
new file mode 100644
index 0000000000..7529085522
--- /dev/null
+++ b/e2e/result-cache-3/src/BarTrait.php
@@ -0,0 +1,11 @@
+ */
+ use BarTrait;
+
+}
diff --git a/e2e/result-cache-4/baseline-1.neon b/e2e/result-cache-4/baseline-1.neon
new file mode 100644
index 0000000000..d54e5899ce
--- /dev/null
+++ b/e2e/result-cache-4/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^PHPDoc tag @var for property TestResultCache4\\\\Foo\\:\\:\\$foo with type TestResultCache4\\\\Bar is incompatible with native type Exception\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-4/patch-1.patch b/e2e/result-cache-4/patch-1.patch
new file mode 100644
index 0000000000..d8f6d0aa67
--- /dev/null
+++ b/e2e/result-cache-4/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Bar.php 2022-10-24 14:28:45.000000000 +0200
++++ src/Bar.php 2022-10-24 14:30:02.000000000 +0200
+@@ -2,7 +2,7 @@
+
+ namespace TestResultCache3;
+
+-class Bar extends \Exception
++class Bar extends \stdClass
+ {
+
+ }
diff --git a/e2e/result-cache-4/phpstan-baseline.neon b/e2e/result-cache-4/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-4/phpstan.neon b/e2e/result-cache-4/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-4/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-4/src/Bar.php b/e2e/result-cache-4/src/Bar.php
new file mode 100644
index 0000000000..d07bf2d9c9
--- /dev/null
+++ b/e2e/result-cache-4/src/Bar.php
@@ -0,0 +1,8 @@
+foo;
+ }
+
+}
diff --git a/e2e/result-cache-5/baseline-1.neon b/e2e/result-cache-5/baseline-1.neon
new file mode 100644
index 0000000000..f0db0c2a00
--- /dev/null
+++ b/e2e/result-cache-5/baseline-1.neon
@@ -0,0 +1,11 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Expected type true, actual\\: false$#"
+ count: 1
+ path: src/Foo.php
+
+ -
+ message: "#^Instanceof between TestResultCache5\\\\Baz and Exception will always evaluate to false\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-5/patch-1.patch b/e2e/result-cache-5/patch-1.patch
new file mode 100644
index 0000000000..69791cca29
--- /dev/null
+++ b/e2e/result-cache-5/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Baz.php 2022-10-24 14:28:45.000000000 +0200
++++ src/Baz.php 2022-10-24 14:30:02.000000000 +0200
+@@ -2,7 +2,7 @@
+
+ namespace TestResultCache5;
+
+-class Baz extends \Exception
++class Baz extends \stdClass
+ {
+
+ }
diff --git a/e2e/result-cache-5/phpstan-baseline.neon b/e2e/result-cache-5/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-5/phpstan.neon b/e2e/result-cache-5/phpstan.neon
new file mode 100644
index 0000000000..7c3f71ae98
--- /dev/null
+++ b/e2e/result-cache-5/phpstan.neon
@@ -0,0 +1,11 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ ignoreErrors:
+ -
+ identifier: instanceof.alwaysTrue
+ reportUnmatched: false
diff --git a/e2e/result-cache-5/src/Bar.php b/e2e/result-cache-5/src/Bar.php
new file mode 100644
index 0000000000..6df1b7ee81
--- /dev/null
+++ b/e2e/result-cache-5/src/Bar.php
@@ -0,0 +1,16 @@
+doBar($var);
+ assertType('true', $var instanceof \Exception);
+ }
+
+}
diff --git a/e2e/result-cache-6/baseline-1.neon b/e2e/result-cache-6/baseline-1.neon
new file mode 100644
index 0000000000..a9ebd9fb61
--- /dev/null
+++ b/e2e/result-cache-6/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Access to an undefined property TestResultCache6\\\\Bar\\:\\:\\$s\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-6/patch-1.patch b/e2e/result-cache-6/patch-1.patch
new file mode 100644
index 0000000000..e2d7e84db0
--- /dev/null
+++ b/e2e/result-cache-6/patch-1.patch
@@ -0,0 +1,10 @@
+diff --git b/e2e/result-cache-6/src/Baz.php a/e2e/result-cache-6/src/Baz.php
+index 4a94eb3ae..6fed0b9ec 100644
+--- b/e2e/result-cache-6/src/Baz.php
++++ a/e2e/result-cache-6/src/Baz.php
+@@ -4,5 +4,4 @@ namespace TestResultCache6;
+
+ class Baz
+ {
+- public string $s;
+ }
diff --git a/e2e/result-cache-6/phpstan-baseline.neon b/e2e/result-cache-6/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-6/phpstan.neon b/e2e/result-cache-6/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-6/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-6/src/Bar.php b/e2e/result-cache-6/src/Bar.php
new file mode 100644
index 0000000000..a9d6848bfe
--- /dev/null
+++ b/e2e/result-cache-6/src/Bar.php
@@ -0,0 +1,10 @@
+s;
+ }
+
+}
diff --git a/e2e/result-cache-7/baseline-1.neon b/e2e/result-cache-7/baseline-1.neon
new file mode 100644
index 0000000000..6f1062520d
--- /dev/null
+++ b/e2e/result-cache-7/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^PHPDoc tag @phpstan\\-require\\-implements cannot contain non\\-interface type TestResultCache7\\\\Bar\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-7/patch-1.patch b/e2e/result-cache-7/patch-1.patch
new file mode 100644
index 0000000000..a381f8b428
--- /dev/null
+++ b/e2e/result-cache-7/patch-1.patch
@@ -0,0 +1,12 @@
+diff --git a/e2e/result-cache-7/src/Bar.php b/e2e/result-cache-7/src/Bar.php
+index b698e695d..0bbcc3093 100644
+--- a/e2e/result-cache-7/src/Bar.php
++++ b/e2e/result-cache-7/src/Bar.php
+@@ -2,6 +2,6 @@
+
+ namespace TestResultCache7;
+
+-interface Bar
++class Bar
+ {
+ }
diff --git a/e2e/result-cache-7/phpstan-baseline.neon b/e2e/result-cache-7/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-7/phpstan.neon b/e2e/result-cache-7/phpstan.neon
new file mode 100644
index 0000000000..66c19c7166
--- /dev/null
+++ b/e2e/result-cache-7/phpstan.neon
@@ -0,0 +1,10 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ ignoreErrors:
+ -
+ identifier: trait.unused
diff --git a/e2e/result-cache-7/src/Bar.php b/e2e/result-cache-7/src/Bar.php
new file mode 100644
index 0000000000..b698e695dd
--- /dev/null
+++ b/e2e/result-cache-7/src/Bar.php
@@ -0,0 +1,7 @@
+
+ */
+class CustomRule implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ return [];
+ }
+
+}
diff --git a/e2e/result-cache-8/build/CustomRule2.php b/e2e/result-cache-8/build/CustomRule2.php
new file mode 100644
index 0000000000..413d37b54d
--- /dev/null
+++ b/e2e/result-cache-8/build/CustomRule2.php
@@ -0,0 +1,24 @@
+
+ */
+class CustomRule2 implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ return [];
+ }
+
+}
diff --git a/e2e/result-cache-8/composer.json b/e2e/result-cache-8/composer.json
new file mode 100644
index 0000000000..d29ab86e75
--- /dev/null
+++ b/e2e/result-cache-8/composer.json
@@ -0,0 +1,14 @@
+{
+ "require-dev": {
+ "phpstan/phpstan": "^1.10",
+ "phpstan/phpstan-webmozart-assert": "^1.2"
+ },
+ "autoload": {
+ "classmap": ["src"]
+ },
+ "autoload-dev": {
+ "classmap": [
+ "build"
+ ]
+ }
+}
diff --git a/e2e/result-cache-8/composer.lock b/e2e/result-cache-8/composer.lock
new file mode 100644
index 0000000000..23a7f311ea
--- /dev/null
+++ b/e2e/result-cache-8/composer.lock
@@ -0,0 +1,132 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "964b13a11680dbf7fa5291f0baa6d10c",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.10.63",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "ad12836d9ca227301f5fb9960979574ed8628339"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad12836d9ca227301f5fb9960979574ed8628339",
+ "reference": "ad12836d9ca227301f5fb9960979574ed8628339",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-03-18T16:53:53+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-webmozart-assert",
+ "version": "1.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-webmozart-assert.git",
+ "reference": "d1ff28697bd4e1c9ef5d3f871367ce9092871fec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-webmozart-assert/zipball/d1ff28697bd4e1c9ef5d3f871367ce9092871fec",
+ "reference": "d1ff28697bd4e1c9ef5d3f871367ce9092871fec",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.10"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^4.13.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-deprecation-rules": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "webmozart/assert": "^1.11.0"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan webmozart/assert extension",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-webmozart-assert/issues",
+ "source": "https://github.com/phpstan/phpstan-webmozart-assert/tree/1.2.4"
+ },
+ "time": "2023-02-21T20:34:19+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/e2e/result-cache-8/phpstan.neon b/e2e/result-cache-8/phpstan.neon
new file mode 100644
index 0000000000..c7fd83c756
--- /dev/null
+++ b/e2e/result-cache-8/phpstan.neon
@@ -0,0 +1,17 @@
+includes:
+ - vendor/phpstan/phpstan-webmozart-assert/extension.neon
+
+parameters:
+ paths:
+ - src
+ level: 8
+
+rules:
+ - ResultCache8E2E\CustomRule
+ - ResultCache8E2E\CustomRule3
+
+services:
+ -
+ class: ResultCache8E2E\CustomRule2
+ tags:
+ - phpstan.rules.rule
diff --git a/e2e/result-cache-8/src/CustomRule3.php b/e2e/result-cache-8/src/CustomRule3.php
new file mode 100644
index 0000000000..1f0ca326e1
--- /dev/null
+++ b/e2e/result-cache-8/src/CustomRule3.php
@@ -0,0 +1,24 @@
+
+ */
+class CustomRule3 implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ return [];
+ }
+
+}
diff --git a/e2e/result-cache-8/src/Foo.php b/e2e/result-cache-8/src/Foo.php
new file mode 100644
index 0000000000..0082675fde
--- /dev/null
+++ b/e2e/result-cache-8/src/Foo.php
@@ -0,0 +1,8 @@
+doFooTrait();
+ }
+
+}
diff --git a/e2e/result-cache-traits/src/ClassUsingBarTrait.php b/e2e/result-cache-traits/src/ClassUsingBarTrait.php
new file mode 100644
index 0000000000..e8063edef4
--- /dev/null
+++ b/e2e/result-cache-traits/src/ClassUsingBarTrait.php
@@ -0,0 +1,10 @@
+=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "Clue\\StreamFilter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ }
+ ],
+ "description": "A simple and modern approach to stream filtering in PHP",
+ "homepage": "https://github.com/clue/stream-filter",
+ "keywords": [
+ "bucket brigade",
+ "callback",
+ "filter",
+ "php_user_filter",
+ "stream",
+ "stream_filter_append",
+ "stream_filter_register"
+ ],
+ "support": {
+ "issues": "https://github.com/clue/stream-filter/issues",
+ "source": "https://github.com/clue/stream-filter/tree/v1.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://clue.engineering/support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-20T15:40:13+00:00"
+ },
+ {
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.42",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+ "scrutinizer/ocular": "1.6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dflydev\\DotAccessData\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Dragonfly Development Inc.",
+ "email": "info@dflydev.com",
+ "homepage": "http://dflydev.com"
+ },
+ {
+ "name": "Beau Simensen",
+ "email": "beau@dflydev.com",
+ "homepage": "http://beausimensen.com"
+ },
+ {
+ "name": "Carlos Frutos",
+ "email": "carlos@kiwing.it",
+ "homepage": "https://github.com/cfrutos"
+ },
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com"
+ }
+ ],
+ "description": "Given a deep data structure, access data by dot notation.",
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+ "keywords": [
+ "access",
+ "data",
+ "dot",
+ "notation"
+ ],
+ "support": {
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
+ },
+ "time": "2024-07-08T12:26:09+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
+ "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^2.3",
+ "guzzlehttp/psr7": "^2.8",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "ext-curl": "*",
+ "guzzle/client-integration-tests": "3.0.2",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-23T22:36:01+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "481557b130ef3790cf82b713667b43030dc9c957"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957",
+ "reference": "481557b130ef3790cf82b713667b43030dc9c957",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-22T14:34:08+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "21dc724a0583619cd1652f673303492272778051"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051",
+ "reference": "21dc724a0583619cd1652f673303492272778051",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.8.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-23T21:21:41+00:00"
+ },
+ {
+ "name": "knplabs/github-api",
+ "version": "v3.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/KnpLabs/php-github-api.git",
+ "reference": "25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28",
+ "reference": "25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2.5 || ^8.0",
+ "php-http/cache-plugin": "^1.7.1|^2.0",
+ "php-http/client-common": "^2.3",
+ "php-http/discovery": "^1.12",
+ "php-http/httplug": "^2.2",
+ "php-http/multipart-stream-builder": "^1.1.2",
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "psr/http-client-implementation": "^1.0",
+ "psr/http-factory-implementation": "^1.0",
+ "psr/http-message": "^1.0|^2.0",
+ "symfony/deprecation-contracts": "^2.2|^3.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^7.2",
+ "guzzlehttp/psr7": "^2.7",
+ "http-interop/http-factory-guzzle": "^1.0",
+ "php-http/mock-client": "^1.4.1",
+ "phpstan/extension-installer": "^1.0.5",
+ "phpstan/phpstan": "^0.12.57",
+ "phpstan/phpstan-deprecation-rules": "^0.12.5",
+ "phpunit/phpunit": "^8.5 || ^9.4",
+ "symfony/cache": "^5.1.8",
+ "symfony/phpunit-bridge": "^5.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.20.x-dev",
+ "dev-master": "3.15-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Github\\": "lib/Github/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KnpLabs Team",
+ "homepage": "http://knplabs.com"
+ },
+ {
+ "name": "Thibault Duplessis",
+ "email": "thibault.duplessis@gmail.com",
+ "homepage": "http://ornicar.github.com"
+ }
+ ],
+ "description": "GitHub API v3 client",
+ "homepage": "https://github.com/KnpLabs/php-github-api",
+ "keywords": [
+ "api",
+ "gh",
+ "gist",
+ "github"
+ ],
+ "support": {
+ "issues": "https://github.com/KnpLabs/php-github-api/issues",
+ "source": "https://github.com/KnpLabs/php-github-api/tree/v3.16.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/acrobat",
+ "type": "github"
+ }
+ ],
+ "time": "2024-11-07T19:35:30+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "10732241927d3971d28e7ea7b5712721fa2296ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca",
+ "reference": "10732241927d3971d28e7ea7b5712721fa2296ca",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "league/config": "^1.1.1",
+ "php": "^7.4 || ^8.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "cebe/markdown": "^1.0",
+ "commonmark/cmark": "0.31.1",
+ "commonmark/commonmark.js": "0.31.1",
+ "composer/package-versions-deprecated": "^1.8",
+ "embed/embed": "^4.4",
+ "erusev/parsedown": "^1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "^1.4 || ^2.0",
+ "nyholm/psr7": "^1.5",
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "forum": "https://github.com/thephpleague/commonmark/discussions",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-20T12:47:49+00:00"
+ },
+ {
+ "name": "league/config",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/config.git",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "shasum": ""
+ },
+ "require": {
+ "dflydev/dot-access-data": "^3.0.1",
+ "nette/schema": "^1.2",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Config\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Define configuration arrays with strict schemas and access values with dot notation",
+ "homepage": "https://config.thephpleague.com",
+ "keywords": [
+ "array",
+ "config",
+ "configuration",
+ "dot",
+ "dot-access",
+ "nested",
+ "schema"
+ ],
+ "support": {
+ "docs": "https://config.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/config/issues",
+ "rss": "https://github.com/thephpleague/config/releases.atom",
+ "source": "https://github.com/thephpleague/config"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-11T20:36:23+00:00"
+ },
+ {
+ "name": "nette/neon",
+ "version": "v3.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/neon.git",
+ "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/neon/zipball/3411aa86b104e2d5b7e760da4600865ead963c3c",
+ "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "8.0 - 8.4"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "bin": [
+ "bin/neon-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
+ "homepage": "https://ne-on.org",
+ "keywords": [
+ "export",
+ "import",
+ "neon",
+ "nette",
+ "yaml"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/neon/issues",
+ "source": "https://github.com/nette/neon/tree/v3.4.4"
+ },
+ "time": "2024-10-04T22:00:08+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
+ "php": "7.1 - 8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.3 || ^2.4",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.2.5"
+ },
+ "time": "2023-10-05T20:37:59+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v3.2.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2 <8.4"
+ },
+ "conflict": {
+ "nette/di": "<3.0.6"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "~2.0",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.3"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
+ "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v3.2.10"
+ },
+ "time": "2023-07-30T15:38:18+00:00"
+ },
+ {
+ "name": "php-http/cache-plugin",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/cache-plugin.git",
+ "reference": "5c591e9e04602cec12307e3e1be3abefeb005e29"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/5c591e9e04602cec12307e3e1be3abefeb005e29",
+ "reference": "5c591e9e04602cec12307e3e1be3abefeb005e29",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/client-common": "^1.9 || ^2.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "psr/http-factory-implementation": "^1.0",
+ "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.6.1",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\Plugin\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "PSR-6 Cache plugin for HTTPlug",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "cache",
+ "http",
+ "httplug",
+ "plugin"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/cache-plugin/issues",
+ "source": "https://github.com/php-http/cache-plugin/tree/2.0.1"
+ },
+ "time": "2024-10-02T11:25:38+00:00"
+ },
+ {
+ "name": "php-http/client-common",
+ "version": "2.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/client-common.git",
+ "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46",
+ "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/httplug": "^2.0",
+ "php-http/message": "^1.6",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.1",
+ "guzzlehttp/psr7": "^1.4",
+ "nyholm/psr7": "^1.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "phpspec/prophecy": "^1.10.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+ },
+ "suggest": {
+ "ext-json": "To detect JSON responses with the ContentTypePlugin",
+ "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+ "php-http/cache-plugin": "PSR-6 Cache plugin",
+ "php-http/logger-plugin": "PSR-3 Logger plugin",
+ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Common HTTP Client implementations and tools for HTTPlug",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "common",
+ "http",
+ "httplug"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/client-common/issues",
+ "source": "https://github.com/php-http/client-common/tree/2.7.2"
+ },
+ "time": "2024-09-24T06:21:48+00:00"
+ },
+ {
+ "name": "php-http/discovery",
+ "version": "1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/discovery.git",
+ "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d",
+ "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "nyholm/psr7": "<1.0",
+ "zendframework/zend-diactoros": "*"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "*",
+ "psr/http-factory-implementation": "*",
+ "psr/http-message-implementation": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "graham-campbell/phpspec-skip-example-extension": "^5.0",
+ "php-http/httplug": "^1.0 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+ "sebastian/comparator": "^3.0.5 || ^4.0.8",
+ "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Http\\Discovery\\Composer\\Plugin",
+ "plugin-optional": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Discovery\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Composer/Plugin.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "adapter",
+ "client",
+ "discovery",
+ "factory",
+ "http",
+ "message",
+ "psr17",
+ "psr7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/discovery/issues",
+ "source": "https://github.com/php-http/discovery/tree/1.20.0"
+ },
+ "time": "2024-10-02T11:20:13+00:00"
+ },
+ {
+ "name": "php-http/httplug",
+ "version": "2.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/httplug.git",
+ "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4",
+ "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/promise": "^1.1",
+ "psr/http-client": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "HTTPlug, the HTTP client abstraction for PHP",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/httplug/issues",
+ "source": "https://github.com/php-http/httplug/tree/2.4.1"
+ },
+ "time": "2024-09-23T11:39:58+00:00"
+ },
+ {
+ "name": "php-http/message",
+ "version": "1.16.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message.git",
+ "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
+ "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
+ "shasum": ""
+ },
+ "require": {
+ "clue/stream-filter": "^1.5",
+ "php": "^7.2 || ^8.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.6",
+ "ext-zlib": "*",
+ "guzzlehttp/psr7": "^1.0 || ^2.0",
+ "laminas/laminas-diactoros": "^2.0 || ^3.0",
+ "php-http/message-factory": "^1.0.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "slim/slim": "^3.0"
+ },
+ "suggest": {
+ "ext-zlib": "Used with compressor/decompressor streams",
+ "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+ "laminas/laminas-diactoros": "Used with Diactoros Factories",
+ "slim/slim": "Used with Slim Framework PSR-7 implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/filters.php"
+ ],
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "HTTP Message related tools",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message/issues",
+ "source": "https://github.com/php-http/message/tree/1.16.2"
+ },
+ "time": "2024-10-02T11:34:13+00:00"
+ },
+ {
+ "name": "php-http/multipart-stream-builder",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/multipart-stream-builder.git",
+ "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e",
+ "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/discovery": "^1.15",
+ "psr/http-factory-implementation": "^1.0"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.0",
+ "php-http/message": "^1.5",
+ "php-http/message-factory": "^1.0.2",
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\MultipartStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ }
+ ],
+ "description": "A builder class that help you create a multipart stream",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "multipart stream",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/multipart-stream-builder/issues",
+ "source": "https://github.com/php-http/multipart-stream-builder/tree/1.4.2"
+ },
+ "time": "2024-09-04T13:22:54+00:00"
+ },
+ {
+ "name": "php-http/promise",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/promise.git",
+ "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+ "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+ "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joel Wurtz",
+ "email": "joel.wurtz@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Promise used for asynchronous HTTP requests",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/promise/issues",
+ "source": "https://github.com/php-http/promise/tree/1.3.1"
+ },
+ "time": "2024-03-15T13:55:21+00:00"
+ },
+ {
+ "name": "phpstan/phpstan",
+ "version": "2.1.29",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-phar-composer-source.git",
+ "reference": "git"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d618573eed4a1b6b75e37b2e0b65ac65c885d88e",
+ "reference": "d618573eed4a1b6b75e37b2e0b65ac65c885d88e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2025-09-25T06:58:18+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-strict-rules",
+ "version": "2.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-strict-rules.git",
+ "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/d6211c46213d4181054b3d77b10a5c5cb0d59538",
+ "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.1.29"
+ },
+ "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"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Extra strict and opinionated rules for PHPStan",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
+ "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.7"
+ },
+ "time": "2025-09-26T11:19:08+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client"
+ },
+ "time": "2023-09-23T14:17:50+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory"
+ },
+ "time": "2024-04-15T12:06:14+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.4.25",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/273fd29ff30ba0a88ca5fb83f7cf1ab69306adae",
+ "reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.4.25"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-22T10:21:53+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "73089124388c8510efb8d2d1689285d285937b08"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/73089124388c8510efb8d2d1689285d285937b08",
+ "reference": "73089124388c8510efb8d2d1689285d285937b08",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T12:02:45+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v7.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
+ "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v7.3.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-05T10:16:07+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-27T09:58:17+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-02T08:10:11+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-25T09:37:31+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
+ "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.3.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-25T06:35:40+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.13.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-01T08:46:24+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
+ "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1"
+ },
+ "time": "2025-08-13T20:13:15+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.32",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "sebastian/code-unit-reverse-lookup": "^2.0.3",
+ "sebastian/complexity": "^2.0.3",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/lines-of-code": "^1.0.4",
+ "sebastian/version": "^3.0.2",
+ "theseer/tokenizer": "^1.2.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "9.2.x-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 that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "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/9.2.32"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-22T04:23:01+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.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": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.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": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.6.29",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "9ecfec57835a5581bc888ea7e13b51eb55ab9dd3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9ecfec57835a5581bc888ea7e13b51eb55ab9dd3",
+ "reference": "9ecfec57835a5581bc888ea7e13b51eb55ab9dd3",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.5.0 || ^2",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.13.4",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.32",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.4",
+ "phpunit/php-timer": "^5.0.3",
+ "sebastian/cli-parser": "^1.0.2",
+ "sebastian/code-unit": "^1.0.8",
+ "sebastian/comparator": "^4.0.9",
+ "sebastian/diff": "^4.0.6",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/exporter": "^4.0.8",
+ "sebastian/global-state": "^5.0.8",
+ "sebastian/object-enumerator": "^4.0.4",
+ "sebastian/resource-operations": "^3.0.4",
+ "sebastian/type": "^3.2.1",
+ "sebastian/version": "^3.0.2"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.29"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-09-24T06:29:11+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "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 parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:27:43+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "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": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5",
+ "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T06:51:50+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:19:30+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:30:58+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:03:51+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c",
+ "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-09-24T06:03:27+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6",
+ "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T07:10:35+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "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 counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:20:34+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "539c6691e0623af6dc6f9c20384c120f963465a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0",
+ "reference": "539c6691e0623af6dc6f9c20384c120f963465a0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T06:57:39+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-14T16:00:52+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:13:03+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.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 that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:36:25+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": {},
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.3"
+ },
+ "platform-dev": {},
+ "platform-overrides": {
+ "php": "8.3.99"
+ },
+ "plugin-api-version": "2.6.0"
+}
diff --git a/issue-bot/console.php b/issue-bot/console.php
new file mode 100755
index 0000000000..fd1dfa73a8
--- /dev/null
+++ b/issue-bot/console.php
@@ -0,0 +1,73 @@
+#!/usr/bin/env php
+addPlugin($rateLimitPlugin);
+ $httpBuilder->addPlugin($requestCounter);
+
+ $client = new Client($httpBuilder);
+ $client->authenticate($token, AuthMethod::ACCESS_TOKEN);
+ $rateLimitPlugin->setClient($client);
+
+ $markdownEnvironment = new Environment();
+ $markdownEnvironment->addExtension(new CommonMarkCoreExtension());
+ $markdownEnvironment->addExtension(new GithubFlavoredMarkdownExtension());
+ $botCommentParser = new BotCommentParser(new MarkdownParser($markdownEnvironment));
+ $issueCommentDownloader = new IssueCommentDownloader($client, $botCommentParser);
+
+ $issueCachePath = __DIR__ . '/tmp/issueCache.tmp';
+ $playgroundCachePath = __DIR__ . '/tmp/playgroundCache.tmp';
+ $tmpDir = __DIR__ . '/tmp';
+
+ exec('git branch --show-current', $gitBranchLines, $exitCode);
+ if ($exitCode === 0) {
+ $gitBranch = implode("\n", $gitBranchLines);
+ } else {
+ $gitBranch = 'dev-master';
+ }
+
+ $postGenerator = new PostGenerator(new Differ(new UnifiedDiffOutputBuilder('')));
+
+ $application = new Application();
+ $application->add(new DownloadCommand($client, new PlaygroundClient(new \GuzzleHttp\Client()), $issueCommentDownloader, $issueCachePath, $playgroundCachePath));
+ $application->add(new RunCommand($playgroundCachePath, $tmpDir));
+ $application->add(new EvaluateCommand(new TabCreator(), $postGenerator, $client, $issueCommentDownloader, $issueCachePath, $playgroundCachePath, $tmpDir, $gitBranch, $phpstanSrcCommitBefore, $phpstanSrcCommitAfter));
+
+ $application->setCatchExceptions(false);
+ $application->run();
+})();
diff --git a/issue-bot/phpstan.neon b/issue-bot/phpstan.neon
new file mode 100644
index 0000000000..7ff756707c
--- /dev/null
+++ b/issue-bot/phpstan.neon
@@ -0,0 +1,13 @@
+includes:
+ - ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
+ - ../vendor/phpstan/phpstan-phpunit/extension.neon
+ - ../vendor/phpstan/phpstan-phpunit/rules.neon
+ - ../vendor/phpstan/phpstan-strict-rules/rules.neon
+ - ../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ - tests
+ - console.php
diff --git a/issue-bot/phpunit.xml b/issue-bot/phpunit.xml
new file mode 100644
index 0000000000..0946e9b886
--- /dev/null
+++ b/issue-bot/phpunit.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ src
+
+
+
+
+
+
+
+
+ tests
+
+
+
+
diff --git a/issue-bot/playground.neon b/issue-bot/playground.neon
new file mode 100644
index 0000000000..a252e3bac8
--- /dev/null
+++ b/issue-bot/playground.neon
@@ -0,0 +1,14 @@
+rules:
+ - PHPStan\Rules\Playground\FunctionNeverRule
+ - PHPStan\Rules\Playground\MethodNeverRule
+ - PHPStan\Rules\Playground\NotAnalysedTraitRule
+ - PHPStan\Rules\Playground\NoPhpCodeRule
+ - PHPStan\Rules\Playground\PhpdocCommentRule
+
+conditionalTags:
+ PHPStan\Rules\Playground\StaticVarWithoutTypeRule:
+ phpstan.rules.rule: %checkImplicitMixed%
+
+services:
+ -
+ class: PHPStan\Rules\Playground\StaticVarWithoutTypeRule
diff --git a/issue-bot/src/.gitkeep b/issue-bot/src/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/issue-bot/src/Comment/BotComment.php b/issue-bot/src/Comment/BotComment.php
new file mode 100644
index 0000000000..3fbc351a6e
--- /dev/null
+++ b/issue-bot/src/Comment/BotComment.php
@@ -0,0 +1,32 @@
+resultHash = $playgroundExample->getHash();
+ }
+
+ public function getResultHash(): string
+ {
+ return $this->resultHash;
+ }
+
+ public function getDiff(): string
+ {
+ return $this->diff;
+ }
+
+}
diff --git a/issue-bot/src/Comment/BotCommentParser.php b/issue-bot/src/Comment/BotCommentParser.php
new file mode 100644
index 0000000000..f0985151df
--- /dev/null
+++ b/issue-bot/src/Comment/BotCommentParser.php
@@ -0,0 +1,63 @@
+docParser->parse($text);
+ $walker = $document->walker();
+ $hashes = [];
+ $diffs = [];
+ while ($event = $walker->next()) { // @phpstan-ignore while.condNotBoolean
+ if (!$event->isEntering()) {
+ continue;
+ }
+
+ $node = $event->getNode();
+ if ($node instanceof Link) {
+ $url = $node->getUrl();
+ $match = Strings::match($url, '/^https:\/\/phpstan\.org\/r\/([0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12})$/i');
+ if ($match === null) {
+ continue;
+ }
+
+ $hashes[] = $match[1];
+ continue;
+ }
+
+ if (!($node instanceof FencedCode)) {
+ continue;
+ }
+
+ if ($node->getInfo() !== 'diff') {
+ continue;
+ }
+
+ $diffs[] = $node->getLiteral();
+ }
+
+ if (count($hashes) !== 1) {
+ throw new BotCommentParserException();
+ }
+
+ if (count($diffs) !== 1) {
+ throw new BotCommentParserException();
+ }
+
+ return new BotCommentParserResult($hashes[0], $diffs[0]);
+ }
+
+}
diff --git a/issue-bot/src/Comment/BotCommentParserException.php b/issue-bot/src/Comment/BotCommentParserException.php
new file mode 100644
index 0000000000..8b4a7d7794
--- /dev/null
+++ b/issue-bot/src/Comment/BotCommentParserException.php
@@ -0,0 +1,10 @@
+hash;
+ }
+
+ public function getDiff(): string
+ {
+ return $this->diff;
+ }
+
+}
diff --git a/issue-bot/src/Comment/Comment.php b/issue-bot/src/Comment/Comment.php
new file mode 100644
index 0000000000..e29701b08d
--- /dev/null
+++ b/issue-bot/src/Comment/Comment.php
@@ -0,0 +1,39 @@
+ $playgroundExamples
+ */
+ public function __construct(
+ private string $author,
+ private string $text,
+ private array $playgroundExamples,
+ )
+ {
+ }
+
+ public function getAuthor(): string
+ {
+ return $this->author;
+ }
+
+ public function getText(): string
+ {
+ return $this->text;
+ }
+
+ /**
+ * @return non-empty-list
+ */
+ public function getPlaygroundExamples(): array
+ {
+ return $this->playgroundExamples;
+ }
+
+}
diff --git a/issue-bot/src/Comment/IssueCommentDownloader.php b/issue-bot/src/Comment/IssueCommentDownloader.php
new file mode 100644
index 0000000000..f676390289
--- /dev/null
+++ b/issue-bot/src/Comment/IssueCommentDownloader.php
@@ -0,0 +1,92 @@
+
+ */
+ public function getComments(int $issueNumber): array
+ {
+ $comments = [];
+ foreach ($this->downloadComments($issueNumber) as $issueComment) {
+ $commentExamples = $this->searchBody($issueComment['body']);
+ if (count($commentExamples) === 0) {
+ continue;
+ }
+
+ if ($issueComment['user']['login'] === 'phpstan-bot') {
+ $parserResult = $this->botCommentParser->parse($issueComment['body']);
+ if (count($commentExamples) !== 1 || $commentExamples[0]->getHash() !== $parserResult->getHash()) {
+ throw new BotCommentParserException();
+ }
+
+ $comments[] = new BotComment($issueComment['body'], $commentExamples[0], $parserResult->getDiff());
+ continue;
+ }
+
+ $comments[] = new Comment($issueComment['user']['login'], $issueComment['body'], $commentExamples);
+ }
+
+ return $comments;
+ }
+
+ /**
+ * @return mixed[]
+ */
+ private function downloadComments(int $issueNumber): array
+ {
+ $page = 1;
+
+ /** @var Issue $api */
+ $api = $this->githubClient->api('issue');
+
+ $comments = [];
+ while (true) {
+ $newComments = $api->comments()->all('phpstan', 'phpstan', $issueNumber, [
+ 'page' => $page,
+ 'per_page' => 100,
+ ]);
+ $comments = array_merge($comments, $newComments);
+ if (count($newComments) < 100) {
+ break;
+ }
+ $page++;
+ }
+
+ return $comments;
+ }
+
+ /**
+ * @return list
+ */
+ public function searchBody(string $text): array
+ {
+ $matches = Strings::matchAll($text, '/https:\/\/phpstan\.org\/r\/([0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12})/i');
+
+ $examples = [];
+
+ foreach ($matches as [$url, $hash]) {
+ $examples[] = new PlaygroundExample($url, $hash);
+ }
+
+ return $examples;
+ }
+
+}
diff --git a/issue-bot/src/Console/DownloadCommand.php b/issue-bot/src/Console/DownloadCommand.php
new file mode 100644
index 0000000000..3edaa7c1e3
--- /dev/null
+++ b/issue-bot/src/Console/DownloadCommand.php
@@ -0,0 +1,261 @@
+setName('download');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $issues = $this->getIssues();
+
+ $playgroundCache = $this->loadPlaygroundCache();
+ if ($playgroundCache === null) {
+ $cachedResults = [];
+ } else {
+ $cachedResults = $playgroundCache->getResults();
+ }
+
+ $unusedCachedResults = $cachedResults;
+
+ $deduplicatedExamples = [];
+ foreach ($issues as $issue) {
+ foreach ($issue->getComments() as $comment) {
+ if ($comment instanceof BotComment) {
+ continue;
+ }
+ foreach ($comment->getPlaygroundExamples() as $example) {
+ $deduplicatedExamples[$example->getHash()] = $example;
+ }
+ }
+ }
+
+ $hashes = array_keys($deduplicatedExamples);
+ foreach ($hashes as $hash) {
+ if (array_key_exists($hash, $cachedResults)) {
+ unset($unusedCachedResults[$hash]);
+ continue;
+ }
+
+ $cachedResults[$hash] = $this->playgroundClient->getResult($hash);
+ }
+
+ foreach (array_keys($unusedCachedResults) as $hash) {
+ unset($cachedResults[$hash]);
+ }
+
+ $this->savePlaygroundCache(new PlaygroundCache($cachedResults));
+
+ $chunkSize = (int) ceil(count($hashes) / 20);
+ if ($chunkSize < 1) {
+ throw new Exception('Chunk size less than 1');
+ }
+
+ $matrix = [];
+ foreach ([70300, 70400, 80000, 80100, 80200, 80300, 80400, 80500] as $phpVersion) {
+ $phpVersionHashes = [];
+ foreach ($cachedResults as $hash => $result) {
+ $resultPhpVersions = array_keys($result->getVersionedErrors());
+ if ($resultPhpVersions === [70400]) {
+ $resultPhpVersions = [70300, 70400, 80000];
+ }
+
+ if (!in_array(80100, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80100;
+ }
+ if (!in_array(80200, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80200;
+ }
+ if (!in_array(80300, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80300;
+ }
+ if (!in_array(80400, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80400;
+ }
+
+ if (!in_array($phpVersion, $resultPhpVersions, true)) {
+ continue;
+ }
+ $phpVersionHashes[] = $hash;
+ }
+ if (count($phpVersionHashes) === 0) {
+ continue;
+ }
+ $chunkSize = (int) ceil(count($phpVersionHashes) / 18);
+ if ($chunkSize < 1) {
+ throw new Exception('Chunk size less than 1');
+ }
+ $chunks = array_chunk($phpVersionHashes, $chunkSize);
+ $i = 1;
+ foreach ($chunks as $chunk) {
+ $matrix[] = [
+ 'phpVersion' => $phpVersion,
+ 'chunkNumber' => $i,
+ 'playgroundExamples' => implode(',', $chunk),
+ ];
+ $i++;
+ }
+ }
+
+ $output->writeln(Json::encode(['include' => $matrix]));
+
+ return 0;
+ }
+
+ /**
+ * @return Issue[]
+ */
+ private function getIssues(): array
+ {
+ /** @var \Github\Api\Issue $api */
+ $api = $this->githubClient->api('issue');
+
+ $cache = $this->loadIssueCache();
+ $newDate = new DateTimeImmutable();
+
+ $issues = [];
+ foreach (['feature-request', 'bug'] as $label) {
+ $page = 1;
+ while (true) {
+ $parameters = [
+ 'labels' => $label,
+ 'page' => $page,
+ 'per_page' => 100,
+ 'sort' => 'created',
+ 'direction' => 'desc',
+ ];
+ if ($cache !== null) {
+ $parameters['state'] = 'all';
+ $parameters['since'] = $cache->getDate()->format(DateTimeImmutable::ATOM);
+ } else {
+ $parameters['state'] = 'open';
+ }
+ $newIssues = $api->all('phpstan', 'phpstan', $parameters);
+ $issues = array_merge($issues, $newIssues);
+ if (count($newIssues) < 100) {
+ break;
+ }
+
+ $page++;
+ }
+ }
+
+ $issueObjects = [];
+ if ($cache !== null) {
+ $issueObjects = $cache->getIssues();
+ }
+ foreach ($issues as $issue) {
+ if ($issue['state'] === 'closed') {
+ unset($issueObjects[$issue['number']]);
+ continue;
+ }
+ $comments = [];
+ $issueExamples = $this->issueCommentDownloader->searchBody($issue['body']);
+ if (count($issueExamples) > 0) {
+ $comments[] = new Comment($issue['user']['login'], $issue['body'], $issueExamples);
+ }
+
+ foreach ($this->issueCommentDownloader->getComments($issue['number']) as $issueComment) {
+ $comments[] = $issueComment;
+ }
+
+ $issueObjects[(int) $issue['number']] = new Issue(
+ $issue['number'],
+ $comments,
+ );
+ }
+
+ $this->saveIssueCache(new IssueCache($newDate, $issueObjects));
+
+ return $issueObjects;
+ }
+
+ private function loadIssueCache(): ?IssueCache
+ {
+ if (!is_file($this->issueCachePath)) {
+ return null;
+ }
+
+ $contents = file_get_contents($this->issueCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ private function saveIssueCache(IssueCache $cache): void
+ {
+ $result = file_put_contents($this->issueCachePath, serialize($cache));
+ if ($result === false) {
+ throw new Exception('Write unsuccessful');
+ }
+ }
+
+ private function loadPlaygroundCache(): ?PlaygroundCache
+ {
+ if (!is_file($this->playgroundCachePath)) {
+ return null;
+ }
+
+ $contents = file_get_contents($this->playgroundCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ private function savePlaygroundCache(PlaygroundCache $cache): void
+ {
+ $result = file_put_contents($this->playgroundCachePath, serialize($cache));
+ if ($result === false) {
+ throw new Exception('Write unsuccessful');
+ }
+ }
+
+}
diff --git a/issue-bot/src/Console/EvaluateCommand.php b/issue-bot/src/Console/EvaluateCommand.php
new file mode 100644
index 0000000000..cc417f6b34
--- /dev/null
+++ b/issue-bot/src/Console/EvaluateCommand.php
@@ -0,0 +1,325 @@
+setName('evaluate');
+ $this->addOption('post-comments', null, InputOption::VALUE_NONE);
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $issueCache = $this->loadIssueCache();
+ $originalResults = $this->loadPlaygroundCache()->getResults();
+ $newResults = $this->loadResults();
+ $toPost = [];
+ $totalCodeSnippets = 0;
+
+ foreach ($issueCache->getIssues() as $issue) {
+ $botComments = [];
+ $deduplicatedExamples = [];
+ foreach ($issue->getComments() as $comment) {
+ if ($comment instanceof BotComment) {
+ $botComments[] = $comment;
+ continue;
+ }
+ foreach ($comment->getPlaygroundExamples() as $example) {
+ if (isset($deduplicatedExamples[$example->getHash()])) {
+ $deduplicatedExamples[$example->getHash()]['users'][] = $comment->getAuthor();
+ $deduplicatedExamples[$example->getHash()]['users'] = array_values(array_unique($deduplicatedExamples[$example->getHash()]['users']));
+ continue;
+ }
+ $deduplicatedExamples[$example->getHash()] = [
+ 'example' => $example,
+ 'users' => [$comment->getAuthor()],
+ ];
+ }
+ }
+
+ $totalCodeSnippets += count($deduplicatedExamples);
+ foreach ($deduplicatedExamples as ['example' => $example, 'users' => $users]) {
+ $hash = $example->getHash();
+ if (!array_key_exists($hash, $originalResults)) {
+ throw new Exception(sprintf('Hash %s does not exist in original results.', $hash));
+ }
+
+ $originalErrors = $originalResults[$hash]->getVersionedErrors();
+ $originalTabs = $this->tabCreator->create($originalErrors);
+
+ if (!array_key_exists($hash, $newResults)) {
+ throw new Exception(sprintf('Hash %s does not exist in new results.', $hash));
+ }
+
+ $originalPhpVersions = array_keys($originalErrors);
+ $newResult = $newResults[$hash];
+ if (array_key_exists(70100, $originalErrors) || $originalPhpVersions === [70400]) {
+ $newResult[70100] = $newResult[70300];
+ }
+ if (array_key_exists(70200, $originalErrors)) {
+ $newResult[70200] = $newResult[70300];
+ }
+
+ $newTabs = $this->tabCreator->create($this->filterErrors($originalErrors, $newResult));
+ $text = $this->postGenerator->createText($hash, $originalTabs, $newTabs, $botComments);
+ if ($text === null) {
+ continue;
+ }
+
+ if ($this->isIssueClosed($issue->getNumber())) {
+ continue;
+ }
+
+ $freshBotComments = $this->getFreshBotComments($issue->getNumber());
+ $textAgain = $this->postGenerator->createText($hash, $originalTabs, $newTabs, $freshBotComments);
+ if ($textAgain === null) {
+ continue;
+ }
+
+ $toPost[] = [
+ 'issue' => $issue->getNumber(),
+ 'hash' => $hash,
+ 'users' => $users,
+ 'diff' => $text['diff'],
+ 'details' => $text['details'],
+ ];
+ }
+ }
+
+ $exitCode = self::EXIT_AFFECTS_ISSUES;
+ if (count($toPost) === 0) {
+ $exitCode = self::EXIT_NO_AFFECTED_ISSUES;
+ $output->writeln(sprintf('No changes in results in %d code snippets from %d GitHub issues. :tada:', $totalCodeSnippets, count($issueCache->getIssues())));
+ }
+
+ foreach ($toPost as ['issue' => $issue, 'hash' => $hash, 'users' => $users, 'diff' => $diff, 'details' => $details]) {
+ $text = sprintf(
+ "Result of the [code snippet](https://phpstan.org/r/%s) from %s in [#%d](https://github.com/phpstan/phpstan/issues/%d) changed:\n\n```diff\n%s```",
+ $hash,
+ implode(' ', array_map(static fn (string $user): string => sprintf('@%s', $user), $users)),
+ $issue,
+ $issue,
+ $diff,
+ );
+ if ($details !== null) {
+ $text .= "\n\n" . sprintf('
+ Full report
+
+%s
+ ', $details);
+ }
+
+ $text .= "\n\n---\n";
+
+ $output->writeln($text);
+ }
+
+ $postComments = (bool) $input->getOption('post-comments');
+ if ($postComments) {
+ if (count($toPost) > 20) {
+ $output->writeln('Too many comments to post, something is probably wrong.');
+ return self::EXIT_ERROR;
+ }
+ foreach ($toPost as ['issue' => $issue, 'hash' => $hash, 'users' => $users, 'diff' => $diff, 'details' => $details]) {
+ $text = sprintf(
+ "%s After [the latest push in %s](https://github.com/phpstan/phpstan-src/compare/%s...%s), PHPStan now reports different result with your [code snippet](https://phpstan.org/r/%s):\n\n```diff\n%s```",
+ implode(' ', array_map(static fn (string $user): string => sprintf('@%s', $user), $users)),
+ $this->gitBranch,
+ $this->phpstanSrcCommitBefore,
+ $this->phpstanSrcCommitAfter,
+ $hash,
+ $diff,
+ );
+ if ($details !== null) {
+ $text .= "\n\n" . sprintf('
+ Full report
+
+%s
+ ', $details);
+ }
+
+ /** @var GitHubIssueApi $issueApi */
+ $issueApi = $this->githubClient->api('issue');
+ $issueApi->comments()->create('phpstan', 'phpstan', $issue, [
+ 'body' => $text,
+ ]);
+ }
+ }
+
+ return $exitCode;
+ }
+
+ /**
+ * @return list
+ */
+ private function getFreshBotComments(int $issueNumber): array
+ {
+ $comments = [];
+ foreach ($this->issueCommentDownloader->getComments($issueNumber) as $issueComment) {
+ if (!$issueComment instanceof BotComment) {
+ continue;
+ }
+
+ $comments[] = $issueComment;
+ }
+
+ return $comments;
+ }
+
+ private function isIssueClosed(int $issueNumber): bool
+ {
+ /** @var GitHubIssueApi $issueApi */
+ $issueApi = $this->githubClient->api('issue');
+ $issue = $issueApi->show('phpstan', 'phpstan', $issueNumber);
+
+ return $issue['state'] === 'closed';
+ }
+
+ private function loadIssueCache(): IssueCache
+ {
+ if (!is_file($this->issueCachePath)) {
+ throw new Exception('Issue cache must exist');
+ }
+
+ $contents = file_get_contents($this->issueCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ private function loadPlaygroundCache(): PlaygroundCache
+ {
+ if (!is_file($this->playgroundCachePath)) {
+ throw new Exception('Playground cache must exist');
+ }
+
+ $contents = file_get_contents($this->playgroundCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ /**
+ * @return array>>
+ */
+ private function loadResults(): array
+ {
+ $finder = new Finder();
+ $tmpResults = [];
+ foreach ($finder->files()->name('results-*.tmp')->in($this->tmpDir) as $resultFile) {
+ $contents = file_get_contents($resultFile->getPathname());
+ if ($contents === false) {
+ throw new Exception('Result read unsuccessful');
+ }
+ $result = unserialize($contents);
+ $phpVersion = (int) $result['phpVersion'];
+ foreach ($result['errors'] as $hash => $errors) {
+ $tmpResults[(string) $hash][$phpVersion] = array_values($errors);
+ }
+ }
+
+ return $tmpResults;
+ }
+
+ /**
+ * @param array> $originalErrors
+ * @param array> $newErrors
+ * @return array>
+ */
+ private function filterErrors(
+ array $originalErrors,
+ array $newErrors,
+ ): array
+ {
+ $originalPhpVersions = array_keys($originalErrors);
+ $filteredNewErrors = [];
+ foreach ($newErrors as $phpVersion => $errors) {
+ if (!in_array($phpVersion, $originalPhpVersions, true)) {
+ continue;
+ }
+
+ $filteredNewErrors[$phpVersion] = $errors;
+ }
+
+ $newTabs = $this->tabCreator->create($newErrors);
+ $filteredNewTabs = $this->tabCreator->create($filteredNewErrors);
+ if (count($newTabs) !== count($filteredNewTabs)) {
+ return $newErrors;
+ }
+
+ $firstFilteredNewTab = $filteredNewTabs[0];
+ $firstNewTab = $newTabs[0];
+
+ if (count($firstFilteredNewTab->getErrors()) !== count($firstNewTab->getErrors())) {
+ return $newErrors;
+ }
+
+ foreach ($firstFilteredNewTab->getErrors() as $i => $error) {
+ $otherError = $firstNewTab->getErrors()[$i];
+ if ($error->getLine() !== $otherError->getLine()) {
+ return $newErrors;
+ }
+ if ($error->getMessage() !== $otherError->getMessage()) {
+ return $newErrors;
+ }
+ }
+
+ return $filteredNewErrors;
+ }
+
+}
diff --git a/issue-bot/src/Console/RunCommand.php b/issue-bot/src/Console/RunCommand.php
new file mode 100644
index 0000000000..763db57cd0
--- /dev/null
+++ b/issue-bot/src/Console/RunCommand.php
@@ -0,0 +1,150 @@
+setName('run');
+ $this->addArgument('phpVersion', InputArgument::REQUIRED);
+ $this->addArgument('playgroundHashes', InputArgument::REQUIRED);
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $phpVersion = (int) $input->getArgument('phpVersion');
+ $commaSeparatedPlaygroundHashes = $input->getArgument('playgroundHashes');
+ $playgroundHashes = explode(',', $commaSeparatedPlaygroundHashes);
+ $playgroundCache = $this->loadPlaygroundCache();
+ $errors = [];
+ foreach ($playgroundHashes as $hash) {
+ if (!array_key_exists($hash, $playgroundCache->getResults())) {
+ throw new Exception(sprintf('Hash %s must exist', $hash));
+ }
+ $errors[$hash] = $this->analyseHash($output, $phpVersion, $playgroundCache->getResults()[$hash]);
+ }
+
+ $data = ['phpVersion' => $phpVersion, 'errors' => $errors];
+
+ $writeSuccess = file_put_contents(sprintf($this->tmpDir . '/results-%d-%s.tmp', $phpVersion, sha1($commaSeparatedPlaygroundHashes)), serialize($data));
+ if ($writeSuccess === false) {
+ throw new Exception('Result write unsuccessful');
+ }
+
+ return 0;
+ }
+
+ /**
+ * @return list
+ */
+ private function analyseHash(OutputInterface $output, int $phpVersion, PlaygroundResult $result): array
+ {
+ $configFiles = [
+ __DIR__ . '/../../playground.neon',
+ ];
+ if ($result->isBleedingEdge()) {
+ $configFiles[] = __DIR__ . '/../../../conf/bleedingEdge.neon';
+ }
+ if ($result->isStrictRules()) {
+ $configFiles[] = __DIR__ . '/../../vendor/phpstan/phpstan-strict-rules/rules.neon';
+ }
+ $neon = Neon::encode([
+ 'includes' => $configFiles,
+ 'parameters' => [
+ 'level' => $result->getLevel(),
+ 'inferPrivatePropertyTypeFromConstructor' => true,
+ 'treatPhpDocTypesAsCertain' => $result->isTreatPhpDocTypesAsCertain(),
+ 'phpVersion' => $phpVersion,
+ ],
+ ]);
+
+ $hash = $result->getHash();
+ $neonPath = sprintf($this->tmpDir . '/%s.neon', $hash);
+ $codePath = sprintf($this->tmpDir . '/%s.php', $hash);
+ file_put_contents($neonPath, $neon);
+ file_put_contents($codePath, $result->getCode());
+
+ $commandArray = [
+ __DIR__ . '/../../../bin/phpstan',
+ 'analyse',
+ '--error-format',
+ 'json',
+ '--no-progress',
+ '-c',
+ $neonPath,
+ $codePath,
+ ];
+
+ $output->writeln(sprintf('Starting analysis of %s', $hash));
+
+ $startTime = microtime(true);
+ exec(implode(' ', $commandArray), $outputLines, $exitCode);
+ $elapsedTime = microtime(true) - $startTime;
+ $output->writeln(sprintf('Analysis of %s took %.2f s', $hash, $elapsedTime));
+
+ if ($exitCode !== 0 && $exitCode !== 1) {
+ throw new Exception(sprintf('PHPStan exited with code %d during analysis of %s', $exitCode, $hash));
+ }
+
+ $json = Json::decode(implode("\n", $outputLines), Json::FORCE_ARRAY);
+ $errors = [];
+ foreach ($json['files'] as ['messages' => $messages]) {
+ foreach ($messages as $message) {
+ $messageText = str_replace(sprintf('/%s.php', $hash), '/tmp.php', $message['message']);
+ if (strpos($messageText, 'Internal error') !== false) {
+ throw new Exception(sprintf('While analysing %s: %s', $hash, $messageText));
+ }
+ $errors[] = new PlaygroundError($message['line'] ?? -1, $messageText, $message['identifier'] ?? null);
+ }
+ }
+
+ return $errors;
+ }
+
+ private function loadPlaygroundCache(): PlaygroundCache
+ {
+ if (!is_file($this->playgroundCachePath)) {
+ throw new Exception('Playground cache must exist');
+ }
+
+ $contents = file_get_contents($this->playgroundCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+}
diff --git a/issue-bot/src/GitHub/RateLimitPlugin.php b/issue-bot/src/GitHub/RateLimitPlugin.php
new file mode 100644
index 0000000000..ce0bbf8caa
--- /dev/null
+++ b/issue-bot/src/GitHub/RateLimitPlugin.php
@@ -0,0 +1,47 @@
+client = $client;
+ }
+
+ public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
+ {
+ $path = $request->getUri()->getPath();
+ if ($path === '/rate_limit') {
+ return $next($request);
+ }
+
+ /** @var RateLimit $api */
+ $api = $this->client->api('rate_limit');
+
+ /** @var RateLimitResource $resource */
+ $resource = $api->getResource('core');
+ if ($resource->getRemaining() < 10) {
+ $reset = $resource->getReset();
+ $sleepFor = $reset - time();
+ if ($sleepFor > 0) {
+ sleep($sleepFor);
+ }
+ }
+
+ return $next($request);
+ }
+
+}
diff --git a/issue-bot/src/GitHub/RequestCounterPlugin.php b/issue-bot/src/GitHub/RequestCounterPlugin.php
new file mode 100644
index 0000000000..042cb53202
--- /dev/null
+++ b/issue-bot/src/GitHub/RequestCounterPlugin.php
@@ -0,0 +1,30 @@
+getUri()->getPath();
+ if ($path === '/rate_limit') {
+ return $next($request);
+ }
+
+ $this->totalCount++;
+ return $next($request);
+ }
+
+ public function getTotalCount(): int
+ {
+ return $this->totalCount;
+ }
+
+}
diff --git a/issue-bot/src/Issue/Issue.php b/issue-bot/src/Issue/Issue.php
new file mode 100644
index 0000000000..a9feaf01d8
--- /dev/null
+++ b/issue-bot/src/Issue/Issue.php
@@ -0,0 +1,30 @@
+number;
+ }
+
+ /**
+ * @return Comment[]
+ */
+ public function getComments(): array
+ {
+ return $this->comments;
+ }
+
+}
diff --git a/issue-bot/src/Issue/IssueCache.php b/issue-bot/src/Issue/IssueCache.php
new file mode 100644
index 0000000000..6b5ed53fec
--- /dev/null
+++ b/issue-bot/src/Issue/IssueCache.php
@@ -0,0 +1,30 @@
+ $issues
+ */
+ public function __construct(private DateTimeImmutable $date, private array $issues)
+ {
+ }
+
+ public function getDate(): DateTimeImmutable
+ {
+ return $this->date;
+ }
+
+ /**
+ * @return array
+ */
+ public function getIssues(): array
+ {
+ return $this->issues;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundCache.php b/issue-bot/src/Playground/PlaygroundCache.php
new file mode 100644
index 0000000000..cda495a831
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundCache.php
@@ -0,0 +1,23 @@
+ $results
+ */
+ public function __construct(private array $results)
+ {
+ }
+
+ /**
+ * @return array
+ */
+ public function getResults(): array
+ {
+ return $this->results;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundClient.php b/issue-bot/src/Playground/PlaygroundClient.php
new file mode 100644
index 0000000000..43cd6ea9d3
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundClient.php
@@ -0,0 +1,42 @@
+client->get(sprintf('https://api.phpstan.org/sample?id=%s', $hash));
+
+ $body = (string) $response->getBody();
+ $json = Json::decode($body, Json::FORCE_ARRAY);
+
+ $versionedErrors = [];
+ foreach ($json['versionedErrors'] as ['phpVersion' => $phpVersion, 'errors' => $errors]) {
+ $versionedErrors[(int) $phpVersion] = array_map(static fn (array $error) => new PlaygroundError($error['line'] ?? -1, $error['message'], $error['identifier'] ?? null), array_values($errors));
+ }
+
+ return new PlaygroundResult(
+ sprintf('https://phpstan.org/r/%s', $hash),
+ $hash,
+ $json['code'],
+ $json['level'],
+ $json['config']['strictRules'],
+ $json['config']['bleedingEdge'],
+ $json['config']['treatPhpDocTypesAsCertain'],
+ $versionedErrors,
+ );
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundError.php b/issue-bot/src/Playground/PlaygroundError.php
new file mode 100644
index 0000000000..1e55ac88b3
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundError.php
@@ -0,0 +1,27 @@
+line;
+ }
+
+ public function getMessage(): string
+ {
+ return $this->message;
+ }
+
+ public function getIdentifier(): ?string
+ {
+ return $this->identifier;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundExample.php b/issue-bot/src/Playground/PlaygroundExample.php
new file mode 100644
index 0000000000..0d25f7bfbb
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundExample.php
@@ -0,0 +1,25 @@
+url;
+ }
+
+ public function getHash(): string
+ {
+ return $this->hash;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundResult.php b/issue-bot/src/Playground/PlaygroundResult.php
new file mode 100644
index 0000000000..faddc6c078
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundResult.php
@@ -0,0 +1,67 @@
+> $versionedErrors
+ */
+ public function __construct(
+ private string $url,
+ private string $hash,
+ private string $code,
+ private string $level,
+ private bool $strictRules,
+ private bool $bleedingEdge,
+ private bool $treatPhpDocTypesAsCertain,
+ private array $versionedErrors,
+ )
+ {
+ }
+
+ public function getUrl(): string
+ {
+ return $this->url;
+ }
+
+ public function getHash(): string
+ {
+ return $this->hash;
+ }
+
+ public function getCode(): string
+ {
+ return $this->code;
+ }
+
+ public function getLevel(): string
+ {
+ return $this->level;
+ }
+
+ public function isStrictRules(): bool
+ {
+ return $this->strictRules;
+ }
+
+ public function isBleedingEdge(): bool
+ {
+ return $this->bleedingEdge;
+ }
+
+ public function isTreatPhpDocTypesAsCertain(): bool
+ {
+ return $this->treatPhpDocTypesAsCertain;
+ }
+
+ /**
+ * @return array>
+ */
+ public function getVersionedErrors(): array
+ {
+ return $this->versionedErrors;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundResultTab.php b/issue-bot/src/Playground/PlaygroundResultTab.php
new file mode 100644
index 0000000000..03d33ac7d4
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundResultTab.php
@@ -0,0 +1,28 @@
+ $errors
+ */
+ public function __construct(private string $title, private array $errors)
+ {
+ }
+
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ /**
+ * @return list
+ */
+ public function getErrors(): array
+ {
+ return $this->errors;
+ }
+
+}
diff --git a/issue-bot/src/Playground/TabCreator.php b/issue-bot/src/Playground/TabCreator.php
new file mode 100644
index 0000000000..a6254957b2
--- /dev/null
+++ b/issue-bot/src/Playground/TabCreator.php
@@ -0,0 +1,130 @@
+> $versionedErrors
+ * @return list
+ */
+ public function create(array $versionedErrors): array
+ {
+ ksort($versionedErrors, SORT_NUMERIC);
+
+ $versions = [];
+ $last = null;
+
+ foreach ($versionedErrors as $phpVersion => $errors) {
+ $errors = array_values(array_filter($errors, static fn (PlaygroundError $error) => $error->getIdentifier() !== 'phpstanPlayground.configParameter'));
+ $errors = array_map(static function (PlaygroundError $error): PlaygroundError {
+ if ($error->getIdentifier() === null) {
+ return $error;
+ }
+
+ if (!str_starts_with($error->getIdentifier(), 'phpstanPlayground.')) {
+ return $error;
+ }
+
+ return new PlaygroundError(
+ $error->getLine(),
+ sprintf('Tip: %s', $error->getMessage()),
+ $error->getIdentifier(),
+ );
+ }, $errors);
+ $current = [
+ 'versions' => [$phpVersion],
+ 'errors' => $errors,
+ ];
+ if ($last === null) {
+ $last = $current;
+ continue;
+ }
+
+ if (count($errors) !== count($last['errors'])) {
+ $versions[] = $last;
+ $last = $current;
+ continue;
+ }
+
+ $merge = true;
+ foreach ($errors as $i => $error) {
+ $lastError = $last['errors'][$i];
+ if ($error->getLine() !== $lastError->getLine()) {
+ $versions[] = $last;
+ $last = $current;
+ $merge = false;
+ break;
+ }
+ if ($error->getMessage() !== $lastError->getMessage()) {
+ $versions[] = $last;
+ $last = $current;
+ $merge = false;
+ break;
+ }
+ }
+
+ if (!$merge) {
+ continue;
+ }
+
+ $last['versions'][] = $phpVersion;
+ }
+
+ if ($last !== null) {
+ $versions[] = $last;
+ }
+
+ usort($versions, static function ($a, $b): int {
+ $aVersion = $a['versions'][count($a['versions']) - 1];
+ $bVersion = $b['versions'][count($b['versions']) - 1];
+
+ return $bVersion - $aVersion;
+ });
+
+ $tabs = [];
+
+ foreach ($versions as $version) {
+ $title = 'PHP ';
+ if (count($version['versions']) > 1) {
+ $title .= $this->versionNumberToString($version['versions'][0]);
+ $title .= ' – ';
+ $title .= $this->versionNumberToString($version['versions'][count($version['versions']) - 1]);
+ } else {
+ $title .= $this->versionNumberToString($version['versions'][0]);
+ }
+
+ if (count($version['errors']) === 1) {
+ $title .= ' (1 error)';
+ } elseif (count($version['errors']) > 0) {
+ $title .= ' (' . count($version['errors']) . ' errors)';
+ }
+
+ $tabs[] = new PlaygroundResultTab($title, $version['errors']);
+ }
+
+ return $tabs;
+ }
+
+ private function versionNumberToString(int $versionId): string
+ {
+ $first = (int) floor($versionId / 10000);
+ $second = (int) floor(($versionId % 10000) / 100);
+ $third = (int) floor($versionId % 100);
+
+ return $first . '.' . $second . ($third !== 0 ? '.' . $third : '');
+ }
+
+}
diff --git a/issue-bot/src/PostGenerator.php b/issue-bot/src/PostGenerator.php
new file mode 100644
index 0000000000..db62d448a8
--- /dev/null
+++ b/issue-bot/src/PostGenerator.php
@@ -0,0 +1,138 @@
+ $originalTabs
+ * @param list $currentTabs
+ * @param BotComment[] $botComments
+ * @return array{diff: string, details: string|null}|null
+ */
+ public function createText(
+ string $hash,
+ array $originalTabs,
+ array $currentTabs,
+ array $botComments,
+ ): ?array
+ {
+ foreach ($currentTabs as $tab) {
+ foreach ($tab->getErrors() as $error) {
+ if (strpos($error->getMessage(), 'Internal error') === false) {
+ continue;
+ }
+
+ return null;
+ }
+ }
+
+ $maxDigit = 1;
+ foreach (array_merge($originalTabs, $currentTabs) as $tab) {
+ foreach ($tab->getErrors() as $error) {
+ $length = strlen((string) $error->getLine());
+ if ($length <= $maxDigit) {
+ continue;
+ }
+
+ $maxDigit = $length;
+ }
+ }
+ $originalErrorsText = $this->generateTextFromTabs($originalTabs, $maxDigit);
+ $currentErrorsText = $this->generateTextFromTabs($currentTabs, $maxDigit);
+ if ($originalErrorsText === $currentErrorsText) {
+ return null;
+ }
+
+ $diff = $this->differ->diff($originalErrorsText, $currentErrorsText);
+ foreach ($botComments as $botComment) {
+ if ($botComment->getResultHash() !== $hash) {
+ continue;
+ }
+
+ if ($botComment->getDiff() === $diff) {
+ return null;
+ }
+ }
+
+ if (count($currentTabs) === 1 && count($currentTabs[0]->getErrors()) === 0) {
+ return ['diff' => $diff, 'details' => null];
+ }
+
+ $details = [];
+ foreach ($currentTabs as $tab) {
+ $detail = '';
+ if (count($currentTabs) > 1) {
+ $detail .= sprintf("%s\n-----------\n\n", $tab->getTitle());
+ }
+
+ if (count($tab->getErrors()) === 0) {
+ $detail .= "No errors\n";
+ $details[] = $detail;
+ continue;
+ }
+
+ $detail .= "| Line | Error |\n";
+ $detail .= "|---|---|\n";
+
+ foreach ($tab->getErrors() as $error) {
+ $errorText = Strings::replace($error->getMessage(), "/\r|\n/", '');
+ $detail .= sprintf("| %d | `%s` |\n", $error->getLine(), $errorText);
+ }
+
+ $details[] = $detail;
+ }
+
+ return ['diff' => $diff, 'details' => implode("\n", $details)];
+ }
+
+ /**
+ * @param PlaygroundResultTab[] $tabs
+ */
+ private function generateTextFromTabs(array $tabs, int $maxDigit): string
+ {
+ $parts = [];
+ foreach ($tabs as $tab) {
+ $text = '';
+ if (count($tabs) > 1) {
+ $text .= sprintf("%s\n==========\n\n", $tab->getTitle());
+ }
+
+ if (count($tab->getErrors()) === 0) {
+ $text .= 'No errors';
+ $parts[] = $text;
+ continue;
+ }
+
+ $errorLines = [];
+ foreach ($tab->getErrors() as $error) {
+ $errorLines[] = sprintf('%s: %s', str_pad((string) $error->getLine(), $maxDigit, ' ', STR_PAD_LEFT), $error->getMessage());
+ }
+
+ $text .= implode("\n", $errorLines);
+
+ $parts[] = $text;
+ }
+
+ return implode("\n\n", $parts);
+ }
+
+}
diff --git a/issue-bot/tests/Comment/BotCommentParserResultTest.php b/issue-bot/tests/Comment/BotCommentParserResultTest.php
new file mode 100644
index 0000000000..123c8034f1
--- /dev/null
+++ b/issue-bot/tests/Comment/BotCommentParserResultTest.php
@@ -0,0 +1,49 @@
+
+ */
+ public function dataParse(): iterable
+ {
+ yield [
+ '@foobar After [the latest commit to dev-master](https://github.com/phpstan/phpstan-src/commit/abc123), PHPStan now reports different result with your [code snippet](https://phpstan.org/r/74c3b0af-5a87-47e7-907a-9ea6fbb1c396):
+
+```diff
+@@ @@
+-1: abc
++1: def
+```',
+ '74c3b0af-5a87-47e7-907a-9ea6fbb1c396',
+ '@@ @@
+-1: abc
++1: def
+',
+ ];
+ }
+
+ /**
+ * @dataProvider dataParse
+ */
+ public function testParse(string $text, string $expectedHash, string $expectedDiff): void
+ {
+ $markdownEnvironment = new Environment();
+ $markdownEnvironment->addExtension(new CommonMarkCoreExtension());
+ $markdownEnvironment->addExtension(new GithubFlavoredMarkdownExtension());
+ $parser = new BotCommentParser(new MarkdownParser($markdownEnvironment));
+ $result = $parser->parse($text);
+ self::assertSame($expectedHash, $result->getHash());
+ self::assertSame($expectedDiff, $result->getDiff());
+ }
+
+}
diff --git a/issue-bot/tests/Playground/TabCreatorTest.php b/issue-bot/tests/Playground/TabCreatorTest.php
new file mode 100644
index 0000000000..47bf147308
--- /dev/null
+++ b/issue-bot/tests/Playground/TabCreatorTest.php
@@ -0,0 +1,134 @@
+>, list}>
+ */
+ public function dataCreate(): array
+ {
+ return [
+ [
+ [
+ 70100 => [
+
+ ],
+ 70200 => [
+
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 – 7.2', []),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', null),
+ ],
+ 70200 => [
+ new PlaygroundError(2, 'Foo', null),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 – 7.2 (1 error)', [
+ new PlaygroundError(2, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ 70200 => [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 – 7.2 (2 errors)', [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ 70200 => [
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.2 (1 error)', [
+ new PlaygroundError(3, 'Foo', null),
+ ]),
+ new PlaygroundResultTab('PHP 7.1 (2 errors)', [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', 'attribute.notFound'),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 (1 error)', [
+ new PlaygroundError(2, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', 'phpstanPlayground.never'),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 (1 error)', [
+ new PlaygroundError(2, 'Tip: Foo', null),
+ ]),
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider dataCreate
+ * @param array> $versionedErrors
+ * @param list $expectedTabs
+ * @return void
+ */
+ public function testCreate(array $versionedErrors, array $expectedTabs): void
+ {
+ $tabCreator = new TabCreator();
+ $tabs = $tabCreator->create($versionedErrors);
+ self::assertCount(count($expectedTabs), $tabs);
+
+ foreach ($tabs as $i => $tab) {
+ $expectedTab = $expectedTabs[$i];
+ self::assertSame($expectedTab->getTitle(), $tab->getTitle());
+ self::assertCount(count($expectedTab->getErrors()), $tab->getErrors());
+ foreach ($tab->getErrors() as $j => $error) {
+ $expectedError = $expectedTab->getErrors()[$j];
+ self::assertSame($expectedError->getMessage(), $error->getMessage());
+ self::assertSame($expectedError->getLine(), $error->getLine());
+ }
+ }
+ }
+
+}
diff --git a/issue-bot/tests/PostGeneratorTest.php b/issue-bot/tests/PostGeneratorTest.php
new file mode 100644
index 0000000000..06c30811c9
--- /dev/null
+++ b/issue-bot/tests/PostGeneratorTest.php
@@ -0,0 +1,133 @@
+, list, BotComment[], string|null}>
+ */
+ public function dataGeneratePosts(): iterable
+ {
+ $diff = '@@ @@
+-1: abc
++1: def
+';
+
+ $details = "| Line | Error |
+|---|---|
+| 1 | `def` |
+";
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [],
+ null,
+ null,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'def', null),
+ ])],
+ [],
+ $diff,
+ $details,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'def', null),
+ ])],
+ [
+ new BotComment('', new PlaygroundExample('', 'abc-def'), 'some diff'),
+ ],
+ $diff,
+ $details,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'def', null),
+ ])],
+ [
+ new BotComment('', new PlaygroundExample('', 'abc-def'), $diff),
+ ],
+ null,
+ null,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'Internal error', null),
+ ])],
+ [],
+ null,
+ null,
+ ];
+ }
+
+ /**
+ * @dataProvider dataGeneratePosts
+ * @param list $originalTabs
+ * @param list $currentTabs
+ * @param BotComment[] $botComments
+ */
+ public function testGeneratePosts(
+ string $hash,
+ array $originalTabs,
+ array $currentTabs,
+ array $botComments,
+ ?string $expectedDiff,
+ ?string $expectedDetails
+ ): void
+ {
+ $generator = new PostGenerator(new Differ(new UnifiedDiffOutputBuilder('')));
+ $text = $generator->createText(
+ $hash,
+ $originalTabs,
+ $currentTabs,
+ $botComments,
+ );
+ if ($text === null) {
+ self::assertNull($expectedDiff);
+ self::assertNull($expectedDetails);
+ return;
+ }
+
+ self::assertSame($expectedDiff, $text['diff']);
+ self::assertSame($expectedDetails, $text['details']);
+ }
+
+}
diff --git a/issue-bot/tmp/.gitignore b/issue-bot/tmp/.gitignore
new file mode 100644
index 0000000000..125e34294b
--- /dev/null
+++ b/issue-bot/tmp/.gitignore
@@ -0,0 +1,2 @@
+*
+!.*
diff --git a/patches/Buffer.patch b/patches/Buffer.patch
new file mode 100644
index 0000000000..1e50ecf112
--- /dev/null
+++ b/patches/Buffer.patch
@@ -0,0 +1,54 @@
+--- Buffer.php 2017-01-10 11:34:47.000000000 +0100
++++ Buffer.php 2021-10-30 16:36:22.000000000 +0200
+@@ -103,7 +103,7 @@
+ *
+ * @return \Iterator
+ */
+- public function getInnerIterator()
++ public function getInnerIterator(): ?\Iterator
+ {
+ return $this->_iterator;
+ }
+@@ -133,6 +133,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function current()
+ {
+ return $this->getBuffer()->current()[self::BUFFER_VALUE];
+@@ -143,6 +144,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function key()
+ {
+ return $this->getBuffer()->current()[self::BUFFER_KEY];
+@@ -153,7 +155,7 @@
+ *
+ * @return void
+ */
+- public function next()
++ public function next(): void
+ {
+ $innerIterator = $this->getInnerIterator();
+ $buffer = $this->getBuffer();
+@@ -204,7 +206,7 @@
+ *
+ * @return void
+ */
+- public function rewind()
++ public function rewind(): void
+ {
+ $innerIterator = $this->getInnerIterator();
+ $buffer = $this->getBuffer();
+@@ -228,7 +230,7 @@
+ *
+ * @return bool
+ */
+- public function valid()
++ public function valid(): bool
+ {
+ return
+ $this->getBuffer()->valid() &&
diff --git a/patches/Consistency.patch b/patches/Consistency.patch
index 73926b901a..4409109b36 100644
--- a/patches/Consistency.patch
+++ b/patches/Consistency.patch
@@ -1,5 +1,3 @@
-@package hoa/consistency
-
--- Consistency.php 2017-05-02 14:18:12.000000000 +0200
+++ Consistency.php 2020-05-05 08:28:35.000000000 +0200
@@ -319,42 +319,6 @@
diff --git a/patches/DependencyChecker.patch b/patches/DependencyChecker.patch
new file mode 100644
index 0000000000..4902922537
--- /dev/null
+++ b/patches/DependencyChecker.patch
@@ -0,0 +1,13 @@
+--- src/DI/DependencyChecker.php 2023-10-02 21:58:38
++++ src/DI/DependencyChecker.php 2024-07-07 09:24:35
+@@ -147,7 +147,9 @@
+ $flip = array_flip($classes);
+ foreach ($functions as $name) {
+ if (strpos($name, '::')) {
+- $method = new ReflectionMethod($name);
++ $method = PHP_VERSION_ID < 80300
++ ? new ReflectionMethod($name)
++ : ReflectionMethod::createFromMethodName($name);
+ $class = $method->getDeclaringClass();
+ if (isset($flip[$class->name])) {
+ continue;
diff --git a/patches/File.patch b/patches/File.patch
new file mode 100644
index 0000000000..0732eb0e55
--- /dev/null
+++ b/patches/File.patch
@@ -0,0 +1,11 @@
+--- File.php 2017-07-11 09:42:15
++++ File.php 2024-08-26 23:13:27
+@@ -192,7 +192,7 @@
+ * @throws \Hoa\File\Exception\FileDoesNotExist
+ * @throws \Hoa\File\Exception
+ */
+- protected function &_open($streamName, Stream\Context $context = null)
++ protected function &_open($streamName, ?Stream\Context $context = null)
+ {
+ if (substr($streamName, 0, 4) == 'file' &&
+ false === is_dir(dirname($streamName))) {
diff --git a/patches/HoaException.patch b/patches/HoaException.patch
new file mode 100644
index 0000000000..bada616504
--- /dev/null
+++ b/patches/HoaException.patch
@@ -0,0 +1,11 @@
+--- Exception/Exception.php 2024-06-24 15:17:26
++++ Exception/Exception.php 2024-06-24 15:17:51
+@@ -37,7 +37,7 @@
+ namespace Hoa\Compiler\Exception;
+
+ use Hoa\Consistency;
+-use Hoa\Exception as HoaException;
++use Hoa\Exception\Exception as HoaException;
+
+ /**
+ * Class \Hoa\Compiler\Exception.
diff --git a/patches/HoaParser.patch b/patches/HoaParser.patch
new file mode 100644
index 0000000000..46829378e2
--- /dev/null
+++ b/patches/HoaParser.patch
@@ -0,0 +1,11 @@
+--- Llk/Parser.php 2017-08-08 09:44:07
++++ Llk/Parser.php 2025-09-08 12:20:08
+@@ -169,7 +169,7 @@
+ $this->_trace = [];
+ $this->_todo = [];
+
+- if (false === array_key_exists($rule, $this->_rules)) {
++ if (false === array_key_exists($rule ?? '', $this->_rules)) {
+ $rule = $this->getRootRule();
+ }
+
diff --git a/patches/Idle.patch b/patches/Idle.patch
new file mode 100644
index 0000000000..6f6f0dbe29
--- /dev/null
+++ b/patches/Idle.patch
@@ -0,0 +1,11 @@
+--- Idle.php 2017-01-16 08:53:27
++++ Idle.php 2024-08-26 23:18:04
+@@ -100,7 +100,7 @@
+ $message,
+ $code = 0,
+ $arguments = [],
+- \Exception $previous = null
++ ?\Exception $previous = null
+ ) {
+ $this->_tmpArguments = $arguments;
+ parent::__construct($message, $code, $previous);
diff --git a/patches/Invocation.patch b/patches/Invocation.patch
new file mode 100644
index 0000000000..a3e9e10965
--- /dev/null
+++ b/patches/Invocation.patch
@@ -0,0 +1,11 @@
+--- Llk/Rule/Invocation.php 2017-08-08 09:44:07
++++ Llk/Rule/Invocation.php 2024-08-26 23:11:25
+@@ -95,7 +95,7 @@
+ public function __construct(
+ $rule,
+ $data,
+- array $todo = null,
++ ?array $todo = null,
+ $depth = -1
+ ) {
+ $this->_rule = $rule;
diff --git a/patches/Lexer.patch b/patches/Lexer.patch
new file mode 100644
index 0000000000..b2d84ed6e9
--- /dev/null
+++ b/patches/Lexer.patch
@@ -0,0 +1,12 @@
+diff --git a/Llk/Lexer.php b/Llk/Lexer.php
+index 6851367..b8acf98 100644
+--- a/Llk/Lexer.php
++++ b/Llk/Lexer.php
+@@ -281,7 +281,7 @@ class Lexer
+ $offset
+ );
+
+- if (0 === $preg) {
++ if (0 === $preg || $preg === false) {
+ return null;
+ }
diff --git a/patches/Lookahead.patch b/patches/Lookahead.patch
new file mode 100644
index 0000000000..d17a378444
--- /dev/null
+++ b/patches/Lookahead.patch
@@ -0,0 +1,52 @@
+--- Lookahead.php 2017-01-10 11:34:47.000000000 +0100
++++ Lookahead.php 2021-10-30 16:35:30.000000000 +0200
+@@ -93,7 +93,7 @@
+ *
+ * @return \Iterator
+ */
+- public function getInnerIterator()
++ public function getInnerIterator(): ?\Iterator
+ {
+ return $this->_iterator;
+ }
+@@ -103,6 +103,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function current()
+ {
+ return $this->_current;
+@@ -113,6 +114,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function key()
+ {
+ return $this->_key;
+@@ -123,6 +125,7 @@
+ *
+ * @return void
+ */
++ #[\ReturnTypeWillChange]
+ public function next()
+ {
+ $innerIterator = $this->getInnerIterator();
+@@ -143,6 +146,7 @@
+ *
+ * @return void
+ */
++ #[\ReturnTypeWillChange]
+ public function rewind()
+ {
+ $out = $this->getInnerIterator()->rewind();
+@@ -156,7 +160,7 @@
+ *
+ * @return bool
+ */
+- public function valid()
++ public function valid(): bool
+ {
+ return $this->_valid;
+ }
diff --git a/patches/Node.patch b/patches/Node.patch
new file mode 100644
index 0000000000..d289251ebd
--- /dev/null
+++ b/patches/Node.patch
@@ -0,0 +1,46 @@
+--- Node/Node.php 2017-01-14 13:26:10.000000000 +0100
++++ Node/Node.php 2021-10-30 16:32:43.000000000 +0200
+@@ -108,7 +108,7 @@
+ * @return \Hoa\Protocol\Protocol
+ * @throws \Hoa\Protocol\Exception
+ */
+- public function offsetSet($name, $node)
++ public function offsetSet($name, $node): void
+ {
+ if (!($node instanceof self)) {
+ throw new Protocol\Exception(
+@@ -141,6 +141,7 @@
+ * @return \Hoa\Protocol\Protocol
+ * @throws \Hoa\Protocol\Exception
+ */
++ #[\ReturnTypeWillChange]
+ public function offsetGet($name)
+ {
+ if (!isset($this[$name])) {
+@@ -160,7 +161,7 @@
+ * @param string $name Node's name.
+ * @return bool
+ */
+- public function offsetExists($name)
++ public function offsetExists($name): bool
+ {
+ return true === array_key_exists($name, $this->_children);
+ }
+@@ -171,7 +172,7 @@
+ * @param string $name Node's name to remove.
+ * @return void
+ */
+- public function offsetUnset($name)
++ public function offsetUnset($name): void
+ {
+ unset($this->_children[$name]);
+
+@@ -365,7 +366,7 @@
+ *
+ * @return \ArrayIterator
+ */
+- public function getIterator()
++ public function getIterator(): \Traversable
+ {
+ return new \ArrayIterator($this->_children);
+ }
diff --git a/patches/OutputFormatter.patch b/patches/OutputFormatter.patch
new file mode 100644
index 0000000000..e956d7210c
--- /dev/null
+++ b/patches/OutputFormatter.patch
@@ -0,0 +1,84 @@
+--- Formatter/OutputFormatter.php
++++ Formatter/OutputFormatter.php
+@@ -12,6 +12,7 @@
+ namespace Symfony\Component\Console\Formatter;
+
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
++use Symfony\Component\Console\Helper\Helper;
+
+ use function Symfony\Component\String\b;
+
+@@ -160,9 +161,11 @@ class OutputFormatter implements WrappableOutputFormatterInterface
+ continue;
+ }
+
++ // convert byte position to character position.
++ $pos = Helper::length(substr($message, 0, $pos));
+ // add the text up to the next tag
+- $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength);
+- $offset = $pos + \strlen($text);
++ $output .= $this->applyCurrentStyle(Helper::substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength);
++ $offset = $pos + Helper::length($text);
+
+ // opening tag?
+ if ($open = '/' != $text[1]) {
+@@ -183,7 +186,7 @@ class OutputFormatter implements WrappableOutputFormatterInterface
+ }
+ }
+
+- $output .= $this->applyCurrentStyle(substr($message, $offset), $output, $width, $currentLineLength);
++ $output .= $this->applyCurrentStyle(Helper::substr($message, $offset), $output, $width, $currentLineLength);
+
+ return strtr($output, ["\0" => '\\', '\\<' => '<', '\\>' => '>']);
+ }
+@@ -253,8 +256,20 @@ class OutputFormatter implements WrappableOutputFormatterInterface
+ }
+
+ if ($currentLineLength) {
+- $prefix = substr($text, 0, $i = $width - $currentLineLength)."\n";
+- $text = substr($text, $i);
++ $lines = explode("\n", $text, 2);
++ $prefix = Helper::substr($lines[0], 0, $i = $width - $currentLineLength)."\n";
++ $text = Helper::substr($lines[0], $i);
++
++ if (isset($lines[1])) {
++ // $prefix may contain the full first line in which the \n is already a part of $prefix.
++ if ('' !== $text) {
++ $text .= "\n";
++ }
++
++ $text .= $lines[1];
++ }
++
++ unset($lines);
+ } else {
+ $prefix = '';
+ }
+@@ -269,8 +284,8 @@ class OutputFormatter implements WrappableOutputFormatterInterface
+
+ $lines = explode("\n", $text);
+
+- foreach ($lines as $line) {
+- $currentLineLength += \strlen($line);
++ foreach ($lines as $i => $line) {
++ $currentLineLength = 0 === $i ? $currentLineLength + Helper::length($line) : Helper::length($line);
+ if ($width <= $currentLineLength) {
+ $currentLineLength = 0;
+ }
+--- Helper/Helper.php
++++ Helper/Helper.php
+@@ -100,6 +100,14 @@ abstract class Helper implements HelperInterface
+ {
+ $string ?? $string = '';
+
++ if (preg_match('//u', $string)) {
++ $result = grapheme_substr((new UnicodeString($string))->toString(), $from, $length);
++
++ return false === $result
++ ? ''
++ : $result;
++ }
++
+ if (false === $encoding = mb_detect_encoding($string, null, true)) {
+ return substr($string, $from, $length);
+ }
diff --git a/patches/PDO.patch b/patches/PDO.patch
new file mode 100644
index 0000000000..607a23fda2
--- /dev/null
+++ b/patches/PDO.patch
@@ -0,0 +1,11 @@
+--- PDO/PDO.php 2021-12-26 15:44:39.000000000 +0100
++++ PDO/PDO.php 2022-01-03 22:54:21.000000000 +0100
+@@ -1476,7 +1476,7 @@ namespace {
+ * @return array|false if one or more notifications is pending, returns a single row,
+ * with fields message and pid, otherwise FALSE.
+ */
+- public function pgsqlGetNotify($fetchMode = PDO::FETCH_DEFAULT, $timeoutMilliseconds = 0) {}
++ public function pgsqlGetNotify($fetchMode = 1, $timeoutMilliseconds = 0) {}
+
+ /**
+ * (PHP 5 >= 5.6.0, PHP 7, PHP 8)
diff --git a/patches/Read.patch b/patches/Read.patch
new file mode 100644
index 0000000000..ad9b64c445
--- /dev/null
+++ b/patches/Read.patch
@@ -0,0 +1,11 @@
+--- Read.php 2017-07-11 09:42:15
++++ Read.php 2024-08-26 23:09:54
+@@ -77,7 +77,7 @@
+ * @throws \Hoa\File\Exception\FileDoesNotExist
+ * @throws \Hoa\File\Exception
+ */
+- protected function &_open($streamName, Stream\Context $context = null)
++ protected function &_open($streamName, ?Stream\Context $context = null)
+ {
+ static $createModes = [
+ parent::MODE_READ
diff --git a/patches/ReflectionProperty.patch b/patches/ReflectionProperty.patch
new file mode 100644
index 0000000000..38d60b1bd4
--- /dev/null
+++ b/patches/ReflectionProperty.patch
@@ -0,0 +1,11 @@
+--- Reflection/ReflectionProperty.php 2023-09-07 12:59:56.000000000 +0200
++++ Reflection/ReflectionProperty.php 2023-09-15 13:24:07.900736741 +0200
+@@ -248,7 +248,7 @@
+ * Gets property type
+ *
+ * @link https://php.net/manual/en/reflectionproperty.gettype.php
+- * @return ReflectionNamedType|ReflectionUnionType|null Returns a {@see ReflectionType} if the
++ * @return ReflectionType|null Returns a {@see ReflectionType} if the
+ * property has a type, and {@see null} otherwise.
+ * @since 7.4
+ */
diff --git a/patches/Resolver.patch b/patches/Resolver.patch
new file mode 100644
index 0000000000..c743addc1b
--- /dev/null
+++ b/patches/Resolver.patch
@@ -0,0 +1,27 @@
+--- src/DI/Resolver.php 2023-10-02 21:58:38
++++ src/DI/Resolver.php 2025-08-26 09:38:08
+@@ -61,13 +61,13 @@
+
+ public function resolveDefinition(Definition $def): void
+ {
+- if ($this->recursive->contains($def)) {
++ if (isset($this->recursive[$def])) {
+ $names = array_map(function ($item) { return $item->getName(); }, iterator_to_array($this->recursive));
+ throw new ServiceCreationException(sprintf('Circular reference detected for services: %s.', implode(', ', $names)));
+ }
+
+ try {
+- $this->recursive->attach($def);
++ $this->recursive[$def] = true;
+
+ $def->resolveType($this);
+
+@@ -78,7 +78,7 @@
+ throw $this->completeException($e, $def);
+
+ } finally {
+- $this->recursive->detach($def);
++ unset($this->recursive[$def]);
+ }
+ }
+
diff --git a/patches/Rule.patch b/patches/Rule.patch
new file mode 100644
index 0000000000..faf698a5ff
--- /dev/null
+++ b/patches/Rule.patch
@@ -0,0 +1,14 @@
+--- Llk/Rule/Rule.php 2017-08-08 09:44:07.000000000 +0200
++++ Llk/Rule/Rule.php 2021-10-29 16:42:12.000000000 +0200
+@@ -118,7 +118,10 @@
+ {
+ $this->setName($name);
+ $this->setChildren($children);
+- $this->setNodeId($nodeId);
++
++ if ($nodeId !== null) {
++ $this->setNodeId($nodeId);
++ }
+
+ return;
+ }
diff --git a/patches/SessionHandler.patch b/patches/SessionHandler.patch
index 5b05a02df5..ba45ffc1b5 100644
--- a/patches/SessionHandler.patch
+++ b/patches/SessionHandler.patch
@@ -1,23 +1,20 @@
-@package jetbrains/phpstorm-stubs
-@version dev-master
-
---- session/SessionHandler.php 2021-09-09 18:57:58.000000000 +0200
-+++ session/SessionHandler.php 2021-09-12 19:00:13.000000000 +0200
-@@ -137,7 +137,7 @@
- * Note this value is returned internally to PHP for processing.
+--- session/SessionHandler.php 2021-11-04 14:27:30.000000000 +0100
++++ session/SessionHandler.php 2021-11-05 11:26:14.000000000 +0100
+@@ -147,7 +147,7 @@
*
*/
-- public function validateId(string $id);
-+ public function validateId($id);
+ #[TentativeType]
+- public function validateId(string $id): bool;
++ public function validateId($id): bool;
/**
* Update timestamp of a session
-@@ -152,7 +152,7 @@
- *
+@@ -163,7 +163,7 @@
* @return bool
*/
-- public function updateTimestamp(string $id, string $data);
-+ public function updateTimestamp($id, $data);
+ #[TentativeType]
+- public function updateTimestamp(string $id, string $data): bool;
++ public function updateTimestamp($id, $data): bool;
}
/**
diff --git a/patches/Stream.patch b/patches/Stream.patch
index 5abd708df1..8dbb2e108e 100644
--- a/patches/Stream.patch
+++ b/patches/Stream.patch
@@ -1,7 +1,5 @@
-@package hoa/stream
-
---- Stream.php 2017-02-21 17:01:06.000000000 +0100
-+++ Stream.php 2021-04-19 17:10:20.000000000 +0200
+--- Stream.php 2024-08-26 23:05:49
++++ Stream.php 2024-08-26 23:01:08
@@ -192,7 +192,7 @@
* @return array
* @throws \Hoa\Stream\Exception
@@ -11,6 +9,15 @@
$streamName,
Stream $handler,
$context = null
+@@ -250,7 +250,7 @@
+ * @return resource
+ * @throws \Hoa\Exception\Exception
+ */
+- abstract protected function &_open($streamName, Context $context = null);
++ abstract protected function &_open($streamName, ?Context $context = null);
+
+ /**
+ * Close the current stream.
@@ -687,11 +687,6 @@
Consistency::flexEntity('Hoa\Stream\Stream');
diff --git a/patches/TreeNode.patch b/patches/TreeNode.patch
new file mode 100644
index 0000000000..39e7917def
--- /dev/null
+++ b/patches/TreeNode.patch
@@ -0,0 +1,14 @@
+--- Llk/TreeNode.php 2017-08-08 09:44:07
++++ Llk/TreeNode.php 2024-08-26 23:07:29
+@@ -95,9 +95,9 @@
+ */
+ public function __construct(
+ $id,
+- array $value = null,
++ ?array $value = null,
+ array $children = [],
+- self $parent = null
++ ?self $parent = null
+ ) {
+ $this->setId($id);
+
diff --git a/patches/Wrapper.patch b/patches/Wrapper.patch
index ade4d0a2fe..b8282376bd 100644
--- a/patches/Wrapper.patch
+++ b/patches/Wrapper.patch
@@ -1,5 +1,3 @@
-@package hoa/protocol
-
--- Wrapper.php 2017-01-14 13:26:10.000000000 +0100
+++ Wrapper.php 2020-05-05 08:39:18.000000000 +0200
@@ -582,24 +582,3 @@
diff --git a/patches/cloudflare-ca.patch b/patches/cloudflare-ca.patch
new file mode 100644
index 0000000000..57f6cf5a77
--- /dev/null
+++ b/patches/cloudflare-ca.patch
@@ -0,0 +1,27 @@
+--- ca-bundle/res/cacert.pem 2024-06-18 13:50:00
++++ ca-bundle/res/cacert.pem 2024-06-18 13:50:29
+@@ -3579,3 +3579,24 @@
+ HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
+ o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
+ -----END CERTIFICATE-----
++
++Cloudflare CA
++==================================
++-----BEGIN CERTIFICATE-----
++MIIC6zCCAkygAwIBAgIUI7b68p0pPrCBoW4ptlyvVcPItscwCgYIKoZIzj0EAwQw
++gY0xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
++YW4gRnJhbmNpc2NvMRgwFgYDVQQKEw9DbG91ZGZsYXJlLCBJbmMxNzA1BgNVBAMT
++LkNsb3VkZmxhcmUgZm9yIFRlYW1zIEVDQyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
++HhcNMjAwMjA0MTYwNTAwWhcNMjUwMjAyMTYwNTAwWjCBjTELMAkGA1UEBhMCVVMx
++EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGDAW
++BgNVBAoTD0Nsb3VkZmxhcmUsIEluYzE3MDUGA1UEAxMuQ2xvdWRmbGFyZSBmb3Ig
++VGVhbXMgRUNDIENlcnRpZmljYXRlIEF1dGhvcml0eTCBmzAQBgcqhkjOPQIBBgUr
++gQQAIwOBhgAEAVdXsX8tpA9NAQeEQalvUIcVaFNDvGsR69ysZxOraRWNGHLfq1mi
++P6o3wtmtx/C2OXG01Cw7UFJbKl5MEDxnT2KoAdFSynSJOF2NDoe5LoZHbUW+yR3X
++FDl+MF6JzZ590VLGo6dPBf06UsXbH7PvHH2XKtFt8bBXVNMa5a21RdmpD0Pho0Uw
++QzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4EFgQU
++YBcQng1AEMMNteuRDAMG0/vgFe0wCgYIKoZIzj0EAwQDgYwAMIGIAkIBQU5OTA2h
++YqmFk8paan5ezHVLcmcucsfYw4L/wmeEjCkczRmCVNm6L86LjhWU0v0wER0e+lHO
++3efvjbsu8gIGSagCQgEBnyYMP9gwg8l96QnQ1khFA1ljFlnqc2XgJHDSaAJC0gdz
+++NV3JMeWaD2Rb32jc9r6/a7xY0u0ByqxBQ1OQ0dt7A==
++-----END CERTIFICATE-----
diff --git a/patches/dom_c.patch b/patches/dom_c.patch
new file mode 100644
index 0000000000..9e542c826d
--- /dev/null
+++ b/patches/dom_c.patch
@@ -0,0 +1,17 @@
+--- dom/dom_c.php 2024-01-02 12:04:54
++++ dom/dom_c.php 2024-01-21 10:41:56
+@@ -1347,6 +1347,14 @@
+ */
+ class DOMNamedNodeMap implements IteratorAggregate, Countable
+ {
++
++ /**
++ * The number of nodes in the map. The range of valid child node indices is 0 to length - 1 inclusive.
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $length;
+ /**
+ * Retrieves a node specified by name
+ * @link https://php.net/manual/en/domnamednodemap.getnameditem.php
diff --git a/patches/paratest.patch b/patches/paratest.patch
new file mode 100644
index 0000000000..f2091828ff
--- /dev/null
+++ b/patches/paratest.patch
@@ -0,0 +1,35 @@
+--- src/Runners/PHPUnit/Worker/BaseWorker.php 2020-02-07 23:07:07.000000000 +0100
++++ src/Runners/PHPUnit/Worker/BaseWorker.php 2022-03-27 17:35:45.000000000 +0200
+@@ -28,17 +28,18 @@
+ array $parameters = [],
+ ?Options $options = null
+ ) {
+- $bin = 'PARATEST=1 ';
++ $env = getenv();
++ $env['PARATEST'] = 1;
+ if (\is_numeric($token)) {
+- $bin .= 'XDEBUG_CONFIG="true" ';
+- $bin .= "TEST_TOKEN=$token ";
++ $env['XDEBUG_CONFIG'] = 'true';
++ $env['TEST_TOKEN'] = $token;
+ }
+ if ($uniqueToken) {
+- $bin .= "UNIQUE_TEST_TOKEN=$uniqueToken ";
++ $env['UNIQUE_TEST_TOKEN'] = $uniqueToken;
+ }
+ $finder = new PhpExecutableFinder();
+ $phpExecutable = $finder->find();
+- $bin .= "$phpExecutable ";
++ $bin = "$phpExecutable ";
+ if ($options && $options->passthruPhp) {
+ $bin .= $options->passthruPhp . ' ';
+ }
+@@ -50,7 +51,7 @@
+ if ($options && $options->verbose) {
+ echo "Starting WrapperWorker via: $bin\n";
+ }
+- $process = \proc_open($bin, self::$descriptorspec, $pipes);
++ $process = \proc_open($bin, self::$descriptorspec, $pipes, null, $env);
+ $this->proc = \is_resource($process) ? $process : null;
+ $this->pipes = $pipes;
+ }
diff --git a/patches/xmlreader.patch b/patches/xmlreader.patch
new file mode 100644
index 0000000000..7be168133f
--- /dev/null
+++ b/patches/xmlreader.patch
@@ -0,0 +1,122 @@
+--- xmlreader/xmlreader.php 2024-01-21 10:44:31
++++ xmlreader/xmlreader.php 2024-01-21 10:48:24
+@@ -28,7 +28,119 @@
+ */
+ class XMLReader
+ {
++ /**
++ * The number of attributes on the node
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $attributeCount;
++
++ /**
++ * The base URI of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $baseURI;
++
++ /**
++ * Depth of the node in the tree, starting at 0
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $depth;
++
++ /**
++ * Indicates if node has attributes
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $hasAttributes;
++
++ /**
++ * Indicates if node has a text value
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $hasValue;
++
++ /**
++ * Indicates if attribute is defaulted from DTD
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $isDefault;
++
++ /**
++ * Indicates if node is an empty element tag
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $isEmptyElement;
++
++ /**
++ * The local name of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $localName;
++
+ /**
++ * The qualified name of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $name;
++
++ /**
++ * The URI of the namespace associated with the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $namespaceURI;
++
++ /**
++ * The node type for the node
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $nodeType;
++
++ /**
++ * The prefix of the namespace associated with the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $prefix;
++
++ /**
++ * The text value of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $value;
++
++ /**
++ * The xml:lang scope which the node resides
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $xmlLang;
++
++ /**
+ * No node type
+ */
+ public const NONE = 0;
diff --git a/phpcs.xml b/phpcs.xml
index b3b5bb5651..0945cbbce6 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -1,54 +1,54 @@
+
+
-
+ bin
src
tests
compiler/src
+ compiler/tests
+ apigen/src
+ changelog-generator/src
+ changelog-generator/run.php
+ issue-bot/src
+ issue-bot/console.php
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
+
-
-
-
-
+
+ src/Rules/Whitespace/FileWhitespaceRule.php
-
-
-
-
-
+
+ 10
+
-
+
+
-
+
+
+ 10
+
+
+
-
+
-
src/Command/CommandHelper.php
@@ -57,56 +57,75 @@
tests
-
- src/Command/AnalyseApplication.php
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+ src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
-
-
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
-
- src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
+
+
+
+
-
- src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ src/Type/TypeResult.php
- tests/*/data
+ compiler/tests/*/data/
+ tests/*/Fixture/
+ tests/*/cache/
+ tests/vendor/*
+ tests/*/data/
+ tests/*/traits/
+ tests/PHPStan/Analyser/nsrt/
+ tests/e2e/anon-class/
+ tests/e2e/magic-setter/
tests/e2e/resultCache_1.php
tests/e2e/resultCache_2.php
tests/e2e/resultCache_3.php
- tests/*/traits
- tests/tmp
- tests/notAutoloaded
- src/Reflection/BetterReflection/BetterReflectionSourceLocatorFactory.php
- src/Reflection/SignatureMap/functionMap.php
- src/Reflection/SignatureMap/functionMetadata.php
+ tests/notAutoloaded/
+ tests/tmp/
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
index ac6123fc51..1ec2cd321b 100644
--- a/phpstan-baseline.neon
+++ b/phpstan-baseline.neon
@@ -1,351 +1,1966 @@
parameters:
ignoreErrors:
-
- message: "#^Only numeric types are allowed in pre\\-decrement, bool\\|float\\|int\\|string\\|null given\\.$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
+ path: build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php
+
+ -
+ rawMessage: 'Method PHPStan\Analyser\AnalyserResultFinalizer::finalize() throws checked exception Throwable but it''s missing from the PHPDoc @throws tag.'
+ identifier: missingType.checkedException
+ count: 1
+ path: src/Analyser/AnalyserResultFinalizer.php
+
+ -
+ rawMessage: Cannot assign offset 'realCount' to array|string.
+ identifier: offsetAssign.dimType
+ count: 1
+ path: src/Analyser/Ignore/IgnoredErrorHelperResult.php
+
+ -
+ rawMessage: Casting to string something that's already string.
+ identifier: cast.useless
+ count: 3
path: src/Analyser/MutatingScope.php
-
- message: "#^Only numeric types are allowed in pre\\-increment, bool\\|float\\|int\\|string\\|null given\\.$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Analyser/MutatingScope.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Analyser/MutatingScope.php
+
+ -
+ rawMessage: 'Only numeric types are allowed in pre-increment, float|int|string|null given.'
+ identifier: preInc.nonNumeric
count: 1
path: src/Analyser/MutatingScope.php
-
- message: "#^Anonymous function has an unused use \\$container\\.$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Analyser/NodeScopeResolver.php
+
+ -
+ rawMessage: 'Parameter #2 $node of method PHPStan\BetterReflection\SourceLocator\Ast\Strategy\NodeToReflection::__invoke() expects PhpParser\Node\Expr\ArrowFunction|PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\FuncCall|PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Const_|PhpParser\Node\Stmt\Enum_|PhpParser\Node\Stmt\Function_|PhpParser\Node\Stmt\Interface_|PhpParser\Node\Stmt\Trait_, PhpParser\Node\Stmt\ClassLike given.'
+ identifier: argument.type
+ count: 1
+ path: src/Analyser/NodeScopeResolver.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Analyser/RicherScopeGetTypeHelper.php
+
+ -
+ rawMessage: 'Call to method __construct() of internal class PhpParser\Internal\TokenStream from outside its root namespace PhpParser.'
+ identifier: method.internalClass
+ count: 1
+ path: src/Analyser/RuleErrorTransformer.php
+
+ -
+ rawMessage: Instantiation of internal class PhpParser\Internal\TokenStream.
+ identifier: new.internalClass
+ count: 1
+ path: src/Analyser/RuleErrorTransformer.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Analyser/TypeSpecifier.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 5
+ path: src/Analyser/TypeSpecifier.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Analyser/TypeSpecifier.php
+
+ -
+ rawMessage: 'Template type TNodeType is declared as covariant, but occurs in contravariant position in parameter node of method PHPStan\Collectors\Collector::processNode().'
+ identifier: generics.variance
+ count: 1
+ path: src/Collectors/Collector.php
+
+ -
+ rawMessage: 'Method PHPStan\Collectors\Registry::__construct() has parameter $collectors with generic interface PHPStan\Collectors\Collector but does not specify its types: TNodeType, TValue'
+ identifier: missingType.generics
+ count: 1
+ path: src/Collectors/Registry.php
+
+ -
+ rawMessage: 'Property PHPStan\Collectors\Registry::$cache with generic interface PHPStan\Collectors\Collector does not specify its types: TNodeType, TValue'
+ identifier: missingType.generics
+ count: 1
+ path: src/Collectors/Registry.php
+
+ -
+ rawMessage: 'Property PHPStan\Collectors\Registry::$collectors with generic interface PHPStan\Collectors\Collector does not specify its types: TNodeType, TValue'
+ identifier: missingType.generics
+ count: 1
+ path: src/Collectors/Registry.php
+
+ -
+ rawMessage: Anonymous function has an unused use $container.
+ identifier: closure.unusedUse
+ count: 1
+ path: src/Command/CommandHelper.php
+
+ -
+ rawMessage: 'Call to static method expand() of internal class Nette\DI\Helpers from outside its root namespace Nette.'
+ identifier: staticMethod.internalClass
+ count: 2
+ path: src/Command/CommandHelper.php
+
+ -
+ rawMessage: 'Parameter #1 $path of function dirname expects string, string|false given.'
+ identifier: argument.type
count: 1
path: src/Command/CommandHelper.php
-
- message: "#^Parameter \\#1 \\$path of function dirname expects string, string\\|false given\\.$#"
+ rawMessage: 'Static property PHPStan\Command\CommandHelper::$reservedMemory is never read, only written.'
+ identifier: property.onlyWritten
count: 1
path: src/Command/CommandHelper.php
-
- message: "#^Parameter \\#1 \\$headers \\(array\\\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$headers \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\StyleInterface\\:\\:table\\(\\)$#"
+ rawMessage: 'Call to static method escape() of internal class Nette\DI\Helpers from outside its root namespace Nette.'
+ identifier: staticMethod.internalClass
+ count: 4
+ path: src/Command/ErrorFormatter/BaselineNeonErrorFormatter.php
+
+ -
+ rawMessage: 'Call to static method escape() of internal class Nette\DI\Helpers from outside its root namespace Nette.'
+ identifier: staticMethod.internalClass
+ count: 5
+ path: src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php
+
+ -
+ rawMessage: 'Parameter #1 $headers (array) of method PHPStan\Command\ErrorsConsoleStyle::table() should be contravariant with parameter $headers (array) of method Symfony\Component\Console\Style\StyleInterface::table()'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Parameter \\#1 \\$headers \\(array\\\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$headers \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\SymfonyStyle\\:\\:table\\(\\)$#"
+ rawMessage: 'Parameter #1 $headers (array) of method PHPStan\Command\ErrorsConsoleStyle::table() should be contravariant with parameter $headers (array) of method Symfony\Component\Console\Style\SymfonyStyle::table()'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Parameter \\#2 \\$rows \\(array\\\\>\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$rows \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\StyleInterface\\:\\:table\\(\\)$#"
+ rawMessage: 'Parameter #2 $rows (array>) of method PHPStan\Command\ErrorsConsoleStyle::table() should be contravariant with parameter $rows (array) of method Symfony\Component\Console\Style\StyleInterface::table()'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Parameter \\#2 \\$rows \\(array\\\\>\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$rows \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\SymfonyStyle\\:\\:table\\(\\)$#"
+ rawMessage: 'Parameter #2 $rows (array>) of method PHPStan\Command\ErrorsConsoleStyle::table() should be contravariant with parameter $rows (array) of method Symfony\Component\Console\Style\SymfonyStyle::table()'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Call to an undefined method React\\\\Promise\\\\PromiseInterface\\:\\:done\\(\\)\\.$#"
+ rawMessage: 'Call to static method escape() of internal class Nette\DI\Helpers from outside its root namespace Nette.'
+ identifier: staticMethod.internalClass
+ count: 1
+ path: src/DependencyInjection/AutowiredAttributeServicesExtension.php
+
+ -
+ rawMessage: 'Call to static method expand() of internal class Nette\DI\Helpers from outside its root namespace Nette.'
+ identifier: staticMethod.internalClass
count: 2
- path: src/Command/FixerApplication.php
+ path: src/DependencyInjection/AutowiredAttributeServicesExtension.php
-
- message: "#^Call to an undefined method React\\\\Promise\\\\PromiseInterface\\\\:\\:done\\(\\)\\.$#"
+ rawMessage: 'Call to static method expand() of internal class Nette\DI\Helpers from outside its root namespace Nette.'
+ identifier: staticMethod.internalClass
count: 1
- path: src/Command/FixerApplication.php
+ path: src/DependencyInjection/ContainerFactory.php
-
- message: "#^Parameter \\#1 \\$arg of function escapeshellarg expects string, string\\|false given\\.$#"
+ rawMessage: 'Call to static method merge() of internal class Nette\Schema\Helpers from outside its root namespace Nette.'
+ identifier: staticMethod.internalClass
+ count: 2
+ path: src/DependencyInjection/ContainerFactory.php
+
+ -
+ rawMessage: Variable method call on Nette\Schema\Elements\AnyOf|Nette\Schema\Elements\Structure|Nette\Schema\Elements\Type.
+ identifier: method.dynamicName
count: 1
- path: src/Command/FixerApplication.php
+ path: src/DependencyInjection/ContainerFactory.php
-
- message: "#^Call to an undefined method React\\\\Promise\\\\PromiseInterface\\:\\:done\\(\\)\\.$#"
+ rawMessage: Variable static method call on Nette\Schema\Expect.
+ identifier: staticMethod.dynamicName
count: 1
- path: src/Command/WorkerCommand.php
+ path: src/DependencyInjection/ContainerFactory.php
-
- message: "#^Fetching class constant PREVENT_MERGING of deprecated class Nette\\\\DI\\\\Config\\\\Helpers\\.$#"
+ rawMessage: Fetching class constant PREVENT_MERGING of deprecated class Nette\DI\Config\Helpers.
+ identifier: classConstant.deprecatedClass
count: 1
path: src/DependencyInjection/NeonAdapter.php
-
- message: "#^Variable method call on Nette\\\\Schema\\\\Elements\\\\AnyOf\\|Nette\\\\Schema\\\\Elements\\\\Structure\\|Nette\\\\Schema\\\\Elements\\\\Type\\.$#"
+ rawMessage: Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/DependencyInjection/ParametersSchemaExtension.php
+ path: src/Diagnose/PHPStanDiagnoseExtension.php
-
- message: "#^Variable static method call on Nette\\\\Schema\\\\Expect\\.$#"
+ rawMessage: 'Parameter #1 $path of function dirname expects string, string|false given.'
+ identifier: argument.type
count: 1
- path: src/DependencyInjection/ParametersSchemaExtension.php
+ path: src/Diagnose/PHPStanDiagnoseExtension.php
+
+ -
+ rawMessage: 'Call to method getContent() of internal class PhpMerge\internal\Line from outside its root namespace PhpMerge.'
+ identifier: method.internalClass
+ count: 2
+ path: src/Fixable/Patcher.php
-
- message: "#^Variable method call on PHPStan\\\\Reflection\\\\ClassReflection\\.$#"
+ rawMessage: 'Call to static method createArray() of internal class PhpMerge\internal\Hunk from outside its root namespace PhpMerge.'
+ identifier: staticMethod.internalClass
count: 2
- path: src/PhpDoc/PhpDocBlock.php
+ path: src/Fixable/Patcher.php
+
+ -
+ rawMessage: 'Call to static method createArray() of internal class PhpMerge\internal\Line from outside its root namespace PhpMerge.'
+ identifier: staticMethod.internalClass
+ count: 5
+ path: src/Fixable/Patcher.php
+
+ -
+ rawMessage: 'Call to method getTokenCode() of internal class PhpParser\Internal\TokenStream from outside its root namespace PhpParser.'
+ identifier: method.internalClass
+ count: 1
+ path: src/Fixable/PhpPrinterIndentationDetectorVisitor.php
+
+ -
+ rawMessage: 'Parameter $origTokens of method PHPStan\Fixable\PhpPrinterIndentationDetectorVisitor::__construct() has typehint with internal class PhpParser\Internal\TokenStream.'
+ identifier: parameter.internalClass
+ count: 1
+ path: src/Fixable/PhpPrinterIndentationDetectorVisitor.php
+
+ -
+ rawMessage: Property $origTokens references internal class PhpParser\Internal\TokenStream in its type.
+ identifier: property.internalClass
+ count: 1
+ path: src/Fixable/PhpPrinterIndentationDetectorVisitor.php
+
+ -
+ rawMessage: Access to property $id of internal class Symfony\Polyfill\Php80\PhpToken from outside its root namespace Symfony.
+ identifier: property.internalClass
+ count: 1
+ path: src/Parser/RichParser.php
+
+ -
+ rawMessage: Access to property $line of internal class Symfony\Polyfill\Php80\PhpToken from outside its root namespace Symfony.
+ identifier: property.internalClass
+ count: 4
+ path: src/Parser/RichParser.php
+
+ -
+ rawMessage: Access to property $text of internal class Symfony\Polyfill\Php80\PhpToken from outside its root namespace Symfony.
+ identifier: property.internalClass
+ count: 3
+ path: src/Parser/RichParser.php
-
- message: "#^Variable static method call on PHPStan\\\\PhpDoc\\\\PhpDocBlock\\.$#"
+ rawMessage: 'Call to function method_exists() with PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode and ''getParamOutTypeTagV…'' will always evaluate to true.'
+ identifier: function.alreadyNarrowedType
count: 1
- path: src/PhpDoc/PhpDocBlock.php
+ path: src/PhpDoc/PhpDocNodeResolver.php
-
- message: "#^Method PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock\\:\\:getNameScope\\(\\) should return PHPStan\\\\Analyser\\\\NameScope but returns PHPStan\\\\Analyser\\\\NameScope\\|null\\.$#"
+ rawMessage: 'Call to function method_exists() with PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode and ''getSelfOutTypeTagVa…'' will always evaluate to true.'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/PhpDoc/PhpDocNodeResolver.php
+
+ -
+ rawMessage: 'Method PHPStan\PhpDoc\ResolvedPhpDocBlock::getNameScope() should return PHPStan\Analyser\NameScope but returns PHPStan\Analyser\NameScope|null.'
+ identifier: return.type
count: 1
path: src/PhpDoc/ResolvedPhpDocBlock.php
-
- message:
- """
- #^Call to deprecated method getInstance\\(\\) of class PHPStan\\\\Broker\\\\Broker\\:
- Use PHPStan\\\\Reflection\\\\ReflectionProviderStaticAccessor instead$#
- """
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/PhpDoc/TypeNodeResolver.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/PhpDoc/TypeNodeResolver.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/PhpDoc/StubValidator.php
+ path: src/PhpDoc/TypeNodeResolver.php
-
- message: "#^Return type \\(PHPStan\\\\PhpDoc\\\\Tag\\\\ParamTag\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\ParamTag\\:\\:withType\\(\\) should be covariant with return type \\(static\\(PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\)\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\:\\:withType\\(\\)$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/PhpDoc/Tag/ParamTag.php
+ path: src/PhpDoc/TypeNodeResolver.php
-
- message: "#^Return type \\(PHPStan\\\\PhpDoc\\\\Tag\\\\ReturnTag\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\ReturnTag\\:\\:withType\\(\\) should be covariant with return type \\(static\\(PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\)\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\:\\:withType\\(\\)$#"
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/PhpDoc/Tag/ReturnTag.php
+ path: src/PhpDoc/TypeNodeResolver.php
-
- message: "#^Return type \\(PHPStan\\\\PhpDoc\\\\Tag\\\\VarTag\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\VarTag\\:\\:withType\\(\\) should be covariant with return type \\(static\\(PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\)\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\:\\:withType\\(\\)$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\IterableType is error-prone and deprecated. Use Type::isIterable() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/PhpDoc/Tag/VarTag.php
+ path: src/PhpDoc/TypeNodeResolver.php
-
- message: "#^Dead catch \\- PHPStan\\\\BetterReflection\\\\Identifier\\\\Exception\\\\InvalidIdentifierName is never thrown in the try block\\.$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
count: 2
+ path: src/PhpDoc/TypeNodeResolver.php
+
+ -
+ rawMessage: Dead catch - PHPStan\BetterReflection\Identifier\Exception\InvalidIdentifierName is never thrown in the try block.
+ identifier: catch.neverThrown
+ count: 4
path: src/Reflection/BetterReflection/BetterReflectionProvider.php
-
- message: "#^Dead catch \\- PHPStan\\\\BetterReflection\\\\NodeCompiler\\\\Exception\\\\UnableToCompileNode\\|PHPStan\\\\BetterReflection\\\\Reflection\\\\Exception\\\\NotAClassReflection\\|PHPStan\\\\BetterReflection\\\\Reflection\\\\Exception\\\\NotAnInterfaceReflection is never thrown in the try block\\.$#"
+ rawMessage: Dead catch - PHPStan\BetterReflection\NodeCompiler\Exception\UnableToCompileNode is never thrown in the try block.
+ identifier: catch.neverThrown
count: 1
path: src/Reflection/BetterReflection/BetterReflectionProvider.php
-
- message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
+ rawMessage: Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
-
- message: "#^Only booleans are allowed in a negated boolean, int\\|false given\\.$#"
+ rawMessage: Creating new ReflectionFunction is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
+
+ -
+ rawMessage: 'Parameter #2 $node of method PHPStan\BetterReflection\SourceLocator\Ast\Strategy\NodeToReflection::__invoke() expects PhpParser\Node\Expr\ArrowFunction|PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\FuncCall|PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Const_|PhpParser\Node\Stmt\Enum_|PhpParser\Node\Stmt\Function_|PhpParser\Node\Stmt\Interface_|PhpParser\Node\Stmt\Trait_, PhpParser\Node\Stmt\ClassLike given.'
+ identifier: argument.type
+ count: 1
+ path: src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
-
- message: "#^Only booleans are allowed in an if condition, int\\|false given\\.$#"
+ rawMessage: 'Method PHPStan\Reflection\BetterReflection\SourceLocator\FileReadTrapStreamWrapper::invokeWithRealFileStreamWrapper() has parameter $cb with no signature specified for callable.'
+ identifier: missingType.callable
+ count: 1
+ path: src/Reflection/BetterReflection/SourceLocator/FileReadTrapStreamWrapper.php
+
+ -
+ rawMessage: 'Parameter #2 $node of method PHPStan\BetterReflection\SourceLocator\Ast\Strategy\NodeToReflection::__invoke() expects PhpParser\Node\Expr\ArrowFunction|PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\FuncCall|PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Const_|PhpParser\Node\Stmt\Enum_|PhpParser\Node\Stmt\Function_|PhpParser\Node\Stmt\Interface_|PhpParser\Node\Stmt\Trait_, PhpParser\Node\Expr\FuncCall|PhpParser\Node\Stmt\ClassLike|PhpParser\Node\Stmt\Const_|PhpParser\Node\Stmt\Function_ given.'
+ identifier: argument.type
count: 1
path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\ClassReflection\\:\\:__construct\\(\\) has parameter \\$reflection with generic class ReflectionClass but does not specify its types\\: T$#"
+ rawMessage: 'Parameter #2 $node of method PHPStan\BetterReflection\SourceLocator\Ast\Strategy\NodeToReflection::__invoke() expects PhpParser\Node\Expr\ArrowFunction|PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\FuncCall|PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Const_|PhpParser\Node\Stmt\Enum_|PhpParser\Node\Stmt\Function_|PhpParser\Node\Stmt\Interface_|PhpParser\Node\Stmt\Trait_, PhpParser\Node\Stmt\ClassLike given.'
+ identifier: argument.type
+ count: 2
+ path: src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocator.php
+
+ -
+ rawMessage: Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/ClassReflection.php
+ path: src/Reflection/BetterReflection/SourceLocator/ReflectionClassSourceLocator.php
+
+ -
+ rawMessage: Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Reflection/BetterReflection/SourceLocator/RewriteClassAliasSourceLocator.php
+
+ -
+ rawMessage: Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Reflection/BetterReflection/SourceLocator/SkipClassAliasSourceLocator.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\ClassReflection\\:\\:getCacheKey\\(\\) should return string but returns string\\|null\\.$#"
+ rawMessage: '''
+ Call to deprecated method isSubclassOf() of class PHPStan\Reflection\ClassReflection:
+ Use isSubclassOfClass instead.
+ '''
+ identifier: method.deprecated
count: 1
path: src/Reflection/ClassReflection.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\ClassReflection\\:\\:getNativeReflection\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Reflection/ClassReflection.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
path: src/Reflection/ClassReflection.php
-
- message: "#^Property PHPStan\\\\Reflection\\\\ClassReflection\\:\\:\\$reflection with generic class ReflectionClass does not specify its types\\: T$#"
+ rawMessage: 'Method PHPStan\Reflection\ClassReflection::getCacheKey() should return string but returns string|null.'
+ identifier: return.type
count: 1
path: src/Reflection/ClassReflection.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\BuiltinMethodReflection\\:\\:getDeclaringClass\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ rawMessage: Binary operation "&" between bool|float|int|string|null and bool|float|int|string|null results in an error.
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: Binary operation "*" between bool|float|int|string|null and bool|float|int|string|null results in an error.
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: Binary operation "+" between bool|float|int|string|null and bool|float|int|string|null results in an error.
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: Binary operation "-" between bool|float|int|string|null and bool|float|int|string|null results in an error.
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: Binary operation "^" between bool|float|int|string|null and bool|float|int|string|null results in an error.
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: Binary operation "|" between bool|float|int|string|null and bool|float|int|string|null results in an error.
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 22
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 10
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: PHPDoc tag @var with type float|int is not subtype of native type int.
+ identifier: varTag.nativeType
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: PHPDoc tag @var with type float|int is not subtype of type int.
+ identifier: varTag.type
+ count: 4
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: PHPDoc tag @var with type float|int|null is not subtype of type int|null.
+ identifier: varTag.type
+ count: 6
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ rawMessage: Creating new PHPStan\Php8StubsMap is not covered by backward compatibility promise. The class might change in a minor PHPStan version.
+ identifier: phpstanApi.constructor
+ count: 1
+ path: src/Reflection/SignatureMap/Php8SignatureMapProvider.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Classes/ImpossibleInstanceOfRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Classes/RequireImplementsRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 6
+ path: src/Rules/Comparison/BooleanAndConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/BooleanNotConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 6
+ path: src/Rules/Comparison/BooleanOrConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/DoWhileLoopConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/ElseIfConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/IfConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\TypeWithClassName is error-prone and deprecated. Use Type::getObjectClassNames() or Type::getObjectClassReflections() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Rules/Comparison/LogicalXorConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Rules/Comparison/MatchExpressionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/NumberComparisonOperatorsConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/TernaryOperatorConstantConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/WhileLoopAlwaysFalseConditionRule.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/WhileLoopAlwaysTrueConditionRule.php
+
+ -
+ rawMessage: 'Function class_implements() is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/Php/BuiltinMethodReflection.php
+ path: src/Rules/DirectRegistry.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\FakeBuiltinMethodReflection\\:\\:__construct\\(\\) has parameter \\$declaringClass with generic class ReflectionClass but does not specify its types\\: T$#"
+ rawMessage: 'Function class_parents() is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/Php/FakeBuiltinMethodReflection.php
+ path: src/Rules/DirectRegistry.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\FakeBuiltinMethodReflection\\:\\:getDeclaringClass\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ rawMessage: 'Method PHPStan\Rules\DirectRegistry::__construct() has parameter $rules with generic interface PHPStan\Rules\Rule but does not specify its types: TNodeType'
+ identifier: missingType.generics
count: 1
- path: src/Reflection/Php/FakeBuiltinMethodReflection.php
+ path: src/Rules/DirectRegistry.php
-
- message: "#^Property PHPStan\\\\Reflection\\\\Php\\\\FakeBuiltinMethodReflection\\:\\:\\$declaringClass with generic class ReflectionClass does not specify its types\\: T$#"
+ rawMessage: 'Property PHPStan\Rules\DirectRegistry::$cache with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
count: 1
- path: src/Reflection/Php/FakeBuiltinMethodReflection.php
+ path: src/Rules/DirectRegistry.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\NativeBuiltinMethodReflection\\:\\:getDeclaringClass\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ rawMessage: 'Property PHPStan\Rules\DirectRegistry::$rules with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
count: 1
- path: src/Reflection/Php/NativeBuiltinMethodReflection.php
+ path: src/Rules/DirectRegistry.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\PhpClassReflectionExtension\\:\\:collectTraits\\(\\) has parameter \\$class with generic class ReflectionClass but does not specify its types\\: T$#"
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Reflection/Php/PhpClassReflectionExtension.php
+ path: src/Rules/Generics/GenericAncestorsCheck.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\PhpClassReflectionExtension\\:\\:collectTraits\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Reflection/Php/PhpClassReflectionExtension.php
+ path: src/Rules/Generics/TemplateTypeCheck.php
-
- message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
+ rawMessage: 'Function class_implements() is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Rules/Api/ApiClassExtendsRule.php
+ path: src/Rules/LazyRegistry.php
-
- message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
+ rawMessage: 'Function class_parents() is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Rules/Api/ApiClassImplementsRule.php
+ path: src/Rules/LazyRegistry.php
-
- message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
+ rawMessage: 'Method PHPStan\Rules\LazyRegistry::getRulesFromContainer() return type with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
count: 1
- path: src/Rules/Api/ApiInstantiationRule.php
+ path: src/Rules/LazyRegistry.php
-
- message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
+ rawMessage: 'Property PHPStan\Rules\LazyRegistry::$cache with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
count: 1
- path: src/Rules/Api/ApiInterfaceExtendsRule.php
+ path: src/Rules/LazyRegistry.php
-
- message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
+ rawMessage: 'Property PHPStan\Rules\LazyRegistry::$rules with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
count: 1
- path: src/Rules/Api/ApiMethodCallRule.php
+ path: src/Rules/LazyRegistry.php
-
- message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Api/ApiStaticCallRule.php
+ path: src/Rules/Methods/MethodParameterComparisonHelper.php
-
- message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Api/ApiTraitUseRule.php
+ path: src/Rules/Methods/MethodParameterComparisonHelper.php
-
- message: "#^Binary operation \"\\+\" between array\\(class\\-string\\\\) and array\\\\|false results in an error\\.$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\IterableType is error-prone and deprecated. Use Type::isIterable() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Registry.php
+ path: src/Rules/Methods/MethodParameterComparisonHelper.php
-
- message: "#^Method PHPStan\\\\Rules\\\\Registry\\:\\:__construct\\(\\) has parameter \\$rules with generic interface PHPStan\\\\Rules\\\\Rule but does not specify its types\\: TNodeType$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Registry.php
+ path: src/Rules/Methods/StaticMethodCallCheck.php
-
- message: "#^Property PHPStan\\\\Rules\\\\Registry\\:\\:\\$cache with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Registry.php
+ path: src/Rules/PhpDoc/VarTagTypeRuleHelper.php
-
- message: "#^Property PHPStan\\\\Rules\\\\Registry\\:\\:\\$rules with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ rawMessage: Access to an undefined property T of PHPStan\Rules\RuleError::$tip.
+ identifier: property.notFound
+ count: 2
+ path: src/Rules/RuleErrorBuilder.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/RuleLevelHelper.php
+
+ -
+ rawMessage: 'Call to function method_exists() with ''PHPUnit\\Framework\\TestCase'' and ''assertFileDoesNotEx…'' will always evaluate to true.'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Testing/LevelsTestCase.php
+
+ -
+ rawMessage: Catching internal class PHPUnit\Framework\AssertionFailedError.
+ identifier: catch.internalClass
+ count: 2
+ path: src/Testing/LevelsTestCase.php
+
+ -
+ rawMessage: 'Return type of method PHPStan\Testing\LevelsTestCase::compareFiles() has typehint with internal class PHPUnit\Framework\AssertionFailedError.'
+ identifier: return.internalClass
count: 1
- path: src/Rules/Registry.php
+ path: src/Testing/LevelsTestCase.php
-
- message: "#^Anonymous function has an unused use \\$container\\.$#"
+ rawMessage: Anonymous function has an unused use $container.
+ identifier: closure.unusedUse
count: 1
path: src/Testing/PHPStanTestCase.php
-
- message:
- """
- #^Call to deprecated method getInstance\\(\\) of class PHPStan\\\\Broker\\\\Broker\\:
- Use PHPStan\\\\Reflection\\\\ReflectionProviderStaticAccessor instead$#
- """
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Testing/TypeInferenceTestCase.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Type/ObjectType.php
+ path: src/Type/Accessory/AccessoryArrayListType.php
-
- message:
- """
- #^Call to deprecated method getUniversalObjectCratesClasses\\(\\) of class PHPStan\\\\Broker\\\\Broker\\:
- Inject %%universalObjectCratesClasses%% parameter instead\\.$#
- """
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Type/ObjectType.php
+ path: src/Type/Accessory/AccessoryLiteralStringType.php
-
- message: "#^Unreachable statement \\- code above always terminates\\.$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/AnalyserTest.php
+ path: src/Type/Accessory/AccessoryLowercaseStringType.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\AnonymousClassNameRule implements generic interface PHPStan\\\\Rules\\\\Rule but does not specify its types\\: TNodeType$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/AnonymousClassNameRule.php
+ path: src/Type/Accessory/AccessoryNonEmptyStringType.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\AnonymousClassNameRuleTest extends generic class PHPStan\\\\Testing\\\\RuleTestCase but does not specify its types\\: TRule$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+ path: src/Type/Accessory/AccessoryNonEmptyStringType.php
-
- message: "#^Method PHPStan\\\\Analyser\\\\AnonymousClassNameRuleTest\\:\\:getRule\\(\\) return type with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+ path: src/Type/Accessory/AccessoryNonFalsyStringType.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\EvaluationOrderRule implements generic interface PHPStan\\\\Rules\\\\Rule but does not specify its types\\: TNodeType$#"
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/EvaluationOrderRule.php
+ path: src/Type/Accessory/AccessoryNumericStringType.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\EvaluationOrderTest extends generic class PHPStan\\\\Testing\\\\RuleTestCase but does not specify its types\\: TRule$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+ path: src/Type/Accessory/AccessoryNumericStringType.php
-
- message: "#^Method PHPStan\\\\Analyser\\\\EvaluationOrderTest\\:\\:getRule\\(\\) return type with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+ path: src/Type/Accessory/AccessoryUppercaseStringType.php
-
- message:
- """
- #^Call to deprecated method getClass\\(\\) of class PHPStan\\\\Broker\\\\Broker\\:
- Use PHPStan\\\\Reflection\\\\ReflectionProvider instead$#
- """
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Broker/BrokerTest.php
+ path: src/Type/Accessory/HasMethodType.php
-
- message:
- """
- #^Call to deprecated method getFunction\\(\\) of class PHPStan\\\\Broker\\\\Broker\\:
- Use PHPStan\\\\Reflection\\\\ReflectionProvider instead$#
- """
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Broker/BrokerTest.php
+ path: src/Type/Accessory/HasOffsetType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Accessory/HasOffsetValueType.php
-
- message:
- """
- #^Call to deprecated method hasClass\\(\\) of class PHPStan\\\\Broker\\\\Broker\\:
- Use PHPStan\\\\Reflection\\\\ReflectionProvider instead$#
- """
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Accessory/HasOffsetValueType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Broker/BrokerTest.php
+ path: src/Type/Accessory/HasOffsetValueType.php
-
- message: "#^Constant SOME_CONSTANT_IN_AUTOLOAD_FILE not found\\.$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Command/AnalyseCommandTest.php
+ path: src/Type/Accessory/HasPropertyType.php
-
- message: "#^Class PHPStan\\\\Node\\\\FileNodeTest extends generic class PHPStan\\\\Testing\\\\RuleTestCase but does not specify its types\\: TRule$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Node/FileNodeTest.php
+ path: src/Type/Accessory/NonEmptyArrayType.php
-
- message: "#^Method PHPStan\\\\Node\\\\FileNodeTest\\:\\:getRule\\(\\) return type with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Node/FileNodeTest.php
+ path: src/Type/Accessory/OversizedArrayType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/ArrayType.php
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ArrayType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ArrayType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ArrayType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\BooleanType is error-prone and deprecated. Use Type::isBoolean() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/BooleanType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/BooleanType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/CallableType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/CallableType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ClosureType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 6
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ rawMessage: PHPDoc tag @var assumes the expression with type PHPStan\Type\Type is always PHPStan\Type\Constant\ConstantIntegerType|PHPStan\Type\Constant\ConstantStringType but it's error-prone and dangerous.
+ identifier: phpstanApi.varTagAssumption
+ count: 2
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ rawMessage: PHPDoc tag @var with type float|int is not subtype of native type int.
+ identifier: varTag.nativeType
+ count: 2
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ rawMessage: PHPDoc tag @var with type float|int is not subtype of type int.
+ identifier: varTag.type
+ count: 1
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\BooleanType is error-prone and deprecated. Use Type::isBoolean() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantBooleanType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantBooleanType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Constant/ConstantBooleanType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantFloatType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\FloatType is error-prone and deprecated. Use Type::isFloat() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantFloatType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantIntegerType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IntegerType is error-prone and deprecated. Use Type::isInteger() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantIntegerType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ClassStringType is error-prone and deprecated. Use Type::isClassStringType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\StringType is error-prone and deprecated. Use Type::isString() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ rawMessage: PHPDoc tag @var with type int|string is not subtype of type string.
+ identifier: varTag.type
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/OversizedArrayBuilder.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Enum\EnumCaseObjectType is error-prone and deprecated. Use Type::getEnumCases() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Enum/EnumCaseObjectType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ExponentiateHelper.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/FileTypeMapper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\FloatType is error-prone and deprecated. Use Type::isFloat() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/FloatType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ClassStringType is error-prone and deprecated. Use Type::isClassStringType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\StringType is error-prone and deprecated. Use Type::isString() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\TypeWithClassName is error-prone and deprecated. Use Type::getObjectClassNames() or Type::getObjectClassReflections() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericStaticType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\TypeWithClassName is error-prone and deprecated. Use Type::getObjectClassNames() or Type::getObjectClassReflections() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericStaticType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateArrayType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateBenevolentUnionType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateBooleanType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateConstantArrayType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateConstantIntegerType.php
+
+ -
+ rawMessage: 'Method PHPStan\Type\Generic\TemplateConstantIntegerType::toPhpDocNode() should return PHPStan\PhpDocParser\Ast\Type\ConstTypeNode but returns PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode.'
+ identifier: return.type
+ count: 1
+ path: src/Type/Generic/TemplateConstantIntegerType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateConstantStringType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateFloatType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateGenericObjectType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateIntegerType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateIntersectionType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateIterableType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateKeyOfType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/TemplateMixedType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateNullType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateObjectShapeType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateObjectType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateObjectWithoutClassType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/TemplateStrictMixedType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateStringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\BooleanType is error-prone and deprecated. Use Type::isBoolean() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\FloatType is error-prone and deprecated. Use Type::isFloat() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IntegerType is error-prone and deprecated. Use Type::isInteger() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IterableType is error-prone and deprecated. Use Type::isIterable() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\NullType is error-prone and deprecated. Use Type::isNull() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectShapeType is error-prone and deprecated. Use Type::isObject() and Type::hasProperty() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectWithoutClassType is error-prone and deprecated. Use Type::isObject() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\StringType is error-prone and deprecated. Use Type::isString() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateUnionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntegerRangeType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IntegerType is error-prone and deprecated. Use Type::isInteger() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/IntegerRangeType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntegerRangeType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IntegerType is error-prone and deprecated. Use Type::isInteger() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/IntegerType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/IntersectionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\BooleanType is error-prone and deprecated. Use Type::isBoolean() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntersectionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/IntersectionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/IntersectionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntersectionType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/IntersectionType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/IterableType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IterableType is error-prone and deprecated. Use Type::isIterable() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IterableType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/NullType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\NullType is error-prone and deprecated. Use Type::isNull() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/NullType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectShapeType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectShapeType is error-prone and deprecated. Use Type::isObject() and Type::hasProperty() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ObjectShapeType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectWithoutClassType is error-prone and deprecated. Use Type::isObject() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectShapeType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Enum\EnumCaseObjectType is error-prone and deprecated. Use Type::getEnumCases() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/ObjectType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectWithoutClassType is error-prone and deprecated. Use Type::isObject() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/ObjectType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectShapeType is error-prone and deprecated. Use Type::isObject() and Type::hasProperty() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ObjectWithoutClassType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectWithoutClassType is error-prone and deprecated. Use Type::isObject() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/ObjectWithoutClassType.php
+
+ -
+ rawMessage: Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine. Use objects retrieved from ReflectionProvider instead.
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Type/PHPStan/ClassNameUsageLocationCreateIdentifierDynamicReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 16
+ path: src/Type/Php/BcMathStringOrNullReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ClassExistsFunctionTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/CompactFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/CompactFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/DefineConstantTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/DefinedConstantTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\TypeWithClassName is error-prone and deprecated. Use Type::getObjectClassNames() or Type::getObjectClassReflections() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/DsMapDynamicReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/FilterFunctionReturnTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/FilterFunctionReturnTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/FunctionExistsFunctionTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/IsAFunctionTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/MbSubstituteCharacterDynamicReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/MethodExistsTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/MinMaxFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/MinMaxFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/NumberFormatFunctionDynamicReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/NumberFormatFunctionDynamicReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/PropertyExistsTypeSpecifyingExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/RangeFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ReflectionMethodConstructorThrowTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ReflectionMethodConstructorThrowTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/SscanfFunctionDynamicReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/StrRepeatFunctionReturnTypeExtension.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectType is error-prone and deprecated. Use Type::isObject() or Type::getObjectClassNames() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/StaticType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectWithoutClassType is error-prone and deprecated. Use Type::isObject() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/StaticType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/StringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\StringType is error-prone and deprecated. Use Type::isString() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/StringType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 5
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 16
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 5
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IterableType is error-prone and deprecated. Use Type::isIterable() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 8
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\NullType is error-prone and deprecated. Use Type::isNull() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ObjectShapeType is error-prone and deprecated. Use Type::isObject() and Type::hasProperty() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: Instanceof between PHPStan\Type\Constant\ConstantIntegerType and PHPStan\Type\Constant\ConstantIntegerType will always evaluate to true.
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: Result of || is always true.
+ identifier: booleanOr.alwaysTrue
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeUtils.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/TypeUtils.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/TypehintHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantArrayType is error-prone and deprecated. Use Type::getConstantArrays() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypehintHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IterableType is error-prone and deprecated. Use Type::isIterable() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypehintHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/UnionType.php
+
+ -
+ rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IterableType is error-prone and deprecated. Use Type::isIterable() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/UnionType.php
+
+ -
+ rawMessage: PHPDoc tag @var assumes the expression with type PHPStan\Type\Type is always PHPStan\Type\BooleanType but it's error-prone and dangerous.
+ identifier: phpstanApi.varTagAssumption
+ count: 1
+ path: src/Type/UnionType.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantBooleanType is error-prone and deprecated. Use Type::isTrue() or Type::isFalse() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\IntegerType is error-prone and deprecated. Use Type::isInteger() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\NullType is error-prone and deprecated. Use Type::isNull() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ rawMessage: 'Doing instanceof PHPStan\Type\VoidType is error-prone and deprecated. Use Type::isVoid() instead.'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/VoidType.php
+
+ -
+ rawMessage: 'Class PHPStan\Analyser\AnonymousClassNameRuleTest extends generic class PHPStan\Testing\RuleTestCase but does not specify its types: TRule'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+
+ -
+ rawMessage: 'Method PHPStan\Analyser\AnonymousClassNameRuleTest::getRule() return type with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+
+ -
+ rawMessage: 'Class PHPStan\Analyser\EvaluationOrderTest extends generic class PHPStan\Testing\RuleTestCase but does not specify its types: TRule'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+
+ -
+ rawMessage: 'Method PHPStan\Analyser\EvaluationOrderTest::getRule() return type with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+
+ -
+ rawMessage: Constant SOME_CONSTANT_IN_AUTOLOAD_FILE not found.
+ identifier: constant.notFound
+ count: 1
+ path: tests/PHPStan/Command/AnalyseCommandTest.php
+
+ -
+ rawMessage: 'Class PHPStan\Node\FileNodeTest extends generic class PHPStan\Testing\RuleTestCase but does not specify its types: TRule'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Node/FileNodeTest.php
+
+ -
+ rawMessage: 'Method PHPStan\Node\FileNodeTest::getRule() return type with generic interface PHPStan\Rules\Rule does not specify its types: TNodeType'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Node/FileNodeTest.php
+
+ -
+ rawMessage: Access to constant on internal class InternalAnnotations\InternalFoo.
+ identifier: classConstant.internalClass
+ count: 1
+ path: tests/PHPStan/Reflection/Annotations/InternalAnnotationsTest.php
+
+ -
+ rawMessage: Access to constant on internal interface InternalAnnotations\InternalFooInterface.
+ identifier: classConstant.internalInterface
+ count: 1
+ path: tests/PHPStan/Reflection/Annotations/InternalAnnotationsTest.php
+
+ -
+ rawMessage: Access to constant on internal trait InternalAnnotations\InternalFooTrait.
+ identifier: classConstant.internalTrait
+ count: 1
+ path: tests/PHPStan/Reflection/Annotations/InternalAnnotationsTest.php
+
+ -
+ rawMessage: PHPDoc tag @var with type string is not subtype of type class-string.
+ identifier: varTag.type
+ count: 1
+ path: tests/PHPStan/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorTest.php
+
+ -
+ rawMessage: Creating new PHPStan\Php8StubsMap is not covered by backward compatibility promise. The class might change in a minor PHPStan version.
+ identifier: phpstanApi.constructor
+ count: 1
+ path: tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
+
+ -
+ rawMessage: Creating new PHPStan\Php8StubsMap is not covered by backward compatibility promise. The class might change in a minor PHPStan version.
+ identifier: phpstanApi.constructor
+ count: 1
+ path: tests/PHPStan/Reflection/SignatureMap/Php8SignatureMapProviderTest.php
+
+ -
+ rawMessage: Access to constant on internal class PHPUnit\Framework\AssertionFailedError.
+ identifier: classConstant.internalClass
+ count: 2
+ path: tests/PHPStan/Testing/TypeInferenceTestCaseTest.php
+
+ -
+ rawMessage: Catching internal class PHPUnit\Framework\AssertionFailedError.
+ identifier: catch.internalClass
+ count: 1
+ path: tests/PHPStan/Testing/TypeInferenceTestCaseTest.php
+
+ -
+ rawMessage: PHPDoc tag @var assumes the expression with type PHPStan\Type\Generic\TemplateType is always PHPStan\Type\Generic\TemplateMixedType but it's error-prone and dangerous.
+ identifier: phpstanApi.varTagAssumption
+ count: 1
+ path: tests/PHPStan/Type/IterableTypeTest.php
diff --git a/phpstan-baseline.php b/phpstan-baseline.php
new file mode 100644
index 0000000000..646cbdbef6
--- /dev/null
+++ b/phpstan-baseline.php
@@ -0,0 +1,3 @@
+
-
-
-
- src
-
-
-
-
-
-
-
-
-
- tests/PHPStan
-
-
-
-
-
- exec
-
-
-
+
+
+
+
+
+
+ tests/PHPStan
+ tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
+
+
+
+
+ exec
+ levels
+
+
+
diff --git a/resources/RegexGrammar.pp b/resources/RegexGrammar.pp
new file mode 100644
index 0000000000..3f49912a36
--- /dev/null
+++ b/resources/RegexGrammar.pp
@@ -0,0 +1,224 @@
+//
+// Hoa
+//
+//
+// @license
+//
+// New BSD License
+//
+// Copyright © 2007-2017, Hoa community. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Hoa nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// Grammar \Hoa\Regex\Grammar.
+//
+// Provide grammar of PCRE (Perl Compatible Regular Expression)for the LL(k)
+// parser. More informations at http://pcre.org/pcre.txt, sections pcrepattern &
+// pcresyntax.
+//
+// @copyright Copyright © 2007-2017 Hoa community.
+// @license New BSD License
+//
+
+// Character classes.
+// tokens suffixed with "fc_" are the same as without such suffix but followed by "class:_class"
+%token negative_class_fc_ \[\^(?=\]) -> class_fc
+%token class_fc_ \[(?=\]) -> class_fc
+%token class_fc:_class \] -> class
+%token negative_class_ \[\^ -> class
+%token class_ \[ -> class
+%token class:posix_class \[:\^?[a-z]+:\]
+%token class:class_ \[
+%token class:_class \] -> default
+%token class:range \-
+// taken over from literals but class:character has \b support on top (backspace in character classes)
+%token class:character \\([aefnrtb]|c[\x00-\x7f])
+%token class:dynamic_character \\([0-7]{3}|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+})
+%token class:character_type \\([CdDhHNRsSvVwWX]|[pP]{[^}]+})
+%token class:literal \\.|.|\n
+
+// Internal options.
+// See https://www.regular-expressions.info/refmodifiers.html
+// and https://www.php.net/manual/en/regexp.reference.internal-options.php
+%token internal_option \(\?[imsxnJUX^]*-?[imsxnJUX^]+\)
+
+// Lookahead and lookbehind assertions.
+%token lookahead_ \(\?=
+%token negative_lookahead_ \(\?!
+%token lookbehind_ \(\?<=
+%token negative_lookbehind_ \(\? nc
+%token absolute_reference_ \(\?\((?=\d) -> c
+%token relative_reference_ \(\?\((?=[\+\-]) -> c
+%token c:index [\+\-]?\d+ -> default
+%token assertion_reference_ \(\?\(
+
+// Comments.
+%token comment_ \(\?# -> co
+%token co:_comment \) -> default
+%token co:comment .*?(?=(? mark
+%token mark:name [^)]+
+%token mark:_marker \) -> default
+
+// Capturing group.
+%token named_capturing_ \(\?P?< -> nc
+%token nc:_named_capturing > -> default
+%token nc:capturing_name .+?(?=(?)
+%token non_capturing_ \(\?:
+%token non_capturing_internal_option \(\?[imsxnJUX^]*-?[imsxnJUX^]+:
+%token non_capturing_reset_ \(\?\|
+%token atomic_group_ \(\?>
+%token capturing_ \(
+%token _capturing \)
+
+// Quantifiers (by default, greedy).
+%token zero_or_one_possessive \?\+
+%token zero_or_one_lazy \?\?
+%token zero_or_one \?
+%token zero_or_more_possessive \*\+
+%token zero_or_more_lazy \*\?
+%token zero_or_more \*
+%token one_or_more_possessive \+\+
+%token one_or_more_lazy \+\?
+%token one_or_more \+
+%token exactly_n \{[0-9]+\}
+%token n_to_m_possessive \{[0-9]+,[0-9]+\}\+
+%token n_to_m_lazy \{[0-9]+,[0-9]+\}\?
+%token n_to_m \{[0-9]+,[0-9]+\}
+%token n_or_more_possessive \{[0-9]+,\}\+
+%token n_or_more_lazy \{[0-9]+,\}\?
+%token n_or_more \{[0-9]+,\}
+
+// Alternation.
+%token alternation \|
+
+// Literal.
+%token character \\([aefnrt]|c[\x00-\x7f])
+%token dynamic_character \\([0-7]{3}|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+})
+// Please, see PCRESYNTAX(3), General Category properties, PCRE special category
+// properties and script names for \p{} and \P{}.
+%token character_type \\([CdDhHNRsSvVwWX]|[pP]{[^}]+})
+%token anchor \\([bBAZzG])|\^|\$
+%token match_point_reset \\K
+%token literal \\.|.|\n
+
+
+// Rules.
+
+#expression:
+ alternation()
+
+alternation:
+ concatenation()? ( concatenation()? #alternation )*
+
+concatenation:
+ ( internal_options() | assertion() | quantification() | condition() )
+ ( ( internal_options() | assertion() | quantification() | condition() ) #concatenation )*
+
+#internal_options:
+
+
+#condition:
+ (
+ ::named_reference_:: ::_named_capturing:: #namedcondition
+ | (
+ ::relative_reference_:: #relativecondition
+ | ::absolute_reference_:: #absolutecondition
+ )
+
+ | ::assertion_reference_:: alternation() #assertioncondition
+ )
+ ::_capturing::
+ alternation()
+ ::_capturing::
+
+assertion:
+ (
+ ::lookahead_:: #lookahead
+ | ::negative_lookahead_:: #negativelookahead
+ | ::lookbehind_:: #lookbehind
+ | ::negative_lookbehind_:: #negativelookbehind
+ )
+ alternation()
+ ::_capturing::
+
+quantification:
+ ( class() | simple() ) ( quantifier() #quantification )?
+
+quantifier:
+ | |
+ | | |
+ | | |
+ |
+ | | |
+ | | |
+
+#class:
+ (
+ ::negative_class_fc_:: #negativeclass
+ <_class>
+ | ::class_fc_::
+ <_class>
+ | ::negative_class_:: #negativeclass
+ | ::class_::
+ )
+ ? ( | | range() ? | literal() )* ?
+ ::_class::
+
+#range:
+ literal() ::range:: literal()
+
+simple:
+ capturing()
+ | literal()
+
+#capturing:
+ ::marker_:: ::_marker:: #mark
+ | ::comment_:: ? ::_comment:: #comment
+ | (
+ ::named_capturing_:: ::_named_capturing:: #namedcapturing
+ | ::non_capturing_:: #noncapturing
+ | non_capturing_internal_options() #noncapturing
+ | ::non_capturing_reset_:: #noncapturingreset
+ | ::atomic_group_:: #atomicgroup
+ | ::capturing_::
+ )
+ alternation()
+ ::_capturing::
+
+non_capturing_internal_options:
+
+
+literal:
+
+ |
+ |
+ |
+ |
+ |
diff --git a/resources/functionMap.php b/resources/functionMap.php
index a0169e3562..c9867cf61d 100644
--- a/resources/functionMap.php
+++ b/resources/functionMap.php
@@ -57,10 +57,7 @@
return [
'_' => ['string', 'message'=>'string'],
-'__halt_compiler' => ['void'],
-'abs' => ['0|positive-int', 'number'=>'int'],
-'abs\'1' => ['float', 'number'=>'float'],
-'abs\'2' => ['float|0|positive-int', 'number'=>'string'],
+'abs' => ['float|0|positive-int', 'num'=>'int|float'],
'accelerator_get_configuration' => ['array'],
'accelerator_get_scripts' => ['array'],
'accelerator_get_status' => ['array', 'fetch_scripts'=>'bool'],
@@ -70,105 +67,31 @@
'acosh' => ['float', 'number'=>'float'],
'addcslashes' => ['string', 'str'=>'string', 'charlist'=>'string'],
'addslashes' => ['string', 'str'=>'string'],
-'AMQPChannel::__construct' => ['void', 'amqp_connection'=>'AMQPConnection'],
-'AMQPChannel::basicRecover' => ['', 'requeue='=>'bool|true'],
-'AMQPChannel::commitTransaction' => ['bool'],
-'AMQPChannel::getChannelId' => ['int'],
-'AMQPChannel::getConnection' => ['AMQPConnection'],
-'AMQPChannel::getPrefetchCount' => ['int'],
-'AMQPChannel::getPrefetchSize' => ['int'],
-'AMQPChannel::isConnected' => ['bool'],
-'AMQPChannel::qos' => ['bool', 'size'=>'int', 'count'=>'int'],
-'AMQPChannel::rollbackTransaction' => ['bool'],
-'AMQPChannel::setPrefetchCount' => ['bool', 'count'=>'int'],
-'AMQPChannel::setPrefetchSize' => ['bool', 'size'=>'int'],
-'AMQPChannel::startTransaction' => ['bool'],
-'AMQPConnection::__construct' => ['void', 'credentials='=>'array'],
-'AMQPConnection::connect' => ['bool'],
-'AMQPConnection::disconnect' => ['bool'],
-'AMQPConnection::getHost' => ['string'],
-'AMQPConnection::getLogin' => ['string'],
-'AMQPConnection::getMaxChannels' => ['int|null'],
-'AMQPConnection::getPassword' => ['string'],
-'AMQPConnection::getPort' => ['int'],
-'AMQPConnection::getReadTimeout' => ['float'],
-'AMQPConnection::getTimeout' => ['float'],
-'AMQPConnection::getUsedChannels' => ['int'],
-'AMQPConnection::getVhost' => ['string'],
-'AMQPConnection::getWriteTimeout' => ['float'],
-'AMQPConnection::isConnected' => ['bool'],
-'AMQPConnection::isPersistent' => ['bool|null'],
-'AMQPConnection::pconnect' => ['bool'],
-'AMQPConnection::pdisconnect' => ['bool'],
-'AMQPConnection::preconnect' => ['bool'],
-'AMQPConnection::reconnect' => ['bool'],
-'AMQPConnection::setHost' => ['bool', 'host'=>'string'],
-'AMQPConnection::setLogin' => ['bool', 'login'=>'string'],
-'AMQPConnection::setPassword' => ['bool', 'password'=>'string'],
-'AMQPConnection::setPort' => ['bool', 'port'=>'int'],
-'AMQPConnection::setReadTimeout' => ['bool', 'timeout'=>'int'],
-'AMQPConnection::setTimeout' => ['bool', 'timeout'=>'int'],
-'AMQPConnection::setVhost' => ['bool', 'vhost'=>'string'],
-'AMQPConnection::setWriteTimeout' => ['bool', 'timeout'=>'int'],
-'AMQPEnvelope::getAppId' => ['string'],
-'AMQPEnvelope::getBody' => ['string'],
-'AMQPEnvelope::getContentEncoding' => ['string'],
-'AMQPEnvelope::getContentType' => ['string'],
-'AMQPEnvelope::getCorrelationId' => ['string'],
-'AMQPEnvelope::getDeliveryMode' => ['int'],
-'AMQPEnvelope::getDeliveryTag' => ['string'],
-'AMQPEnvelope::getExchangeName' => ['string'],
-'AMQPEnvelope::getExpiration' => ['string'],
-'AMQPEnvelope::getHeader' => ['bool|string', 'header_key'=>'string'],
-'AMQPEnvelope::getHeaders' => ['array'],
-'AMQPEnvelope::getMessageId' => ['string'],
-'AMQPEnvelope::getPriority' => ['int'],
-'AMQPEnvelope::getReplyTo' => ['string'],
-'AMQPEnvelope::getRoutingKey' => ['string'],
-'AMQPEnvelope::getTimeStamp' => ['string'],
-'AMQPEnvelope::getType' => ['string'],
-'AMQPEnvelope::getUserId' => ['string'],
-'AMQPEnvelope::isRedelivery' => ['bool'],
-'AMQPExchange::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'],
-'AMQPExchange::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
-'AMQPExchange::declareExchange' => ['bool'],
-'AMQPExchange::delete' => ['bool', 'exchangeName='=>'string', 'flags='=>'int'],
-'AMQPExchange::getArgument' => ['bool|int|string', 'key'=>'string'],
-'AMQPExchange::getArguments' => ['array'],
-'AMQPExchange::getChannel' => ['AMQPChannel'],
-'AMQPExchange::getConnection' => ['AMQPConnection'],
-'AMQPExchange::getFlags' => ['int'],
-'AMQPExchange::getName' => ['string'],
-'AMQPExchange::getType' => ['string'],
-'AMQPExchange::publish' => ['bool', 'message'=>'string', 'routing_key='=>'string', 'flags='=>'int', 'attributes='=>'array'],
-'AMQPExchange::setArgument' => ['bool', 'key'=>'string', 'value'=>'int|string'],
-'AMQPExchange::setArguments' => ['bool', 'arguments'=>'array'],
-'AMQPExchange::setFlags' => ['bool', 'flags'=>'int'],
-'AMQPExchange::setName' => ['bool', 'exchange_name'=>'string'],
-'AMQPExchange::setType' => ['bool', 'exchange_type'=>'string'],
-'AMQPExchange::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
-'AMQPQueue::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'],
-'AMQPQueue::ack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'],
-'AMQPQueue::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
-'AMQPQueue::cancel' => ['bool', 'consumer_tag='=>'string'],
-'AMQPQueue::consume' => ['void', 'callback='=>'?callable', 'flags='=>'int', 'consumerTag='=>'string'],
-'AMQPQueue::declareQueue' => ['int'],
-'AMQPQueue::delete' => ['int', 'flags='=>'int'],
-'AMQPQueue::get' => ['AMQPEnvelope|bool', 'flags='=>'int'],
-'AMQPQueue::getArgument' => ['bool|int|string', 'key'=>'string'],
-'AMQPQueue::getArguments' => ['array'],
-'AMQPQueue::getChannel' => ['AMQPChannel'],
-'AMQPQueue::getConnection' => ['AMQPConnection'],
-'AMQPQueue::getFlags' => ['int'],
-'AMQPQueue::getName' => ['string'],
-'AMQPQueue::nack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'],
-'AMQPQueue::purge' => ['bool'],
-'AMQPQueue::reject' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'],
-'AMQPQueue::setArgument' => ['bool', 'key'=>'string', 'value'=>'mixed'],
-'AMQPQueue::setArguments' => ['bool', 'arguments'=>'array'],
-'AMQPQueue::setFlags' => ['bool', 'flags'=>'int'],
-'AMQPQueue::setName' => ['bool', 'queue_name'=>'string'],
-'AMQPQueue::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
+'AMQPChannel::getChannelId' => ['int<1, 65535>'],
+'AMQPChannel::getPrefetchCount' => ['int<0, 65535>'],
+'AMQPChannel::getPrefetchSize' => ['int<0, max>'],
+'AMQPConnection::getMaxChannels' => ['int<1, 65535>'],
+'AMQPConnection::getPort' => ['int<1, 65535>'],
+'AMQPConnection::getUsedChannels' => ['int<1, 65535>'],
+'AMQPEnvelope::getHeaders' => ['array'],
+'AMQPEnvelope::getPriority' => ['int<0, max>'],
+'AMQPExchange::bind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
+'AMQPExchange::getArguments' => ['array'],
+'AMQPExchange::publish' => ['void', 'message'=>'string', 'routingKey='=>'string|null', 'flags='=>'int|null', 'header='=>'array'],
+'AMQPExchange::setArgument' => ['void', 'argumentName'=>'string', 'argumentValue'=>'scalar|null'],
+'AMQPExchange::setArguments' => ['void', 'arguments'=>'array'],
+'AMQPExchange::setName' => ['void', 'exchangeName'=>'string|null'],
+'AMQPExchange::setType' => ['void', 'exchangeType'=>'string|null'],
+'AMQPExchange::unbind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
+'AMQPQueue::bind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
+'AMQPQueue::cancel' => ['void', 'consumerTag='=>'string'],
+'AMQPQueue::consume' => ['void', 'callback='=>'null|callable(AMQPEnvelope, AMQPQueue): mixed', 'flags='=>'int|null', 'consumerTag='=>'string|null'],
+'AMQPQueue::delete' => ['int', 'flags='=>'int|null'],
+'AMQPQueue::nack' => ['void', 'deliveryTag'=>'int', 'flags='=>'int|null'],
+'AMQPQueue::reject' => ['void', 'deliveryTag'=>'int', 'flags='=>'int|null'],
+'AMQPQueue::setFlags' => ['void', 'flags'=>'int|null'],
+'AMQPQueue::setName' => ['void', 'name'=>'string'],
+'AMQPQueue::unbind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
'apache_child_terminate' => ['bool'],
'apache_get_modules' => ['array'],
'apache_get_version' => ['string|false'],
@@ -212,18 +135,18 @@
'APCIterator::valid' => ['bool'],
'apcu_add' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'],
'apcu_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'],
-'apcu_cache_info' => ['array', 'limited='=>'bool'],
+'apcu_cache_info' => ['__benevolent|false>', 'limited='=>'bool'],
'apcu_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'],
'apcu_clear_cache' => ['bool'],
'apcu_dec' => ['int', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'],
'apcu_delete' => ['bool', 'key'=>'string|APCuIterator'],
-'apcu_delete\'1' => ['array', 'key'=>'string[]'],
+'apcu_delete\'1' => ['list', 'key'=>'string[]'],
'apcu_entry' => ['mixed', 'key'=>'string', 'generator'=>'callable', 'ttl='=>'int'],
'apcu_exists' => ['bool', 'keys'=>'string'],
'apcu_exists\'1' => ['array', 'keys'=>'string[]'],
'apcu_fetch' => ['mixed', 'key'=>'string|string[]', '&w_success='=>'bool'],
'apcu_inc' => ['int', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'],
-'apcu_sma_info' => ['array', 'limited='=>'bool'],
+'apcu_sma_info' => ['__benevolent', 'limited='=>'bool'],
'apcu_store' => ['bool', 'key'=>'string', 'var='=>'', 'ttl='=>'int'],
'apcu_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'],
'APCuIterator::__construct' => ['void', 'search='=>'string|string[]|null', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'],
@@ -250,7 +173,7 @@
'apd_set_session_trace' => ['void', 'debug_level'=>'int', 'dump_directory='=>'string'],
'apd_set_session_trace_socket' => ['bool', 'tcp_server'=>'string', 'socket_type'=>'int', 'port'=>'int', 'debug_level'=>'int'],
'AppendIterator::__construct' => ['void'],
-'AppendIterator::append' => ['void', 'iterator'=>'iterator'],
+'AppendIterator::append' => ['void', 'iterator'=>'Iterator'],
'AppendIterator::current' => ['mixed'],
'AppendIterator::getArrayIterator' => ['ArrayIterator'],
'AppendIterator::getInnerIterator' => ['iterator'],
@@ -260,10 +183,10 @@
'AppendIterator::rewind' => ['void'],
'AppendIterator::valid' => ['bool'],
'array_change_key_case' => ['array', 'input'=>'array', 'case='=>'int'],
-'array_chunk' => ['array[]', 'input'=>'array', 'size'=>'int', 'preserve_keys='=>'bool'],
+'array_chunk' => ['list', 'input'=>'array', 'size'=>'positive-int', 'preserve_keys='=>'bool'],
'array_column' => ['array', 'array'=>'array', 'column_key'=>'mixed', 'index_key='=>'mixed'],
'array_combine' => ['array|false', 'keys'=>'array', 'values'=>'array'],
-'array_count_values' => ['array<0|positive-int>', 'input'=>'array'],
+'array_count_values' => ['array', 'input'=>'array'],
'array_diff' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
'array_diff_assoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
'array_diff_key' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
@@ -283,13 +206,13 @@
'array_intersect_ukey' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'],
'array_intersect_ukey\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'],
'array_key_exists' => ['bool', 'key'=>'string|int', 'search'=>'array'],
-'array_key_first' => ['int|string|null', 'array' => 'array'],
-'array_key_last' => ['int|string|null', 'array' => 'array'],
-'array_keys' => ['array', 'input'=>'array', 'search_value='=>'mixed', 'strict='=>'bool'],
-'array_map' => ['array', 'callback'=>'?callable', 'input1'=>'array', '...args='=>'array'],
+'array_key_first' => ['int|string|null', 'array'=>'array'],
+'array_key_last' => ['int|string|null', 'array'=>'array'],
+'array_keys' => ['list', 'input'=>'array', 'search_value='=>'mixed', 'strict='=>'bool'],
+'array_map' => ['array', 'callback'=>'?callable', 'array'=>'array', '...args='=>'array'],
'array_merge' => ['array', 'arr1'=>'array', '...args='=>'array'],
'array_merge_recursive' => ['array', 'arr1'=>'array', '...args='=>'array'],
-'array_multisort' => ['bool', '&rw_array1'=>'array', 'array1_sort_order='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'],
+'array_multisort' => ['bool', 'array1'=>'array', 'array1_sort_order='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'],
'array_pad' => ['array', 'input'=>'array', 'pad_size'=>'int', 'pad_value'=>'mixed'],
'array_pop' => ['mixed', '&rw_stack'=>'array'],
'array_product' => ['int|float', 'input'=>'array'],
@@ -303,7 +226,7 @@
'array_search' => ['int|string|false', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'],
'array_shift' => ['mixed', '&rw_stack'=>'array'],
'array_slice' => ['array', 'input'=>'array', 'offset'=>'int', 'length='=>'?int', 'preserve_keys='=>'bool'],
-'array_splice' => ['array', '&rw_input'=>'array', 'offset'=>'int', 'length='=>'int', 'replacement='=>'array|string'],
+'array_splice' => ['array', '&rw_input'=>'array', 'offset'=>'int', 'length='=>'int', 'replacement='=>'mixed'],
'array_sum' => ['int|float', 'input'=>'array'],
'array_udiff' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'],
'array_udiff\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'],
@@ -318,8 +241,8 @@
'array_uintersect_uassoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int', 'key_compare_func'=>'callable(mixed,mixed):int'],
'array_uintersect_uassoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'],
'array_unique' => ['array', 'array'=>'array', 'flags='=>'int'],
-'array_unshift' => ['int', '&rw_stack'=>'array', 'var'=>'mixed', '...vars='=>'mixed'],
-'array_values' => ['array', 'input'=>'array'],
+'array_unshift' => ['positive-int', '&rw_stack'=>'array', 'var'=>'mixed', '...vars='=>'mixed'],
+'array_values' => ['list', 'input'=>'array'],
'array_walk' => ['bool', '&rw_input'=>'array|object', 'callback'=>'callable', 'userdata='=>'mixed'],
'array_walk_recursive' => ['bool', '&rw_input'=>'array|object', 'callback'=>'callable', 'userdata='=>'mixed'],
'ArrayAccess::offsetExists' => ['bool', 'offset'=>'mixed'],
@@ -350,7 +273,7 @@
'ArrayIterator::uksort' => ['void', 'callback'=>'callable(array-key,array-key):int'],
'ArrayIterator::unserialize' => ['void', 'serialized'=>'string'],
'ArrayIterator::valid' => ['bool'],
-'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'],
+'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'class-string'],
'ArrayObject::append' => ['void', 'value'=>'mixed'],
'ArrayObject::asort' => ['void'],
'ArrayObject::count' => ['0|positive-int'],
@@ -396,7 +319,7 @@
'BadFunctionCallException::getLine' => ['int'],
'BadFunctionCallException::getMessage' => ['string'],
'BadFunctionCallException::getPrevious' => ['(?Throwable)|(?BadFunctionCallException)'],
-'BadFunctionCallException::getTrace' => ['array'],
+'BadFunctionCallException::getTrace' => ['list\',args?:list,object?:object}>'],
'BadFunctionCallException::getTraceAsString' => ['string'],
'BadMethodCallException::__clone' => ['void'],
'BadMethodCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?BadMethodCallException)'],
@@ -406,9 +329,10 @@
'BadMethodCallException::getLine' => ['int'],
'BadMethodCallException::getMessage' => ['string'],
'BadMethodCallException::getPrevious' => ['(?Throwable)|(?BadMethodCallException)'],
-'BadMethodCallException::getTrace' => ['array'],
+'BadMethodCallException::getTrace' => ['list\',args?:list,object?:object}>'],
'BadMethodCallException::getTraceAsString' => ['string'],
-'base64_decode' => ['string|false', 'str'=>'string', 'strict='=>'bool'],
+'base64_decode' => ['string', 'str'=>'string', 'strict='=>'false'],
+'base64_decode\'1' => ['string|false', 'str'=>'string', 'strict='=>'true'],
'base64_encode' => ['string', 'str'=>'string'],
'base_convert' => ['string', 'number'=>'string', 'frombase'=>'int', 'tobase'=>'int'],
'basename' => ['string', 'path'=>'string', 'suffix='=>'string'],
@@ -419,11 +343,11 @@
'bbcode_parse' => ['string', 'bbcode_container'=>'resource', 'to_parse'=>'string'],
'bbcode_set_arg_parser' => ['bool', 'bbcode_container'=>'resource', 'bbcode_arg_parser'=>'resource'],
'bbcode_set_flags' => ['bool', 'bbcode_container'=>'resource', 'flags'=>'int', 'mode='=>'int'],
-'bcadd' => ['numeric-string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bccomp' => ['int', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bcdiv' => ['numeric-string|null', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bcmod' => ['numeric-string|null', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bcmul' => ['numeric-string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
+'bcadd' => ['numeric-string', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bccomp' => ['0|1|-1', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bcdiv' => ['numeric-string|null', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bcmod' => ['numeric-string|null', 'left_operand'=>'string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bcmul' => ['numeric-string', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
'bcompiler_load' => ['bool', 'filename'=>'string'],
'bcompiler_load_exe' => ['bool', 'filename'=>'string'],
'bcompiler_parse_class' => ['bool', 'class'=>'string', 'callback'=>'string'],
@@ -437,11 +361,11 @@
'bcompiler_write_functions_from_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'],
'bcompiler_write_header' => ['bool', 'filehandle'=>'resource', 'write_ver='=>'string'],
'bcompiler_write_included_filename' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'],
-'bcpow' => ['numeric-string', 'base'=>'string', 'exponent'=>'string', 'scale='=>'int'],
-'bcpowmod' => ['numeric-string|null', 'base'=>'string', 'exponent'=>'string', 'modulus'=>'string', 'scale='=>'int'],
+'bcpow' => ['numeric-string', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int'],
+'bcpowmod' => ['numeric-string|null', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'string', 'scale='=>'int'],
'bcscale' => ['int', 'scale='=>'int'],
-'bcsqrt' => ['numeric-string', 'operand'=>'string', 'scale='=>'int'],
-'bcsub' => ['numeric-string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
+'bcsqrt' => ['numeric-string', 'operand'=>'numeric-string', 'scale='=>'int'],
+'bcsub' => ['numeric-string', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
'bin2hex' => ['string', 'data'=>'string'],
'bind_textdomain_codeset' => ['string|false', 'domain'=>'string', 'codeset'=>'string'],
'bindec' => ['float|int', 'binary_number'=>'string'],
@@ -484,7 +408,7 @@
'bson_encode' => ['string', 'anything'=>'mixed'],
'bzclose' => ['bool', 'bz'=>'resource'],
'bzcompress' => ['string|int', 'source'=>'string', 'blocksize100k='=>'int', 'workfactor='=>'int'],
-'bzdecompress' => ['string|false', 'source'=>'string', 'small='=>'int'],
+'bzdecompress' => ['string|int|false', 'source'=>'string', 'small='=>'int'],
'bzerrno' => ['int', 'bz'=>'resource'],
'bzerror' => ['array', 'bz'=>'resource'],
'bzerrstr' => ['string', 'bz'=>'resource'],
@@ -492,7 +416,7 @@
'bzopen' => ['resource|false', 'file'=>'string|resource', 'mode'=>'string'],
'bzread' => ['string|false', 'bz'=>'resource', 'length='=>'int'],
'bzwrite' => ['int|false', 'bz'=>'resource', 'data'=>'string', 'length='=>'int'],
-'CachingIterator::__construct' => ['void', 'iterator'=>'iterator', 'flags='=>''],
+'CachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>''],
'CachingIterator::__toString' => ['string'],
'CachingIterator::count' => ['0|positive-int'],
'CachingIterator::current' => ['mixed'],
@@ -925,15 +849,15 @@
'call_user_func_array' => ['mixed', 'function'=>'callable', 'parameters'=>'array'],
'call_user_method' => ['mixed', 'method_name'=>'string', 'obj'=>'object', 'parameter='=>'mixed', '...args='=>'mixed'],
'call_user_method_array' => ['mixed', 'method_name'=>'string', 'obj'=>'object', 'params'=>'array'],
-'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'iterator', 'func'=>'callable'],
+'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'func'=>'callable'],
'CallbackFilterIterator::accept' => ['bool'],
'CallbackFilterIterator::current' => ['mixed'],
-'CallbackFilterIterator::getInnerIterator' => ['iterator'],
+'CallbackFilterIterator::getInnerIterator' => ['Iterator'],
'CallbackFilterIterator::key' => ['mixed'],
'CallbackFilterIterator::next' => ['void'],
'CallbackFilterIterator::rewind' => ['void'],
'CallbackFilterIterator::valid' => ['bool'],
-'ceil' => ['float', 'number'=>'float'],
+'ceil' => ['__benevolent', 'number'=>'float'],
'chdb::__construct' => ['void', 'pathname'=>'string'],
'chdb::get' => ['string', 'key'=>'string'],
'chdb_create' => ['bool', 'pathname'=>'string', 'data'=>'array'],
@@ -946,12 +870,12 @@
'chown' => ['bool', 'filename'=>'string', 'user'=>'string|int'],
'chr' => ['non-empty-string', 'ascii'=>'int'],
'chroot' => ['bool', 'directory'=>'string'],
-'chunk_split' => ['string', 'str'=>'string', 'chunklen='=>'int', 'ending='=>'string'],
+'chunk_split' => ['string', 'str'=>'string', 'chunklen='=>'positive-int', 'ending='=>'string'],
'class_alias' => ['bool', 'user_class_name'=>'string', 'alias_name'=>'string', 'autoload='=>'bool'],
'class_exists' => ['bool', 'classname'=>'string', 'autoload='=>'bool'],
-'class_implements' => ['array|false', 'what'=>'object|string', 'autoload='=>'bool'],
+'class_implements' => ['array|false', 'what'=>'object|string', 'autoload='=>'bool'],
'class_parents' => ['array|false', 'instance'=>'object|string', 'autoload='=>'bool'],
-'class_uses' => ['array|false', 'what'=>'object|string', 'autoload='=>'bool'],
+'class_uses' => ['array|false', 'what'=>'object|string', 'autoload='=>'bool'],
'classkit_import' => ['array', 'filename'=>'string'],
'classkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'],
'classkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'],
@@ -990,14 +914,14 @@
'ClosedGeneratorException::getLine' => ['int'],
'ClosedGeneratorException::getMessage' => ['string'],
'ClosedGeneratorException::getPrevious' => ['Throwable|ClosedGeneratorException|null'],
-'ClosedGeneratorException::getTrace' => ['array'],
+'ClosedGeneratorException::getTrace' => ['list\',args?:list,object?:object}>'],
'ClosedGeneratorException::getTraceAsString' => ['string'],
'closedir' => ['void', 'dir_handle='=>'resource'],
'closelog' => ['bool'],
'Closure::__construct' => ['void'],
'Closure::__invoke' => ['', '...args='=>''],
-'Closure::bind' => ['Closure', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|string'],
-'Closure::bindTo' => ['Closure', 'new'=>'?object', 'newscope='=>'object|string'],
+'Closure::bind' => ['__benevolent', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|class-string|\'static\'|null'],
+'Closure::bindTo' => ['__benevolent', 'new'=>'?object', 'newscope='=>'object|class-string|\'static\'|null'],
'Closure::call' => ['', 'to'=>'object', '...parameters='=>''],
'Closure::fromCallable' => ['Closure', 'callable'=>'callable'],
'clusterObj::convertToString' => ['string'],
@@ -1008,7 +932,7 @@
'Collator::__construct' => ['void', 'locale'=>'string'],
'Collator::asort' => ['bool', '&rw_arr'=>'array', 'sort_flag='=>'int'],
'Collator::compare' => ['int|false', 'str1'=>'string', 'str2'=>'string'],
-'Collator::create' => ['Collator', 'locale'=>'string'],
+'Collator::create' => ['?Collator', 'locale'=>'string'],
'Collator::getAttribute' => ['int', 'attr'=>'int'],
'Collator::getErrorCode' => ['int'],
'Collator::getErrorMessage' => ['string'],
@@ -1021,7 +945,7 @@
'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'array'],
'collator_asort' => ['bool', 'coll'=>'collator', '&rw_arr'=>'array', 'sort_flag='=>'int'],
'collator_compare' => ['int|false', 'coll'=>'collator', 'str1'=>'string', 'str2'=>'string'],
-'collator_create' => ['Collator', 'locale'=>'string'],
+'collator_create' => ['?Collator', 'locale'=>'string'],
'collator_get_attribute' => ['int|false', 'coll'=>'collator', 'attr'=>'int'],
'collator_get_error_code' => ['int|false', 'coll'=>'collator'],
'collator_get_error_message' => ['string|false', 'coll'=>'collator'],
@@ -1060,8 +984,8 @@
'componere\cast' => ['Type', 'arg1'=>'', 'object'=>''],
'componere\cast_by_ref' => ['Type', 'arg1'=>'', 'object'=>''],
'confirm_pdo_ibm_compiled' => [''],
-'connection_aborted' => ['int'],
-'connection_status' => ['int'],
+'connection_aborted' => ['0|1'],
+'connection_status' => ['int-mask'],
'connection_timeout' => ['int'],
'constant' => ['mixed', 'const_name'=>'string'],
'convert_cyr_string' => ['string', 'str'=>'string', 'from'=>'string', 'to'=>'string'],
@@ -1070,303 +994,8 @@
'copy' => ['bool', 'source_file'=>'string', 'destination_file'=>'string', 'context='=>'resource'],
'cos' => ['float', 'number'=>'float'],
'cosh' => ['float', 'number'=>'float'],
-'Couchbase\AnalyticsQuery::__construct' => ['void'],
-'Couchbase\AnalyticsQuery::fromString' => ['Couchbase\AnalyticsQuery', 'statement'=>'string'],
-'Couchbase\basicDecoderV1' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int', 'options'=>'array'],
-'Couchbase\basicEncoderV1' => ['array', 'value'=>'mixed', 'options'=>'array'],
-'Couchbase\BooleanFieldSearchQuery::__construct' => ['void'],
-'Couchbase\BooleanFieldSearchQuery::boost' => ['Couchbase\BooleanFieldSearchQuery', 'boost'=>'float'],
-'Couchbase\BooleanFieldSearchQuery::field' => ['Couchbase\BooleanFieldSearchQuery', 'field'=>'string'],
-'Couchbase\BooleanFieldSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\BooleanSearchQuery::__construct' => ['void'],
-'Couchbase\BooleanSearchQuery::boost' => ['Couchbase\BooleanSearchQuery', 'boost'=>'float'],
-'Couchbase\BooleanSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\BooleanSearchQuery::must' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'],
-'Couchbase\BooleanSearchQuery::mustNot' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'],
-'Couchbase\BooleanSearchQuery::should' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'],
-'Couchbase\Bucket::__construct' => ['void'],
-'Couchbase\Bucket::__get' => ['int', 'name'=>'string'],
-'Couchbase\Bucket::__set' => ['int', 'name'=>'string', 'value'=>'int'],
-'Couchbase\Bucket::append' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'],
-'Couchbase\Bucket::counter' => ['Couchbase\Document|array', 'ids'=>'array|string', 'delta='=>'int', 'options='=>'array'],
-'Couchbase\Bucket::diag' => ['array', 'reportId='=>'string'],
-'Couchbase\Bucket::get' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'],
-'Couchbase\Bucket::getAndLock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'lockTime'=>'int', 'options='=>'array'],
-'Couchbase\Bucket::getAndTouch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'],
-'Couchbase\Bucket::getFromReplica' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'],
-'Couchbase\Bucket::insert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'],
-'Couchbase\Bucket::listExists' => ['bool', 'id'=>'string', 'value'=>'mixed'],
-'Couchbase\Bucket::listGet' => ['mixed', 'id'=>'string', 'index'=>'int'],
-'Couchbase\Bucket::listPush' => ['', 'id'=>'string', 'value'=>'mixed'],
-'Couchbase\Bucket::listRemove' => ['', 'id'=>'string', 'index'=>'int'],
-'Couchbase\Bucket::listSet' => ['', 'id'=>'string', 'index'=>'int', 'value'=>'mixed'],
-'Couchbase\Bucket::listShift' => ['', 'id'=>'string', 'value'=>'mixed'],
-'Couchbase\Bucket::listSize' => ['int', 'id'=>'string'],
-'Couchbase\Bucket::lookupIn' => ['Couchbase\LookupInBuilder', 'id'=>'string'],
-'Couchbase\Bucket::manager' => ['Couchbase\BucketManager'],
-'Couchbase\Bucket::mapAdd' => ['', 'id'=>'string', 'key'=>'string', 'value'=>'mixed'],
-'Couchbase\Bucket::mapGet' => ['mixed', 'id'=>'string', 'key'=>'string'],
-'Couchbase\Bucket::mapRemove' => ['', 'id'=>'string', 'key'=>'string'],
-'Couchbase\Bucket::mapSize' => ['int', 'id'=>'string'],
-'Couchbase\Bucket::mutateIn' => ['Couchbase\MutateInBuilder', 'id'=>'string', 'cas'=>'string'],
-'Couchbase\Bucket::ping' => ['array', 'services='=>'int', 'reportId='=>'string'],
-'Couchbase\Bucket::prepend' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'],
-'Couchbase\Bucket::query' => ['object', 'query'=>'Couchbase\AnalyticsQuery|Couchbase\N1qlQuery|Couchbase\SearchQuery|Couchbase\SpatialViewQuery|Couchbase\ViewQuery', 'jsonAsArray='=>'bool|false'],
-'Couchbase\Bucket::queueAdd' => ['', 'id'=>'string', 'value'=>'mixed'],
-'Couchbase\Bucket::queueExists' => ['bool', 'id'=>'string', 'value'=>'mixed'],
-'Couchbase\Bucket::queueRemove' => ['mixed', 'id'=>'string'],
-'Couchbase\Bucket::queueSize' => ['int', 'id'=>'string'],
-'Couchbase\Bucket::remove' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'],
-'Couchbase\Bucket::replace' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'],
-'Couchbase\Bucket::retrieveIn' => ['Couchbase\DocumentFragment', 'id'=>'string', '...paths='=>'array'],
-'Couchbase\Bucket::setAdd' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'],
-'Couchbase\Bucket::setExists' => ['bool', 'id'=>'string', 'value'=>'bool|float|int|string'],
-'Couchbase\Bucket::setRemove' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'],
-'Couchbase\Bucket::setSize' => ['int', 'id'=>'string'],
-'Couchbase\Bucket::setTranscoder' => ['', 'encoder'=>'callable', 'decoder'=>'callable'],
-'Couchbase\Bucket::touch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'],
-'Couchbase\Bucket::unlock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'],
-'Couchbase\Bucket::upsert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'],
-'Couchbase\BucketManager::__construct' => ['void'],
-'Couchbase\BucketManager::createN1qlIndex' => ['', 'name'=>'string', 'fields'=>'array', 'whereClause='=>'string', 'ignoreIfExist='=>'bool|false', 'defer='=>'bool|false'],
-'Couchbase\BucketManager::createN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfExist='=>'bool|false', 'defer='=>'bool|false'],
-'Couchbase\BucketManager::dropN1qlIndex' => ['', 'name'=>'string', 'ignoreIfNotExist='=>'bool|false'],
-'Couchbase\BucketManager::dropN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfNotExist='=>'bool|false'],
-'Couchbase\BucketManager::flush' => [''],
-'Couchbase\BucketManager::getDesignDocument' => ['array', 'name'=>'string'],
-'Couchbase\BucketManager::info' => ['array'],
-'Couchbase\BucketManager::insertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'],
-'Couchbase\BucketManager::listDesignDocuments' => ['array'],
-'Couchbase\BucketManager::listN1qlIndexes' => ['array'],
-'Couchbase\BucketManager::removeDesignDocument' => ['', 'name'=>'string'],
-'Couchbase\BucketManager::upsertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'],
-'Couchbase\ClassicAuthenticator::bucket' => ['', 'name'=>'string', 'password'=>'string'],
-'Couchbase\ClassicAuthenticator::cluster' => ['', 'username'=>'string', 'password'=>'string'],
-'Couchbase\Cluster::__construct' => ['void', 'connstr'=>'string'],
-'Couchbase\Cluster::authenticate' => ['null', 'authenticator'=>'Couchbase\Authenticator'],
-'Couchbase\Cluster::authenticateAs' => ['null', 'username'=>'string', 'password'=>'string'],
-'Couchbase\Cluster::manager' => ['Couchbase\ClusterManager', 'username='=>'string', 'password='=>'string'],
-'Couchbase\Cluster::openBucket' => ['Couchbase\Bucket', 'name='=>'string', 'password='=>'string'],
-'Couchbase\ClusterManager::__construct' => ['void'],
-'Couchbase\ClusterManager::createBucket' => ['', 'name'=>'string', 'options='=>'array'],
-'Couchbase\ClusterManager::getUser' => ['array', 'username'=>'string', 'domain='=>'int'],
-'Couchbase\ClusterManager::info' => ['array'],
-'Couchbase\ClusterManager::listBuckets' => ['array'],
-'Couchbase\ClusterManager::listUsers' => ['array', 'domain='=>'int'],
-'Couchbase\ClusterManager::removeBucket' => ['', 'name'=>'string'],
-'Couchbase\ClusterManager::removeUser' => ['', 'name'=>'string', 'domain='=>'int'],
-'Couchbase\ClusterManager::upsertUser' => ['', 'name'=>'string', 'settings'=>'Couchbase\UserSettings', 'domain='=>'int'],
-'Couchbase\ConjunctionSearchQuery::__construct' => ['void'],
-'Couchbase\ConjunctionSearchQuery::boost' => ['Couchbase\ConjunctionSearchQuery', 'boost'=>'float'],
-'Couchbase\ConjunctionSearchQuery::every' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'],
-'Couchbase\ConjunctionSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\DateRangeSearchFacet::__construct' => ['void'],
-'Couchbase\DateRangeSearchFacet::addRange' => ['Couchbase\DateSearchFacet', 'name'=>'string', 'start'=>'int|string', 'end'=>'int|string'],
-'Couchbase\DateRangeSearchFacet::jsonSerialize' => ['array'],
-'Couchbase\DateRangeSearchQuery::__construct' => ['void'],
-'Couchbase\DateRangeSearchQuery::boost' => ['Couchbase\DateRangeSearchQuery', 'boost'=>'float'],
-'Couchbase\DateRangeSearchQuery::dateTimeParser' => ['Couchbase\DateRangeSearchQuery', 'dateTimeParser'=>'string'],
-'Couchbase\DateRangeSearchQuery::end' => ['Couchbase\DateRangeSearchQuery', 'end'=>'int|string', 'inclusive='=>'bool|false'],
-'Couchbase\DateRangeSearchQuery::field' => ['Couchbase\DateRangeSearchQuery', 'field'=>'string'],
-'Couchbase\DateRangeSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\DateRangeSearchQuery::start' => ['Couchbase\DateRangeSearchQuery', 'start'=>'int|string', 'inclusive='=>'bool|true'],
-'Couchbase\defaultDecoder' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'],
-'Couchbase\defaultEncoder' => ['array', 'value'=>'mixed'],
-'Couchbase\DisjunctionSearchQuery::__construct' => ['void'],
-'Couchbase\DisjunctionSearchQuery::boost' => ['Couchbase\DisjunctionSearchQuery', 'boost'=>'float'],
-'Couchbase\DisjunctionSearchQuery::either' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'],
-'Couchbase\DisjunctionSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\DisjunctionSearchQuery::min' => ['Couchbase\DisjunctionSearchQuery', 'min'=>'int'],
-'Couchbase\DocIdSearchQuery::__construct' => ['void'],
-'Couchbase\DocIdSearchQuery::boost' => ['Couchbase\DocIdSearchQuery', 'boost'=>'float'],
-'Couchbase\DocIdSearchQuery::docIds' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'],
-'Couchbase\DocIdSearchQuery::field' => ['Couchbase\DocIdSearchQuery', 'field'=>'string'],
-'Couchbase\DocIdSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\fastlzCompress' => ['string', 'data'=>'string'],
-'Couchbase\fastlzDecompress' => ['string', 'data'=>'string'],
-'Couchbase\GeoBoundingBoxSearchQuery::__construct' => ['void'],
-'Couchbase\GeoBoundingBoxSearchQuery::boost' => ['Couchbase\GeoBoundingBoxSearchQuery', 'boost'=>'float'],
-'Couchbase\GeoBoundingBoxSearchQuery::field' => ['Couchbase\GeoBoundingBoxSearchQuery', 'field'=>'string'],
-'Couchbase\GeoBoundingBoxSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\GeoDistanceSearchQuery::__construct' => ['void'],
-'Couchbase\GeoDistanceSearchQuery::boost' => ['Couchbase\GeoDistanceSearchQuery', 'boost'=>'float'],
-'Couchbase\GeoDistanceSearchQuery::field' => ['Couchbase\GeoDistanceSearchQuery', 'field'=>'string'],
-'Couchbase\GeoDistanceSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\LookupInBuilder::__construct' => ['void'],
-'Couchbase\LookupInBuilder::execute' => ['Couchbase\DocumentFragment'],
-'Couchbase\LookupInBuilder::exists' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'],
-'Couchbase\LookupInBuilder::get' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'],
-'Couchbase\LookupInBuilder::getCount' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'],
-'Couchbase\MatchAllSearchQuery::__construct' => ['void'],
-'Couchbase\MatchAllSearchQuery::boost' => ['Couchbase\MatchAllSearchQuery', 'boost'=>'float'],
-'Couchbase\MatchAllSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\MatchNoneSearchQuery::__construct' => ['void'],
-'Couchbase\MatchNoneSearchQuery::boost' => ['Couchbase\MatchNoneSearchQuery', 'boost'=>'float'],
-'Couchbase\MatchNoneSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\MatchPhraseSearchQuery::__construct' => ['void'],
-'Couchbase\MatchPhraseSearchQuery::analyzer' => ['Couchbase\MatchPhraseSearchQuery', 'analyzer'=>'string'],
-'Couchbase\MatchPhraseSearchQuery::boost' => ['Couchbase\MatchPhraseSearchQuery', 'boost'=>'float'],
-'Couchbase\MatchPhraseSearchQuery::field' => ['Couchbase\MatchPhraseSearchQuery', 'field'=>'string'],
-'Couchbase\MatchPhraseSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\MatchSearchQuery::__construct' => ['void'],
-'Couchbase\MatchSearchQuery::analyzer' => ['Couchbase\MatchSearchQuery', 'analyzer'=>'string'],
-'Couchbase\MatchSearchQuery::boost' => ['Couchbase\MatchSearchQuery', 'boost'=>'float'],
-'Couchbase\MatchSearchQuery::field' => ['Couchbase\MatchSearchQuery', 'field'=>'string'],
-'Couchbase\MatchSearchQuery::fuzziness' => ['Couchbase\MatchSearchQuery', 'fuzziness'=>'int'],
-'Couchbase\MatchSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\MatchSearchQuery::prefixLength' => ['Couchbase\MatchSearchQuery', 'prefixLength'=>'int'],
-'Couchbase\MutateInBuilder::__construct' => ['void'],
-'Couchbase\MutateInBuilder::arrayAddUnique' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::arrayAppend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::arrayAppendAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::arrayInsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'],
-'Couchbase\MutateInBuilder::arrayInsertAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array'],
-'Couchbase\MutateInBuilder::arrayPrepend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::arrayPrependAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::counter' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'delta'=>'int', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::execute' => ['Couchbase\DocumentFragment'],
-'Couchbase\MutateInBuilder::insert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::modeDocument' => ['', 'mode'=>'int'],
-'Couchbase\MutateInBuilder::remove' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'options='=>'array'],
-'Couchbase\MutateInBuilder::replace' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'],
-'Couchbase\MutateInBuilder::upsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'],
-'Couchbase\MutateInBuilder::withExpiry' => ['Couchbase\MutateInBuilder', 'expiry'=>'Couchbase\expiry'],
-'Couchbase\MutationState::__construct' => ['void'],
-'Couchbase\MutationState::add' => ['', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'],
-'Couchbase\MutationState::from' => ['Couchbase\MutationState', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'],
-'Couchbase\MutationToken::__construct' => ['void'],
-'Couchbase\MutationToken::bucketName' => ['string'],
-'Couchbase\MutationToken::from' => ['', 'bucketName'=>'string', 'vbucketId'=>'int', 'vbucketUuid'=>'string', 'sequenceNumber'=>'string'],
-'Couchbase\MutationToken::sequenceNumber' => ['string'],
-'Couchbase\MutationToken::vbucketId' => ['int'],
-'Couchbase\MutationToken::vbucketUuid' => ['string'],
-'Couchbase\N1qlIndex::__construct' => ['void'],
-'Couchbase\N1qlQuery::__construct' => ['void'],
-'Couchbase\N1qlQuery::adhoc' => ['Couchbase\N1qlQuery', 'adhoc'=>'bool'],
-'Couchbase\N1qlQuery::consistency' => ['Couchbase\N1qlQuery', 'consistency'=>'int'],
-'Couchbase\N1qlQuery::consistentWith' => ['Couchbase\N1qlQuery', 'state'=>'Couchbase\MutationState'],
-'Couchbase\N1qlQuery::crossBucket' => ['Couchbase\N1qlQuery', 'crossBucket'=>'bool'],
-'Couchbase\N1qlQuery::fromString' => ['Couchbase\N1qlQuery', 'statement'=>'string'],
-'Couchbase\N1qlQuery::maxParallelism' => ['Couchbase\N1qlQuery', 'maxParallelism'=>'int'],
-'Couchbase\N1qlQuery::namedParams' => ['Couchbase\N1qlQuery', 'params'=>'array'],
-'Couchbase\N1qlQuery::pipelineBatch' => ['Couchbase\N1qlQuery', 'pipelineBatch'=>'int'],
-'Couchbase\N1qlQuery::pipelineCap' => ['Couchbase\N1qlQuery', 'pipelineCap'=>'int'],
-'Couchbase\N1qlQuery::positionalParams' => ['Couchbase\N1qlQuery', 'params'=>'array'],
-'Couchbase\N1qlQuery::readonly' => ['Couchbase\N1qlQuery', 'readonly'=>'bool'],
-'Couchbase\N1qlQuery::scanCap' => ['Couchbase\N1qlQuery', 'scanCap'=>'int'],
-'Couchbase\NumericRangeSearchFacet::__construct' => ['void'],
-'Couchbase\NumericRangeSearchFacet::addRange' => ['Couchbase\NumericSearchFacet', 'name'=>'string', 'min'=>'float', 'max'=>'float'],
-'Couchbase\NumericRangeSearchFacet::jsonSerialize' => ['array'],
-'Couchbase\NumericRangeSearchQuery::__construct' => ['void'],
-'Couchbase\NumericRangeSearchQuery::boost' => ['Couchbase\NumericRangeSearchQuery', 'boost'=>'float'],
-'Couchbase\NumericRangeSearchQuery::field' => ['Couchbase\NumericRangeSearchQuery', 'field'=>'string'],
-'Couchbase\NumericRangeSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\NumericRangeSearchQuery::max' => ['Couchbase\NumericRangeSearchQuery', 'max'=>'float', 'inclusive='=>'bool|false'],
-'Couchbase\NumericRangeSearchQuery::min' => ['Couchbase\NumericRangeSearchQuery', 'min'=>'float', 'inclusive='=>'bool|true'],
-'Couchbase\passthruDecoder' => ['string', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'],
-'Couchbase\passthruEncoder' => ['array', 'value'=>'string'],
-'Couchbase\PasswordAuthenticator::password' => ['Couchbase\PasswordAuthenticator', 'password'=>'string'],
-'Couchbase\PasswordAuthenticator::username' => ['Couchbase\PasswordAuthenticator', 'username'=>'string'],
-'Couchbase\PhraseSearchQuery::__construct' => ['void'],
-'Couchbase\PhraseSearchQuery::boost' => ['Couchbase\PhraseSearchQuery', 'boost'=>'float'],
-'Couchbase\PhraseSearchQuery::field' => ['Couchbase\PhraseSearchQuery', 'field'=>'string'],
-'Couchbase\PhraseSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\PrefixSearchQuery::__construct' => ['void'],
-'Couchbase\PrefixSearchQuery::boost' => ['Couchbase\PrefixSearchQuery', 'boost'=>'float'],
-'Couchbase\PrefixSearchQuery::field' => ['Couchbase\PrefixSearchQuery', 'field'=>'string'],
-'Couchbase\PrefixSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\QueryStringSearchQuery::__construct' => ['void'],
-'Couchbase\QueryStringSearchQuery::boost' => ['Couchbase\QueryStringSearchQuery', 'boost'=>'float'],
-'Couchbase\QueryStringSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\RegexpSearchQuery::__construct' => ['void'],
-'Couchbase\RegexpSearchQuery::boost' => ['Couchbase\RegexpSearchQuery', 'boost'=>'float'],
-'Couchbase\RegexpSearchQuery::field' => ['Couchbase\RegexpSearchQuery', 'field'=>'string'],
-'Couchbase\RegexpSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\SearchQuery::__construct' => ['void', 'indexName'=>'string', 'queryPart'=>'Couchbase\SearchQueryPart'],
-'Couchbase\SearchQuery::addFacet' => ['Couchbase\SearchQuery', 'name'=>'string', 'facet'=>'Couchbase\SearchFacet'],
-'Couchbase\SearchQuery::boolean' => ['Couchbase\BooleanSearchQuery'],
-'Couchbase\SearchQuery::booleanField' => ['Couchbase\BooleanFieldSearchQuery', 'value'=>'bool'],
-'Couchbase\SearchQuery::conjuncts' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'],
-'Couchbase\SearchQuery::consistentWith' => ['Couchbase\SearchQuery', 'state'=>'Couchbase\MutationState'],
-'Couchbase\SearchQuery::dateRange' => ['Couchbase\DateRangeSearchQuery'],
-'Couchbase\SearchQuery::dateRangeFacet' => ['Couchbase\DateRangeSearchFacet', 'field'=>'string', 'limit'=>'int'],
-'Couchbase\SearchQuery::disjuncts' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'],
-'Couchbase\SearchQuery::docId' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'],
-'Couchbase\SearchQuery::explain' => ['Couchbase\SearchQuery', 'explain'=>'bool'],
-'Couchbase\SearchQuery::fields' => ['Couchbase\SearchQuery', '...fields='=>'array'],
-'Couchbase\SearchQuery::geoBoundingBox' => ['Couchbase\GeoBoundingBoxSearchQuery', 'topLeftLongitude'=>'float', 'topLeftLatitude'=>'float', 'bottomRightLongitude'=>'float', 'bottomRightLatitude'=>'float'],
-'Couchbase\SearchQuery::geoDistance' => ['Couchbase\GeoDistanceSearchQuery', 'longitude'=>'float', 'latitude'=>'float', 'distance'=>'string'],
-'Couchbase\SearchQuery::highlight' => ['Couchbase\SearchQuery', 'style'=>'string', '...fields='=>'array'],
-'Couchbase\SearchQuery::jsonSerialize' => ['array'],
-'Couchbase\SearchQuery::limit' => ['Couchbase\SearchQuery', 'limit'=>'int'],
-'Couchbase\SearchQuery::match' => ['Couchbase\MatchSearchQuery', 'match'=>'string'],
-'Couchbase\SearchQuery::matchAll' => ['Couchbase\MatchAllSearchQuery'],
-'Couchbase\SearchQuery::matchNone' => ['Couchbase\MatchNoneSearchQuery'],
-'Couchbase\SearchQuery::matchPhrase' => ['Couchbase\MatchPhraseSearchQuery', '...terms='=>'array'],
-'Couchbase\SearchQuery::numericRange' => ['Couchbase\NumericRangeSearchQuery'],
-'Couchbase\SearchQuery::numericRangeFacet' => ['Couchbase\NumericRangeSearchFacet', 'field'=>'string', 'limit'=>'int'],
-'Couchbase\SearchQuery::prefix' => ['Couchbase\PrefixSearchQuery', 'prefix'=>'string'],
-'Couchbase\SearchQuery::queryString' => ['Couchbase\QueryStringSearchQuery', 'queryString'=>'string'],
-'Couchbase\SearchQuery::regexp' => ['Couchbase\RegexpSearchQuery', 'regexp'=>'string'],
-'Couchbase\SearchQuery::serverSideTimeout' => ['Couchbase\SearchQuery', 'serverSideTimeout'=>'int'],
-'Couchbase\SearchQuery::skip' => ['Couchbase\SearchQuery', 'skip'=>'int'],
-'Couchbase\SearchQuery::sort' => ['Couchbase\SearchQuery', '...sort='=>'array'],
-'Couchbase\SearchQuery::term' => ['Couchbase\TermSearchQuery', 'term'=>'string'],
-'Couchbase\SearchQuery::termFacet' => ['Couchbase\TermSearchFacet', 'field'=>'string', 'limit'=>'int'],
-'Couchbase\SearchQuery::termRange' => ['Couchbase\TermRangeSearchQuery'],
-'Couchbase\SearchQuery::wildcard' => ['Couchbase\WildcardSearchQuery', 'wildcard'=>'string'],
-'Couchbase\SpatialViewQuery::__construct' => ['void'],
-'Couchbase\SpatialViewQuery::bbox' => ['Couchbase\SpatialViewQuery', 'bbox'=>'array'],
-'Couchbase\SpatialViewQuery::consistency' => ['Couchbase\SpatialViewQuery', 'consistency'=>'int'],
-'Couchbase\SpatialViewQuery::custom' => ['', 'customParameters'=>'array'],
-'Couchbase\SpatialViewQuery::encode' => ['array'],
-'Couchbase\SpatialViewQuery::endRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'],
-'Couchbase\SpatialViewQuery::limit' => ['Couchbase\SpatialViewQuery', 'limit'=>'int'],
-'Couchbase\SpatialViewQuery::order' => ['Couchbase\SpatialViewQuery', 'order'=>'int'],
-'Couchbase\SpatialViewQuery::skip' => ['Couchbase\SpatialViewQuery', 'skip'=>'int'],
-'Couchbase\SpatialViewQuery::startRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'],
-'Couchbase\TermRangeSearchQuery::__construct' => ['void'],
-'Couchbase\TermRangeSearchQuery::boost' => ['Couchbase\TermRangeSearchQuery', 'boost'=>'float'],
-'Couchbase\TermRangeSearchQuery::field' => ['Couchbase\TermRangeSearchQuery', 'field'=>'string'],
-'Couchbase\TermRangeSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\TermRangeSearchQuery::max' => ['Couchbase\TermRangeSearchQuery', 'max'=>'string', 'inclusive='=>'bool|false'],
-'Couchbase\TermRangeSearchQuery::min' => ['Couchbase\TermRangeSearchQuery', 'min'=>'string', 'inclusive='=>'bool|true'],
-'Couchbase\TermSearchFacet::__construct' => ['void'],
-'Couchbase\TermSearchFacet::jsonSerialize' => ['array'],
-'Couchbase\TermSearchQuery::__construct' => ['void'],
-'Couchbase\TermSearchQuery::boost' => ['Couchbase\TermSearchQuery', 'boost'=>'float'],
-'Couchbase\TermSearchQuery::field' => ['Couchbase\TermSearchQuery', 'field'=>'string'],
-'Couchbase\TermSearchQuery::fuzziness' => ['Couchbase\TermSearchQuery', 'fuzziness'=>'int'],
-'Couchbase\TermSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\TermSearchQuery::prefixLength' => ['Couchbase\TermSearchQuery', 'prefixLength'=>'int'],
-'Couchbase\UserSettings::fullName' => ['Couchbase\UserSettings', 'fullName'=>'string'],
-'Couchbase\UserSettings::password' => ['Couchbase\UserSettings', 'password'=>'string'],
-'Couchbase\UserSettings::role' => ['Couchbase\UserSettings', 'role'=>'string', 'bucket='=>'string'],
-'Couchbase\ViewQuery::__construct' => ['void'],
-'Couchbase\ViewQuery::consistency' => ['Couchbase\ViewQuery', 'consistency'=>'int'],
-'Couchbase\ViewQuery::custom' => ['Couchbase\ViewQuery', 'customParameters'=>'array'],
-'Couchbase\ViewQuery::encode' => ['array'],
-'Couchbase\ViewQuery::from' => ['Couchbase\ViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'],
-'Couchbase\ViewQuery::fromSpatial' => ['Couchbase\SpatialViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'],
-'Couchbase\ViewQuery::group' => ['Couchbase\ViewQuery', 'group'=>'bool'],
-'Couchbase\ViewQuery::groupLevel' => ['Couchbase\ViewQuery', 'groupLevel'=>'int'],
-'Couchbase\ViewQuery::idRange' => ['Couchbase\ViewQuery', 'startKeyDocumentId'=>'string', 'endKeyDocumentId'=>'string'],
-'Couchbase\ViewQuery::key' => ['Couchbase\ViewQuery', 'key'=>'mixed'],
-'Couchbase\ViewQuery::keys' => ['Couchbase\ViewQuery', 'keys'=>'array'],
-'Couchbase\ViewQuery::limit' => ['Couchbase\ViewQuery', 'limit'=>'int'],
-'Couchbase\ViewQuery::order' => ['Couchbase\ViewQuery', 'order'=>'int'],
-'Couchbase\ViewQuery::range' => ['Couchbase\ViewQuery', 'startKey'=>'mixed', 'endKey'=>'mixed', 'inclusiveEnd='=>'bool|false'],
-'Couchbase\ViewQuery::reduce' => ['Couchbase\ViewQuery', 'reduce'=>'bool'],
-'Couchbase\ViewQuery::skip' => ['Couchbase\ViewQuery', 'skip'=>'int'],
-'Couchbase\ViewQueryEncodable::encode' => ['array'],
-'Couchbase\WildcardSearchQuery::__construct' => ['void'],
-'Couchbase\WildcardSearchQuery::boost' => ['Couchbase\WildcardSearchQuery', 'boost'=>'float'],
-'Couchbase\WildcardSearchQuery::field' => ['Couchbase\WildcardSearchQuery', 'field'=>'string'],
-'Couchbase\WildcardSearchQuery::jsonSerialize' => ['array'],
-'Couchbase\zlibCompress' => ['string', 'data'=>'string'],
-'Couchbase\zlibDecompress' => ['string', 'data'=>'string'],
-'count' => ['0|positive-int', 'var'=>'Countable|array', 'mode='=>'int'],
-'count_chars' => ['mixed', 'input'=>'string', 'mode='=>'int'],
+'count' => ['0|positive-int', 'var'=>'Countable|array', 'mode='=>'0|1'],
+'count_chars' => ['mixed', 'input'=>'string', 'mode='=>'0|1|2|3|4'],
'Countable::count' => ['0|positive-int'],
'crack_check' => ['bool', 'dictionary'=>'', 'password'=>'string'],
'crack_closedict' => ['bool', 'dictionary='=>'resource'],
@@ -1375,7 +1004,7 @@
'crash' => [''],
'crc32' => ['int', 'str'=>'string'],
'create_function' => ['string', 'args'=>'string', 'code'=>'string'],
-'crypt' => ['string', 'str'=>'string', 'salt='=>'string'],
+'crypt' => ['non-empty-string', 'str'=>'string', 'salt='=>'string'],
'ctype_alnum' => ['bool', 'c'=>'mixed'],
'ctype_alpha' => ['bool', 'c'=>'mixed'],
'ctype_cntrl' => ['bool', 'c'=>'mixed'],
@@ -1494,14 +1123,14 @@
'curl_exec' => ['bool|string', 'ch'=>'resource'],
'curl_file_create' => ['CURLFile', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'],
'curl_getinfo' => ['mixed', 'ch'=>'resource', 'option='=>'int'],
-'curl_init' => ['resource|false', 'url='=>'string'],
+'curl_init' => ['__benevolent', 'url='=>'string'],
'curl_multi_add_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'],
'curl_multi_close' => ['void', 'mh'=>'resource'],
'curl_multi_errno' => ['int', 'mh'=>'resource'],
'curl_multi_exec' => ['int', 'mh'=>'resource', '&w_still_running'=>'int'],
-'curl_multi_getcontent' => ['string', 'ch'=>'resource'],
+'curl_multi_getcontent' => ['string|null', 'ch'=>'resource'],
'curl_multi_info_read' => ['array|false', 'mh'=>'resource', '&w_msgs_in_queue='=>'int'],
-'curl_multi_init' => ['resource|false'],
+'curl_multi_init' => ['resource'],
'curl_multi_remove_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'],
'curl_multi_select' => ['int', 'mh'=>'resource', 'timeout='=>'float'],
'curl_multi_setopt' => ['bool', 'mh'=>'resource', 'option'=>'int', 'value'=>'mixed'],
@@ -1534,25 +1163,25 @@
'cyrus_unbind' => ['bool', 'connection'=>'resource', 'trigger_name'=>'string'],
'date' => ['string', 'format'=>'string', 'timestamp='=>'int'],
'date_add' => ['DateTime|false', 'object'=>'', 'interval'=>''],
-'date_create' => ['DateTime|false', 'time='=>'string|null', 'timezone='=>'?\DateTimeZone'],
-'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?\DateTimeZone'],
-'date_create_immutable' => ['DateTimeImmutable|false', 'time='=>'string', 'timezone='=>'?\DateTimeZone'],
-'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?\DateTimeZone'],
+'date_create' => ['DateTime|false', 'time='=>'string|null', 'timezone='=>'?DateTimeZone'],
+'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'],
+'date_create_immutable' => ['DateTimeImmutable|false', 'time='=>'string', 'timezone='=>'?DateTimeZone'],
+'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'],
'date_date_set' => ['DateTime|false', 'object'=>'', 'year'=>'', 'month'=>'', 'day'=>''],
'date_default_timezone_get' => ['string'],
'date_default_timezone_set' => ['bool', 'timezone_identifier'=>'string'],
'date_diff' => ['DateInterval', 'obj1'=>'DateTimeInterface', 'obj2'=>'DateTimeInterface', 'absolute='=>'bool'],
'date_format' => ['string', 'obj'=>'DateTimeInterface', 'format'=>'string'],
-'date_get_last_errors' => ['array{warning_count: int, warnings: array, error_count: int, errors: array}|false'],
+'date_get_last_errors' => ['array{warning_count: 0|positive-int, warnings: list, error_count: 0|positive-int, errors: list}|false'],
'date_interval_create_from_date_string' => ['DateInterval|false', 'time'=>'string'],
'date_interval_format' => ['string', 'object'=>'DateInterval', 'format'=>'string'],
'date_isodate_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'week'=>'int', 'day='=>'int|mixed'],
'date_modify' => ['DateTime|false', 'object'=>'DateTime', 'modify'=>'string'],
'date_offset_get' => ['int', 'obj'=>'DateTimeInterface'],
-'date_parse' => ['array|false', 'date'=>'string'],
-'date_parse_from_format' => ['array', 'format'=>'string', 'date'=>'string'],
+'date_parse' => ['array{year: int|false, month: int|false, day: int|false, hour: int|false, minute: int|false, second: int|false, fraction: float|false, warning_count: int, warnings: string[], error_count: int, errors: string[], is_localtime: bool, zone_type?: int|bool, zone?: int|bool, is_dst?: bool, tz_abbr?: string, tz_id?: string, relative?: array{year: int, month: int, day: int, hour: int, minute: int, second: int, weekday?: int, weekdays?: int, first_day_of_month?: bool, last_day_of_month?: bool}}', 'date'=>'string'],
+'date_parse_from_format' => ['array{year: int|false, month: int|false, day: int|false, hour: int|false, minute: int|false, second: int|false, fraction: float|false, warning_count: int, warnings: string[], error_count: int, errors: string[], is_localtime: bool, zone_type?: int|bool, zone?: int|bool, is_dst?: bool, tz_abbr?: string, tz_id?: string, relative?: array{year: int, month: int, day: int, hour: int, minute: int, second: int, weekday?: int, weekdays?: int, first_day_of_month?: bool, last_day_of_month?: bool}}', 'format'=>'string', 'date'=>'string'],
'date_sub' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'],
-'date_sun_info' => ['array', 'time'=>'int', 'latitude'=>'float', 'longitude'=>'float'],
+'date_sun_info' => ['__benevolent', 'time'=>'int', 'latitude'=>'float', 'longitude'=>'float'],
'date_sunrise' => ['mixed', 'time'=>'int', 'format='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'gmt_offset='=>'float'],
'date_sunset' => ['mixed', 'time'=>'int', 'format='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'gmt_offset='=>'float'],
'date_time_set' => ['DateTime|false', 'object'=>'', 'hour'=>'', 'minute'=>'', 'second='=>'', 'microseconds='=>''],
@@ -1564,7 +1193,7 @@
'datefmt_format' => ['string|false', 'fmt'=>'IntlDateFormatter', 'value'=>'DateTime|IntlCalendar|array|int'],
'datefmt_format_object' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'],
'datefmt_get_calendar' => ['int|false', 'fmt'=>'IntlDateFormatter'],
-'datefmt_get_calendar_object' => ['IntlCalendar|false', 'fmt'=>'IntlDateFormatter'],
+'datefmt_get_calendar_object' => ['IntlCalendar|false|null', 'fmt'=>'IntlDateFormatter'],
'datefmt_get_datetype' => ['int|false', 'fmt'=>'IntlDateFormatter'],
'datefmt_get_error_code' => ['int', 'fmt'=>'IntlDateFormatter'],
'datefmt_get_error_message' => ['string', 'fmt'=>'IntlDateFormatter'],
@@ -1574,24 +1203,24 @@
'datefmt_get_timezone' => ['IntlTimeZone|false'],
'datefmt_get_timezone_id' => ['string|false', 'fmt'=>'IntlDateFormatter'],
'datefmt_is_lenient' => ['bool', 'fmt'=>'IntlDateFormatter'],
-'datefmt_localtime' => ['array|bool|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
-'datefmt_parse' => ['int|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
+'datefmt_localtime' => ['array|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
+'datefmt_parse' => ['int|float|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
'datefmt_set_calendar' => ['bool', 'fmt'=>'IntlDateFormatter', 'which'=>'int'],
-'datefmt_set_lenient' => ['?bool', 'fmt'=>'IntlDateFormatter', 'lenient'=>'bool'],
+'datefmt_set_lenient' => ['void', 'fmt'=>'IntlDateFormatter', 'lenient'=>'bool'],
'datefmt_set_pattern' => ['bool', 'fmt'=>'IntlDateFormatter', 'pattern'=>'string'],
'datefmt_set_timezone' => ['bool', 'zone'=>'mixed'],
'datefmt_set_timezone_id' => ['bool', 'fmt'=>'IntlDateFormatter', 'zone'=>'string'],
'DateInterval::__construct' => ['void', 'spec'=>'string'],
'DateInterval::__set_state' => ['DateInterval', 'array'=>'array'],
'DateInterval::__wakeup' => ['void'],
-'DateInterval::createFromDateString' => ['DateInterval', 'time'=>'string'],
+'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'string'],
'DateInterval::format' => ['string', 'format'=>'string'],
'DatePeriod::__construct' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'recur'=>'int', 'options='=>'int'],
'DatePeriod::__construct\'1' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'end'=>'DateTimeInterface', 'options='=>'int'],
'DatePeriod::__construct\'2' => ['void', 'iso'=>'string', 'options='=>'int'],
'DatePeriod::__wakeup' => ['void'],
'DatePeriod::getDateInterval' => ['DateInterval'],
-'DatePeriod::getEndDate' => ['DateTimeInterface'],
+'DatePeriod::getEndDate' => ['?DateTimeInterface'],
'DatePeriod::getStartDate' => ['DateTimeInterface'],
'DateTime::__construct' => ['void', 'time='=>'string', 'timezone='=>'?DateTimeZone'],
'DateTime::__set_state' => ['static', 'array'=>'array'],
@@ -1601,11 +1230,11 @@
'DateTime::createFromImmutable' => ['static', 'object'=>'DateTimeImmutable'],
'DateTime::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'],
'DateTime::format' => ['string', 'format'=>'string'],
-'DateTime::getLastErrors' => ['array{warning_count: int, warnings: array, error_count: int, errors: array}|false'],
+'DateTime::getLastErrors' => ['array{warning_count: 0|positive-int, warnings: list, error_count: 0|positive-int, errors: list}|false'],
'DateTime::getOffset' => ['int'],
'DateTime::getTimestamp' => ['int'],
'DateTime::getTimezone' => ['DateTimeZone'],
-'DateTime::modify' => ['static', 'modify'=>'string'],
+'DateTime::modify' => ['__benevolent', 'modify'=>'string'],
'DateTime::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'],
'DateTime::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'],
'DateTime::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'],
@@ -1620,11 +1249,11 @@
'DateTimeImmutable::createFromMutable' => ['static', 'datetime'=>'DateTime'],
'DateTimeImmutable::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'],
'DateTimeImmutable::format' => ['string', 'format'=>'string'],
-'DateTimeImmutable::getLastErrors' => ['array{warning_count: int, warnings: array, error_count: int, errors: array}|false'],
+'DateTimeImmutable::getLastErrors' => ['array{warning_count: 0|positive-int, warnings: list, error_count: 0|positive-int, errors: list}|false'],
'DateTimeImmutable::getOffset' => ['int'],
'DateTimeImmutable::getTimestamp' => ['int'],
'DateTimeImmutable::getTimezone' => ['DateTimeZone'],
-'DateTimeImmutable::modify' => ['static', 'modify'=>'string'],
+'DateTimeImmutable::modify' => ['__benevolent', 'modify'=>'string'],
'DateTimeImmutable::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'],
'DateTimeImmutable::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'],
'DateTimeImmutable::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'],
@@ -1639,15 +1268,15 @@
'DateTimeZone::__construct' => ['void', 'timezone'=>'string'],
'DateTimeZone::__set_state' => ['DateTimeZone', 'array'=>'array'],
'DateTimeZone::__wakeup' => ['void'],
-'DateTimeZone::getLocation' => ['array'],
+'DateTimeZone::getLocation' => ['array{country_code: string, latitude: float, longitude: float, comments: string}|false'],
'DateTimeZone::getName' => ['string'],
'DateTimeZone::getOffset' => ['int', 'datetime'=>'DateTimeInterface'],
-'DateTimeZone::getTransitions' => ['array', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'],
-'DateTimeZone::listAbbreviations' => ['array'],
-'DateTimeZone::listIdentifiers' => ['array', 'what='=>'int', 'country='=>'string'],
-'db2_autocommit' => ['mixed', 'connection'=>'resource', 'value='=>'int'],
+'DateTimeZone::getTransitions' => ['list', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'],
+'DateTimeZone::listAbbreviations' => ['array>'],
+'DateTimeZone::listIdentifiers' => ['list', 'what='=>'int', 'country='=>'string'],
+'db2_autocommit' => ['DB2_AUTOCOMMIT_OFF|DB2_AUTOCOMMIT_ON|bool', 'connection'=>'resource', 'value='=>'DB2_AUTOCOMMIT_OFF|DB2_AUTOCOMMIT_ON'],
'db2_bind_param' => ['bool', 'stmt'=>'resource', 'parameter_number'=>'int', 'variable_name'=>'string', 'parameter_type='=>'int', 'data_type='=>'int', 'precision='=>'int', 'scale='=>'int'],
-'db2_client_info' => ['object|false', 'connection'=>'resource'],
+'db2_client_info' => ['stdClass|false', 'connection'=>'resource'],
'db2_close' => ['bool', 'connection'=>'resource'],
'db2_column_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'],
'db2_columns' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'],
@@ -1659,10 +1288,10 @@
'db2_escape_string' => ['string', 'string_literal'=>'string'],
'db2_exec' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'],
'db2_execute' => ['bool', 'stmt'=>'resource', 'parameters='=>'array'],
-'db2_fetch_array' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'],
-'db2_fetch_assoc' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'],
+'db2_fetch_array' => ['non-empty-list|false', 'stmt'=>'resource', 'row_number='=>'int'],
+'db2_fetch_assoc' => ['non-empty-array|false', 'stmt'=>'resource', 'row_number='=>'int'],
'db2_fetch_both' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'],
-'db2_fetch_object' => ['object|false', 'stmt'=>'resource', 'row_number='=>'int'],
+'db2_fetch_object' => ['stdClass|false', 'stmt'=>'resource', 'row_number='=>'int'],
'db2_fetch_row' => ['bool', 'stmt'=>'resource', 'row_number='=>'int'],
'db2_field_display_size' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'],
'db2_field_name' => ['string|false', 'stmt'=>'resource', 'column'=>'mixed'],
@@ -1675,11 +1304,11 @@
'db2_free_result' => ['bool', 'stmt'=>'resource'],
'db2_free_stmt' => ['bool', 'stmt'=>'resource'],
'db2_get_option' => ['string|false', 'resource'=>'resource', 'option'=>'string'],
-'db2_last_insert_id' => ['string', 'resource'=>'resource'],
+'db2_last_insert_id' => ['string|null', 'resource'=>'resource'],
'db2_lob_read' => ['string|false', 'stmt'=>'resource', 'colnum'=>'int', 'length'=>'int'],
'db2_next_result' => ['resource|false', 'stmt'=>'resource'],
-'db2_num_fields' => ['int|false', 'stmt'=>'resource'],
-'db2_num_rows' => ['int', 'stmt'=>'resource'],
+'db2_num_fields' => ['0|positive-int|false', 'stmt'=>'resource'],
+'db2_num_rows' => ['0|positive-int|false', 'stmt'=>'resource'],
'db2_pclose' => ['bool', 'resource'=>'resource'],
'db2_pconnect' => ['resource|false', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'options='=>'array'],
'db2_prepare' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'],
@@ -1690,7 +1319,7 @@
'db2_procedures' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'procedure'=>'string'],
'db2_result' => ['mixed', 'stmt'=>'resource', 'column'=>'mixed'],
'db2_rollback' => ['bool', 'connection'=>'resource'],
-'db2_server_info' => ['object|false', 'connection'=>'resource'],
+'db2_server_info' => ['stdClass|false', 'connection'=>'resource'],
'db2_set_option' => ['bool', 'resource'=>'resource', 'options'=>'array', 'type'=>'int'],
'db2_setoption' => [''],
'db2_special_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string', 'scope'=>'int'],
@@ -1787,7 +1416,7 @@
'dcgettext' => ['string', 'domain_name'=>'string', 'msgid'=>'string', 'category'=>'int'],
'dcngettext' => ['string', 'domain'=>'string', 'msgid1'=>'string', 'msgid2'=>'string', 'n'=>'int', 'category'=>'int'],
'deaggregate' => ['', 'object'=>'object', 'class_name='=>'string'],
-'debug_backtrace' => ['array', 'options='=>'int|bool', 'limit='=>'int'],
+'debug_backtrace' => ['list\',args?:list,object?:object}>', 'options='=>'int|bool', 'limit='=>'int'],
'debug_print_backtrace' => ['void', 'options='=>'int|bool', 'limit='=>'int'],
'debug_zval_dump' => ['void', '...var'=>'mixed'],
'debugger_connect' => [''],
@@ -1855,7 +1484,7 @@
'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'],
'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'],
'DirectoryIterator::valid' => ['bool'],
-'dirname' => ['string', 'path'=>'string', 'levels='=>'int'],
+'dirname' => ['string', 'path'=>'string', 'levels='=>'positive-int'],
'disk_free_space' => ['float|false', 'path'=>'string'],
'disk_total_space' => ['float|false', 'path'=>'string'],
'diskfreespace' => ['float|false', 'path'=>'string'],
@@ -1864,7 +1493,7 @@
'dngettext' => ['string', 'domain'=>'string', 'msgid1'=>'string', 'msgid2'=>'string', 'count'=>'int'],
'dns_check_record' => ['bool', 'host'=>'string', 'type='=>'string'],
'dns_get_mx' => ['bool', 'hostname'=>'string', '&w_mxhosts'=>'array', '&w_weight'=>'array'],
-'dns_get_record' => ['array|false', 'hostname'=>'string', 'type='=>'int', '&w_authns='=>'array', '&w_addtl='=>'array', 'raw='=>'bool'],
+'dns_get_record' => ['list|false', 'hostname'=>'string', 'type='=>'int', '&w_authns='=>'array', '&w_addtl='=>'array', 'raw='=>'bool'],
'dom_document_relaxNG_validate_file' => ['bool', 'filename'=>'string'],
'dom_document_relaxNG_validate_xml' => ['bool', 'source'=>'string'],
'dom_document_schema_validate' => ['bool', 'source'=>'string', 'flags'=>'int'],
@@ -1884,7 +1513,7 @@
'DomainException::getLine' => ['int'],
'DomainException::getMessage' => ['string'],
'DomainException::getPrevious' => ['Throwable|DomainException|null'],
-'DomainException::getTrace' => ['array'],
+'DomainException::getTrace' => ['list\',args?:list,object?:object}>'],
'DomainException::getTraceAsString' => ['string'],
'DOMAttr::__construct' => ['void', 'name'=>'string', 'value='=>'string'],
'DOMAttr::isId' => ['bool'],
@@ -1900,29 +1529,29 @@
'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'],
'DOMComment::__construct' => ['void', 'value='=>'string'],
'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'],
-'DOMDocument::createAttribute' => ['DOMAttr', 'name'=>'string'],
-'DOMDocument::createAttributeNS' => ['DOMAttr', 'namespaceuri'=>'string', 'qualifiedname'=>'string'],
-'DOMDocument::createCDATASection' => ['DOMCDATASection', 'data'=>'string'],
+'DOMDocument::createAttribute' => ['__benevolent', 'name'=>'string'],
+'DOMDocument::createAttributeNS' => ['__benevolent', 'namespaceuri'=>'string', 'qualifiedname'=>'string'],
+'DOMDocument::createCDATASection' => ['__benevolent', 'data'=>'string'],
'DOMDocument::createComment' => ['DOMComment', 'data'=>'string'],
'DOMDocument::createDocumentFragment' => ['DOMDocumentFragment'],
-'DOMDocument::createElement' => ['DOMElement', 'name'=>'string', 'value='=>'string'],
-'DOMDocument::createElementNS' => ['DOMElement', 'namespaceuri'=>'string', 'qualifiedname'=>'string', 'value='=>'string'],
-'DOMDocument::createEntityReference' => ['DOMEntityReference', 'name'=>'string'],
-'DOMDocument::createProcessingInstruction' => ['DOMProcessingInstruction', 'target'=>'string', 'data='=>'string'],
+'DOMDocument::createElement' => ['__benevolent', 'name'=>'string', 'value='=>'string'],
+'DOMDocument::createElementNS' => ['__benevolent', 'namespaceuri'=>'string', 'qualifiedname'=>'string', 'value='=>'string'],
+'DOMDocument::createEntityReference' => ['__benevolent', 'name'=>'string'],
+'DOMDocument::createProcessingInstruction' => ['__benevolent', 'target'=>'string', 'data='=>'string'],
'DOMDocument::createTextNode' => ['DOMText', 'content'=>'string'],
'DOMDocument::getElementById' => ['DOMElement|null', 'elementid'=>'string'],
'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'],
'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string', 'localname'=>'string'],
'DOMDocument::importNode' => ['DOMNode', 'importednode'=>'DOMNode', 'deep='=>'bool'],
-'DOMDocument::load' => ['mixed', 'filename'=>'string', 'options='=>'int'],
+'DOMDocument::load' => ['bool', 'filename'=>'string', 'options='=>'int'],
'DOMDocument::loadHTML' => ['bool', 'source'=>'string', 'options='=>'int'],
'DOMDocument::loadHTMLFile' => ['bool', 'filename'=>'string', 'options='=>'int'],
-'DOMDocument::loadXML' => ['mixed', 'source'=>'string', 'options='=>'int'],
+'DOMDocument::loadXML' => ['bool', 'source'=>'string', 'options='=>'int'],
'DOMDocument::normalizeDocument' => ['void'],
'DOMDocument::registerNodeClass' => ['bool', 'baseclass'=>'string', 'extendedclass'=>'string'],
'DOMDocument::relaxNGValidate' => ['bool', 'filename'=>'string'],
'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'],
-'DOMDocument::save' => ['int', 'filename'=>'string', 'options='=>'int'],
+'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'],
'DOMDocument::saveHTML' => ['string|false', 'node='=>'?DOMNode'],
'DOMDocument::saveHTMLFile' => ['int|false', 'filename'=>'string'],
'DOMDocument::saveXML' => ['string|false', 'node='=>'?DOMNode', 'options='=>'int'],
@@ -1975,24 +1604,24 @@
'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'string', 'localname'=>'string'],
'DOMNamedNodeMap::item' => ['?DOMNode', 'index'=>'int'],
'DomNode::add_namespace' => ['bool', 'uri'=>'string', 'prefix'=>'string'],
-'DomNode::append_child' => ['DOMNode', 'newnode'=>'DOMNode'],
-'DOMNode::appendChild' => ['DOMNode', 'newnode'=>'DOMNode'],
+'DomNode::append_child' => ['__benevolent', 'newnode'=>'DOMNode'],
+'DOMNode::appendChild' => ['__benevolent', 'newnode'=>'DOMNode'],
'DOMNode::C14N' => ['string', 'exclusive='=>'bool', 'with_comments='=>'bool', 'xpath='=>'array', 'ns_prefixes='=>'array'],
'DOMNode::C14NFile' => ['int', 'uri='=>'string', 'exclusive='=>'bool', 'with_comments='=>'bool', 'xpath='=>'array', 'ns_prefixes='=>'array'],
-'DOMNode::cloneNode' => ['DOMNode', 'deep='=>'bool'],
+'DOMNode::cloneNode' => ['__benevolent', 'deep='=>'bool'],
'DOMNode::getLineNo' => ['int'],
'DOMNode::getNodePath' => ['?string'],
'DOMNode::hasAttributes' => ['bool'],
'DOMNode::hasChildNodes' => ['bool'],
-'DOMNode::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'],
+'DOMNode::insertBefore' => ['__benevolent', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'],
'DOMNode::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'],
'DOMNode::isSameNode' => ['bool', 'node'=>'DOMNode'],
'DOMNode::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'],
-'DOMNode::lookupNamespaceURI' => ['string', 'prefix'=>'string'],
+'DOMNode::lookupNamespaceURI' => ['?string', 'prefix'=>'?string'],
'DOMNode::lookupPrefix' => ['string', 'namespaceuri'=>'string'],
'DOMNode::normalize' => ['void'],
-'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'],
-'DOMNode::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'],
+'DOMNode::removeChild' => ['__benevolent', 'oldnode'=>'DOMNode'],
+'DOMNode::replaceChild' => ['__benevolent', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'],
'DOMNodeList::count' => ['0|positive-int'],
'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'],
'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'],
@@ -2001,7 +1630,7 @@
'DOMText::__construct' => ['void', 'value='=>'string'],
'DOMText::isElementContentWhitespace' => ['bool'],
'DOMText::isWhitespaceInElementContent' => ['bool'],
-'DOMText::splitText' => ['DOMText', 'offset'=>'int'],
+'DOMText::splitText' => ['DOMText|false', 'offset'=>'int'],
'domxml_new_doc' => ['DomDocument', 'version'=>'string'],
'domxml_open_file' => ['DomDocument', 'filename'=>'string', 'mode='=>'int', 'error='=>'array'],
'domxml_open_mem' => ['DomDocument', 'str'=>'string', 'mode='=>'int', 'error='=>'array'],
@@ -2021,279 +1650,108 @@
'DomXsltStylesheet::result_dump_mem' => ['string', 'xmldoc'=>'DOMDocument'],
'DOTNET::__construct' => ['void', 'assembly_name'=>'string', 'class_name'=>'string', 'codepage='=>'int'],
'dotnet_load' => ['int', 'assembly_name'=>'string', 'datatype_name='=>'string', 'codepage='=>'int'],
-'doubleval' => ['float', 'var'=>'mixed'],
-'Ds\Collection::clear' => ['void'],
-'Ds\Collection::copy' => ['Ds\Collection'],
-'Ds\Collection::isEmpty' => ['bool'],
-'Ds\Collection::toArray' => ['array'],
+'doubleval' => ['float', 'var'=>'scalar|array|resource|null'],
'Ds\Deque::__construct' => ['void', 'values='=>'mixed'],
-'Ds\Deque::allocate' => ['void', 'capacity'=>'int'],
-'Ds\Deque::apply' => ['void', 'callback'=>'callable'],
-'Ds\Deque::capacity' => ['int'],
-'Ds\Deque::clear' => ['void'],
-'Ds\Deque::contains' => ['bool', '...values='=>'mixed'],
-'Ds\Deque::copy' => ['Ds\Deque'],
'Ds\Deque::count' => ['0|positive-int'],
-'Ds\Deque::filter' => ['Ds\Deque', 'callback='=>'callable'],
-'Ds\Deque::find' => ['mixed', 'value'=>'mixed'],
-'Ds\Deque::first' => ['mixed'],
-'Ds\Deque::get' => ['void', 'index'=>'int'],
-'Ds\Deque::insert' => ['void', 'index'=>'int', '...values='=>'mixed'],
-'Ds\Deque::isEmpty' => ['bool'],
-'Ds\Deque::join' => ['string', 'glue='=>'string'],
'Ds\Deque::jsonSerialize' => ['array'],
-'Ds\Deque::last' => ['mixed'],
-'Ds\Deque::map' => ['Ds\Deque', 'callback'=>'callable'],
-'Ds\Deque::merge' => ['Ds\Deque', 'values'=>'mixed'],
-'Ds\Deque::pop' => ['mixed'],
-'Ds\Deque::push' => ['void', '...values='=>'mixed'],
-'Ds\Deque::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'],
-'Ds\Deque::remove' => ['mixed', 'index'=>'int'],
-'Ds\Deque::reverse' => ['void'],
-'Ds\Deque::reversed' => ['Ds\Deque'],
-'Ds\Deque::rotate' => ['void', 'rotations'=>'int'],
-'Ds\Deque::set' => ['void', 'index'=>'int', 'value'=>'mixed'],
-'Ds\Deque::shift' => ['mixed'],
-'Ds\Deque::slice' => ['Ds\Deque', 'index'=>'int', 'length='=>'?int'],
-'Ds\Deque::sort' => ['void', 'comparator='=>'callable'],
-'Ds\Deque::sorted' => ['Ds\Deque', 'comparator='=>'callable'],
-'Ds\Deque::sum' => ['int|float'],
-'Ds\Deque::toArray' => ['array'],
-'Ds\Deque::unshift' => ['void', '...values='=>'mixed'],
-'Ds\Hashable::equals' => ['bool', 'obj'=>'mixed'],
-'Ds\Hashable::hash' => ['mixed'],
'Ds\Map::__construct' => ['void', 'values='=>'mixed'],
'Ds\Map::allocate' => ['void', 'capacity'=>'int'],
'Ds\Map::apply' => ['void', 'callback'=>'callable'],
-'Ds\Map::capacity' => ['int'],
-'Ds\Map::clear' => ['void'],
-'Ds\Map::copy' => ['Ds\Map'],
'Ds\Map::count' => ['0|positive-int'],
-'Ds\Map::diff' => ['Ds\Map', 'map'=>'Ds\Map'],
-'Ds\Map::filter' => ['Ds\Map', 'callback='=>'callable'],
-'Ds\Map::first' => ['Ds\Pair'],
-'Ds\Map::get' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'],
-'Ds\Map::hasKey' => ['bool', 'key'=>'mixed'],
-'Ds\Map::hasValue' => ['bool', 'value'=>'mixed'],
-'Ds\Map::intersect' => ['Ds\Map', 'map'=>'Ds\Map'],
-'Ds\Map::isEmpty' => ['bool'],
'Ds\Map::jsonSerialize' => ['array'],
-'Ds\Map::keys' => ['Ds\Set'],
'Ds\Map::ksort' => ['void', 'comparator='=>'callable'],
-'Ds\Map::ksorted' => ['Ds\Map', 'comparator='=>'callable'],
-'Ds\Map::last' => ['Ds\Pair'],
-'Ds\Map::map' => ['Ds\Map', 'callback'=>'callable'],
-'Ds\Map::merge' => ['Ds\Map', 'values'=>'mixed'],
-'Ds\Map::pairs' => ['Ds\Sequence'],
'Ds\Map::put' => ['void', 'key'=>'mixed', 'value'=>'mixed'],
'Ds\Map::putAll' => ['void', 'values'=>'mixed'],
-'Ds\Map::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'],
-'Ds\Map::remove' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'],
'Ds\Map::reverse' => ['void'],
-'Ds\Map::reversed' => ['Ds\Map'],
-'Ds\Map::skip' => ['Ds\Pair', 'position'=>'int'],
-'Ds\Map::slice' => ['Ds\Map', 'index'=>'int', 'length='=>'?int'],
'Ds\Map::sort' => ['void', 'comparator='=>'callable'],
-'Ds\Map::sorted' => ['Ds\Map', 'comparator='=>'callable'],
-'Ds\Map::sum' => ['int|float'],
-'Ds\Map::toArray' => ['array'],
-'Ds\Map::union' => ['Ds\Map', 'map'=>'Ds\Map'],
-'Ds\Map::values' => ['Ds\Sequence'],
-'Ds\Map::xor' => ['Ds\Map', 'map'=>'Ds\Map'],
-'Ds\Pair::__construct' => ['void', 'key='=>'mixed', 'value='=>'mixed'],
-'Ds\Pair::copy' => ['Ds\Pair'],
'Ds\Pair::jsonSerialize' => ['array'],
-'Ds\Pair::toArray' => ['array'],
-'Ds\PriorityQueue::__construct' => ['void'],
-'Ds\PriorityQueue::allocate' => ['void', 'capacity'=>'int'],
-'Ds\PriorityQueue::capacity' => ['int'],
-'Ds\PriorityQueue::clear' => ['void'],
-'Ds\PriorityQueue::copy' => ['Ds\PriorityQueue'],
'Ds\PriorityQueue::count' => ['0|positive-int'],
-'Ds\PriorityQueue::isEmpty' => ['bool'],
'Ds\PriorityQueue::jsonSerialize' => ['array'],
-'Ds\PriorityQueue::peek' => ['mixed'],
-'Ds\PriorityQueue::pop' => ['mixed'],
'Ds\PriorityQueue::push' => ['void', 'value'=>'mixed', 'priority'=>'int'],
-'Ds\PriorityQueue::toArray' => ['array'],
-'Ds\Queue::__construct' => ['void', 'values='=>'mixed'],
'Ds\Queue::allocate' => ['void', 'capacity'=>'int'],
-'Ds\Queue::capacity' => ['int'],
-'Ds\Queue::clear' => ['void'],
-'Ds\Queue::copy' => ['Ds\Queue'],
'Ds\Queue::count' => ['0|positive-int'],
-'Ds\Queue::isEmpty' => ['bool'],
'Ds\Queue::jsonSerialize' => ['array'],
-'Ds\Queue::peek' => ['mixed'],
-'Ds\Queue::pop' => ['mixed'],
'Ds\Queue::push' => ['void', '...values='=>'mixed'],
-'Ds\Queue::toArray' => ['array'],
-'Ds\Sequence::allocate' => ['void', 'capacity'=>'int'],
-'Ds\Sequence::apply' => ['void', 'callback'=>'callable'],
-'Ds\Sequence::capacity' => ['int'],
-'Ds\Sequence::contains' => ['bool', '...values='=>'mixed'],
-'Ds\Sequence::filter' => ['Ds\Sequence', 'callback='=>'callable'],
-'Ds\Sequence::find' => ['mixed', 'value'=>'mixed'],
-'Ds\Sequence::first' => ['mixed'],
-'Ds\Sequence::get' => ['mixed', 'index'=>'int'],
-'Ds\Sequence::insert' => ['void', 'index'=>'int', '...values='=>'mixed'],
-'Ds\Sequence::join' => ['string', 'glue='=>'string'],
-'Ds\Sequence::last' => ['void'],
-'Ds\Sequence::map' => ['Ds\Sequence', 'callback'=>'callable'],
-'Ds\Sequence::merge' => ['Ds\Sequence', 'values'=>'mixed'],
-'Ds\Sequence::pop' => ['mixed'],
-'Ds\Sequence::push' => ['void', '...values='=>'mixed'],
-'Ds\Sequence::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'],
-'Ds\Sequence::remove' => ['mixed', 'index'=>'int'],
-'Ds\Sequence::reverse' => ['void'],
-'Ds\Sequence::reversed' => ['Ds\Sequence'],
-'Ds\Sequence::rotate' => ['void', 'rotations'=>'int'],
-'Ds\Sequence::set' => ['void', 'index'=>'int', 'value'=>'mixed'],
-'Ds\Sequence::shift' => ['mixed'],
-'Ds\Sequence::slice' => ['Ds\Sequence', 'index'=>'int', 'length='=>'?int'],
-'Ds\Sequence::sort' => ['void', 'comparator='=>'callable'],
-'Ds\Sequence::sorted' => ['Ds\Sequence', 'comparator='=>'callable'],
-'Ds\Sequence::sum' => ['int|float'],
-'Ds\Sequence::unshift' => ['void', '...values='=>'mixed'],
-'Ds\Set::__construct' => ['void', 'values='=>'mixed'],
'Ds\Set::add' => ['void', '...values='=>'mixed'],
'Ds\Set::allocate' => ['void', 'capacity'=>'int'],
-'Ds\Set::capacity' => ['int'],
'Ds\Set::clear' => ['void'],
-'Ds\Set::contains' => ['bool', '...values='=>'mixed'],
-'Ds\Set::copy' => ['Ds\Set'],
'Ds\Set::count' => ['0|positive-int'],
-'Ds\Set::diff' => ['Ds\Set', 'set'=>'Ds\Set'],
-'Ds\Set::filter' => ['Ds\Set', 'callback='=>'callable'],
-'Ds\Set::first' => ['mixed'],
-'Ds\Set::get' => ['mixed', 'index'=>'int'],
-'Ds\Set::intersect' => ['Ds\Set', 'set'=>'Ds\Set'],
-'Ds\Set::isEmpty' => ['bool'],
'Ds\Set::join' => ['string', 'glue='=>'string'],
'Ds\Set::jsonSerialize' => ['array'],
-'Ds\Set::last' => ['mixed'],
-'Ds\Set::merge' => ['Ds\Set', 'values'=>'mixed'],
-'Ds\Set::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'],
'Ds\Set::remove' => ['void', '...values='=>'mixed'],
'Ds\Set::reverse' => ['void'],
-'Ds\Set::reversed' => ['Ds\Set'],
-'Ds\Set::slice' => ['Ds\Set', 'index'=>'int', 'length='=>'?int'],
'Ds\Set::sort' => ['void', 'comparator='=>'callable'],
-'Ds\Set::sorted' => ['Ds\Set', 'comparator='=>'callable'],
-'Ds\Set::sum' => ['int|float'],
-'Ds\Set::toArray' => ['array'],
-'Ds\Set::union' => ['Ds\Set', 'set'=>'Ds\Set'],
-'Ds\Set::xor' => ['Ds\Set', 'set'=>'Ds\Set'],
-'Ds\Stack::__construct' => ['void', 'values='=>'mixed'],
'Ds\Stack::allocate' => ['void', 'capacity'=>'int'],
-'Ds\Stack::capacity' => ['int'],
-'Ds\Stack::clear' => ['void'],
-'Ds\Stack::copy' => ['Ds\Stack'],
'Ds\Stack::count' => ['0|positive-int'],
-'Ds\Stack::isEmpty' => ['bool'],
'Ds\Stack::jsonSerialize' => ['array'],
-'Ds\Stack::peek' => ['mixed'],
-'Ds\Stack::pop' => ['mixed'],
-'Ds\Stack::push' => ['void', '...values='=>'mixed'],
-'Ds\Stack::toArray' => ['array'],
'Ds\Vector::__construct' => ['void', 'values='=>'mixed'],
-'Ds\Vector::allocate' => ['void', 'capacity'=>'int'],
-'Ds\Vector::apply' => ['void', 'callback'=>'callable'],
-'Ds\Vector::capacity' => ['int'],
-'Ds\Vector::clear' => ['void'],
-'Ds\Vector::contains' => ['bool', '...values='=>'mixed'],
-'Ds\Vector::copy' => ['Ds\Vector'],
'Ds\Vector::count' => ['0|positive-int'],
-'Ds\Vector::filter' => ['Ds\Vector', 'callback='=>'callable'],
-'Ds\Vector::find' => ['mixed', 'value'=>'mixed'],
-'Ds\Vector::first' => ['mixed'],
-'Ds\Vector::get' => ['mixed', 'index'=>'int'],
-'Ds\Vector::insert' => ['void', 'index'=>'int', '...values='=>'mixed'],
-'Ds\Vector::isEmpty' => ['bool'],
'Ds\Vector::join' => ['string', 'glue='=>'string'],
'Ds\Vector::jsonSerialize' => ['array'],
-'Ds\Vector::last' => ['mixed'],
-'Ds\Vector::map' => ['Ds\Vector', 'callback'=>'callable'],
-'Ds\Vector::merge' => ['Ds\Vector', 'values'=>'mixed'],
-'Ds\Vector::pop' => ['mixed'],
-'Ds\Vector::push' => ['void', '...values='=>'mixed'],
-'Ds\Vector::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'],
-'Ds\Vector::remove' => ['mixed', 'index'=>'int'],
-'Ds\Vector::reverse' => ['void'],
-'Ds\Vector::reversed' => ['Ds\Vector'],
-'Ds\Vector::rotate' => ['void', 'rotations'=>'int'],
-'Ds\Vector::set' => ['void', 'index'=>'int', 'value'=>'mixed'],
-'Ds\Vector::shift' => ['mixed'],
-'Ds\Vector::slice' => ['Ds\Vector', 'index'=>'int', 'length='=>'?int'],
-'Ds\Vector::sort' => ['void', 'comparator='=>'callable'],
-'Ds\Vector::sorted' => ['Ds\Vector', 'comparator='=>'callable'],
'Ds\Vector::sum' => ['int|float'],
-'Ds\Vector::toArray' => ['array'],
'Ds\Vector::unshift' => ['void', '...values='=>'mixed'],
'each' => ['array', '&rw_arr'=>'array'],
'easter_date' => ['int', 'year='=>'int'],
'easter_days' => ['int', 'year='=>'int', 'method='=>'int'],
-'echo' => ['void', 'arg1'=>'string', '...args='=>'string'],
-'eio_busy' => ['resource', 'delay'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_busy' => ['resource|false', 'delay'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'eio_cancel' => ['void', 'req'=>'resource'],
-'eio_chmod' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_chown' => ['resource', 'path'=>'string', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_close' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_custom' => ['resource', 'execute'=>'callable', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
-'eio_dup2' => ['resource', 'fd'=>'mixed', 'fd2'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_chmod' => ['resource|false', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_chown' => ['resource|false', 'path'=>'string', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_close' => ['resource|false', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_custom' => ['resource|false', 'execute'=>'callable', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_dup2' => ['resource|false', 'fd'=>'mixed', 'fd2'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'eio_event_loop' => ['bool'],
-'eio_fallocate' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_fchmod' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_fchown' => ['resource', 'fd'=>'mixed', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_fdatasync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_fstat' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
-'eio_fstatvfs' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
-'eio_fsync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_ftruncate' => ['resource', 'fd'=>'mixed', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_futime' => ['resource', 'fd'=>'mixed', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_fallocate' => ['resource|false', 'fd'=>'mixed', 'mode'=>'int', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_fchmod' => ['resource|false', 'fd'=>'mixed', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_fchown' => ['resource|false', 'fd'=>'mixed', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_fdatasync' => ['resource|false', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_fstat' => ['resource|false', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_fstatvfs' => ['resource|false', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_fsync' => ['resource|false', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_ftruncate' => ['resource|false', 'fd'=>'mixed', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_futime' => ['resource|false', 'fd'=>'mixed', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'eio_get_event_stream' => ['mixed'],
'eio_get_last_error' => ['string', 'req'=>'resource'],
-'eio_grp' => ['resource', 'callback'=>'callable', 'data='=>'string'],
+'eio_grp' => ['resource|false', 'callback'=>'callable', 'data='=>'string'],
'eio_grp_add' => ['void', 'grp'=>'resource', 'req'=>'resource'],
'eio_grp_cancel' => ['void', 'grp'=>'resource'],
'eio_grp_limit' => ['void', 'grp'=>'resource', 'limit'=>'int'],
'eio_init' => ['void'],
-'eio_link' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_lstat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
-'eio_mkdir' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_mknod' => ['resource', 'path'=>'string', 'mode'=>'int', 'dev'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_nop' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_link' => ['resource|false', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_lstat' => ['resource|false', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_mkdir' => ['resource|false', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_mknod' => ['resource|false', 'path'=>'string', 'mode'=>'int', 'dev'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_nop' => ['resource|false', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'eio_npending' => ['int'],
'eio_nready' => ['int'],
'eio_nreqs' => ['int'],
'eio_nthreads' => ['int'],
-'eio_open' => ['resource', 'path'=>'string', 'flags'=>'int', 'mode'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_open' => ['resource|false', 'path'=>'string', 'flags'=>'int', 'mode'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
'eio_poll' => ['int'],
-'eio_read' => ['resource', 'fd'=>'mixed', 'length'=>'int', 'offset'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
-'eio_readahead' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_readdir' => ['resource', 'path'=>'string', 'flags'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'],
-'eio_readlink' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'],
-'eio_realpath' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'],
-'eio_rename' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_rmdir' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_seek' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'whence'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_sendfile' => ['resource', 'out_fd'=>'mixed', 'in_fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'string'],
+'eio_read' => ['resource|false', 'fd'=>'mixed', 'length'=>'int', 'offset'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_readahead' => ['resource|false', 'fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_readdir' => ['resource|false', 'path'=>'string', 'flags'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'],
+'eio_readlink' => ['resource|false', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'],
+'eio_realpath' => ['resource|false', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'],
+'eio_rename' => ['resource|false', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_rmdir' => ['resource|false', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_seek' => ['resource|false', 'fd'=>'mixed', 'offset'=>'int', 'whence'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_sendfile' => ['resource|false', 'out_fd'=>'mixed', 'in_fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'string'],
'eio_set_max_idle' => ['void', 'nthreads'=>'int'],
'eio_set_max_parallel' => ['void', 'nthreads'=>'int'],
'eio_set_max_poll_reqs' => ['void', 'nreqs'=>'int'],
'eio_set_max_poll_time' => ['void', 'nseconds'=>'float'],
'eio_set_min_parallel' => ['void', 'nthreads'=>'string'],
-'eio_stat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
-'eio_statvfs' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
-'eio_symlink' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_sync' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_sync_file_range' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'nbytes'=>'int', 'flags'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_syncfs' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_truncate' => ['resource', 'path'=>'string', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_unlink' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_utime' => ['resource', 'path'=>'string', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'eio_write' => ['resource', 'fd'=>'mixed', 'str'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'empty' => ['bool', 'var'=>'mixed'],
+'eio_stat' => ['resource|false', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_statvfs' => ['resource|false', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'],
+'eio_symlink' => ['resource|false', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_sync' => ['resource|false', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_sync_file_range' => ['resource|false', 'fd'=>'mixed', 'offset'=>'int', 'nbytes'=>'int', 'flags'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_syncfs' => ['resource|false', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_truncate' => ['resource|false', 'path'=>'string', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_unlink' => ['resource|false', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_utime' => ['resource|false', 'path'=>'string', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
+'eio_write' => ['resource|false', 'fd'=>'mixed', 'str'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'EmptyIterator::current' => ['mixed'],
'EmptyIterator::key' => ['mixed'],
'EmptyIterator::next' => ['void'],
@@ -2333,11 +1791,11 @@
'Error::getLine' => ['int'],
'Error::getMessage' => ['string'],
'Error::getPrevious' => ['Throwable|Error|null'],
-'Error::getTrace' => ['array'],
+'Error::getTrace' => ['list\',args?:list,object?:object}>'],
'Error::getTraceAsString' => ['string'],
'error_clear_last' => ['void'],
'error_get_last' => ['?array{type:int,message:string,file:string,line:int}'],
-'error_log' => ['bool', 'message'=>'string', 'message_type='=>'int', 'destination='=>'string', 'extra_headers='=>'string'],
+'error_log' => ['bool', 'message'=>'string', 'message_type='=>'0|1|2|3|4', 'destination='=>'string', 'extra_headers='=>'string'],
'error_reporting' => ['int', 'new_error_level='=>'int'],
'ErrorException::__clone' => ['void'],
'ErrorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'lineno='=>'int', 'previous='=>'(?Throwable)|(?ErrorException)'],
@@ -2348,7 +1806,7 @@
'ErrorException::getMessage' => ['string'],
'ErrorException::getPrevious' => ['Throwable|ErrorException|null'],
'ErrorException::getSeverity' => ['int'],
-'ErrorException::getTrace' => ['array'],
+'ErrorException::getTrace' => ['list\',args?:list,object?:object}>'],
'ErrorException::getTraceAsString' => ['string'],
'escapeshellarg' => ['string', 'arg'=>'string'],
'escapeshellcmd' => ['string', 'command'=>'string'],
@@ -2369,7 +1827,6 @@
'Ev::suspend' => ['void'],
'Ev::time' => ['float'],
'Ev::verify' => ['void'],
-'eval' => ['mixed', 'code_str'=>'string'],
'EvCheck::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'],
'EvCheck::createStopped' => ['object', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'],
'EvChild::__construct' => ['void', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'],
@@ -2628,21 +2085,20 @@
'Exception::getLine' => ['int'],
'Exception::getMessage' => ['string'],
'Exception::getPrevious' => ['(?Throwable)|(?Exception)'],
-'Exception::getTrace' => ['array'],
+'Exception::getTrace' => ['list\',args?:list,object?:object}>'],
'Exception::getTraceAsString' => ['string'],
-'exec' => ['string', 'command'=>'string', '&w_output='=>'array', '&w_return_value='=>'int'],
+'exec' => ['string|false', 'command'=>'string', '&w_output='=>'array', '&w_return_value='=>'int'],
'exif_imagetype' => ['int|false', 'imagefile'=>'string'],
'exif_read_data' => ['array|false', 'filename'=>'string|resource', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'],
'exif_tagname' => ['string|false', 'index'=>'int'],
'exif_thumbnail' => ['string|false', 'filename'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_imagetype='=>'int'],
-'exit' => ['', 'status'=>'string|int'],
'exp' => ['float', 'number'=>'float'],
'expect_expectl' => ['int', 'expect'=>'resource', 'cases'=>'array', 'match='=>'array'],
'expect_popen' => ['resource|false', 'command'=>'string'],
-'explode' => ['non-empty-array|false', 'separator'=>'string', 'str'=>'string', 'limit='=>'int'],
+'explode' => ['list|false', 'separator'=>'string', 'str'=>'string', 'limit='=>'int'],
'expm1' => ['float', 'number'=>'float'],
'extension_loaded' => ['bool', 'extension_name'=>'string'],
-'extract' => ['int', '&rw_var_array'=>'array', 'extract_type='=>'int', 'prefix='=>'string|null'],
+'extract' => ['0|positive-int', 'array'=>'array', 'flags='=>'EXTR_OVERWRITE|EXTR_SKIP|EXTR_PREFIX_SAME|EXTR_PREFIX_ALL|EXTR_PREFIX_INVALID|EXTR_IF_EXISTS|EXTR_PREFIX_IF_EXISTS|EXTR_REFS', 'prefix='=>'string|null'],
'ezmlm_hash' => ['int', 'addr'=>'string'],
'fam_cancel_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'],
'fam_close' => ['void', 'fam'=>'resource'],
@@ -2937,13 +2393,13 @@
'ffmpeg_movie::hasAudio' => ['bool'],
'ffmpeg_movie::hasVideo' => ['bool'],
'fgetc' => ['string|false', 'fp'=>'resource'],
-'fgetcsv' => ['(?array)|(?false)', 'fp'=>'resource', 'length='=>'int', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'],
-'fgets' => ['string|false', 'fp'=>'resource', 'length='=>'int'],
-'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'int', 'allowable_tags='=>'string'],
-'file' => ['array|false', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'],
+'fgetcsv' => ['non-empty-list|array{0: null}|false|null', 'fp'=>'resource', 'length='=>'0|positive-int|null', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'],
+'fgets' => ['string|false', 'fp'=>'resource', 'length='=>'0|positive-int'],
+'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'0|positive-int', 'allowable_tags='=>'string'],
+'file' => ['list|false', 'filename'=>'string', 'flags='=>'int-mask', 'context='=>'resource'],
'file_exists' => ['bool', 'filename'=>'string'],
-'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'maxlen='=>'int'],
-'file_put_contents' => ['int|false', 'file'=>'string', 'data'=>'mixed', 'flags='=>'int', 'context='=>'?resource'],
+'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'maxlen='=>'0|positive-int'],
+'file_put_contents' => ['0|positive-int|false', 'file'=>'string', 'data'=>'mixed', 'flags='=>'int', 'context='=>'?resource'],
'fileatime' => ['int|false', 'filename'=>'string'],
'filectime' => ['int|false', 'filename'=>'string'],
'filegroup' => ['int|false', 'filename'=>'string'],
@@ -2958,7 +2414,7 @@
'filepro_fieldwidth' => ['int', 'field_number'=>'int'],
'filepro_retrieve' => ['string', 'row_number'=>'int', 'field_number'=>'int'],
'filepro_rowcount' => ['int'],
-'filesize' => ['int|false', 'filename'=>'string'],
+'filesize' => ['0|positive-int|false', 'filename'=>'string'],
'FilesystemIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'],
'FilesystemIterator::current' => ['string|SplFileInfo'],
'FilesystemIterator::getFlags' => ['int'],
@@ -2971,10 +2427,10 @@
'filter_id' => ['int|false', 'filtername'=>'string'],
'filter_input' => ['mixed', 'type'=>'int', 'variable_name'=>'string', 'filter='=>'int', 'options='=>'array|int'],
'filter_input_array' => ['array|false|null', 'type'=>'int', 'definition='=>'int|array', 'add_empty='=>'bool'],
-'filter_list' => ['array'],
+'filter_list' => ['non-empty-list'],
'filter_var' => ['mixed', 'variable'=>'mixed', 'filter='=>'int', 'options='=>'mixed'],
'filter_var_array' => ['array|false|null', 'data'=>'array', 'definition='=>'mixed', 'add_empty='=>'bool'],
-'FilterIterator::__construct' => ['void', 'iterator'=>'iterator'],
+'FilterIterator::__construct' => ['void', 'iterator'=>'Iterator'],
'FilterIterator::accept' => ['bool'],
'FilterIterator::current' => ['mixed'],
'FilterIterator::getInnerIterator' => ['Iterator'],
@@ -2992,31 +2448,31 @@
'finfo_file' => ['string|false', 'finfo'=>'resource', 'file_name'=>'string', 'options='=>'int', 'context='=>'resource'],
'finfo_open' => ['resource|false', 'options='=>'int', 'arg='=>'string'],
'finfo_set_flags' => ['bool', 'finfo'=>'resource', 'options'=>'int'],
-'floatval' => ['float', 'var'=>'mixed'],
-'flock' => ['bool', 'fp'=>'resource', 'operation'=>'int', '&w_wouldblock='=>'int'],
-'floor' => ['float', 'number'=>'float'],
+'floatval' => ['float', 'var'=>'scalar|array|resource|null'],
+'flock' => ['bool', 'fp'=>'resource', 'operation'=>'int-mask', '&w_wouldblock='=>'0|1'],
+'floor' => ['__benevolent', 'number'=>'float'],
'flush' => ['void'],
'fmod' => ['float', 'x'=>'float', 'y'=>'float'],
'fnmatch' => ['bool', 'pattern'=>'string', 'filename'=>'string', 'flags='=>'int'],
-'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'],
+'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource|null'],
'forward_static_call' => ['mixed', 'function'=>'callable', '...parameters='=>'mixed'],
'forward_static_call_array' => ['mixed', 'function'=>'callable', 'parameters'=>'array'],
-'fpassthru' => ['int|false', 'fp'=>'resource'],
-'fpm_get_status' => ['array|false'],
-'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'string|int|float'],
-'fputcsv' => ['int|false', 'fp'=>'resource', 'fields'=>'array', 'delimiter='=>'string', 'enclosure='=>'string', 'escape_char='=>'string'],
-'fputs' => ['int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'int'],
-'fread' => ['string|false', 'fp'=>'resource', 'length'=>'int'],
+'fpassthru' => ['0|positive-int|false', 'fp'=>'resource'],
+'fpm_get_status' => ['array{pool: string, process-manager: \'dynamic\'|\'ondemand\'|\'static\', start-time: int<0, max>, start-since: int<0, max>, accepted-conn: int<0, max>, listen-queue: int<0, max>, max-listen-queue: int<0, max>, listen-queue-len: int<0, max>, idle-processes: int<0, max>, active-processes: int<1, max>, total-processes: int<1, max>, max-active-processes: int<1, max>, max-children-reached: 0|1, slow-requests: int<0, max>, procs: array, state: \'Idle\'|\'Running\', start-time: int<0, max>, start-since: int<0, max>, requests: int<0, max>, request-duration: int<0, max>, request-method: string, request-uri: string, query-string: string, request-length: int<0, max>, user: string, script: string, last-request-cpu: float, last-request-memory: int<0, max>}>}|false'],
+'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'__stringAndStringable|int|float|null|bool'],
+'fputcsv' => ['0|positive-int|false', 'fp'=>'resource', 'fields'=>'array', 'delimiter='=>'string', 'enclosure='=>'string', 'escape_char='=>'string'],
+'fputs' => ['0|positive-int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'0|positive-int'],
+'fread' => ['string', 'fp'=>'resource', 'length'=>'positive-int'],
'frenchtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'],
'fribidi_log2vis' => ['string', 'str'=>'string', 'direction'=>'string', 'charset'=>'int'],
-'fscanf' => ['array|int|false', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float|null'],
-'fseek' => ['int', 'fp'=>'resource', 'offset'=>'int', 'whence='=>'int'],
+'fscanf' => ['list|int|false', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float|null'],
+'fseek' => ['0|-1', 'fp'=>'resource', 'offset'=>'int', 'whence='=>'int'],
'fsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_errno='=>'int', '&w_errstr='=>'string', 'timeout='=>'float'],
'fstat' => ['array|false', 'fp'=>'resource'],
'ftell' => ['int|false', 'fp'=>'resource'],
'ftok' => ['int', 'pathname'=>'string', 'proj'=>'string'],
'ftp_alloc' => ['bool', 'stream'=>'resource', 'size'=>'int', '&w_response='=>'string'],
-'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'int'],
+'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY'],
'ftp_cdup' => ['bool', 'stream'=>'resource'],
'ftp_chdir' => ['bool', 'stream'=>'resource', 'directory'=>'string'],
'ftp_chmod' => ['int|false', 'stream'=>'resource', 'mode'=>'int', 'filename'=>'string'],
@@ -3024,22 +2480,22 @@
'ftp_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'],
'ftp_delete' => ['bool', 'stream'=>'resource', 'file'=>'string'],
'ftp_exec' => ['bool', 'stream'=>'resource', 'command'=>'string'],
-'ftp_fget' => ['bool', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'int', 'resumepos='=>'int'],
-'ftp_fput' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'int', 'startpos='=>'int'],
-'ftp_get' => ['bool', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'int', 'resume_pos='=>'int'],
+'ftp_fget' => ['bool', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resumepos='=>'int'],
+'ftp_fput' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
+'ftp_get' => ['bool', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resume_pos='=>'int'],
'ftp_get_option' => ['mixed', 'stream'=>'resource', 'option'=>'int'],
'ftp_login' => ['bool', 'stream'=>'resource', 'username'=>'string', 'password'=>'string'],
'ftp_mdtm' => ['int', 'stream'=>'resource', 'filename'=>'string'],
'ftp_mkdir' => ['string|false', 'stream'=>'resource', 'directory'=>'string'],
'ftp_mlsd' => ['array|false', 'ftp_stream'=>'resource', 'directory'=>'string'],
'ftp_nb_continue' => ['int', 'stream'=>'resource'],
-'ftp_nb_fget' => ['int', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode'=>'int', 'resumepos='=>'int'],
-'ftp_nb_fput' => ['int', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode'=>'int', 'startpos='=>'int'],
-'ftp_nb_get' => ['int', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode'=>'int', 'resume_pos='=>'int'],
-'ftp_nb_put' => ['int|false', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode'=>'int', 'startpos='=>'int'],
+'ftp_nb_fget' => ['int', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resumepos='=>'int'],
+'ftp_nb_fput' => ['int', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
+'ftp_nb_get' => ['int|false', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resume_pos='=>'int'],
+'ftp_nb_put' => ['int|false', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
'ftp_nlist' => ['array|false', 'stream'=>'resource', 'directory'=>'string'],
'ftp_pasv' => ['bool', 'stream'=>'resource', 'pasv'=>'bool'],
-'ftp_put' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode'=>'int', 'startpos='=>'int'],
+'ftp_put' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
'ftp_pwd' => ['string|false', 'stream'=>'resource'],
'ftp_raw' => ['array', 'stream'=>'resource', 'command'=>'string'],
'ftp_rawlist' => ['array|false', 'stream'=>'resource', 'directory'=>'string', 'recursive='=>'bool'],
@@ -3050,12 +2506,12 @@
'ftp_size' => ['int', 'stream'=>'resource', 'filename'=>'string'],
'ftp_ssl_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'],
'ftp_systype' => ['string|false', 'stream'=>'resource'],
-'ftruncate' => ['bool', 'fp'=>'resource', 'size'=>'int'],
-'func_get_arg' => ['mixed', 'arg_num'=>'int'],
-'func_get_args' => ['array'],
-'func_num_args' => ['int'],
+'ftruncate' => ['bool', 'fp'=>'resource', 'size'=>'0|positive-int'],
+'func_get_arg' => ['mixed', 'arg_num'=>'0|positive-int'],
+'func_get_args' => ['list'],
+'func_num_args' => ['0|positive-int'],
'function_exists' => ['bool', 'function_name'=>'string'],
-'fwrite' => ['int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'int'],
+'fwrite' => ['0|positive-int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'0|positive-int'],
'gc_collect_cycles' => ['int'],
'gc_disable' => ['void'],
'gc_enable' => ['void'],
@@ -3302,47 +2758,47 @@
'get_called_class' => ['class-string'],
'get_cfg_var' => ['mixed', 'option_name'=>'string'],
'get_class' => ['class-string', 'object='=>'object'],
-'get_class_methods' => ['array', 'class'=>'mixed'],
+'get_class_methods' => ['list', 'class'=>'mixed'],
'get_class_vars' => ['array', 'class_name'=>'string'],
'get_current_user' => ['string'],
-'get_declared_classes' => ['array'],
-'get_declared_interfaces' => ['array'],
-'get_declared_traits' => ['array'],
-'get_defined_constants' => ['array', 'categorize='=>'bool'],
-'get_defined_functions' => ['array>', 'exclude_disabled='=>'bool'],
-'get_defined_vars' => ['array'],
-'get_extension_funcs' => ['array|false', 'extension_name'=>'string'],
+'get_declared_classes' => ['list'],
+'get_declared_interfaces' => ['list'],
+'get_declared_traits' => ['list'],
+'get_defined_constants' => ['array', 'categorize='=>'bool'],
+'get_defined_functions' => ['array{internal:non-empty-list,user:list}', 'exclude_disabled='=>'bool'],
+'get_defined_vars' => ['array'],
+'get_extension_funcs' => ['list|false', 'extension_name'=>'string'],
'get_headers' => ['array|false', 'url'=>'string', 'format='=>'int', 'context='=>'resource'],
'get_html_translation_table' => ['array', 'table='=>'int', 'flags='=>'int', 'encoding='=>'string'],
-'get_include_path' => ['string|false'],
-'get_included_files' => ['array'],
-'get_loaded_extensions' => ['array', 'zend_extensions='=>'bool'],
-'get_magic_quotes_gpc' => ['bool'],
-'get_magic_quotes_runtime' => ['bool'],
+'get_include_path' => ['__benevolent'],
+'get_included_files' => ['list'],
+'get_loaded_extensions' => ['list', 'zend_extensions='=>'bool'],
+'get_magic_quotes_gpc' => ['false'],
+'get_magic_quotes_runtime' => ['false'],
'get_meta_tags' => ['array|false', 'filename'=>'string', 'use_include_path='=>'bool'],
'get_object_vars' => ['array', 'obj'=>'object'],
'get_parent_class' => ['class-string|false', 'object='=>'mixed'],
-'get_required_files' => ['string[]'],
+'get_required_files' => ['list'],
'get_resource_type' => ['string', 'res'=>'resource'],
-'get_resources' => ['resource[]', 'resource_type'=>'string'],
+'get_resources' => ['array', 'type='=>'string'],
'getallheaders' => ['array'],
-'getcwd' => ['string|false'],
-'getdate' => ['array', 'timestamp='=>'int'],
+'getcwd' => ['non-empty-string|false'],
+'getdate' => ['array{seconds: int<0, 59>, minutes: int<0, 59>, hours: int<0, 23>, mday: int<1, 31>, wday: int<0, 6>, mon: int<1, 12>, year: int, yday: int<0, 365>, weekday: "Monday"|"Tuesday"|"Wednesday"|"Thursday"|"Friday"|"Saturday"|"Sunday", month: "January"|"February"|"March"|"April"|"May"|"June"|"July"|"August"|"September"|"October"|"November"|"December", 0: int}', 'timestamp='=>'int'],
'getenv' => ['string|false', 'varname'=>'string', 'local_only='=>'bool'],
-'getenv\'1' => ['string[]'],
+'getenv\'1' => ['array'],
'gethostbyaddr' => ['string|false', 'ip_address'=>'string'],
'gethostbyname' => ['string', 'hostname'=>'string'],
-'gethostbynamel' => ['array|false', 'hostname'=>'string'],
+'gethostbynamel' => ['list|false', 'hostname'=>'string'],
'gethostname' => ['string|false'],
-'getimagesize' => ['array|false', 'imagefile'=>'string', '&w_info='=>'array'],
-'getimagesizefromstring' => ['array|false', 'data'=>'string', '&w_info='=>'array'],
+'getimagesize' => ['array{0: 0|positive-int, 1: 0|positive-int, 2: int, 3: string, mime: string, channels?: int, bits?: int}|false', 'imagefile'=>'string', '&w_info='=>'array'],
+'getimagesizefromstring' => ['array{0: 0|positive-int, 1: 0|positive-int, 2: int, 3: string, mime: string, channels?: int, bits?: int}|false', 'data'=>'string', '&w_info='=>'array'],
'getlastmod' => ['int|false'],
'getmxrr' => ['bool', 'hostname'=>'string', '&w_mxhosts'=>'array', '&w_weight='=>'array'],
'getmygid' => ['int|false'],
'getmyinode' => ['int|false'],
'getmypid' => ['int|false'],
'getmyuid' => ['int|false'],
-'getopt' => ['array|array|array>|false', 'options'=>'string', 'longopts='=>'array', '&w_optind='=>'int'],
+'getopt' => ['__benevolent|array|array>|false>', 'options'=>'string', 'longopts='=>'array', '&w_optind='=>'int'],
'getprotobyname' => ['int|false', 'name'=>'string'],
'getprotobynumber' => ['string|false', 'proto'=>'int'],
'getrandmax' => ['int'],
@@ -3352,7 +2808,7 @@
'gettext' => ['string', 'msgid'=>'string'],
'gettimeofday' => ['array|float', 'get_as_float='=>'bool'],
'gettype' => ['string', 'var'=>'mixed'],
-'glob' => ['array|false', 'pattern'=>'string', 'flags='=>'int'],
+'glob' => ['list|false', 'pattern'=>'string', 'flags='=>'int'],
'GlobIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'],
'GlobIterator::cont' => ['int'],
'GlobIterator::count' => ['0|positive-int'],
@@ -3550,7 +3006,7 @@
'gmp_clrbit' => ['void', 'a'=>'GMP|string|int', 'index'=>'int'],
'gmp_cmp' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
'gmp_com' => ['GMP', 'a'=>'GMP|string|int'],
-'gmp_div' => ['GMP', 'a'=>'GMP|resource|string', 'b'=>'GMP|resource|string', 'round='=>'int'],
+'gmp_div' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
'gmp_div_q' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
'gmp_div_qr' => ['array', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
'gmp_div_r' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
@@ -3602,47 +3058,55 @@
'gnupg::cleardecryptkeys' => ['bool'],
'gnupg::clearencryptkeys' => ['bool'],
'gnupg::clearsignkeys' => ['bool'],
-'gnupg::decrypt' => ['string', 'text'=>'string'],
-'gnupg::decryptverify' => ['array', 'text'=>'string', '&plaintext'=>'string'],
-'gnupg::encrypt' => ['string', 'plaintext'=>'string'],
-'gnupg::encryptsign' => ['string', 'plaintext'=>'string'],
-'gnupg::export' => ['string', 'fingerprint'=>'string'],
-'gnupg::geterror' => ['string'],
+'gnupg::decrypt' => ['string|false', 'text'=>'string'],
+'gnupg::deletekey' => ['bool', 'key'=>'string', 'allow_secret'=>'bool'],
+'gnupg::decryptverify' => ['array|false', 'text'=>'string', '&plaintext'=>'string'],
+'gnupg::encrypt' => ['string|false', 'plaintext'=>'string'],
+'gnupg::encryptsign' => ['string|false', 'plaintext'=>'string'],
+'gnupg::export' => ['string|false', 'fingerprint'=>'string'],
+'gnupg::getengineinfo' => ['array'],
+'gnupg::geterror' => ['string|false'],
'gnupg::getprotocol' => ['int'],
-'gnupg::import' => ['array', 'keydata'=>'string'],
-'gnupg::init' => ['resource'],
-'gnupg::keyinfo' => ['array', 'pattern'=>'string'],
+'gnupg::gettrustlist' => ['array', 'pattern'=>'string'],
+'gnupg::import' => ['array|false', 'keydata'=>'string'],
+'gnupg::init' => ['resource', 'options'=>'?array{file_name?:string,home_dir?:string}'],
+'gnupg::keyinfo' => ['array|false', 'pattern'=>'string'],
+'gnupg::listsignatures' => ['?array', 'keyid'=>'string'],
'gnupg::setarmor' => ['bool', 'armor'=>'int'],
'gnupg::seterrormode' => ['void', 'errormode'=>'int'],
'gnupg::setsignmode' => ['bool', 'signmode'=>'int'],
-'gnupg::sign' => ['string', 'plaintext'=>'string'],
-'gnupg::verify' => ['array', 'signed_text'=>'string', 'signature'=>'string', '&plaintext='=>'string'],
+'gnupg::sign' => ['string|false', 'plaintext'=>'string'],
+'gnupg::verify' => ['array|false', 'signed_text'=>'string', 'signature'=>'string|false', '&plaintext='=>'string'],
'gnupg_adddecryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase'=>'string'],
'gnupg_addencryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string'],
'gnupg_addsignkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase='=>'string'],
'gnupg_cleardecryptkeys' => ['bool', 'identifier'=>'resource'],
'gnupg_clearencryptkeys' => ['bool', 'identifier'=>'resource'],
'gnupg_clearsignkeys' => ['bool', 'identifier'=>'resource'],
-'gnupg_decrypt' => ['string', 'identifier'=>'resource', 'text'=>'string'],
+'gnupg_decrypt' => ['string|false', 'identifier'=>'resource', 'text'=>'string'],
'gnupg_decryptverify' => ['array', 'identifier'=>'resource', 'text'=>'string', 'plaintext'=>'string'],
-'gnupg_encrypt' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'],
-'gnupg_encryptsign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'],
-'gnupg_export' => ['string', 'identifier'=>'resource', 'fingerprint'=>'string'],
-'gnupg_geterror' => ['string', 'identifier'=>'resource'],
+'gnupg_deletekey' => ['bool', 'identifier'=>'resource', 'key'=>'string', 'allow_secret'=>'bool'],
+'gnupg_encrypt' => ['string|false', 'identifier'=>'resource', 'plaintext'=>'string'],
+'gnupg_encryptsign' => ['string|false', 'identifier'=>'resource', 'plaintext'=>'string'],
+'gnupg_export' => ['string|false', 'identifier'=>'resource', 'fingerprint'=>'string'],
+'gnupg_getengineinfo' => ['array', 'identifier'=>'resource'],
+'gnupg_geterror' => ['string|false', 'identifier'=>'resource'],
'gnupg_getprotocol' => ['int', 'identifier'=>'resource'],
-'gnupg_import' => ['array', 'identifier'=>'resource', 'keydata'=>'string'],
-'gnupg_init' => ['resource'],
-'gnupg_keyinfo' => ['array', 'identifier'=>'resource', 'pattern'=>'string'],
+'gnupg_gettrustlist' => ['array', 'identifier'=>'resource', 'pattern'=>'string'],
+'gnupg_import' => ['array|false', 'identifier'=>'resource', 'keydata'=>'string'],
+'gnupg_init' => ['resource', 'options='=>'?array{file_name?:string,home_dir?:string}'],
+'gnupg_keyinfo' => ['array|false', 'identifier'=>'resource', 'pattern'=>'string'],
+'gnupg_listsignatures' => ['?array', 'identifier'=>'resource', 'keyid'=>'string'],
'gnupg_setarmor' => ['bool', 'identifier'=>'resource', 'armor'=>'int'],
'gnupg_seterrormode' => ['void', 'identifier'=>'resource', 'errormode'=>'int'],
'gnupg_setsignmode' => ['bool', 'identifier'=>'resource', 'signmode'=>'int'],
-'gnupg_sign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'],
-'gnupg_verify' => ['array', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string', 'plaintext='=>'string'],
+'gnupg_sign' => ['string|false', 'identifier'=>'resource', 'plaintext'=>'string'],
+'gnupg_verify' => ['array|false', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string|false', '&plaintext='=>'string'],
'gopher_parsedir' => ['array', 'dirent'=>'string'],
'grapheme_extract' => ['string|false', 'str'=>'string', 'size'=>'int', 'extract_type='=>'int', 'start='=>'int', '&w_next='=>'int'],
'grapheme_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
'grapheme_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool'],
-'grapheme_strlen' => ['int|false', 'str'=>'string'],
+'grapheme_strlen' => ['0|positive-int|false', 'str'=>'string'],
'grapheme_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
'grapheme_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
'grapheme_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
@@ -3728,7 +3192,7 @@
'gzdeflate' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'],
'gzencode' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding_mode='=>'int'],
'gzeof' => ['bool', 'zp'=>'resource'],
-'gzfile' => ['array|false', 'filename'=>'string', 'use_include_path='=>'int'],
+'gzfile' => ['list|false', 'filename'=>'string', 'use_include_path='=>'int'],
'gzgetc' => ['string|false', 'zp'=>'resource'],
'gzgets' => ['string|false', 'zp'=>'resource', 'length='=>'int'],
'gzgetss' => ['string|false', 'zp'=>'resource', 'length'=>'int', 'allowable_tags='=>'string'],
@@ -3906,18 +3370,18 @@
'HaruPage::stroke' => ['bool', 'close_path='=>'bool'],
'HaruPage::textOut' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'],
'HaruPage::textRect' => ['bool', 'left'=>'float', 'top'=>'float', 'right'=>'float', 'bottom'=>'float', 'text'=>'string', 'align='=>'int'],
-'hash' => ['string|false', 'algo'=>'string', 'data'=>'string', 'raw_output='=>'bool'],
-'hash_algos' => ['array'],
+'hash' => ['non-falsy-string|false', 'algo'=>'string', 'data'=>'string', 'raw_output='=>'bool'],
+'hash_algos' => ['non-empty-list'],
'hash_copy' => ['HashContext', 'context'=>'HashContext'],
'hash_equals' => ['bool', 'known_string'=>'string', 'user_string'=>'string'],
-'hash_file' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'raw_output='=>'bool'],
-'hash_final' => ['string', 'context'=>'HashContext', 'raw_output='=>'bool'],
-'hash_hkdf' => ['string', 'algo'=>'string', 'ikm'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'],
-'hash_hmac' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
-'hash_hmac_algos' => ['array'],
-'hash_hmac_file' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
+'hash_file' => ['non-falsy-string|false', 'algo'=>'string', 'filename'=>'string', 'raw_output='=>'bool'],
+'hash_final' => ['non-falsy-string', 'context'=>'HashContext', 'raw_output='=>'bool'],
+'hash_hkdf' => ['non-falsy-string|false', 'algo'=>'string', 'key'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'],
+'hash_hmac' => ['non-falsy-string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
+'hash_hmac_algos' => ['non-empty-list'],
+'hash_hmac_file' => ['non-falsy-string|false', 'algo'=>'string', 'filename'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
'hash_init' => ['HashContext', 'algo'=>'string', 'options='=>'int', 'key='=>'string'],
-'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'raw_output='=>'bool'],
+'hash_pbkdf2' => ['(non-falsy-string&lowercase-string)|false', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'raw_output='=>'bool'],
'hash_update' => ['bool', 'context'=>'HashContext', 'data'=>'string'],
'hash_update_file' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'scontext='=>'?HashContext'],
'hash_update_stream' => ['int', 'context'=>'HashContext', 'handle'=>'resource', 'length='=>'int'],
@@ -3929,7 +3393,7 @@
'header' => ['void', 'header'=>'string', 'replace='=>'bool', 'http_response_code='=>'int'],
'header_register_callback' => ['bool', 'callback'=>'callable'],
'header_remove' => ['void', 'name='=>'string'],
-'headers_list' => ['array'],
+'headers_list' => ['list'],
'headers_sent' => ['bool', '&w_file='=>'string', '&w_line='=>'int'],
'hebrev' => ['string', 'str'=>'string', 'max_chars_per_line='=>'int'],
'hebrevc' => ['string', 'str'=>'string', 'max_chars_per_line='=>'int'],
@@ -3954,8 +3418,8 @@
'HRTime\StopWatch::start' => ['void'],
'HRTime\StopWatch::stop' => ['void'],
'html_entity_decode' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string'],
-'htmlentities' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'],
-'htmlspecialchars' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'],
+'htmlentities' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'],
+'htmlspecialchars' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'],
'htmlspecialchars_decode' => ['string', 'string'=>'string', 'quote_style='=>'int'],
'http\Env\Request::__construct' => ['void'],
'http\Env\Request::getCookie' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'],
@@ -4452,7 +3916,7 @@
'iconv_mime_decode_headers' => ['array|false', 'headers'=>'string', 'mode='=>'int', 'charset='=>'string'],
'iconv_mime_encode' => ['string|false', 'field_name'=>'string', 'field_value'=>'string', 'preference='=>'array'],
'iconv_set_encoding' => ['bool', 'type'=>'string', 'charset'=>'string'],
-'iconv_strlen' => ['int|false', 'str'=>'string', 'charset='=>'string'],
+'iconv_strlen' => ['0|positive-int|false', 'str'=>'string', 'charset='=>'string'],
'iconv_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'charset='=>'string'],
'iconv_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'charset='=>'string'],
'iconv_substr' => ['string|false', 'str'=>'string', 'offset'=>'int', 'length='=>'int', 'charset='=>'string'],
@@ -4507,9 +3971,9 @@
'ifxus_seek_slob' => ['int', 'bid'=>'int', 'mode'=>'int', 'offset'=>'int'],
'ifxus_tell_slob' => ['int', 'bid'=>'int'],
'ifxus_write_slob' => ['int', 'bid'=>'int', 'content'=>'string'],
-'igbinary_serialize' => ['string', 'value'=>''],
-'igbinary_unserialize' => ['', 'str'=>'string'],
-'ignore_user_abort' => ['int', 'value='=>'bool'],
+'igbinary_serialize' => ['string|null', 'value'=>'mixed'],
+'igbinary_unserialize' => ['mixed', 'str'=>'string'],
+'ignore_user_abort' => ['0|1', 'value='=>'bool'],
'iis_add_server' => ['int', 'path'=>'string', 'comment'=>'string', 'server_ip'=>'string', 'port'=>'int', 'host_name'=>'string', 'rights'=>'int', 'start_server'=>'int'],
'iis_get_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'],
'iis_get_script_map' => ['string', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string'],
@@ -4539,21 +4003,21 @@
'imagebmp' => ['bool', 'image'=>'resource', 'to='=>'string|resource|null', 'compressed='=>'bool'],
'imagechar' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'c'=>'string', 'col'=>'int'],
'imagecharup' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'c'=>'string', 'col'=>'int'],
-'imagecolorallocate' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorallocatealpha' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
-'imagecolorat' => ['int|false', 'im'=>'resource', 'x'=>'int', 'y'=>'int'],
-'imagecolorclosest' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorclosestalpha' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
-'imagecolorclosesthwb' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
+'imagecolorallocate' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorallocatealpha' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
+'imagecolorat' => ['int<0, max>|false', 'im'=>'resource', 'x'=>'int', 'y'=>'int'],
+'imagecolorclosest' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorclosestalpha' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
+'imagecolorclosesthwb' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
'imagecolordeallocate' => ['bool', 'im'=>'resource', 'index'=>'int'],
-'imagecolorexact' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorexactalpha' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
+'imagecolorexact' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorexactalpha' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
'imagecolormatch' => ['bool', 'im1'=>'resource', 'im2'=>'resource'],
-'imagecolorresolve' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorresolvealpha' => ['int|false', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
-'imagecolorset' => ['void', 'im'=>'resource', 'col'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'],
-'imagecolorsforindex' => ['array|false', 'im'=>'resource', 'col'=>'int'],
-'imagecolorstotal' => ['int', 'im'=>'resource'],
+'imagecolorresolve' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorresolvealpha' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
+'imagecolorset' => ['void', 'im'=>'resource', 'col'=>'int', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha='=>'int<0, 127>'],
+'imagecolorsforindex' => ['array{red: int<0, 255>, green: int<0, 255>, blue: int<0, 255>, alpha: int<0, 127>}', 'im'=>'resource', 'col'=>'int'],
+'imagecolorstotal' => ['int<0, 256>', 'im'=>'resource'],
'imagecolortransparent' => ['int', 'im'=>'resource', 'col='=>'int'],
'imageconvolution' => ['bool', 'src_im'=>'resource', 'matrix3x3'=>'array', 'div'=>'float', 'offset'=>'float'],
'imagecopy' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_w'=>'int', 'src_h'=>'int'],
@@ -4561,7 +4025,7 @@
'imagecopymergegray' => ['bool', 'src_im'=>'resource', 'dst_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_w'=>'int', 'src_h'=>'int', 'pct'=>'int'],
'imagecopyresampled' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_w'=>'int', 'dst_h'=>'int', 'src_w'=>'int', 'src_h'=>'int'],
'imagecopyresized' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_w'=>'int', 'dst_h'=>'int', 'src_w'=>'int', 'src_h'=>'int'],
-'imagecreate' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'],
+'imagecreate' => ['__benevolent', 'x_size'=>'int<1, max>', 'y_size'=>'int<1, max>'],
'imagecreatefrombmp' => ['resource|false', 'filename'=>'string'],
'imagecreatefromgd' => ['resource|false', 'filename'=>'string'],
'imagecreatefromgd2' => ['resource|false', 'filename'=>'string'],
@@ -4574,7 +4038,7 @@
'imagecreatefromwebp' => ['resource|false', 'filename'=>'string'],
'imagecreatefromxbm' => ['resource|false', 'filename'=>'string'],
'imagecreatefromxpm' => ['resource|false', 'filename'=>'string'],
-'imagecreatetruecolor' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'],
+'imagecreatetruecolor' => ['__benevolent', 'x_size'=>'int<1, max>', 'y_size'=>'int<1, max>'],
'imagecrop' => ['resource|false', 'im'=>'resource', 'rect'=>'array'],
'imagecropauto' => ['resource|false', 'im'=>'resource', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'],
'imagedashedline' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'],
@@ -4634,8 +4098,8 @@
'imagesettile' => ['bool', 'image'=>'resource', 'tile'=>'resource'],
'imagestring' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'str'=>'string', 'col'=>'int'],
'imagestringup' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'str'=>'string', 'col'=>'int'],
-'imagesx' => ['int', 'im'=>'resource'],
-'imagesy' => ['int', 'im'=>'resource'],
+'imagesx' => ['int<1, max>', 'im'=>'resource'],
+'imagesy' => ['int<1, max>', 'im'=>'resource'],
'imagetruecolortopalette' => ['bool', 'im'=>'resource', 'ditherflag'=>'bool', 'colorswanted'=>'int'],
'imagettfbbox' => ['array|false', 'size'=>'float', 'angle'=>'float', 'font_file'=>'string', 'text'=>'string'],
'imagettftext' => ['array|false', 'im'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'col'=>'int', 'font_file'=>'string', 'text'=>'string'],
@@ -4645,25 +4109,25 @@
'imagexbm' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null', 'foreground='=>'int'],
'Imagick::__construct' => ['void', 'files='=>''],
'Imagick::__toString' => ['string'],
-'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::adaptiveResizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool'],
-'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::adaptiveThresholdImage' => ['bool', 'width'=>'int', 'height'=>'int', 'offset'=>'int'],
'Imagick::addImage' => ['bool', 'source'=>'imagick'],
-'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'int', 'channel='=>'int'],
+'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'Imagick::NOISE_*', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::affineTransformImage' => ['bool', 'matrix'=>'imagickdraw'],
'Imagick::animateImages' => ['bool', 'x_server'=>'string'],
'Imagick::annotateImage' => ['bool', 'draw_settings'=>'imagickdraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'],
'Imagick::appendImages' => ['Imagick', 'stack'=>'bool'],
-'Imagick::autoGammaImage' => ['bool', 'channel='=>'int'],
-'Imagick::autoLevelImage' => ['bool', 'CHANNEL='=>'string'],
+'Imagick::autoGammaImage' => ['bool', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::autoLevelImage' => ['bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::autoOrient' => ['bool'],
'Imagick::averageImages' => ['Imagick'],
'Imagick::blackThresholdImage' => ['bool', 'threshold'=>'mixed'],
'Imagick::blueShiftImage' => ['bool', 'factor='=>'float'],
-'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::borderImage' => ['bool', 'bordercolor'=>'mixed', 'width'=>'int', 'height'=>'int'],
-'Imagick::brightnessContrastImage' => ['bool', 'brightness'=>'float', 'contrast'=>'float', 'channel='=>'int'],
+'Imagick::brightnessContrastImage' => ['bool', 'brightness'=>'float', 'contrast'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::charcoalImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'],
'Imagick::chopImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::clampImage' => ['bool', 'channel='=>'int'],
@@ -4677,16 +4141,16 @@
'Imagick::colorFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'],
'Imagick::colorizeImage' => ['bool', 'colorize'=>'mixed', 'opacity'=>'mixed'],
'Imagick::colorMatrixImage' => ['bool', 'color_matrix'=>'array'],
-'Imagick::combineImages' => ['Imagick', 'channeltype'=>'int'],
+'Imagick::combineImages' => ['Imagick', 'channeltype'=>'Imagick::CHANNEL_*'],
'Imagick::commentImage' => ['bool', 'comment'=>'string'],
-'Imagick::compareImageChannels' => ['array', 'image'=>'imagick', 'channeltype'=>'int', 'metrictype'=>'int'],
-'Imagick::compareImageLayers' => ['Imagick', 'method'=>'int'],
-'Imagick::compareImages' => ['array', 'compare'=>'imagick', 'metric'=>'int'],
-'Imagick::compositeImage' => ['bool', 'composite_object'=>'imagick', 'composite'=>'int', 'x'=>'int', 'y'=>'int', 'channel='=>'int'],
+'Imagick::compareImageChannels' => ['array{Imagick,float}', 'image'=>'imagick', 'channeltype'=>'Imagick::CHANNEL_*', 'metrictype'=>'Imagick::METRIC_*'],
+'Imagick::compareImageLayers' => ['Imagick', 'method'=>'Imagick::LAYERMETHOD_*'],
+'Imagick::compareImages' => ['array{Imagick,float}', 'compare'=>'imagick', 'metric'=>'Imagick::METRIC_*'],
+'Imagick::compositeImage' => ['bool', 'composite_object'=>'imagick', 'composite'=>'Imagick::COMPOSITE_*', 'x'=>'int', 'y'=>'int', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::compositeImageGravity' => ['bool', 'imagick'=>'Imagick', 'COMPOSITE_CONSTANT'=>'int', 'GRAVITY_CONSTANT'=>'int'],
'Imagick::contrastImage' => ['bool', 'sharpen'=>'bool'],
-'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'int'],
-'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'int'],
+'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::count' => ['0|positive-int', 'mode='=>'int'],
'Imagick::cropImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::cropThumbnailImage' => ['bool', 'width'=>'int', 'height'=>'int', 'legacy='=>'bool'],
@@ -4701,167 +4165,167 @@
'Imagick::destroy' => ['bool'],
'Imagick::displayImage' => ['bool', 'servername'=>'string'],
'Imagick::displayImages' => ['bool', 'servername'=>'string'],
-'Imagick::distortImage' => ['bool', 'method'=>'int', 'arguments'=>'array', 'bestfit'=>'bool'],
+'Imagick::distortImage' => ['bool', 'method'=>'Imagick::DISTORTION_*', 'arguments'=>'array', 'bestfit'=>'bool'],
'Imagick::drawImage' => ['bool', 'draw'=>'imagickdraw'],
'Imagick::edgeImage' => ['bool', 'radius'=>'float'],
'Imagick::embossImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'],
'Imagick::encipherImage' => ['bool', 'passphrase'=>'string'],
'Imagick::enhanceImage' => ['bool'],
'Imagick::equalizeImage' => ['bool'],
-'Imagick::evaluateImage' => ['bool', 'op'=>'int', 'constant'=>'float', 'channel='=>'int'],
+'Imagick::evaluateImage' => ['bool', 'op'=>'Imagick::EVALUATE_*', 'constant'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::evaluateImages' => ['bool', 'EVALUATE_CONSTANT'=>'int'],
-'Imagick::exportImagePixels' => ['array', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int'],
+'Imagick::exportImagePixels' => ['list', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'Imagick::PIXEL_*'],
'Imagick::extentImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::filter' => ['bool', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'int'],
'Imagick::flattenImages' => ['Imagick'],
'Imagick::flipImage' => ['bool'],
-'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'int'],
+'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::flopImage' => ['bool'],
'Imagick::forwardFourierTransformimage' => ['bool', 'magnitude'=>'bool'],
'Imagick::frameImage' => ['bool', 'matte_color'=>'mixed', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'],
-'Imagick::functionImage' => ['bool', 'function'=>'int', 'arguments'=>'array', 'channel='=>'int'],
-'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'int'],
-'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'int'],
-'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
-'Imagick::getColorspace' => ['int'],
-'Imagick::getCompression' => ['int'],
+'Imagick::functionImage' => ['bool', 'function'=>'Imagick::FUNCTION_*', 'arguments'=>'array', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::getColorspace' => ['Imagick::COLORSPACE_*'],
+'Imagick::getCompression' => ['Imagick::COMPRESSION_*'],
'Imagick::getCompressionQuality' => ['int'],
-'Imagick::getConfigureOptions' => ['string'],
+'Imagick::getConfigureOptions' => ['array'],
'Imagick::getCopyright' => ['string'],
'Imagick::getFeatures' => ['string'],
'Imagick::getFilename' => ['string'],
'Imagick::getFont' => ['string'],
'Imagick::getFormat' => ['string'],
-'Imagick::getGravity' => ['int'],
+'Imagick::getGravity' => ['Imagick::GRAVITY_*'],
'Imagick::getHDRIEnabled' => ['int'],
'Imagick::getHomeURL' => ['string'],
'Imagick::getImage' => ['Imagick'],
-'Imagick::getImageAlphaChannel' => ['int'],
+'Imagick::getImageAlphaChannel' => ['bool'],
'Imagick::getImageArtifact' => ['string', 'artifact'=>'string'],
'Imagick::getImageAttribute' => ['string', 'key'=>'string'],
'Imagick::getImageBackgroundColor' => ['ImagickPixel'],
'Imagick::getImageBlob' => ['string'],
-'Imagick::getImageBluePrimary' => ['array'],
+'Imagick::getImageBluePrimary' => ['array{x:float,y:float}'],
'Imagick::getImageBorderColor' => ['ImagickPixel'],
-'Imagick::getImageChannelDepth' => ['int', 'channel'=>'int'],
-'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'imagick', 'channel'=>'int', 'metric'=>'int'],
-'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'imagick', 'metric'=>'int', 'channel='=>'int'],
-'Imagick::getImageChannelExtrema' => ['array', 'channel'=>'int'],
-'Imagick::getImageChannelKurtosis' => ['array', 'channel='=>'int'],
-'Imagick::getImageChannelMean' => ['array', 'channel'=>'int'],
-'Imagick::getImageChannelRange' => ['array', 'channel'=>'int'],
-'Imagick::getImageChannelStatistics' => ['array'],
+'Imagick::getImageChannelDepth' => ['int', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'imagick', 'channel'=>'Imagick::CHANNEL_*', 'metric'=>'Imagick::METRIC_*'],
+'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'imagick', 'metric'=>'Imagick::METRIC_*', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelExtrema' => ['array{minima:0|positive-int,maxima:0|positive-int}', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelKurtosis' => ['array{kurtosis:float,skewness:float}', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelMean' => ['array{mean:float,standardDeviation:float}', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelRange' => ['array{minima:float,maxima:float}', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelStatistics' => ['array{mean:float,minima:float,maxima:float,standardDeviation:float,depth:int}'],
'Imagick::getImageClipMask' => ['Imagick'],
'Imagick::getImageColormapColor' => ['ImagickPixel', 'index'=>'int'],
'Imagick::getImageColors' => ['int'],
-'Imagick::getImageColorspace' => ['int'],
-'Imagick::getImageCompose' => ['int'],
-'Imagick::getImageCompression' => ['int'],
+'Imagick::getImageColorspace' => ['Imagick::COLORSPACE_*'],
+'Imagick::getImageCompose' => ['Imagick::COMPOSITE_*'],
+'Imagick::getImageCompression' => ['Imagick::COMPRESSION_*'],
'Imagick::getImageCompressionQuality' => ['int'],
'Imagick::getImageDelay' => ['int'],
'Imagick::getImageDepth' => ['int'],
-'Imagick::getImageDispose' => ['int'],
-'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'int'],
-'Imagick::getImageExtrema' => ['array'],
+'Imagick::getImageDispose' => ['Imagick::DISPOSE_*'],
+'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'Imagick::METRIC_*'],
+'Imagick::getImageExtrema' => ['array{min:0|positive-int,max:0|positive-int}'],
'Imagick::getImageFilename' => ['string'],
'Imagick::getImageFormat' => ['string'],
'Imagick::getImageGamma' => ['float'],
-'Imagick::getImageGeometry' => ['array'],
-'Imagick::getImageGravity' => ['int'],
-'Imagick::getImageGreenPrimary' => ['array'],
+'Imagick::getImageGeometry' => ['array{width:int,height:int}'],
+'Imagick::getImageGravity' => ['Imagick::GRAVITY_*'],
+'Imagick::getImageGreenPrimary' => ['array{x:float,y:float}'],
'Imagick::getImageHeight' => ['int'],
-'Imagick::getImageHistogram' => ['array'],
+'Imagick::getImageHistogram' => ['list'],
'Imagick::getImageIndex' => ['int'],
-'Imagick::getImageInterlaceScheme' => ['int'],
-'Imagick::getImageInterpolateMethod' => ['int'],
+'Imagick::getImageInterlaceScheme' => ['Imagick::INTERLACE_*'],
+'Imagick::getImageInterpolateMethod' => ['Imagick::INTERPOLATE_*'],
'Imagick::getImageIterations' => ['int'],
-'Imagick::getImageLength' => ['int'],
+'Imagick::getImageLength' => ['0|positive-int'],
'Imagick::getImageMagickLicense' => ['string'],
'Imagick::getImageMatte' => ['bool'],
'Imagick::getImageMatteColor' => ['ImagickPixel'],
-'Imagick::getImageMimeType' => ['string'],
-'Imagick::getImageOrientation' => ['int'],
-'Imagick::getImagePage' => ['array'],
+'Imagick::getImageMimeType' => ['non-empty-string'],
+'Imagick::getImageOrientation' => ['Imagick::ORIENTATION_*'],
+'Imagick::getImagePage' => ['array{width:int,height:int,x:int,y:int}'],
'Imagick::getImagePixelColor' => ['ImagickPixel', 'x'=>'int', 'y'=>'int'],
'Imagick::getImageProfile' => ['string', 'name'=>'string'],
'Imagick::getImageProfiles' => ['array', 'pattern='=>'string', 'only_names='=>'bool'],
'Imagick::getImageProperties' => ['array', 'pattern='=>'string', 'only_names='=>'bool'],
'Imagick::getImageProperty' => ['string', 'name'=>'string'],
-'Imagick::getImageRedPrimary' => ['array'],
+'Imagick::getImageRedPrimary' => ['array{x:float,y:float}'],
'Imagick::getImageRegion' => ['Imagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
-'Imagick::getImageRenderingIntent' => ['int'],
-'Imagick::getImageResolution' => ['array'],
+'Imagick::getImageRenderingIntent' => ['Imagick::RENDERINGINTENT_*'],
+'Imagick::getImageResolution' => ['array{x:float,y:float}'],
'Imagick::getImagesBlob' => ['string'],
-'Imagick::getImageScene' => ['int'],
+'Imagick::getImageScene' => ['0|positive-int'],
'Imagick::getImageSignature' => ['string'],
-'Imagick::getImageSize' => ['int'],
-'Imagick::getImageTicksPerSecond' => ['int'],
+'Imagick::getImageSize' => ['0|positive-int'],
+'Imagick::getImageTicksPerSecond' => ['0|positive-int'],
'Imagick::getImageTotalInkDensity' => ['float'],
-'Imagick::getImageType' => ['int'],
+'Imagick::getImageType' => ['Imagick::IMGTYPE_*'],
'Imagick::getImageUnits' => ['int'],
'Imagick::getImageVirtualPixelMethod' => ['int'],
-'Imagick::getImageWhitePoint' => ['array'],
-'Imagick::getImageWidth' => ['int'],
-'Imagick::getInterlaceScheme' => ['int'],
+'Imagick::getImageWhitePoint' => ['array{x:float,y:float}'],
+'Imagick::getImageWidth' => ['0|positive-int'],
+'Imagick::getInterlaceScheme' => ['Imagick::INTERLACE_*'],
'Imagick::getIteratorIndex' => ['int'],
-'Imagick::getNumberImages' => ['int'],
+'Imagick::getNumberImages' => ['0|positive-int'],
'Imagick::getOption' => ['string', 'key'=>'string'],
'Imagick::getPackageName' => ['string'],
-'Imagick::getPage' => ['array'],
+'Imagick::getPage' => ['array{width:int,height:int,x:int,y:int}'],
'Imagick::getPixelIterator' => ['ImagickPixelIterator'],
'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'],
'Imagick::getPointSize' => ['float'],
-'Imagick::getQuantum' => ['int'],
-'Imagick::getQuantumDepth' => ['array'],
-'Imagick::getQuantumRange' => ['array'],
+'Imagick::getQuantum' => ['0|positive-int'],
+'Imagick::getQuantumDepth' => ['array{quantumDepthLong:0|positive-int,quantumDepthString:numeric-string}'],
+'Imagick::getQuantumRange' => ['array{quantumRangeLong:0|positive-int,quantumRangeString:numeric-string}'],
'Imagick::getRegistry' => ['string', 'key'=>'string'],
'Imagick::getReleaseDate' => ['string'],
-'Imagick::getResource' => ['int', 'type'=>'int'],
-'Imagick::getResourceLimit' => ['int', 'type'=>'int'],
-'Imagick::getSamplingFactors' => ['array'],
-'Imagick::getSize' => ['array'],
+'Imagick::getResource' => ['int', 'type'=>'Imagick::RESOURCETYPE_*'],
+'Imagick::getResourceLimit' => ['int', 'type'=>'Imagick::RESOURCETYPE_*'],
+'Imagick::getSamplingFactors' => ['list'],
+'Imagick::getSize' => ['array{columns:0|positive-int,rows:0|positive-int}'],
'Imagick::getSizeOffset' => ['int'],
-'Imagick::getVersion' => ['array'],
+'Imagick::getVersion' => ['array{versionNumber:0|positive-int,versionString:non-falsy-string}'],
'Imagick::haldClutImage' => ['bool', 'clut'=>'imagick', 'channel='=>'int'],
'Imagick::hasNextImage' => ['bool'],
'Imagick::hasPreviousImage' => ['bool'],
'Imagick::identifyFormat' => ['string|false', 'embedText'=>'string'],
-'Imagick::identifyImage' => ['array', 'appendrawoutput='=>'bool'],
+'Imagick::identifyImage' => ['array{imageName:string,mimetype:string,format:string,units:string,colorSpace:string,type:string,compression:string,fileSize:string,geometry:array{width:0|positive-int,height:0|positive-int},resolution:array{x:float,y:float},signature:string}', 'appendrawoutput='=>'bool'],
'Imagick::identifyImageType' => ['int'],
'Imagick::implodeImage' => ['bool', 'radius'=>'float'],
-'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int', 'pixels'=>'array'],
+'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'Imagick::PIXEL_*', 'pixels'=>'array'],
'Imagick::inverseFourierTransformImage' => ['bool', 'complement'=>'Imagick', 'magnitude'=>'bool'],
'Imagick::key' => ['int|string'],
'Imagick::labelImage' => ['bool', 'label'=>'string'],
-'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'],
+'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::linearStretchImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float'],
'Imagick::liquidRescaleImage' => ['bool', 'width'=>'int', 'height'=>'int', 'delta_x'=>'float', 'rigidity'=>'float'],
-'Imagick::listRegistry' => ['array'],
+'Imagick::listRegistry' => ['array'],
'Imagick::localContrastImage' => ['bool', 'radius'=>'float', 'strength'=>'float'],
'Imagick::magnifyImage' => ['bool'],
'Imagick::mapImage' => ['bool', 'map'=>'imagick', 'dither'=>'bool'],
'Imagick::matteFloodfillImage' => ['bool', 'alpha'=>'float', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'],
'Imagick::medianFilterImage' => ['bool', 'radius'=>'float'],
-'Imagick::mergeImageLayers' => ['Imagick', 'layer_method'=>'int'],
+'Imagick::mergeImageLayers' => ['Imagick', 'layer_method'=>'Imagick::LAYERMETHOD_*'],
'Imagick::minifyImage' => ['bool'],
'Imagick::modulateImage' => ['bool', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'],
-'Imagick::montageImage' => ['Imagick', 'draw'=>'imagickdraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'int', 'frame'=>'string'],
+'Imagick::montageImage' => ['Imagick', 'draw'=>'imagickdraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'Imagick::MONTAGEMODE_*', 'frame'=>'string'],
'Imagick::morphImages' => ['Imagick', 'number_frames'=>'int'],
-'Imagick::morphology' => ['bool', 'morphologyMethod'=>'int', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'channel='=>'int'],
+'Imagick::morphology' => ['bool', 'morphologyMethod'=>'Imagick::MORPHOLOGY_*', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::mosaicImages' => ['Imagick'],
-'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'int'],
-'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'int'],
+'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::newImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'background'=>'mixed', 'format='=>'string'],
'Imagick::newPseudoImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'pseudostring'=>'string'],
'Imagick::next' => ['void'],
'Imagick::nextImage' => ['bool'],
-'Imagick::normalizeImage' => ['bool', 'channel='=>'int'],
+'Imagick::normalizeImage' => ['bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::oilPaintImage' => ['bool', 'radius'=>'float'],
-'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'int'],
+'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::optimizeImageLayers' => ['bool'],
-'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'int'],
-'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'int'],
-'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'int'],
+'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::paintTransparentImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float'],
'Imagick::pingImage' => ['bool', 'filename'=>'string'],
'Imagick::pingImageBlob' => ['bool', 'image'=>'string'],
@@ -4870,22 +4334,22 @@
'Imagick::posterizeImage' => ['bool', 'levels'=>'int', 'dither'=>'bool'],
'Imagick::previewImages' => ['bool', 'preview'=>'int'],
'Imagick::previousImage' => ['bool'],
-'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'string'],
+'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'?string'],
'Imagick::quantizeImage' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'],
'Imagick::quantizeImages' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'],
-'Imagick::queryFontMetrics' => ['array', 'properties'=>'imagickdraw', 'text'=>'string', 'multiline='=>'bool'],
-'Imagick::queryFonts' => ['array', 'pattern='=>'string'],
-'Imagick::queryFormats' => ['array', 'pattern='=>'string'],
-'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'int'],
+'Imagick::queryFontMetrics' => ['array{characterWidth:float,characterHeight:float,ascender:float,descender:float,textWidth:float,textHeight:float,maxHorizontalAdvance:float,boundingBox:array{x1:float,x2:float,y1:float,y2:float},originX:float,originY:float}', 'properties'=>'imagickdraw', 'text'=>'string', 'multiline='=>'bool'],
+'Imagick::queryFonts' => ['list', 'pattern='=>'string'],
+'Imagick::queryFormats' => ['list', 'pattern='=>'string'],
+'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::raiseImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'],
-'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'int'],
+'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::readImage' => ['bool', 'filename'=>'string'],
'Imagick::readImageBlob' => ['bool', 'image'=>'string', 'filename='=>'string'],
'Imagick::readImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'],
'Imagick::readImages' => ['Imagick', 'filenames'=>'string'],
'Imagick::recolorImage' => ['bool', 'matrix'=>'array'],
'Imagick::reduceNoiseImage' => ['bool', 'radius'=>'float'],
-'Imagick::remapImage' => ['bool', 'replacement'=>'imagick', 'dither'=>'int'],
+'Imagick::remapImage' => ['bool', 'replacement'=>'imagick', 'dither'=>'Imagick::DITHERMETHOD_*'],
'Imagick::removeImage' => ['bool'],
'Imagick::removeImageProfile' => ['string', 'name'=>'string'],
'Imagick::render' => ['bool'],
@@ -4896,28 +4360,28 @@
'Imagick::rewind' => ['void'],
'Imagick::rollImage' => ['bool', 'x'=>'int', 'y'=>'int'],
'Imagick::rotateImage' => ['bool', 'background'=>'mixed', 'degrees'=>'float'],
-'Imagick::rotationalBlurImage' => ['bool', 'float'=>'string', 'channel='=>'int'],
+'Imagick::rotationalBlurImage' => ['bool', 'float'=>'string', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::roundCorners' => ['bool', 'x_rounding'=>'float', 'y_rounding'=>'float', 'stroke_width='=>'float', 'displace='=>'float', 'size_correction='=>'float'],
-'Imagick::roundCornersImage' => ['', 'xRounding'=>'', 'yRounding'=>'', 'strokeWidth'=>'', 'displace'=>'', 'sizeCorrection'=>''],
+'Imagick::roundCornersImage' => ['bool', 'x_rounding'=>'', 'y_rounding'=>'', 'stroke_width='=>'', 'displace='=>'', 'size_correction='=>''],
'Imagick::sampleImage' => ['bool', 'columns'=>'int', 'rows'=>'int'],
-'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool'],
-'Imagick::segmentImage' => ['bool', 'colorspace'=>'int', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'],
-'Imagick::selectiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'channel='=>'int'],
-'Imagick::separateImageChannel' => ['bool', 'channel'=>'int'],
+'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'legacy='=>'bool'],
+'Imagick::segmentImage' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'],
+'Imagick::selectiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::separateImageChannel' => ['bool', 'channel'=>'Imagick::CHANNEL_*'],
'Imagick::sepiaToneImage' => ['bool', 'threshold'=>'float'],
'Imagick::setAntiAlias' => ['int', 'antialias'=>'bool'],
'Imagick::setBackgroundColor' => ['bool', 'background'=>'mixed'],
-'Imagick::setColorspace' => ['bool', 'colorspace'=>'int'],
-'Imagick::setCompression' => ['bool', 'compression'=>'int'],
+'Imagick::setColorspace' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*'],
+'Imagick::setCompression' => ['bool', 'compression'=>'Imagick::COMPRESSION_*'],
'Imagick::setCompressionQuality' => ['bool', 'quality'=>'int'],
'Imagick::setFilename' => ['bool', 'filename'=>'string'],
'Imagick::setFirstIterator' => ['bool'],
'Imagick::setFont' => ['bool', 'font'=>'string'],
'Imagick::setFormat' => ['bool', 'format'=>'string'],
-'Imagick::setGravity' => ['bool', 'gravity'=>'int'],
+'Imagick::setGravity' => ['bool', 'gravity'=>'Imagick::GRAVITY_*'],
'Imagick::setImage' => ['bool', 'replace'=>'imagick'],
'Imagick::setImageAlpha' => ['bool', 'alpha'=>'float'],
-'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'int'],
+'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'Imagick::ALPHACHANNEL_*'],
'Imagick::setImageArtifact' => ['bool', 'artifact'=>'string', 'value'=>'string'],
'Imagick::setImageAttribute' => ['bool', 'key'=>'string', 'value'=>'string'],
'Imagick::setImageBackgroundColor' => ['bool', 'background'=>'mixed'],
@@ -4925,41 +4389,41 @@
'Imagick::setImageBiasQuantum' => ['void', 'bias'=>'string'],
'Imagick::setImageBluePrimary' => ['bool', 'x'=>'float', 'y'=>'float'],
'Imagick::setImageBorderColor' => ['bool', 'border'=>'mixed'],
-'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'int', 'depth'=>'int'],
-'Imagick::setImageChannelMask' => ['', 'channel'=>'int'],
+'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'Imagick::CHANNEL_*', 'depth'=>'int'],
+'Imagick::setImageChannelMask' => ['', 'channel'=>'Imagick::CHANNEL_*'],
'Imagick::setImageClipMask' => ['bool', 'clip_mask'=>'imagick'],
'Imagick::setImageColormapColor' => ['bool', 'index'=>'int', 'color'=>'imagickpixel'],
-'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'int'],
-'Imagick::setImageCompose' => ['bool', 'compose'=>'int'],
-'Imagick::setImageCompression' => ['bool', 'compression'=>'int'],
+'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*'],
+'Imagick::setImageCompose' => ['bool', 'compose'=>'Imagick::COMPOSITE_*'],
+'Imagick::setImageCompression' => ['bool', 'compression'=>'Imagick::COMPRESSION_*'],
'Imagick::setImageCompressionQuality' => ['bool', 'quality'=>'int'],
'Imagick::setImageDelay' => ['bool', 'delay'=>'int'],
'Imagick::setImageDepth' => ['bool', 'depth'=>'int'],
-'Imagick::setImageDispose' => ['bool', 'dispose'=>'int'],
+'Imagick::setImageDispose' => ['bool', 'dispose'=>'Imagick::DISPOSE_*'],
'Imagick::setImageExtent' => ['bool', 'columns'=>'int', 'rows'=>'int'],
'Imagick::setImageFilename' => ['bool', 'filename'=>'string'],
'Imagick::setImageFormat' => ['bool', 'format'=>'string'],
'Imagick::setImageGamma' => ['bool', 'gamma'=>'float'],
-'Imagick::setImageGravity' => ['bool', 'gravity'=>'int'],
+'Imagick::setImageGravity' => ['bool', 'gravity'=>'Imagick::GRAVITY_*'],
'Imagick::setImageGreenPrimary' => ['bool', 'x'=>'float', 'y'=>'float'],
'Imagick::setImageIndex' => ['bool', 'index'=>'int'],
-'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'],
-'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'int'],
+'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'Imagick::INTERLACE_*'],
+'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'Imagick::INTERPOLATE_*'],
'Imagick::setImageIterations' => ['bool', 'iterations'=>'int'],
'Imagick::setImageMatte' => ['bool', 'matte'=>'bool'],
'Imagick::setImageMatteColor' => ['bool', 'matte'=>'mixed'],
'Imagick::setImageOpacity' => ['bool', 'opacity'=>'float'],
-'Imagick::setImageOrientation' => ['bool', 'orientation'=>'int'],
+'Imagick::setImageOrientation' => ['bool', 'orientation'=>'Imagick::ORIENTATION_*'],
'Imagick::setImagePage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::setImageProfile' => ['bool', 'name'=>'string', 'profile'=>'string'],
'Imagick::setImageProgressMonitor' => ['', 'filename'=>''],
'Imagick::setImageProperty' => ['bool', 'name'=>'string', 'value'=>'string'],
'Imagick::setImageRedPrimary' => ['bool', 'x'=>'float', 'y'=>'float'],
-'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'int'],
+'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'Imagick::RENDERINGINTENT_*'],
'Imagick::setImageResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'],
'Imagick::setImageScene' => ['bool', 'scene'=>'int'],
'Imagick::setImageTicksPerSecond' => ['bool', 'ticks_per_second'=>'int'],
-'Imagick::setImageType' => ['bool', 'image_type'=>'int'],
+'Imagick::setImageType' => ['bool', 'image_type'=>'Imagick::IMGTYPE_*'],
'Imagick::setImageUnits' => ['bool', 'units'=>'int'],
'Imagick::setImageVirtualPixelMethod' => ['bool', 'method'=>'int'],
'Imagick::setImageWhitePoint' => ['bool', 'x'=>'float', 'y'=>'float'],
@@ -4976,46 +4440,46 @@
'Imagick::setSamplingFactors' => ['bool', 'factors'=>'array'],
'Imagick::setSize' => ['bool', 'columns'=>'int', 'rows'=>'int'],
'Imagick::setSizeOffset' => ['bool', 'columns'=>'int', 'rows'=>'int', 'offset'=>'int'],
-'Imagick::setType' => ['bool', 'image_type'=>'int'],
+'Imagick::setType' => ['bool', 'image_type'=>'Imagick::IMGTYPE_*'],
'Imagick::shadeImage' => ['bool', 'gray'=>'bool', 'azimuth'=>'float', 'elevation'=>'float'],
'Imagick::shadowImage' => ['bool', 'opacity'=>'float', 'sigma'=>'float', 'x'=>'int', 'y'=>'int'],
-'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::shaveImage' => ['bool', 'columns'=>'int', 'rows'=>'int'],
'Imagick::shearImage' => ['bool', 'background'=>'mixed', 'x_shear'=>'float', 'y_shear'=>'float'],
-'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'int'],
-'Imagick::similarityImage' => ['Imagick', 'imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'int'],
+'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::similarityImage' => ['Imagick', 'imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'Imagick::METRIC_*'],
'Imagick::sketchImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'],
'Imagick::smushImages' => ['Imagick', 'stack'=>'bool', 'offset'=>'int'],
-'Imagick::solarizeImage' => ['bool', 'threshold'=>'int'],
-'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'int', 'arguments'=>'array', 'channel='=>'int'],
+'Imagick::solarizeImage' => ['bool', 'threshold'=>'0|positive-int'],
+'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'Imagick::SPARSECOLORMETHOD_*', 'arguments'=>'array', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::spliceImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::spreadImage' => ['bool', 'radius'=>'float'],
-'Imagick::statisticImage' => ['bool', 'type'=>'int', 'width'=>'int', 'height'=>'int', 'channel='=>'int'],
+'Imagick::statisticImage' => ['bool', 'type'=>'Imagick::STATISTIC_*', 'width'=>'int', 'height'=>'int', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::steganoImage' => ['Imagick', 'watermark_wand'=>'imagick', 'offset'=>'int'],
'Imagick::stereoImage' => ['bool', 'offset_wand'=>'imagick'],
'Imagick::stripImage' => ['bool'],
'Imagick::subImageMatch' => ['Imagick', 'Imagick'=>'Imagick', '&w_offset='=>'array', '&w_similarity='=>'float'],
'Imagick::swirlImage' => ['bool', 'degrees'=>'float'],
'Imagick::textureImage' => ['Imagick', 'texture_wand'=>'imagick'],
-'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'int'],
+'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::thumbnailImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'fill='=>'bool', 'legacy='=>'bool'],
'Imagick::tintImage' => ['bool', 'tint'=>'mixed', 'opacity'=>'mixed'],
'Imagick::transformImage' => ['Imagick', 'crop'=>'string', 'geometry'=>'string'],
-'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'int'],
+'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*'],
'Imagick::transparentPaintImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float', 'invert'=>'bool'],
'Imagick::transposeImage' => ['bool'],
'Imagick::transverseImage' => ['bool'],
'Imagick::trimImage' => ['bool', 'fuzz'=>'float'],
'Imagick::uniqueImageColors' => ['bool'],
-'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'int'],
+'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::valid' => ['bool'],
'Imagick::vignetteImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float', 'x'=>'int', 'y'=>'int'],
'Imagick::waveImage' => ['bool', 'amplitude'=>'float', 'length'=>'float'],
'Imagick::whiteThresholdImage' => ['bool', 'threshold'=>'mixed'],
'Imagick::writeImage' => ['bool', 'filename='=>'string'],
-'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource'],
+'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource', 'format='=>'?string'],
'Imagick::writeImages' => ['bool', 'filename'=>'string', 'adjoin'=>'bool'],
-'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource'],
+'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource', 'format='=>'?string'],
'ImagickDraw::__construct' => ['void'],
'ImagickDraw::affine' => ['bool', 'affine'=>'array'],
'ImagickDraw::annotation' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'],
@@ -5024,9 +4488,9 @@
'ImagickDraw::circle' => ['bool', 'ox'=>'float', 'oy'=>'float', 'px'=>'float', 'py'=>'float'],
'ImagickDraw::clear' => ['bool'],
'ImagickDraw::clone' => ['ImagickDraw'],
-'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'],
+'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'Imagick::PAINT_*'],
'ImagickDraw::comment' => ['bool', 'comment'=>'string'],
-'ImagickDraw::composite' => ['bool', 'compose'=>'int', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'imagick'],
+'ImagickDraw::composite' => ['bool', 'compose'=>'Imagick::COMPOSITE_*', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'imagick'],
'ImagickDraw::destroy' => ['bool'],
'ImagickDraw::ellipse' => ['bool', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'],
'ImagickDraw::getBorderColor' => ['ImagickPixel'],
@@ -5036,28 +4500,28 @@
'ImagickDraw::getDensity' => ['null|string'],
'ImagickDraw::getFillColor' => ['ImagickPixel'],
'ImagickDraw::getFillOpacity' => ['float'],
-'ImagickDraw::getFillRule' => ['int'],
+'ImagickDraw::getFillRule' => ['Imagick::FILLRULE_*'],
'ImagickDraw::getFont' => ['string'],
'ImagickDraw::getFontFamily' => ['string'],
'ImagickDraw::getFontResolution' => ['array'],
'ImagickDraw::getFontSize' => ['float'],
-'ImagickDraw::getFontStretch' => ['int'],
-'ImagickDraw::getFontStyle' => ['int'],
+'ImagickDraw::getFontStretch' => ['Imagick::STRETCH_*'],
+'ImagickDraw::getFontStyle' => ['Imagick::STYLE_*'],
'ImagickDraw::getFontWeight' => ['int'],
-'ImagickDraw::getGravity' => ['int'],
+'ImagickDraw::getGravity' => ['Imagick::GRAVITY_*'],
'ImagickDraw::getOpacity' => ['float'],
'ImagickDraw::getStrokeAntialias' => ['bool'],
'ImagickDraw::getStrokeColor' => ['ImagickPixel'],
'ImagickDraw::getStrokeDashArray' => ['array'],
'ImagickDraw::getStrokeDashOffset' => ['float'],
-'ImagickDraw::getStrokeLineCap' => ['int'],
-'ImagickDraw::getStrokeLineJoin' => ['int'],
+'ImagickDraw::getStrokeLineCap' => ['Imagick::LINECAP_*'],
+'ImagickDraw::getStrokeLineJoin' => ['Imagick::LINEJOIN_*'],
'ImagickDraw::getStrokeMiterLimit' => ['int'],
'ImagickDraw::getStrokeOpacity' => ['float'],
'ImagickDraw::getStrokeWidth' => ['float'],
-'ImagickDraw::getTextAlignment' => ['int'],
+'ImagickDraw::getTextAlignment' => ['Imagick::ALIGN_*'],
'ImagickDraw::getTextAntialias' => ['bool'],
-'ImagickDraw::getTextDecoration' => ['int'],
+'ImagickDraw::getTextDecoration' => ['Imagick::DECORATION_*'],
'ImagickDraw::getTextDirection' => ['bool'],
'ImagickDraw::getTextEncoding' => ['string'],
'ImagickDraw::getTextInterlineSpacing' => ['float'],
@@ -5066,7 +4530,7 @@
'ImagickDraw::getTextUnderColor' => ['ImagickPixel'],
'ImagickDraw::getVectorGraphics' => ['string'],
'ImagickDraw::line' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'],
-'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'],
+'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'Imagick::PAINT_*'],
'ImagickDraw::pathClose' => ['bool'],
'ImagickDraw::pathCurveToAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'],
'ImagickDraw::pathCurveToQuadraticBezierAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'],
@@ -5107,22 +4571,22 @@
'ImagickDraw::scale' => ['bool', 'x'=>'float', 'y'=>'float'],
'ImagickDraw::setBorderColor' => ['bool', 'color'=>'ImagickPixel|string'],
'ImagickDraw::setClipPath' => ['bool', 'clip_mask'=>'string'],
-'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'int'],
+'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'Imagick::FILLRULE_*'],
'ImagickDraw::setClipUnits' => ['bool', 'clip_units'=>'int'],
'ImagickDraw::setDensity' => ['bool', 'density_string'=>'string'],
'ImagickDraw::setFillAlpha' => ['bool', 'opacity'=>'float'],
'ImagickDraw::setFillColor' => ['bool', 'fill_pixel'=>'ImagickPixel|string'],
'ImagickDraw::setFillOpacity' => ['bool', 'fillopacity'=>'float'],
'ImagickDraw::setFillPatternURL' => ['bool', 'fill_url'=>'string'],
-'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'int'],
+'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'Imagick::FILLRULE_*'],
'ImagickDraw::setFont' => ['bool', 'font_name'=>'string'],
'ImagickDraw::setFontFamily' => ['bool', 'font_family'=>'string'],
'ImagickDraw::setFontResolution' => ['bool', 'x'=>'float', 'y'=>'float'],
'ImagickDraw::setFontSize' => ['bool', 'pointsize'=>'float'],
-'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'int'],
-'ImagickDraw::setFontStyle' => ['bool', 'style'=>'int'],
+'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'Imagick::STRETCH_*'],
+'ImagickDraw::setFontStyle' => ['bool', 'style'=>'Imagick::STYLE_*'],
'ImagickDraw::setFontWeight' => ['bool', 'font_weight'=>'int'],
-'ImagickDraw::setGravity' => ['bool', 'gravity'=>'int'],
+'ImagickDraw::setGravity' => ['bool', 'gravity'=>'Imagick::GRAVITY_*'],
'ImagickDraw::setOpacity' => ['void', 'opacity'=>'float'],
'ImagickDraw::setResolution' => ['void', 'x_resolution'=>'float', 'y_resolution'=>'float'],
'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity'=>'float'],
@@ -5130,15 +4594,15 @@
'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel'=>'ImagickPixel|string'],
'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray'=>'array'],
'ImagickDraw::setStrokeDashOffset' => ['bool', 'dash_offset'=>'float'],
-'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'int'],
-'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'int'],
+'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'Imagick::LINECAP_*'],
+'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'Imagick::LINEJOIN_*'],
'ImagickDraw::setStrokeMiterLimit' => ['bool', 'miterlimit'=>'int'],
'ImagickDraw::setStrokeOpacity' => ['bool', 'stroke_opacity'=>'float'],
'ImagickDraw::setStrokePatternURL' => ['bool', 'stroke_url'=>'string'],
'ImagickDraw::setStrokeWidth' => ['bool', 'stroke_width'=>'float'],
-'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'int'],
+'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'Imagick::ALIGN_*'],
'ImagickDraw::setTextAntialias' => ['bool', 'antialias'=>'bool'],
-'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'int'],
+'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'Imagick::DECORATION_*'],
'ImagickDraw::setTextDirection' => ['bool', 'direction'=>'int'],
'ImagickDraw::setTextEncoding' => ['bool', 'encoding'=>'string'],
'ImagickDraw::setTextInterlineSpacing' => ['void', 'spacing'=>'float'],
@@ -5152,17 +4616,16 @@
'ImagickDraw::translate' => ['bool', 'x'=>'float', 'y'=>'float'],
'ImagickKernel::addKernel' => ['void', 'ImagickKernel'=>'ImagickKernel'],
'ImagickKernel::addUnityKernel' => ['void'],
-'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'string', 'kernelString'=>'string'],
+'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'Imagick::KERNEL_*', 'kernelString'=>'string'],
'ImagickKernel::fromMatrix' => ['ImagickKernel', 'matrix'=>'array', 'origin='=>'array'],
-'ImagickKernel::getMatrix' => ['array'],
-'ImagickKernel::scale' => ['void'],
+'ImagickKernel::getMatrix' => ['list>'],
+'ImagickKernel::scale' => ['void', 'scale'=>'float', 'normalizeFlag'=>'Imagick::NORMALIZE_KERNEL_*'],
'ImagickKernel::separate' => ['array'],
-'ImagickKernel::seperate' => ['void'],
'ImagickPixel::__construct' => ['void', 'color='=>'string'],
'ImagickPixel::clear' => ['bool'],
'ImagickPixel::clone' => ['void'],
'ImagickPixel::destroy' => ['bool'],
-'ImagickPixel::getColor' => ['array', 'normalized='=>'bool'],
+'ImagickPixel::getColor' => ['array{r: int|float, g: int|float, b: int|float, a: int|float}', 'normalized='=>'0|1|2'],
'ImagickPixel::getColorAsString' => ['string'],
'ImagickPixel::getColorCount' => ['int'],
'ImagickPixel::getColorQuantum' => ['mixed'],
@@ -5213,7 +4676,7 @@
'imap_close' => ['bool', 'stream_id'=>'resource', 'options='=>'int'],
'imap_create' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
'imap_createmailbox' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
-'imap_delete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'int', 'options='=>'int'],
+'imap_delete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'string', 'options='=>'int'],
'imap_deletemailbox' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
'imap_errors' => ['array|false'],
'imap_expunge' => ['bool', 'stream_id'=>'resource'],
@@ -5248,7 +4711,7 @@
'imap_mutf7_to_utf8' => ['string|false', 'in'=>'string'],
'imap_num_msg' => ['int|false', 'stream_id'=>'resource'],
'imap_num_recent' => ['int|false', 'stream_id'=>'resource'],
-'imap_open' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'options='=>'int', 'n_retries='=>'int', 'params=' => 'array|null'],
+'imap_open' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'options='=>'int', 'n_retries='=>'int', 'params='=>'array|null'],
'imap_ping' => ['bool', 'stream_id'=>'resource'],
'imap_qprint' => ['string|false', 'text'=>'string'],
'imap_rename' => ['bool', 'stream_id'=>'resource', 'old_name'=>'string', 'new_name'=>'string'],
@@ -5270,7 +4733,7 @@
'imap_thread' => ['array|false', 'stream_id'=>'resource', 'options='=>'int'],
'imap_timeout' => ['mixed', 'timeout_type'=>'int', 'timeout='=>'int'],
'imap_uid' => ['int|false', 'stream_id'=>'resource', 'msg_no'=>'int'],
-'imap_undelete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'int', 'flags='=>'int'],
+'imap_undelete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'string', 'flags='=>'int'],
'imap_unsubscribe' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
'imap_utf7_decode' => ['string|false', 'buf'=>'string'],
'imap_utf7_encode' => ['string', 'buf'=>'string'],
@@ -5284,7 +4747,7 @@
'inclued_get_data' => ['array'],
'inet_ntop' => ['string|false', 'in_addr'=>'string'],
'inet_pton' => ['string|false', 'ip_address'=>'string'],
-'InfiniteIterator::__construct' => ['void', 'iterator'=>'iterator'],
+'InfiniteIterator::__construct' => ['void', 'iterator'=>'Iterator'],
'InfiniteIterator::next' => ['void'],
'inflate_add' => ['string|false', 'context'=>'resource', 'encoded_data'=>'string', 'flush_mode='=>'int'],
'inflate_get_read_len' => ['int|false', 'resource'=>'resource'],
@@ -5329,10 +4792,10 @@
'ini_get_all' => ['array|false', 'extension='=>'?string', 'details='=>'bool'],
'ini_restore' => ['void', 'varname'=>'string'],
'ini_set' => ['string|false', 'varname'=>'string', 'newvalue'=>'string'],
-'inotify_add_watch' => ['int', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'],
+'inotify_add_watch' => ['int<1,max>|false', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'],
'inotify_init' => ['resource'],
-'inotify_queue_len' => ['int', 'inotify_instance'=>'resource'],
-'inotify_read' => ['array', 'inotify_instance'=>'resource'],
+'inotify_queue_len' => ['int<0,max>', 'inotify_instance'=>'resource'],
+'inotify_read' => ['list,mask:int<0,max>,cookie:int<0,max>,name:string}>|false', 'inotify_instance'=>'resource'],
'inotify_rm_watch' => ['bool', 'inotify_instance'=>'resource', 'watch_descriptor'=>'int'],
'intdiv' => ['int', 'numerator'=>'int', 'divisor'=>'int'],
'interface_exists' => ['bool', 'classname'=>'string', 'autoload='=>'bool'],
@@ -5353,7 +4816,7 @@
'IntlBreakIterator::getErrorCode' => ['int'],
'IntlBreakIterator::getErrorMessage' => ['string'],
'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'],
-'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'],
+'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'IntlPartsIterator::KEY_*'],
'IntlBreakIterator::getText' => ['string'],
'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'],
'IntlBreakIterator::last' => ['int'],
@@ -5513,24 +4976,24 @@
'IntlChar::toupper' => ['mixed', 'codepoint'=>'mixed'],
'IntlCodePointBreakIterator::getLastCodePoint' => ['int'],
'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'null|int|IntlCalendar', 'pattern='=>'string'],
-'IntlDateFormatter::create' => ['IntlDateFormatter|false', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'],
+'IntlDateFormatter::create' => ['IntlDateFormatter|null', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'],
'IntlDateFormatter::format' => ['string|false', 'args'=>''],
-'IntlDateFormatter::formatObject' => ['string', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'],
-'IntlDateFormatter::getCalendar' => ['int'],
-'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'],
-'IntlDateFormatter::getDateType' => ['int'],
+'IntlDateFormatter::formatObject' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'],
+'IntlDateFormatter::getCalendar' => ['int|false'],
+'IntlDateFormatter::getCalendarObject' => ['IntlCalendar|false|null'],
+'IntlDateFormatter::getDateType' => ['int|false'],
'IntlDateFormatter::getErrorCode' => ['int'],
'IntlDateFormatter::getErrorMessage' => ['string'],
-'IntlDateFormatter::getLocale' => ['string'],
-'IntlDateFormatter::getPattern' => ['string'],
-'IntlDateFormatter::getTimeType' => ['int'],
-'IntlDateFormatter::getTimeZone' => ['IntlTimeZone'],
-'IntlDateFormatter::getTimeZoneId' => ['string'],
+'IntlDateFormatter::getLocale' => ['string|false'],
+'IntlDateFormatter::getPattern' => ['string|false'],
+'IntlDateFormatter::getTimeType' => ['int|false'],
+'IntlDateFormatter::getTimeZone' => ['IntlTimeZone|false'],
+'IntlDateFormatter::getTimeZoneId' => ['string|false'],
'IntlDateFormatter::isLenient' => ['bool'],
-'IntlDateFormatter::localtime' => ['array', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'],
-'IntlDateFormatter::parse' => ['int|false', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'],
+'IntlDateFormatter::localtime' => ['array|false', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'],
+'IntlDateFormatter::parse' => ['int|float|false', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'],
'IntlDateFormatter::setCalendar' => ['bool', 'calendar'=>''],
-'IntlDateFormatter::setLenient' => ['bool', 'lenient'=>'bool'],
+'IntlDateFormatter::setLenient' => ['void', 'lenient'=>'bool'],
'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'],
'IntlDateFormatter::setTimeZone' => ['bool', 'timezone'=>''],
'IntlDateFormatter::setTimeZoneId' => ['bool', 'zone'=>'string', 'fmt='=>'IntlDateFormatter'],
@@ -5542,6 +5005,7 @@
'IntlIterator::next' => ['void'],
'IntlIterator::rewind' => ['void'],
'IntlIterator::valid' => ['bool'],
+'IntlPartsIterator::current' => ['non-empty-string'],
'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'],
'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'],
'IntlRuleBasedBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale'=>'string'],
@@ -5611,7 +5075,7 @@
'intltz_to_date_time_zone' => ['DateTimeZone|false', 'obj'=>''],
'intltz_use_daylight_time' => ['bool', 'obj'=>''],
'intlz_create_default' => ['IntlTimeZone'],
-'intval' => ['int', 'var'=>'mixed', 'base='=>'int'],
+'intval' => ['int', 'var'=>'scalar|array|resource|null', 'base='=>'int'],
'InvalidArgumentException::__clone' => ['void'],
'InvalidArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?InvalidArgumentException)'],
'InvalidArgumentException::__toString' => ['string'],
@@ -5620,11 +5084,11 @@
'InvalidArgumentException::getLine' => ['int'],
'InvalidArgumentException::getMessage' => ['string'],
'InvalidArgumentException::getPrevious' => ['Throwable|InvalidArgumentException|null'],
-'InvalidArgumentException::getTrace' => ['array'],
+'InvalidArgumentException::getTrace' => ['list\',args?:list,object?:object}>'],
'InvalidArgumentException::getTraceAsString' => ['string'],
'ip2long' => ['int|false', 'ip_address'=>'string'],
'iptcembed' => ['string|bool', 'iptcdata'=>'string', 'jpeg_file_name'=>'string', 'spool='=>'int'],
-'iptcparse' => ['array|false', 'iptcdata'=>'string'],
+'iptcparse' => ['array>|false', 'iptcdata'=>'string'],
'is_a' => ['bool', 'object_or_string'=>'object|string', 'class_name'=>'string', 'allow_string='=>'bool'],
'is_array' => ['bool', 'var'=>'mixed'],
'is_bool' => ['bool', 'var'=>'mixed'],
@@ -5657,7 +5121,6 @@
'is_uploaded_file' => ['bool', 'path'=>'string'],
'is_writable' => ['bool', 'filename'=>'string'],
'is_writeable' => ['bool', 'filename'=>'string'],
-'isset' => ['bool', 'var'=>'mixed', '...rest='=>'mixed'],
'Iterator::current' => ['mixed'],
'Iterator::key' => ['mixed'],
'Iterator::next' => ['void'],
@@ -5693,10 +5156,11 @@
'jobqueue_license_info' => ['array'],
'join' => ['string', 'glue'=>'string', 'pieces'=>'array'],
'join\'1' => ['string', 'pieces'=>'array'],
+'join\'2' => ['string', 'pieces'=>'array', 'glue'=>'string'],
'jpeg2wbmp' => ['bool', 'jpegname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'],
-'json_decode' => ['mixed', 'json'=>'string', 'assoc='=>'bool', 'depth='=>'int', 'options='=>'int'],
-'json_encode' => ['string|false', 'data'=>'mixed', 'options='=>'int', 'depth='=>'int'],
-'json_last_error' => ['int'],
+'json_decode' => ['mixed', 'json'=>'string', 'assoc='=>'bool|null', 'depth='=>'positive-int', 'options='=>'int'],
+'json_encode' => ['non-empty-string|false', 'data'=>'mixed', 'options='=>'int', 'depth='=>'positive-int'],
+'json_last_error' => ['JSON_ERROR_NONE|JSON_ERROR_DEPTH|JSON_ERROR_STATE_MISMATCH|JSON_ERROR_CTRL_CHAR|JSON_ERROR_SYNTAX|JSON_ERROR_UTF8|JSON_ERROR_RECURSION|JSON_ERROR_INF_OR_NAN|JSON_ERROR_UNSUPPORTED_TYPE|JSON_ERROR_INVALID_PROPERTY_NAME|JSON_ERROR_UTF16'],
'json_last_error_msg' => ['string'],
'JsonIncrementalParser::__construct' => ['void', 'depth'=>'', 'options'=>''],
'JsonIncrementalParser::get' => ['', 'options'=>''],
@@ -5848,8 +5312,8 @@
'ldap_8859_to_t61' => ['string|false', 'value'=>'string'],
'ldap_add' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
'ldap_add_ext' => ['resource|false', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
-'ldap_bind' => ['bool', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls=' => 'array'],
-'ldap_bind_ext' => ['resource|false', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls=' => 'array'],
+'ldap_bind' => ['bool', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls='=>'array'],
+'ldap_bind_ext' => ['resource|false', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls='=>'array'],
'ldap_close' => ['bool', 'link_identifier'=>'resource'],
'ldap_compare' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'attr'=>'string', 'value'=>'string', 'servercontrols='=>'array'],
'ldap_connect' => ['resource|false', 'host='=>'string', 'port='=>'int', 'wallet='=>'string', 'wallet_passwd='=>'string', 'authmode='=>'int'],
@@ -5899,7 +5363,7 @@
'ldap_sasl_bind' => ['bool', 'link_identifier'=>'resource', 'binddn='=>'string', 'password='=>'string', 'sasl_mech='=>'string', 'sasl_realm='=>'string', 'sasl_authc_id='=>'string', 'sasl_authz_id='=>'string', 'props='=>'string'],
'ldap_search' => ['resource|false', 'link_identifier'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'servercontrols='=>'array'],
'ldap_set_option' => ['bool', 'link_identifier'=>'resource|null', 'option'=>'int', 'newval'=>'mixed'],
-'ldap_set_rebind_proc' => ['bool', 'link_identifier'=>'resource', 'callback'=>'string'],
+'ldap_set_rebind_proc' => ['bool', 'link_identifier'=>'resource', 'callback'=>'callable'],
'ldap_sort' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', 'sortfilter'=>'string'],
'ldap_start_tls' => ['bool', 'link_identifier'=>'resource'],
'ldap_t61_to_8859' => ['string|false', 'value'=>'string'],
@@ -5918,13 +5382,13 @@
'LengthException::getLine' => ['int'],
'LengthException::getMessage' => ['string'],
'LengthException::getPrevious' => ['Throwable|LengthException|null'],
-'LengthException::getTrace' => ['array'],
+'LengthException::getTrace' => ['list\',args?:list,object?:object}>'],
'LengthException::getTraceAsString' => ['string'],
'levenshtein' => ['int', 'str1'=>'string', 'str2'=>'string'],
'levenshtein\'1' => ['int', 'str1'=>'string', 'str2'=>'string', 'cost_ins'=>'int', 'cost_rep'=>'int', 'cost_del'=>'int'],
'libxml_clear_errors' => ['void'],
'libxml_disable_entity_loader' => ['bool', 'disable='=>'bool'],
-'libxml_get_errors' => ['array'],
+'libxml_get_errors' => ['list'],
'libxml_get_last_error' => ['LibXMLError|false'],
'libxml_set_external_entity_loader' => ['bool', 'resolver_function'=>'callable'],
'libxml_set_streams_context' => ['void', 'streams_context'=>'resource'],
@@ -5949,41 +5413,41 @@
'linkinfo' => ['int|false', 'filename'=>'string'],
'litespeed_request_headers' => ['array'],
'litespeed_response_headers' => ['array|false'],
-'Locale::acceptFromHttp' => ['string|false', 'header'=>'string'],
-'Locale::canonicalize' => ['string', 'locale'=>'string'],
-'Locale::composeLocale' => ['string', 'subtags'=>'array'],
-'Locale::filterMatches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
-'Locale::getAllVariants' => ['array', 'locale'=>'string'],
-'Locale::getDefault' => ['string'],
-'Locale::getDisplayLanguage' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayName' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayRegion' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayScript' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayVariant' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getKeywords' => ['array|false', 'locale'=>'string'],
-'Locale::getPrimaryLanguage' => ['string', 'locale'=>'string'],
-'Locale::getRegion' => ['string', 'locale'=>'string'],
-'Locale::getScript' => ['string', 'locale'=>'string'],
-'Locale::lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'],
-'Locale::parseLocale' => ['array', 'locale'=>'string'],
+'Locale::acceptFromHttp' => ['non-empty-string|false', 'header'=>'string'],
+'Locale::canonicalize' => ['non-empty-string|null', 'locale'=>'string'],
+'Locale::composeLocale' => ['string|false', 'subtags'=>'array{language:string, script?:string, region?:string, variant?:array, private?:array, extlang?:array, variant0?:string, variant1?:string, variant2?:string, variant3?:string, variant4?:string, variant5?:string, variant6?:string, variant7?:string, variant8?:string, variant9?:string, variant10?:string, variant11?:string, variant12?:string, variant13?:string, variant14?:string, private0?:string, private1?:string, private2?:string, private3?:string, private4?:string, private5?:string, private6?:string, private7?:string, private8?:string, private9?:string, private10?:string, private11?:string, private12?:string, private13?:string, private14?:string, extlang0?:string, extlang1?:string, extlang2?:string}'],
+'Locale::filterMatches' => ['bool|null', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
+'Locale::getAllVariants' => ['array|null', 'locale'=>'string'],
+'Locale::getDefault' => ['non-empty-string'],
+'Locale::getDisplayLanguage' => ['non-empty-string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayName' => ['non-empty-string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayRegion' => ['string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayScript' => ['string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayVariant' => ['string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getKeywords' => ['array|null', 'locale'=>'string'],
+'Locale::getPrimaryLanguage' => ['non-empty-string|null', 'locale'=>'string'],
+'Locale::getRegion' => ['string|null', 'locale'=>'string'],
+'Locale::getScript' => ['string|null', 'locale'=>'string'],
+'Locale::lookup' => ['string|null', 'languageTag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'],
+'Locale::parseLocale' => ['array|null', 'locale'=>'string'],
'Locale::setDefault' => ['bool', 'locale'=>'string'],
-'locale_accept_from_http' => ['string|false', 'header'=>'string'],
-'locale_canonicalize' => ['', 'arg1'=>''],
-'locale_compose' => ['string|false', 'subtags'=>'array'],
-'locale_filter_matches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
-'locale_get_all_variants' => ['array', 'locale'=>'string'],
-'locale_get_default' => ['string'],
-'locale_get_display_language' => ['string|false', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_name' => ['string|false', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_region' => ['string|false', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_script' => ['string|false', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_variant' => ['string|false', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_keywords' => ['array|false', 'locale'=>'string'],
-'locale_get_primary_language' => ['string', 'locale'=>'string'],
-'locale_get_region' => ['string', 'locale'=>'string'],
-'locale_get_script' => ['string', 'locale'=>'string'],
-'locale_lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'],
-'locale_parse' => ['array', 'locale'=>'string'],
+'locale_accept_from_http' => ['non-empty-string|false', 'header'=>'string'],
+'locale_canonicalize' => ['non-empty-string|null', 'locale'=>'string'],
+'locale_compose' => ['string|false', 'subtags'=>'array{language:string, script?:string, region?:string, variant?:array, private?:array, extlang?:array, variant0?:string, variant1?:string, variant2?:string, variant3?:string, variant4?:string, variant5?:string, variant6?:string, variant7?:string, variant8?:string, variant9?:string, variant10?:string, variant11?:string, variant12?:string, variant13?:string, variant14?:string, private0?:string, private1?:string, private2?:string, private3?:string, private4?:string, private5?:string, private6?:string, private7?:string, private8?:string, private9?:string, private10?:string, private11?:string, private12?:string, private13?:string, private14?:string, extlang0?:string, extlang1?:string, extlang2?:string}'],
+'locale_filter_matches' => ['bool|null', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
+'locale_get_all_variants' => ['array|null', 'locale'=>'string'],
+'locale_get_default' => ['non-empty-string'],
+'locale_get_display_language' => ['non-empty-string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_name' => ['non-empty-string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_region' => ['string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_script' => ['string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_variant' => ['string|false', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_keywords' => ['array|null', 'locale'=>'string'],
+'locale_get_primary_language' => ['non-empty-string|null', 'locale'=>'string'],
+'locale_get_region' => ['string|null', 'locale'=>'string'],
+'locale_get_script' => ['string|null', 'locale'=>'string'],
+'locale_lookup' => ['string|null', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'],
+'locale_parse' => ['array|null', 'locale'=>'string'],
'locale_set_default' => ['bool', 'locale'=>'string'],
'localeconv' => ['array'],
'localtime' => ['array', 'timestamp='=>'int', 'associative_array='=>'bool'],
@@ -5998,7 +5462,7 @@
'LogicException::getLine' => ['int'],
'LogicException::getMessage' => ['string'],
'LogicException::getPrevious' => ['Throwable|LogicException|null'],
-'LogicException::getTrace' => ['array'],
+'LogicException::getTrace' => ['list\',args?:list,object?:object}>'],
'LogicException::getTraceAsString' => ['string'],
'long2ip' => ['string|false', 'proper_address'=>'int'],
'lstat' => ['array|false', 'filename'=>'string'],
@@ -6062,7 +5526,7 @@
'mailparse_msg_extract_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'mixed', 'callbackfunc='=>'callable'],
'mailparse_msg_extract_whole_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'string', 'callbackfunc='=>'callable'],
'mailparse_msg_free' => ['bool', 'mimemail'=>'resource'],
-'mailparse_msg_get_part' => ['resource', 'mimemail'=>'resource', 'mimesection'=>'string'],
+'mailparse_msg_get_part' => ['resource|false', 'mimemail'=>'resource', 'mimesection'=>'string'],
'mailparse_msg_get_part_data' => ['array', 'mimemail'=>'resource'],
'mailparse_msg_get_structure' => ['array', 'mimemail'=>'resource'],
'mailparse_msg_parse' => ['bool', 'mimemail'=>'resource', 'data'=>'string'],
@@ -6140,7 +5604,7 @@
'mapObj::zoomPoint' => ['int', 'nZoomFactor'=>'int', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'],
'mapObj::zoomRectangle' => ['int', 'oPixelExt'=>'rectObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'],
'mapObj::zoomScale' => ['int', 'nScaleDenom'=>'float', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj', 'oMaxGeorefExt'=>'rectObj'],
-'max' => ['', '...arg1'=>'array'],
+'max' => ['', '...arg1'=>'non-empty-array'],
'max\'1' => ['', 'arg1'=>'', 'arg2'=>'', '...args='=>''],
'maxdb::__construct' => ['void', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'],
'maxdb::affected_rows' => ['int', 'link'=>''],
@@ -6307,23 +5771,24 @@
'maxdb_thread_safe' => ['bool'],
'maxdb_use_result' => ['resource', 'link'=>''],
'maxdb_warning_count' => ['int', 'link'=>'resource'],
-'mb_check_encoding' => ['bool', 'var='=>'string', 'encoding='=>'string'],
+'mb_check_encoding' => ['bool', 'var='=>'string|array', 'encoding='=>'string'],
'mb_chr' => ['string|false', 'cp'=>'int', 'encoding='=>'string'],
'mb_convert_case' => ['string', 'sourcestring'=>'string', 'mode'=>'int', 'encoding='=>'string'],
-'mb_convert_encoding' => ['string|array|false', 'val'=>'string|array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'],
+'mb_convert_encoding' => ['string|array|false', 'val'=>'string|array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'],
'mb_convert_kana' => ['string', 'str'=>'string', 'option='=>'string', 'encoding='=>'string'],
'mb_convert_variables' => ['string|false', 'to_encoding'=>'string', 'from_encoding'=>'array|string', '&rw_vars'=>'string|array|object', '&...rw_vars='=>'string|array|object'],
'mb_decode_mimeheader' => ['string', 'string'=>'string'],
'mb_decode_numericentity' => ['string', 'string'=>'string', 'convmap'=>'array', 'encoding'=>'string'],
'mb_detect_encoding' => ['string|false', 'str'=>'string', 'encoding_list='=>'mixed', 'strict='=>'bool'],
-'mb_detect_order' => ['bool|array', 'encoding_list='=>'mixed'],
+'mb_detect_order' => ['bool', 'encoding_list'=>'non-empty-list|non-falsy-string'],
+'mb_detect_order\'1' => ['list'],
'mb_encode_mimeheader' => ['string', 'str'=>'string', 'charset='=>'string', 'transfer_encoding='=>'string', 'linefeed='=>'string', 'indent='=>'int'],
'mb_encode_numericentity' => ['string', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string', 'is_hex='=>'bool'],
-'mb_encoding_aliases' => ['array|false', 'encoding'=>'string'],
+'mb_encoding_aliases' => ['list|false', 'encoding'=>'string'],
'mb_ereg' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_registers='=>'array'],
'mb_ereg_match' => ['bool', 'pattern'=>'string', 'string'=>'string', 'option='=>'string'],
'mb_ereg_replace' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'option='=>'string'],
-'mb_ereg_replace_callback' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'option='=>'string'],
+'mb_ereg_replace_callback' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable(array):string', 'string'=>'string', 'option='=>'string'],
'mb_ereg_search' => ['bool', 'pattern='=>'string', 'option='=>'string'],
'mb_ereg_search_getpos' => ['int'],
'mb_ereg_search_getregs' => ['array|false'],
@@ -6338,7 +5803,7 @@
'mb_http_output' => ['string|bool', 'encoding='=>'string'],
'mb_internal_encoding' => ['string|bool', 'encoding='=>'string'],
'mb_language' => ['string|bool', 'language='=>'string'],
-'mb_list_encodings' => ['array'],
+'mb_list_encodings' => ['non-empty-list'],
'mb_ord' => ['int|false', 'str'=>'string', 'enc='=>'string'],
'mb_output_handler' => ['string', 'contents'=>'string', 'status'=>'int'],
'mb_parse_str' => ['bool', 'encoded_string'=>'string', '&w_result='=>'array'],
@@ -6347,21 +5812,21 @@
'mb_regex_set_options' => ['string', 'options='=>'string'],
'mb_scrub' => ['string', 'str'=>'string', 'enc='=>'string'],
'mb_send_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array|null', 'additional_parameter='=>'string'],
-'mb_split' => ['array|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'],
+'mb_split' => ['list|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'],
'mb_strcut' => ['string', 'str'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'],
'mb_strimwidth' => ['string', 'str'=>'string', 'start'=>'int', 'width'=>'int', 'trimmarker='=>'string', 'encoding='=>'string'],
-'mb_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_stripos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
'mb_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
-'mb_strlen' => ['int|false', 'str'=>'string', 'encoding='=>'string'],
-'mb_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_strlen' => ['0|positive-int|false', 'str'=>'string', 'encoding='=>'string'],
+'mb_strpos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
'mb_strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
'mb_strrichr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
-'mb_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
-'mb_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_strripos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_strrpos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
'mb_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
-'mb_strtolower' => ['string', 'str'=>'string', 'encoding='=>'string'],
-'mb_strtoupper' => ['string', 'str'=>'string', 'encoding='=>'string'],
-'mb_strwidth' => ['int', 'str'=>'string', 'encoding='=>'string'],
+'mb_strtolower' => ['lowercase-string', 'str'=>'string', 'encoding='=>'string'],
+'mb_strtoupper' => ['uppercase-string', 'str'=>'string', 'encoding='=>'string'],
+'mb_strwidth' => ['0|positive-int', 'str'=>'string', 'encoding='=>'string'],
'mb_substitute_character' => ['mixed', 'substchar='=>'mixed'],
'mb_substr' => ['string', 'str'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'],
'mb_substr_count' => ['0|positive-int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'],
@@ -6401,8 +5866,8 @@
'mcrypt_module_open' => ['resource|false', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'],
'mcrypt_module_self_test' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'],
'mcrypt_ofb' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'],
-'md5' => ['string', 'str'=>'string', 'raw_output='=>'bool'],
-'md5_file' => ['string|false', 'filename'=>'string', 'raw_output='=>'bool'],
+'md5' => ['non-falsy-string&lowercase-string', 'str'=>'string', 'raw_output='=>'bool'],
+'md5_file' => ['(non-falsy-string&lowercase-string)|false', 'filename'=>'string', 'raw_output='=>'bool'],
'mdecrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'],
'Memcache::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'],
'Memcache::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'],
@@ -6411,7 +5876,8 @@
'Memcache::decrement' => ['int', 'key'=>'string', 'value='=>'int'],
'Memcache::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'],
'Memcache::flush' => ['bool'],
-'Memcache::get' => ['string|array|false', 'key'=>'string', '&flags='=>'array', '&keys='=>'array'],
+'Memcache::get' => ['mixed', 'key'=>'string', '&flags='=>'int'],
+'Memcache::get\'1' => ['mixed[]|false', 'keys'=>'string[]', '&flags='=>'int[]'],
'Memcache::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
'Memcache::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'],
'Memcache::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
@@ -6478,7 +5944,8 @@
'MemcachePool::decrement' => ['int', 'key'=>'string', 'value='=>'int'],
'MemcachePool::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'],
'MemcachePool::flush' => ['bool'],
-'MemcachePool::get' => ['string|array|false', 'key'=>'string', '&flags='=>'array', '&keys='=>'array'],
+'MemcachePool::get' => ['mixed', 'key'=>'string', '&flags='=>'int'],
+'MemcachePool::get\'1' => ['mixed[]|false', 'keys'=>'string[]', '&flags='=>'int[]'],
'MemcachePool::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
'MemcachePool::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'],
'MemcachePool::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
@@ -6488,8 +5955,8 @@
'MemcachePool::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'],
'MemcachePool::setCompressThreshold' => ['bool', 'threshold'=>'int', 'min_savings='=>'float'],
'MemcachePool::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'],
-'memory_get_peak_usage' => ['int', 'real_usage='=>'bool'],
-'memory_get_usage' => ['int', 'real_usage='=>'bool'],
+'memory_get_peak_usage' => ['positive-int', 'real_usage='=>'bool'],
+'memory_get_usage' => ['positive-int', 'real_usage='=>'bool'],
'MessageFormatter::__construct' => ['void', 'locale'=>'string', 'pattern'=>'string'],
'MessageFormatter::create' => ['MessageFormatter', 'locale'=>'string', 'pattern'=>'string'],
'MessageFormatter::format' => ['false|string', 'args'=>'array'],
@@ -6510,7 +5977,7 @@
'mhash_keygen_s2k' => ['string|false', 'hash'=>'int', 'input_password'=>'string', 'salt'=>'string', 'bytes'=>'int'],
'microtime' => ['mixed', 'get_as_float='=>'bool'],
'mime_content_type' => ['string|false', 'filename_or_stream'=>'string|resource'],
-'min' => ['', '...arg1'=>'array'],
+'min' => ['', '...arg1'=>'non-empty-array'],
'min\'1' => ['', 'arg1'=>'', 'arg2'=>'', '...args='=>''],
'ming_keypress' => ['int', 'char'=>'string'],
'ming_setcubicthreshold' => ['void', 'threshold'=>'int'],
@@ -6519,7 +5986,7 @@
'ming_useconstants' => ['void', 'use'=>'int'],
'ming_useswfversion' => ['void', 'version'=>'int'],
'mkdir' => ['bool', 'pathname'=>'string', 'mode='=>'int', 'recursive='=>'bool', 'context='=>'resource'],
-'mktime' => ['int|false', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'],
+'mktime' => ['__benevolent', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'],
'money_format' => ['string', 'format'=>'string', 'value'=>'float'],
'Mongo::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'],
'Mongo::__get' => ['MongoDB', 'dbname'=>'string'],
@@ -6589,7 +6056,7 @@
'MongoCollection::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'],
'MongoCollection::find' => ['MongoCursor', 'query='=>'array', 'fields='=>'array'],
'MongoCollection::findAndModify' => ['array', 'query'=>'array', 'update='=>'array', 'fields='=>'array', 'options='=>'array'],
-'MongoCollection::findOne' => ['array', 'query='=>'array', 'fields='=>'array'],
+'MongoCollection::findOne' => ['array|null', 'query='=>'array', 'fields='=>'array'],
'MongoCollection::getDBRef' => ['array', 'ref'=>'array'],
'MongoCollection::getIndexInfo' => ['array'],
'MongoCollection::getName' => ['string'],
@@ -6600,7 +6067,7 @@
'MongoCollection::insert' => ['bool|array', 'a'=>'array', 'options='=>'array'],
'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors'=>'int'],
'MongoCollection::remove' => ['bool|array', 'criteria='=>'array', 'options='=>'array'],
-'MongoCollection::save' => ['mixed', 'a'=>'array', 'options='=>'array'],
+'MongoCollection::save' => ['mixed', 'a'=>'array|object', 'options='=>'array'],
'MongoCollection::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'],
'MongoCollection::setSlaveOkay' => ['bool', 'ok='=>'bool'],
'MongoCollection::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'],
@@ -6662,7 +6129,7 @@
'MongoCursorException::getLine' => ['int'],
'MongoCursorException::getMessage' => ['string'],
'MongoCursorException::getPrevious' => ['Exception|Throwable'],
-'MongoCursorException::getTrace' => ['array'],
+'MongoCursorException::getTrace' => ['list\',args?:list,object?:object}>'],
'MongoCursorException::getTraceAsString' => ['string'],
'MongoCursorInterface::__construct' => ['void'],
'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize'=>'int'],
@@ -6708,126 +6175,6 @@
'MongoDB::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'],
'MongoDB::setSlaveOkay' => ['bool', 'ok='=>'bool'],
'MongoDB::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'],
-'MongoDB\BSON\Binary::__construct' => ['void', 'data'=>'string', 'type'=>'int'],
-'MongoDB\BSON\Binary::getData' => ['string'],
-'MongoDB\BSON\Binary::getType' => ['int'],
-'MongoDB\BSON\Decimal128::__construct' => ['void', 'value='=>'string'],
-'MongoDB\BSON\Decimal128::__toString' => ['string'],
-'MongoDB\BSON\fromJSON' => ['string', 'json'=>'string'],
-'MongoDB\BSON\fromPHP' => ['string', 'value'=>'array|object'],
-'MongoDB\BSON\Javascript::__construct' => ['void', 'code'=>'string', 'scope='=>'array|object'],
-'MongoDB\BSON\ObjectId::__construct' => ['void', 'id='=>'string'],
-'MongoDB\BSON\ObjectId::__toString' => ['string'],
-'MongoDB\BSON\Regex::__construct' => ['void', 'pattern'=>'string', 'flags='=>'string'],
-'MongoDB\BSON\Regex::__toString' => ['string'],
-'MongoDB\BSON\Regex::getFlags' => [''],
-'MongoDB\BSON\Regex::getPattern' => ['string'],
-'MongoDB\BSON\Serializable::bsonSerialize' => ['array|object'],
-'MongoDB\BSON\Timestamp::__construct' => ['void', 'increment'=>'int', 'timestamp'=>'int'],
-'MongoDB\BSON\Timestamp::__toString' => ['string'],
-'MongoDB\BSON\toJSON' => ['string', 'bson'=>'string'],
-'MongoDB\BSON\toPHP' => ['object', 'bson'=>'string', 'typeMap='=>'array'],
-'MongoDB\BSON\Unserializable::bsonUnserialize' => ['', 'data'=>'array'],
-'MongoDB\BSON\UTCDateTime::__construct' => ['void', 'milliseconds='=>'int|DateTimeInterface'],
-'MongoDB\BSON\UTCDateTime::__toString' => ['string'],
-'MongoDB\BSON\UTCDateTime::toDateTime' => ['DateTime'],
-'MongoDB\Driver\BulkWrite::__construct' => ['void', 'ordered='=>'bool'],
-'MongoDB\Driver\BulkWrite::count' => ['0|positive-int'],
-'MongoDB\Driver\BulkWrite::delete' => ['void', 'filter'=>'array|object', 'deleteOptions='=>'array'],
-'MongoDB\Driver\BulkWrite::insert' => ['MongoDB\Driver\ObjectID', 'document'=>'array|object'],
-'MongoDB\Driver\BulkWrite::update' => ['void', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array'],
-'MongoDB\Driver\Command::__construct' => ['void', 'document'=>'array|object'],
-'MongoDB\Driver\Cursor::__construct' => ['void', 'server'=>'Server', 'responseDocument'=>'string'],
-'MongoDB\Driver\Cursor::getId' => ['MongoDB\Driver\CursorId'],
-'MongoDB\Driver\Cursor::getServer' => ['MongoDB\Driver\Server'],
-'MongoDB\Driver\Cursor::isDead' => ['bool'],
-'MongoDB\Driver\Cursor::setTypeMap' => ['void', 'typemap'=>'array'],
-'MongoDB\Driver\Cursor::toArray' => ['array'],
-'MongoDB\Driver\CursorId::__construct' => ['void', 'id'=>'string'],
-'MongoDB\Driver\CursorId::__toString' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::__clone' => ['void'],
-'MongoDB\Driver\Exception\RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?RuntimeException)|(?Throwable)'],
-'MongoDB\Driver\Exception\RuntimeException::__toString' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::__wakeup' => ['void'],
-'MongoDB\Driver\Exception\RuntimeException::getCode' => ['int'],
-'MongoDB\Driver\Exception\RuntimeException::getFile' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::getLine' => ['int'],
-'MongoDB\Driver\Exception\RuntimeException::getMessage' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::getPrevious' => ['RuntimeException|Throwable'],
-'MongoDB\Driver\Exception\RuntimeException::getTrace' => ['array'],
-'MongoDB\Driver\Exception\RuntimeException::getTraceAsString' => ['string'],
-'MongoDB\Driver\Exception\WriteException::__clone' => ['void'],
-'MongoDB\Driver\Exception\WriteException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?RuntimeException)|(?Throwable)'],
-'MongoDB\Driver\Exception\WriteException::__toString' => ['string'],
-'MongoDB\Driver\Exception\WriteException::__wakeup' => ['void'],
-'MongoDB\Driver\Exception\WriteException::getCode' => ['int'],
-'MongoDB\Driver\Exception\WriteException::getFile' => ['string'],
-'MongoDB\Driver\Exception\WriteException::getLine' => ['int'],
-'MongoDB\Driver\Exception\WriteException::getMessage' => ['string'],
-'MongoDB\Driver\Exception\WriteException::getPrevious' => ['RuntimeException|Throwable'],
-'MongoDB\Driver\Exception\WriteException::getTrace' => ['array'],
-'MongoDB\Driver\Exception\WriteException::getTraceAsString' => ['string'],
-'MongoDB\Driver\Exception\WriteException::getWriteResult' => ['MongoDB\Driver\WriteResult'],
-'MongoDB\Driver\Manager::__construct' => ['void', 'uri'=>'string', 'options='=>'array', 'driverOptions='=>'array'],
-'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'readPreference='=>'MongoDB\Driver\ReadPreference'],
-'MongoDB\Driver\Manager::executeDelete' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'deleteOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::executeInsert' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'document'=>'array|object', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'readPreference='=>'MongoDB\Driver\ReadPreference'],
-'MongoDB\Driver\Manager::executeUpdate' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::getReadConcern' => ['MongoDB\Driver\ReadConcern'],
-'MongoDB\Driver\Manager::getReadPreference' => ['MongoDB\Driver\ReadPreference'],
-'MongoDB\Driver\Manager::getServers' => ['array'],
-'MongoDB\Driver\Manager::getWriteConcern' => ['MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::selectServer' => ['MongoDB\Driver\Server', 'readPreference'=>'MongoDB\Driver\ReadPreference'],
-'MongoDB\Driver\Query::__construct' => ['void', 'filter'=>'array|object', 'queryOptions='=>'array'],
-'MongoDB\Driver\ReadConcern::__construct' => ['void', 'level='=>'string'],
-'MongoDB\Driver\ReadConcern::bsonSerialize' => ['object'],
-'MongoDB\Driver\ReadConcern::getLevel' => ['null|string'],
-'MongoDB\Driver\ReadPreference::__construct' => ['void', 'mode'=>'string|int', 'tagSets='=>'array', 'options='=>'array'],
-'MongoDB\Driver\ReadPreference::bsonSerialize' => ['object'],
-'MongoDB\Driver\ReadPreference::getMode' => ['int'],
-'MongoDB\Driver\ReadPreference::getTagSets' => ['array'],
-'MongoDB\Driver\Server::__construct' => ['void', 'host'=>'string', 'port'=>'string', 'options='=>'array', 'driverOptions='=>'array'],
-'MongoDB\Driver\Server::executeBulkWrite' => ['', 'namespace'=>'string', 'zwrite'=>'BulkWrite'],
-'MongoDB\Driver\Server::executeCommand' => ['', 'db'=>'string', 'command'=>'Command'],
-'MongoDB\Driver\Server::executeQuery' => ['', 'namespace'=>'string', 'zquery'=>'Query'],
-'MongoDB\Driver\Server::getHost' => [''],
-'MongoDB\Driver\Server::getInfo' => [''],
-'MongoDB\Driver\Server::getLatency' => [''],
-'MongoDB\Driver\Server::getPort' => [''],
-'MongoDB\Driver\Server::getState' => [''],
-'MongoDB\Driver\Server::getTags' => ['array'],
-'MongoDB\Driver\Server::getType' => [''],
-'MongoDB\Driver\Server::isArbiter' => ['bool'],
-'MongoDB\Driver\Server::isDelayed' => [''],
-'MongoDB\Driver\Server::isHidden' => ['bool'],
-'MongoDB\Driver\Server::isPassive' => [''],
-'MongoDB\Driver\Server::isPrimary' => ['bool'],
-'MongoDB\Driver\Server::isSecondary' => ['bool'],
-'MongoDB\Driver\WriteConcern::__construct' => ['void', 'w'=>'string|int', 'wtimeout='=>'int', 'journal='=>'bool', 'fsync='=>'bool'],
-'MongoDB\Driver\WriteConcern::getJurnal' => ['bool|null'],
-'MongoDB\Driver\WriteConcern::getW' => ['int|null|string'],
-'MongoDB\Driver\WriteConcern::getWtimeout' => ['int'],
-'MongoDB\Driver\WriteConcernError::getCode' => [''],
-'MongoDB\Driver\WriteConcernError::getInfo' => [''],
-'MongoDB\Driver\WriteConcernError::getMessage' => [''],
-'MongoDB\Driver\WriteError::getCode' => [''],
-'MongoDB\Driver\WriteError::getIndex' => [''],
-'MongoDB\Driver\WriteError::getInfo' => ['mixed'],
-'MongoDB\Driver\WriteError::getMessage' => [''],
-'MongoDB\Driver\WriteException::getWriteResult' => [''],
-'MongoDB\Driver\WriteResult::getDeletedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getInfo' => [''],
-'MongoDB\Driver\WriteResult::getInsertedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getMatchedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getModifiedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getServer' => [''],
-'MongoDB\Driver\WriteResult::getUpsertedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getUpsertedIds' => [''],
-'MongoDB\Driver\WriteResult::getWriteConcernError' => [''],
-'MongoDB\Driver\WriteResult::getWriteErrors' => [''],
-'MongoDB\Driver\WriteResult::isAcknowledged' => ['bool'],
'MongoDBRef::create' => ['array', 'collection'=>'string', 'id'=>'mixed', 'database='=>'string'],
'MongoDBRef::get' => ['array', 'db'=>'mongodb', 'ref'=>'array'],
'MongoDBRef::isRef' => ['bool', 'ref'=>'mixed'],
@@ -6841,7 +6188,7 @@
'MongoException::getLine' => ['int'],
'MongoException::getMessage' => ['string'],
'MongoException::getPrevious' => ['Exception|Throwable'],
-'MongoException::getTrace' => ['array'],
+'MongoException::getTrace' => ['list\',args?:list,object?:object}>'],
'MongoException::getTraceAsString' => ['string'],
'MongoGridFS::__construct' => ['void', 'db'=>'MongoDB', 'prefix='=>'string', 'chunks='=>'mixed'],
'MongoGridFS::__get' => ['MongoCollection', 'name'=>'string'],
@@ -6934,7 +6281,7 @@
'MongoLog::getCallback' => ['callable'],
'MongoLog::getLevel' => ['int'],
'MongoLog::getModule' => ['int'],
-'MongoLog::setCallback' => ['void', 'log_function'=>'callable'],
+'MongoLog::setCallback' => ['bool', 'log_function'=>'callable'],
'MongoLog::setLevel' => ['void', 'level'=>'int'],
'MongoLog::setModule' => ['void', 'module'=>'int'],
'MongoPool::getSize' => ['int'],
@@ -6952,7 +6299,7 @@
'MongoResultException::getLine' => ['int'],
'MongoResultException::getMessage' => ['string'],
'MongoResultException::getPrevious' => ['Exception|Throwable'],
-'MongoResultException::getTrace' => ['array'],
+'MongoResultException::getTrace' => ['list\',args?:list,object?:object}>'],
'MongoResultException::getTraceAsString' => ['string'],
'MongoTimestamp::__construct' => ['void', 'sec='=>'int', 'inc='=>'int'],
'MongoTimestamp::__toString' => ['string'],
@@ -6972,7 +6319,7 @@
'MongoWriteConcernException::getLine' => ['int'],
'MongoWriteConcernException::getMessage' => ['string'],
'MongoWriteConcernException::getPrevious' => ['Exception|Throwable'],
-'MongoWriteConcernException::getTrace' => ['array'],
+'MongoWriteConcernException::getTrace' => ['list\',args?:list,object?:object}>'],
'MongoWriteConcernException::getTraceAsString' => ['string'],
'monitor_custom_event' => ['void', 'class'=>'string', 'text'=>'string', 'severe='=>'int', 'user_data='=>'mixed'],
'monitor_httperror_event' => ['void', 'error_code'=>'int', 'url'=>'string', 'severe='=>'int'],
@@ -7107,11 +6454,11 @@
'mt_rand\'1' => ['int'],
'mt_srand' => ['void', 'seed='=>'int', 'mode='=>'int'],
'MultipleIterator::__construct' => ['void', 'flags='=>'int'],
-'MultipleIterator::attachIterator' => ['void', 'iterator'=>'iterator', 'infos='=>'string'],
-'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'iterator'],
+'MultipleIterator::attachIterator' => ['void', 'iterator'=>'Iterator', 'infos='=>'string'],
+'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'Iterator'],
'MultipleIterator::countIterators' => ['int'],
'MultipleIterator::current' => ['array'],
-'MultipleIterator::detachIterator' => ['void', 'iterator'=>'iterator'],
+'MultipleIterator::detachIterator' => ['void', 'iterator'=>'Iterator'],
'MultipleIterator::getFlags' => ['int'],
'MultipleIterator::key' => ['array'],
'MultipleIterator::next' => ['void'],
@@ -7179,7 +6526,7 @@
'mysqli::get_charset' => ['object'],
'mysqli::get_client_info' => ['string'],
'mysqli::get_connection_stats' => ['array|false'],
-'mysqli::get_warnings' => ['mysqli_warning'],
+'mysqli::get_warnings' => ['mysqli_warning|false'],
'mysqli::init' => ['mysqli'],
'mysqli::kill' => ['bool', 'processid'=>'int'],
'mysqli::more_results' => ['bool'],
@@ -7190,7 +6537,7 @@
'mysqli::poll' => ['int|false', '&w_read'=>'array', '&w_error'=>'array', '&w_reject'=>'array', 'sec'=>'int', 'usec='=>'int'],
'mysqli::prepare' => ['mysqli_stmt|false', 'query'=>'string'],
'mysqli::query' => ['bool|mysqli_result', 'query'=>'string', 'resultmode='=>'int'],
-'mysqli::real_connect' => ['bool', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string', 'flags='=>'int'],
+'mysqli::real_connect' => ['bool', 'host='=>'?string', 'username='=>'?string', 'passwd='=>'?string', 'dbname='=>'?string', 'port='=>'?int', 'socket='=>'?string', 'flags='=>'int'],
'mysqli::real_escape_string' => ['string', 'escapestr'=>'string'],
'mysqli::real_query' => ['bool', 'query'=>'string'],
'mysqli::reap_async_query' => ['mysqli_result|false'],
@@ -7210,7 +6557,7 @@
'mysqli::store_result' => ['mysqli_result|false', 'option='=>'int'],
'mysqli::thread_safe' => ['bool'],
'mysqli::use_result' => ['mysqli_result|false'],
-'mysqli_affected_rows' => ['int', 'link'=>'mysqli'],
+'mysqli_affected_rows' => ['int<-1,max>|numeric-string', 'link'=>'mysqli'],
'mysqli_autocommit' => ['bool', 'link'=>'mysqli', 'mode'=>'bool'],
'mysqli_begin_transaction' => ['bool', 'link'=>'mysqli', 'flags='=>'int', 'name='=>'string'],
'mysqli_change_user' => ['bool', 'link'=>'mysqli', 'user'=>'string', 'password'=>'string', 'database'=>'string'],
@@ -7234,14 +6581,15 @@
'mysqli_errno' => ['int', 'link'=>'mysqli'],
'mysqli_error' => ['string|null', 'link'=>'mysqli'],
'mysqli_error_list' => ['array', 'connection'=>'mysqli'],
-'mysqli_fetch_all' => ['array|false', 'result'=>'mysqli_result', 'resulttype='=>'int'],
+'mysqli_fetch_all' => ['list', 'result'=>'mysqli_result', 'resulttype='=>'int'],
'mysqli_fetch_array' => ['array|null|false', 'result'=>'mysqli_result', 'resulttype='=>'int'],
-'mysqli_fetch_assoc' => ['array|null', 'result'=>'mysqli_result'],
-'mysqli_fetch_field' => ['object|false', 'result'=>'mysqli_result'],
-'mysqli_fetch_field_direct' => ['object|false', 'result'=>'mysqli_result', 'fieldnr'=>'int'],
-'mysqli_fetch_fields' => ['array|false', 'result'=>'mysqli_result'],
+'mysqli_fetch_assoc' => ['array|null|false', 'result'=>'mysqli_result'],
+'mysqli_fetch_column' => ['null|int|float|string|false', 'result' => 'mysqli_result', 'column'=>'int'],
+'mysqli_fetch_field' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false', 'result'=>'mysqli_result'],
+'mysqli_fetch_field_direct' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false', 'result'=>'mysqli_result', 'fieldnr'=>'int'],
+'mysqli_fetch_fields' => ['list', 'result'=>'mysqli_result'],
'mysqli_fetch_lengths' => ['array|false', 'result'=>'mysqli_result'],
-'mysqli_fetch_object' => ['object|null', 'result'=>'mysqli_result', 'class_name='=>'string', 'params='=>'?array'],
+'mysqli_fetch_object' => ['object|false|null', 'result'=>'mysqli_result', 'class_name='=>'string', 'params='=>'?array'],
'mysqli_fetch_row' => ['array|null', 'result'=>'mysqli_result'],
'mysqli_field_count' => ['int', 'link'=>'mysqli'],
'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'fieldnr'=>'int'],
@@ -7269,13 +6617,13 @@
'mysqli_multi_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'],
'mysqli_next_result' => ['bool', 'link'=>'mysqli'],
'mysqli_num_fields' => ['int', 'link'=>'mysqli_result'],
-'mysqli_num_rows' => ['int', 'link'=>'mysqli_result'],
+'mysqli_num_rows' => ['int<0,max>|numeric-string', 'link'=>'mysqli_result'],
'mysqli_options' => ['bool', 'link'=>'mysqli', 'option'=>'int', 'value'=>'mixed'],
'mysqli_ping' => ['bool', 'link'=>'mysqli'],
'mysqli_poll' => ['int|false', 'read'=>'array', 'error'=>'array', 'reject'=>'array', 'sec'=>'int', 'usec='=>'int'],
'mysqli_prepare' => ['mysqli_stmt|false', 'link'=>'mysqli', 'query'=>'string'],
'mysqli_query' => ['mysqli_result|bool', 'link'=>'mysqli', 'query'=>'string', 'resultmode='=>'int'],
-'mysqli_real_connect' => ['bool', 'link='=>'mysqli', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string', 'flags='=>'int'],
+'mysqli_real_connect' => ['bool', 'link='=>'mysqli', 'host='=>'?string', 'username='=>'?string', 'passwd='=>'?string', 'dbname='=>'?string', 'port='=>'?int', 'socket='=>'?string', 'flags='=>'int'],
'mysqli_real_escape_string' => ['string', 'link'=>'mysqli', 'escapestr'=>'string'],
'mysqli_real_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'],
'mysqli_reap_async_query' => ['mysqli_result|false', 'link'=>'mysqli'],
@@ -7285,12 +6633,13 @@
'mysqli_result::__construct' => ['void', 'link'=>'mysqli', 'resultmode='=>'int'],
'mysqli_result::close' => ['void'],
'mysqli_result::data_seek' => ['bool', 'offset'=>'int'],
-'mysqli_result::fetch_all' => ['array', 'resulttype='=>'int'],
-'mysqli_result::fetch_array' => ['array|null', 'resulttype='=>'int'],
-'mysqli_result::fetch_assoc' => ['array|null'],
-'mysqli_result::fetch_field' => ['object|false'],
-'mysqli_result::fetch_field_direct' => ['object|false', 'fieldnr'=>'int'],
-'mysqli_result::fetch_fields' => ['array|false'],
+'mysqli_result::fetch_all' => ['list', 'resulttype='=>'int'],
+'mysqli_result::fetch_array' => ['array|null|false', 'resulttype='=>'int'],
+'mysqli_result::fetch_assoc' => ['array|null|false'],
+'mysqli_result::fetch_column' => ['null|int|float|string|false', 'column'=>'int'],
+'mysqli_result::fetch_field' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false'],
+'mysqli_result::fetch_field_direct' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false', 'fieldnr'=>'int'],
+'mysqli_result::fetch_fields' => ['list'],
'mysqli_result::fetch_object' => ['object|null', 'class_name='=>'string', 'params='=>'array'],
'mysqli_result::fetch_row' => ['array|null'],
'mysqli_result::field_seek' => ['bool', 'fieldnr'=>'int'],
@@ -7322,16 +6671,16 @@
'mysqli_stmt::fetch' => ['bool|null'],
'mysqli_stmt::free_result' => ['void'],
'mysqli_stmt::get_result' => ['mysqli_result|false'],
-'mysqli_stmt::get_warnings' => ['object'],
+'mysqli_stmt::get_warnings' => ['mysqli_warning|false'],
'mysqli_stmt::more_results' => ['bool'],
'mysqli_stmt::next_result' => ['bool'],
-'mysqli_stmt::num_rows' => ['int'],
+'mysqli_stmt::num_rows' => ['int<0,max>|numeric-string'],
'mysqli_stmt::prepare' => ['bool', 'query'=>'string'],
'mysqli_stmt::reset' => ['bool'],
'mysqli_stmt::result_metadata' => ['mysqli_result|false'],
'mysqli_stmt::send_long_data' => ['bool', 'param_nr'=>'int', 'data'=>'string'],
'mysqli_stmt::store_result' => ['bool'],
-'mysqli_stmt_affected_rows' => ['int|string', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_affected_rows' => ['int<-1,max>|numeric-string', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_attr_get' => ['int|false', 'stmt'=>'mysqli_stmt', 'attr'=>'int'],
'mysqli_stmt_attr_set' => ['bool', 'stmt'=>'mysqli_stmt', 'attr'=>'int', 'mode'=>'int'],
'mysqli_stmt_bind_param' => ['bool', 'stmt'=>'mysqli_stmt', 'types'=>'string', 'var1'=>'mixed', '...args='=>'mixed'],
@@ -7340,24 +6689,24 @@
'mysqli_stmt_data_seek' => ['void', 'stmt'=>'mysqli_stmt', 'offset'=>'int'],
'mysqli_stmt_errno' => ['int', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_error' => ['string', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_error_list' => ['array', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_error_list' => ['list', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_execute' => ['bool', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_fetch' => ['bool|null', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_field_count' => ['int', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_field_count' => ['0|positive-int', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_free_result' => ['void', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_get_result' => ['mysqli_result|false', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_get_warnings' => ['object|false', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_get_warnings' => ['mysqli_warning|false', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_init' => ['mysqli_stmt|false', 'link'=>'mysqli'],
'mysqli_stmt_insert_id' => ['', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_more_results' => ['bool', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_next_result' => ['bool', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_num_rows' => ['int', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_param_count' => ['int', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_num_rows' => ['0|positive-int', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_param_count' => ['0|positive-int', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_prepare' => ['bool', 'stmt'=>'mysqli_stmt', 'query'=>'string'],
'mysqli_stmt_reset' => ['bool', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_send_long_data' => ['bool', 'stmt'=>'mysqli_stmt', 'param_nr'=>'int', 'data'=>'string'],
-'mysqli_stmt_sqlstate' => ['string', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_sqlstate' => ['non-empty-string', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_store_result' => ['bool', 'stmt'=>'mysqli_stmt'],
'mysqli_store_result' => ['mysqli_result|false', 'link'=>'mysqli', 'option='=>'int'],
'mysqli_thread_id' => ['int', 'link'=>'mysqli'],
@@ -7754,9 +7103,9 @@
'ngettext' => ['string', 'msgid1'=>'string', 'msgid2'=>'string', 'n'=>'int'],
'nl2br' => ['string', 'str'=>'string', 'is_xhtml='=>'bool'],
'nl_langinfo' => ['string|false', 'item'=>'int'],
-'NoRewindIterator::__construct' => ['void', 'iterator'=>'iterator'],
+'NoRewindIterator::__construct' => ['void', 'iterator'=>'Iterator'],
'NoRewindIterator::current' => ['mixed'],
-'NoRewindIterator::getInnerIterator' => ['iterator'],
+'NoRewindIterator::getInnerIterator' => ['Iterator'],
'NoRewindIterator::key' => ['mixed'],
'NoRewindIterator::next' => ['void'],
'NoRewindIterator::rewind' => ['void'],
@@ -7785,11 +7134,11 @@
'nsapi_response_headers' => ['array'],
'nsapi_virtual' => ['bool', 'uri'=>'string'],
'nthmac' => ['string', 'clent'=>'string', 'data'=>'string'],
-'number_format' => ['string', 'number'=>'float', 'num_decimal_places='=>'int', 'dec_separator='=>'string|null', 'thousands_separator='=>'string|null'],
+'number_format' => ['non-empty-string', 'number'=>'float', 'num_decimal_places='=>'int', 'dec_separator='=>'string|null', 'thousands_separator='=>'string|null'],
'NumberFormatter::__construct' => ['void', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'],
'NumberFormatter::create' => ['NumberFormatter', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'],
-'NumberFormatter::format' => ['string', 'num'=>'', 'type='=>'int'],
-'NumberFormatter::formatCurrency' => ['string', 'num'=>'float', 'currency'=>'string'],
+'NumberFormatter::format' => ['string|false', 'num'=>'', 'type='=>'int'],
+'NumberFormatter::formatCurrency' => ['string|false', 'num'=>'float', 'currency'=>'string'],
'NumberFormatter::getAttribute' => ['int', 'attr'=>'int'],
'NumberFormatter::getErrorCode' => ['int'],
'NumberFormatter::getErrorMessage' => ['string'],
@@ -7798,7 +7147,7 @@
'NumberFormatter::getSymbol' => ['string', 'attr'=>'int'],
'NumberFormatter::getTextAttribute' => ['string', 'attr'=>'int'],
'NumberFormatter::parse' => ['float|false', 'str'=>'string', 'type='=>'int', '&rw_position='=>'int'],
-'NumberFormatter::parseCurrency' => ['float', 'str'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'],
+'NumberFormatter::parseCurrency' => ['float|false', 'str'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'],
'NumberFormatter::setAttribute' => ['bool', 'attr'=>'int', 'value'=>''],
'NumberFormatter::setPattern' => ['bool', 'pattern'=>'string'],
'NumberFormatter::setSymbol' => ['bool', 'attr'=>'int', 'symbol'=>'string'],
@@ -7879,7 +7228,7 @@
'ob_iconv_handler' => ['string', 'contents'=>'string', 'status'=>'int'],
'ob_implicit_flush' => ['void', 'flag='=>'int'],
'ob_inflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'],
-'ob_list_handlers' => ['false|array'],
+'ob_list_handlers' => ['false|list'],
'ob_start' => ['bool', 'user_function='=>'string|array|callable|null', 'chunk_size='=>'int', 'flags='=>'int'],
'ob_tidyhandler' => ['string', 'input'=>'string', 'mode='=>'int'],
'OCI-Collection::append' => ['bool', 'value'=>'mixed'],
@@ -7976,8 +7325,8 @@
'oci_new_connect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'],
'oci_new_cursor' => ['resource|false', 'connection'=>'resource'],
'oci_new_descriptor' => ['OCI-Lob|false', 'connection'=>'resource', 'type='=>'int'],
-'oci_num_fields' => ['int|false', 'stmt'=>'resource'],
-'oci_num_rows' => ['int|false', 'stmt'=>'resource'],
+'oci_num_fields' => ['0|positive-int|false', 'stmt'=>'resource'],
+'oci_num_rows' => ['0|positive-int|false', 'stmt'=>'resource'],
'oci_parse' => ['resource|false', 'connection'=>'resource', 'statement'=>'string'],
'oci_password_change' => ['bool', 'connection'=>'', 'username'=>'string', 'old_password'=>'string', 'new_password'=>'string'],
'oci_pconnect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'],
@@ -7997,18 +7346,18 @@
'ocifetchinto' => ['int|false', 'stmt'=>'', '&w_output'=>'array', 'mode='=>'int'],
'ocigetbufferinglob' => ['bool'],
'ocisetbufferinglob' => ['bool', 'flag'=>'bool'],
-'octdec' => ['int', 'octal_number'=>'string'],
+'octdec' => ['int|float', 'octal_number'=>'string'],
'odbc_autocommit' => ['mixed', 'connection_id'=>'resource', 'onoff='=>'bool'],
'odbc_binmode' => ['bool', 'result_id'=>'int', 'mode'=>'int'],
'odbc_close' => ['void', 'connection_id'=>'resource'],
'odbc_close_all' => ['void'],
-'odbc_columnprivileges' => ['resource', 'connection_id'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'],
-'odbc_columns' => ['resource', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'table_name='=>'string', 'column_name='=>'string'],
+'odbc_columnprivileges' => ['resource|false', 'connection_id'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'],
+'odbc_columns' => ['resource|false', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'table_name='=>'string', 'column_name='=>'string'],
'odbc_commit' => ['bool', 'connection_id'=>'resource'],
'odbc_connect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'],
'odbc_cursor' => ['string|false', 'result_id'=>'resource'],
'odbc_data_source' => ['array|false', 'connection_id'=>'resource', 'fetch_type'=>'int'],
-'odbc_do' => ['resource', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'],
+'odbc_do' => ['resource|false', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'],
'odbc_error' => ['string', 'connection_id='=>'resource'],
'odbc_errormsg' => ['string', 'connection_id='=>'resource'],
'odbc_exec' => ['resource|false', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'],
@@ -8023,26 +7372,26 @@
'odbc_field_precision' => ['int|false', 'result_id'=>'resource', 'field_number'=>'int'],
'odbc_field_scale' => ['int|false', 'result_id'=>'resource', 'field_number'=>'int'],
'odbc_field_type' => ['string|false', 'result_id'=>'resource', 'field_number'=>'int'],
-'odbc_foreignkeys' => ['resource', 'connection_id'=>'resource', 'pk_qualifier'=>'string', 'pk_owner'=>'string', 'pk_table'=>'string', 'fk_qualifier'=>'string', 'fk_owner'=>'string', 'fk_table'=>'string'],
+'odbc_foreignkeys' => ['resource|false', 'connection_id'=>'resource', 'pk_qualifier'=>'string', 'pk_owner'=>'string', 'pk_table'=>'string', 'fk_qualifier'=>'string', 'fk_owner'=>'string', 'fk_table'=>'string'],
'odbc_free_result' => ['bool', 'result_id'=>'resource'],
-'odbc_gettypeinfo' => ['resource', 'connection_id'=>'resource', 'data_type='=>'int'],
+'odbc_gettypeinfo' => ['resource|false', 'connection_id'=>'resource', 'data_type='=>'int'],
'odbc_longreadlen' => ['bool', 'result_id'=>'resource', 'length'=>'int'],
'odbc_next_result' => ['bool', 'result_id'=>'resource'],
'odbc_num_fields' => ['int', 'result_id'=>'resource'],
'odbc_num_rows' => ['int', 'result_id'=>'resource'],
-'odbc_pconnect' => ['resource', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'],
+'odbc_pconnect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'],
'odbc_prepare' => ['resource|false', 'connection_id'=>'resource', 'query'=>'string'],
-'odbc_primarykeys' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string'],
-'odbc_procedurecolumns' => ['resource', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'proc'=>'string', 'column'=>'string'],
-'odbc_procedures' => ['resource', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'],
+'odbc_primarykeys' => ['resource|false', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string'],
+'odbc_procedurecolumns' => ['resource|false', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'proc'=>'string', 'column'=>'string'],
+'odbc_procedures' => ['resource|false', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'],
'odbc_result' => ['mixed', 'result_id'=>'resource', 'field'=>'mixed'],
'odbc_result_all' => ['int|false', 'result_id'=>'resource', 'format='=>'string'],
'odbc_rollback' => ['bool', 'connection_id'=>'resource'],
'odbc_setoption' => ['bool', 'result_id'=>'resource', 'which'=>'int', 'option'=>'int', 'value'=>'int'],
-'odbc_specialcolumns' => ['resource', 'connection_id'=>'resource', 'type'=>'int', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'],
-'odbc_statistics' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string', 'unique'=>'int', 'accuracy'=>'int'],
-'odbc_tableprivileges' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'],
-'odbc_tables' => ['resource', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'name='=>'string', 'table_types='=>'string'],
+'odbc_specialcolumns' => ['resource|false', 'connection_id'=>'resource', 'type'=>'int', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'],
+'odbc_statistics' => ['resource|false', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string', 'unique'=>'int', 'accuracy'=>'int'],
+'odbc_tableprivileges' => ['resource|false', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'],
+'odbc_tables' => ['resource|false', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'name='=>'string', 'table_types='=>'string'],
'opcache_compile_file' => ['bool', 'file'=>'string'],
'opcache_get_configuration' => ['array|false'],
'opcache_get_status' => ['array|false', 'get_scripts='=>'bool'],
@@ -8087,10 +7436,10 @@
'openssl_encrypt' => ['string|false', 'data'=>'string', 'method'=>'string', 'key'=>'string', 'options='=>'int', 'iv='=>'string', '&w_tag='=>'string', 'aad='=>'string', 'tag_length='=>'int'],
'openssl_error_string' => ['string|false'],
'openssl_free_key' => ['void', 'key_identifier'=>'resource'],
-'openssl_get_cert_locations' => ['array'],
-'openssl_get_cipher_methods' => ['array', 'aliases='=>'bool'],
-'openssl_get_curve_names' => ['array|false'],
-'openssl_get_md_methods' => ['array', 'aliases='=>'bool'],
+'openssl_get_cert_locations' => ['array'],
+'openssl_get_cipher_methods' => ['list', 'aliases='=>'bool'],
+'openssl_get_curve_names' => ['list|false'],
+'openssl_get_md_methods' => ['list', 'aliases='=>'bool'],
'openssl_get_privatekey' => ['resource|false', 'key'=>'string', 'passphrase='=>'string'],
'openssl_get_publickey' => ['resource|false', 'cert'=>'resource|string'],
'openssl_open' => ['bool', 'sealed_data'=>'string', '&w_open_data'=>'string', 'env_key'=>'string', 'priv_key_id'=>'string|array|resource', 'method='=>'string', 'iv='=>'string'],
@@ -8131,7 +7480,7 @@
'openssl_x509_free' => ['void', 'x509'=>'resource'],
'openssl_x509_parse' => ['array|false', 'x509cert'=>'string|resource', 'shortnames='=>'bool'],
'openssl_x509_read' => ['resource|false', 'x509certdata'=>'string|resource'],
-'ord' => ['int', 'character'=>'string'],
+'ord' => ['int<0, 255>', 'character'=>'string'],
'OuterIterator::getInnerIterator' => ['Iterator'],
'OutOfBoundsException::__clone' => ['void'],
'OutOfBoundsException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?OutOfBoundsException)'],
@@ -8141,7 +7490,7 @@
'OutOfBoundsException::getLine' => ['int'],
'OutOfBoundsException::getMessage' => ['string'],
'OutOfBoundsException::getPrevious' => ['Throwable|OutOfBoundsException|null'],
-'OutOfBoundsException::getTrace' => ['array'],
+'OutOfBoundsException::getTrace' => ['list\',args?:list,object?:object}>'],
'OutOfBoundsException::getTraceAsString' => ['string'],
'OutOfRangeException::__clone' => ['void'],
'OutOfRangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?OutOfRangeException)'],
@@ -8151,7 +7500,7 @@
'OutOfRangeException::getLine' => ['int'],
'OutOfRangeException::getMessage' => ['string'],
'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'],
-'OutOfRangeException::getTrace' => ['array'],
+'OutOfRangeException::getTrace' => ['list\',args?:list,object?:object}>'],
'OutOfRangeException::getTraceAsString' => ['string'],
'output_add_rewrite_var' => ['bool', 'name'=>'string', 'value'=>'string'],
'output_reset_rewrite_vars' => ['bool'],
@@ -8163,12 +7512,12 @@
'OverflowException::getLine' => ['int'],
'OverflowException::getMessage' => ['string'],
'OverflowException::getPrevious' => ['Throwable|OverflowException|null'],
-'OverflowException::getTrace' => ['array'],
+'OverflowException::getTrace' => ['list\',args?:list,object?:object}>'],
'OverflowException::getTraceAsString' => ['string'],
'overload' => ['', 'class_name'=>'string'],
'override_function' => ['bool', 'function_name'=>'string', 'function_args'=>'string', 'function_code'=>'string'],
'pack' => ['string', 'format'=>'string', '...args='=>'mixed'],
-'ParentIterator::__construct' => ['void', 'iterator'=>'recursiveiterator'],
+'ParentIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'],
'ParentIterator::accept' => ['bool'],
'ParentIterator::getChildren' => ['ParentIterator'],
'ParentIterator::hasChildren' => ['bool'],
@@ -8239,14 +7588,14 @@
'ParseError::getLine' => ['int'],
'ParseError::getMessage' => ['string'],
'ParseError::getPrevious' => ['Throwable|ParseError|null'],
-'ParseError::getTrace' => ['array'],
+'ParseError::getTrace' => ['list