From e9e143a9a242b96a038ff16c50e7c79300c277f4 Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 14:26:01 +0100 Subject: [PATCH 01/10] Remove abandoned speccy dependency speccy has had no commits since 2019 and its transitive dependencies are reported by security scanners. package.json was shipped in the Composer package, so projects depending on this library got those reports too. Remove package.json and yarn.lock together with the Node tooling. make lint keeps validating the test data with bin/php-openapi. Also exclude doc/ from the distributed package. Co-Authored-By: Claude Opus 5.5 --- .gitattributes | 2 +- .gitignore | 2 - Makefile | 9 +- docker-compose.yml | 4 - package.json | 5 - yarn.lock | 1602 -------------------------------------------- 6 files changed, 3 insertions(+), 1621 deletions(-) delete mode 100644 package.json delete mode 100644 yarn.lock diff --git a/.gitattributes b/.gitattributes index 1281f04c..6c24c19c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ /.github export-ignore +/doc export-ignore /tests export-ignore .gitattributes export-ignore .gitignore export-ignore @@ -7,4 +8,3 @@ docker-compose.yml export-ignore Makefile export-ignore phpunit.xml.dist export-ignore phpunit11.xml.dist export-ignore -yarn.lock export-ignore diff --git a/.gitignore b/.gitignore index 795d780f..677fbc19 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,6 @@ /composer.lock /composer.phar -/node_modules - /.php_cs.cache /.phpunit.result.cache /.idea diff --git a/Makefile b/Makefile index 0fa46f28..197a87fd 100755 --- a/Makefile +++ b/Makefile @@ -6,13 +6,11 @@ ifeq ($(XDEBUG),1) XPHPARGS=-dzend_extension=xdebug.so -dxdebug.remote_enable=1 -dxdebug.remote_autostart=1 endif -# Run make with IN_DOCKER=1 to run yarn and php commands in a docker container +# Run make with IN_DOCKER=1 to run php commands in a docker container DOCKER_PHP= -DOCKER_NODE= IN_DOCKER=0 ifeq ($(IN_DOCKER),1) DOCKER_PHP=docker compose run --rm php -DOCKER_NODE=docker compose run --rm -w /app node endif all: @@ -37,9 +35,8 @@ fix-style: php-cs-fixer.phar $(DOCKER_PHP) vendor/bin/indent --spaces .php_cs.dist $(DOCKER_PHP) ./php-cs-fixer.phar fix src/ --diff -install: composer.lock yarn.lock +install: composer.lock $(DOCKER_PHP) composer install --prefer-dist --no-interaction --no-progress --ansi - $(DOCKER_NODE) yarn install test: unit test-recursion.json test-recursion2.yaml test-recursion3_index.yaml test-empty-maps.json test-const.json @@ -62,8 +59,6 @@ lint: install $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) bin/php-openapi validate tests/spec/data/recursion2.yaml $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) bin/php-openapi validate tests/spec/data/empty-maps.json $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) bin/php-openapi validate tests/spec/data/const.json - $(DOCKER_NODE) yarn run speccy lint tests/spec/data/reference/playlist.json - $(DOCKER_NODE) yarn run speccy lint tests/spec/data/recursion.json stan: $(DOCKER_PHP) php $(PHPARGS) vendor/bin/phpstan analyse -l 5 src diff --git a/docker-compose.yml b/docker-compose.yml index e84e636c..92b101f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,3 @@ services: extra_hosts: - "host.docker.internal:host-gateway" tty: true - node: - image: node:12 - volumes: - - .:/app diff --git a/package.json b/package.json deleted file mode 100644 index f7df3304..00000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "speccy": "^0.11.0" - } -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index fb2944f1..00000000 --- a/yarn.lock +++ /dev/null @@ -1,1602 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" - integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== - dependencies: - regenerator-runtime "^0.13.4" - -"@cloudflare/json-schema-walker@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@cloudflare/json-schema-walker/-/json-schema-walker-0.1.1.tgz#d1cc94065327b0b3800158db40cb78124a3476de" - integrity sha512-P3n0hEgk1m6uKWgL4Yb1owzXVG4pM70G4kRnDQxZXiVvfCRtaqiHu+ZRiRPzmwGBiLTO1LWc2yR1M8oz0YkXww== - -"@exodus/schemasafe@^1.0.0-rc.2": - version "1.0.0-rc.6" - resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz#7985f681564cff4ffaebb5896eb4be20af3aae7a" - integrity sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ== - -accepts@~1.3.7: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -ajv@^5.5.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -better-ajv-errors@^0.6.1, better-ajv-errors@^0.6.7: - version "0.6.7" - resolved "https://registry.yarnpkg.com/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz#b5344af1ce10f434fe02fc4390a5a9c811e470d1" - integrity sha512-PYgt/sCzR4aGpyNy5+ViSQ77ognMnWq7745zM+/flYO4/Yisdtp9wDQW2IKCyVYPUxQt3E/b5GBSwfhd1LPdlg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/runtime" "^7.0.0" - chalk "^2.4.1" - core-js "^3.2.1" - json-to-ast "^2.0.3" - jsonpointer "^4.0.1" - leven "^3.1.0" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -body-parser@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" - integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== - dependencies: - bytes "3.1.1" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.6" - raw-body "2.4.2" - type-is "~1.6.18" - -bytes@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" - integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -camelcase@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@^2.0.0, chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -classnames@^2.2.3, classnames@^2.2.6: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -cliui@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clsx@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -code-error-fragment@0.0.230: - version "0.0.230" - resolved "https://registry.yarnpkg.com/code-error-fragment/-/code-error-fragment-0.0.230.tgz#d736d75c832445342eca1d1fedbf17d9618b14d7" - integrity sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw== - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^2.18.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -core-js@^3.2.1: - version "3.21.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.0.tgz#f479dbfc3dffb035a0827602dd056839a774aa71" - integrity sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ== - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -decamelize@^1.1.1, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decko@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" - integrity sha1-/UPHNelnuAEzBohKVvvmZZlraBc= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -dompurify@^1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-1.0.11.tgz#fe0f4a40d147f7cebbe31a50a1357539cfc1eb4d" - integrity sha512-XywCTXZtc/qCX3iprD1pIklRVk/uhl8BKpkTxr+ZyMVUzSUg7wkQXRBp/euJ5J5moa1QvfpvaPQVP71z1O59dQ== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -ejs@^2.5.2: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -es6-promise@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter3@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -express@^4.14.0: - version "4.17.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" - integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.4.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.9.6" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" - setprototypeof "1.2.0" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -foreach@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -format-util@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -global@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http2-client@^1.2.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" - integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.12.1, js-yaml@^3.2.3: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-pointer@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.1.tgz#3c6caa6ac139e2599f5a1659d39852154015054d" - integrity sha512-3OvjqKdCBvH41DLpV4iSt6v2XhZXV1bPB4OROuknvUXI7ZQNofieCPkmE26stEJ9zdQuvIxDHCuYhfgxFAAs+Q== - dependencies: - foreach "^2.0.4" - -json-schema-ref-parser@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz#30af34aeab5bee0431da805dac0eb21b574bf63d" - integrity sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw== - dependencies: - call-me-maybe "^1.0.1" - js-yaml "^3.12.1" - ono "^4.0.11" - -json-schema-to-openapi-schema@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/json-schema-to-openapi-schema/-/json-schema-to-openapi-schema-0.3.0.tgz#d8d4a1a321b3aa00dce71fa27ba5016f2d50288b" - integrity sha512-UaaAmmbAq61yQM5yLoVOM99GP1JI8YNVEv3QWbD/79YDNNKk99uGn1k2pa+ZSfdLILi/euGguVG8URmv5gR/Bw== - dependencies: - "@cloudflare/json-schema-walker" "^0.1.1" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - -json-to-ast@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json-to-ast/-/json-to-ast-2.1.0.tgz#041a9fcd03c0845036acb670d29f425cea4faaf9" - integrity sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ== - dependencies: - code-error-fragment "0.0.230" - grapheme-splitter "^1.0.4" - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonpointer@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" - integrity sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg== - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -loader-utils@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lunr@2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5" - integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q== - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -mark.js@^8.11.1: - version "8.11.1" - resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" - integrity sha1-GA8fnr74sOY45BZq1S24eb6y/8U= - -marked@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946" - integrity sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memoize-one@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -minimist@^1.2.0: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mobx-react@^5.4.3: - version "5.4.4" - resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-5.4.4.tgz#b3de9c6eabcd0ed8a40036888cb0221ab9568b80" - integrity sha512-2mTzpyEjVB/RGk2i6KbcmP4HWcAUFox5ZRCrGvSyz49w20I4C4qql63grPpYrS9E9GKwgydBHQlA4y665LuRCQ== - dependencies: - hoist-non-react-statics "^3.0.0" - react-lifecycles-compat "^3.0.2" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nconf-yaml@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nconf-yaml/-/nconf-yaml-1.0.2.tgz#fea065333cf42b77a5e8060517969799d4156575" - integrity sha1-/qBlMzz0K3el6AYFF5aXmdQVZXU= - dependencies: - js-yaml "^3.2.3" - -nconf@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.10.0.tgz#da1285ee95d0a922ca6cee75adcf861f48205ad2" - integrity sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q== - dependencies: - async "^1.4.0" - ini "^1.3.0" - secure-keys "^1.0.0" - yargs "^3.19.0" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch-h2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" - integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== - dependencies: - http2-client "^1.2.5" - -node-fetch@^2.3.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-readfiles@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" - integrity sha1-271K8SE04uY1wkXvk//Pb2BnOl0= - dependencies: - es6-promise "^3.2.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -oas-kit-common@^1.0.7, oas-kit-common@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" - integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== - dependencies: - fast-safe-stringify "^2.0.7" - -oas-linter@^3.0.0, oas-linter@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" - integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== - dependencies: - "@exodus/schemasafe" "^1.0.0-rc.2" - should "^13.2.1" - yaml "^1.10.0" - -oas-resolver@^2.2.4, oas-resolver@^2.3.0: - version "2.5.6" - resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" - integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== - dependencies: - node-fetch-h2 "^2.3.0" - oas-kit-common "^1.0.8" - reftools "^1.1.9" - yaml "^1.10.0" - yargs "^17.0.1" - -oas-schema-walker@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" - integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== - -oas-validator@^3.0.1, oas-validator@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-3.4.0.tgz#7633b02e495af4a4e0224b249288b0928748476d" - integrity sha512-l/SxykuACi2U51osSsBXTxdsFc8Fw41xI7AsZkzgVgWJAzoEFaaNptt35WgY9C3757RUclsm6ye5GvSyYoozLQ== - dependencies: - ajv "^5.5.2" - better-ajv-errors "^0.6.7" - call-me-maybe "^1.0.1" - oas-kit-common "^1.0.7" - oas-linter "^3.1.0" - oas-resolver "^2.3.0" - oas-schema-walker "^1.1.3" - reftools "^1.1.0" - should "^13.2.1" - yaml "^1.8.3" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -ono@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d" - integrity sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g== - dependencies: - format-util "^1.0.3" - -openapi-sampler@1.0.0-beta.14: - version "1.0.0-beta.14" - resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.0.0-beta.14.tgz#e06807f33a9c0fab841e212f5fb90e7af4acf30c" - integrity sha512-NNmH9YAN5AaCE4w6MQXdCrmsOJJQTswHVSp075+h+iiG+OTonpZE8HzwocozovD2imx4lamkuxGLs4E4bO4Z+g== - dependencies: - json-pointer "^0.6.0" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -perfect-scrollbar@^1.4.0: - version "1.5.5" - resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz#41a211a2fb52a7191eff301432134ea47052b27f" - integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== - -polished@^3.0.3: - version "3.7.2" - resolved "https://registry.yarnpkg.com/polished/-/polished-3.7.2.tgz#ec5ddc17a7d322a574d5e10ddd2a6f01d3e767d1" - integrity sha512-pQKtpZGmsZrW8UUpQMAnR7s3ppHeMQVNyMDKtUyKwuvDmklzcEyM5Kllb3JyE/sE/x7arDmyd35i+4vp99H6sQ== - dependencies: - "@babel/runtime" "^7.12.5" - -prismjs@^1.15.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -prop-types@^15.5.0, prop-types@^15.6.1, prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -qs@6.9.6: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" - integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== - dependencies: - bytes "3.1.1" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-dropdown@^1.6.4: - version "1.9.2" - resolved "https://registry.yarnpkg.com/react-dropdown/-/react-dropdown-1.9.2.tgz#db6cbc90184e3f6dd7eb40f7ddabac4b09dccf15" - integrity sha512-g4eufErTi5P5T5bGK+VmLl//qvAHy79jm6KKx8G2Tl3mG90bpigb+Aw85P+C2JUdAnIIQdv8kP/oHN314GvAfw== - dependencies: - classnames "^2.2.3" - -react-hot-loader@^4.8.0: - version "4.13.0" - resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.13.0.tgz#c27e9408581c2a678f5316e69c061b226dc6a202" - integrity sha512-JrLlvUPqh6wIkrK2hZDfOyq/Uh/WeVEr8nc7hkn2/3Ul0sx1Kr5y4kOGNacNRoj7RhwLNcQ3Udf1KJXrqc0ZtA== - dependencies: - fast-levenshtein "^2.0.6" - global "^4.3.0" - hoist-non-react-statics "^3.3.0" - loader-utils "^1.1.0" - prop-types "^15.6.1" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.1.0" - source-map "^0.7.3" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-tabs@^3.0.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.3.tgz#ccbb3e1241ad3f601047305c75db661239977f2f" - integrity sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg== - dependencies: - clsx "^1.1.0" - prop-types "^15.5.0" - -redoc@v2.0.0-rc.8-1: - version "2.0.0-rc.8-1" - resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.0.0-rc.8-1.tgz#53e441f54e79ce25782525d937cd499af3b25e2d" - integrity sha512-/YoCdcl2QtveKz4CTXaqtOfCIaVgZZgcnfUNC5xK7xBl/LxTiNj3tUbgFmrYMLTZGzNdQ9TUJpsa7lXDKcr8Pw== - dependencies: - classnames "^2.2.6" - decko "^1.2.0" - dompurify "^1.0.10" - eventemitter3 "^3.0.0" - json-pointer "^0.6.0" - json-schema-ref-parser "^6.1.0" - lunr "2.3.6" - mark.js "^8.11.1" - marked "^0.6.1" - memoize-one "^5.0.0" - mobx-react "^5.4.3" - openapi-sampler "1.0.0-beta.14" - perfect-scrollbar "^1.4.0" - polished "^3.0.3" - prismjs "^1.15.0" - prop-types "^15.7.2" - react-dropdown "^1.6.4" - react-hot-loader "^4.8.0" - react-tabs "^3.0.0" - slugify "^1.3.4" - stickyfill "^1.1.1" - swagger2openapi "^5.2.3" - tslib "^1.9.3" - -reftools@^1.1.0, reftools@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" - integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -secure-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" - integrity sha1-8MgtmKOxOah3aogIBQuCRDEIf8o= - -semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "1.8.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.2" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -should-equal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" - integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== - dependencies: - should-type "^1.4.0" - -should-format@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" - integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE= - dependencies: - should-type "^1.3.0" - should-type-adaptors "^1.0.1" - -should-type-adaptors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" - integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== - dependencies: - should-type "^1.3.0" - should-util "^1.0.0" - -should-type@^1.3.0, should-type@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" - integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM= - -should-util@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" - integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== - -should@^13.2.1: - version "13.2.3" - resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" - integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== - dependencies: - should-equal "^2.0.0" - should-format "^3.0.3" - should-type "^1.4.0" - should-type-adaptors "^1.0.1" - should-util "^1.0.0" - -signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -slugify@^1.3.4: - version "1.6.5" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.5.tgz#c8f5c072bf2135b80703589b39a3d41451fbe8c8" - integrity sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -speccy@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/speccy/-/speccy-0.11.0.tgz#8edcb76d3ebc146ae39a44f5ed095bd326fb07ff" - integrity sha512-f9XXngfae43WR9uz8m3yk935nsJIJH1YaRNNjEYqF+uL3yNlabFgixPKncJKXT2LfiMhhszwVSgrDgUaUvGBVQ== - dependencies: - commander "^2.18.0" - ejs "^2.5.2" - express "^4.14.0" - json-schema-to-openapi-schema "^0.3.0" - nconf "^0.10.0" - nconf-yaml "^1.0.2" - node-fetch "^2.3.0" - node-readfiles "^0.2.0" - oas-linter "^3.0.0" - oas-resolver "^2.2.4" - oas-validator "^3.0.1" - redoc v2.0.0-rc.8-1 - yaml "^1.5.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stickyfill@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02" - integrity sha1-OUE/7p0CXHSn5ZzuyyN4TMDxfwI= - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -swagger2openapi@^5.2.3: - version "5.4.0" - resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-5.4.0.tgz#1e1c8909f7966b1f455bf1b66490093ac1c0029c" - integrity sha512-f5QqfXawiVijhjMtYqWZ55ESHPZFqrPC8L9idhIiuSX8O2qsa1i4MVGtCM3TQF+Smzr/6WfT/7zBuzG3aTgPAA== - dependencies: - better-ajv-errors "^0.6.1" - call-me-maybe "^1.0.1" - node-fetch-h2 "^2.3.0" - node-readfiles "^0.2.0" - oas-kit-common "^1.0.7" - oas-resolver "^2.3.0" - oas-schema-walker "^1.1.3" - oas-validator "^3.4.0" - reftools "^1.1.0" - yaml "^1.8.3" - yargs "^12.0.5" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -"y18n@^3.2.1 || ^4.0.0": - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yaml@^1.10.0, yaml@^1.5.0, yaml@^1.8.3: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.0.0: - version "21.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" - integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== - -yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^17.0.1: - version "17.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" - integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yargs@^3.19.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" From ffac8733896f5394927b7a3d5e54e36c03abf54c Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 14:26:01 +0100 Subject: [PATCH 02/10] Restrict URI schemes used to load referenced files Every $ref URI was passed to file_get_contents(), so a specification could use any stream wrapper (php://, data://, phar://) and a remote document could read local files. By default only file, http, https and the scheme of the base document are allowed now, and documents loaded via http(s) can not reference file URIs. Add ReferenceContext::$allowedSchemes and $uriFilter to restrict this further and $httpTimeout for remote references. Co-Authored-By: Claude Opus 5.5 --- README.md | 23 ++++++ src/ReferenceContext.php | 68 ++++++++++++++++- tests/ReferenceContextTest.php | 129 +++++++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index abcee183..280a0f9d 100644 --- a/README.md +++ b/README.md @@ -223,6 +223,29 @@ $openapi->resolveReferences( ); ``` +### Restricting where References are loaded from + +Resolving a reference reads the file or URL it points to. By default references may only be loaded from `file`, `http` +and `https` URIs and from the scheme of the base document. A document loaded via `http` or `https` may not reference `file` URIs. + +If you process API Descriptions from untrusted sources, restrict this further or do not resolve references at all: + +```php +$context = new \cebe\openapi\ReferenceContext($openapi, '/var/www/api/openapi.yaml'); +// only allow exactly these schemes, e.g. disable remote references +$context->allowedSchemes = ['file']; +// decide for each URI, e.g. restrict references to one directory +$context->uriFilter = function (string $uri): bool { + return strpos($uri, 'file:///var/www/api/') === 0; +}; +// read timeout in seconds for http(s) references +$context->httpTimeout = 5.0; +$openapi->resolveReferences($context); +``` + +`uriFilter` is not called again for HTTP redirects. To limit remote hosts reliably, also restrict outgoing connections +on the network level, or disable remote references. + ### Validation The library provides simple validation operations, that check basic OpenAPI spec requirements. diff --git a/src/ReferenceContext.php b/src/ReferenceContext.php index bde0a964..712538d6 100644 --- a/src/ReferenceContext.php +++ b/src/ReferenceContext.php @@ -28,6 +28,10 @@ class ReferenceContext * resolve all references, except recursive ones. */ const RESOLVE_MODE_ALL = 'all'; + /** + * URI schemes referenced files may be loaded from when [[allowedSchemes]] is not set. + */ + const DEFAULT_ALLOWED_SCHEMES = ['file', 'http', 'https']; /** * @var bool whether to throw UnresolvableReferenceException in case a reference can not @@ -38,6 +42,23 @@ class ReferenceContext * @var string */ public $mode = self::RESOLVE_MODE_ALL; + /** + * @var string[]|null URI schemes referenced files may be loaded from. + * If `null` (the default), [[DEFAULT_ALLOWED_SCHEMES]] and the scheme of the base document are + * allowed, except that a document loaded via http(s) may not reference `file` URIs. + * If an array is given, exactly the listed schemes are allowed, e.g. `['file']` to disable remote references. + */ + public $allowedSchemes = null; + /** + * @var callable|null optional callback receiving the URI of a referenced file. It must return `true` + * to allow loading the file, e.g. to restrict references to certain hosts or directories. + * It is called after the [[allowedSchemes]] check. HTTP redirects are followed without calling it again. + */ + public $uriFilter = null; + /** + * @var float read timeout in seconds for referenced files loaded via http(s). + */ + public $httpTimeout = 30.0; /** * @var SpecObjectInterface */ @@ -205,16 +226,22 @@ public function resolveRelativeUri(string $uri): string * * The current context will cache files by URI, so they are only loaded once. * - * @throws IOException in case the file is not readable or fetching the file - * from a remote URL failed. + * @throws IOException in case loading the URI is not allowed, the file is not readable + * or fetching the file from a remote URL failed. */ public function fetchReferencedFile($uri) { + if (!$this->isUriAllowed($uri)) { + $e = new IOException("Loading referenced file is not allowed: '$uri'"); + $e->fileName = $uri; + throw $e; + } + if ($this->_cache->has('FILE_CONTENT://' . $uri, 'FILE_CONTENT')) { return $this->_cache->get('FILE_CONTENT://' . $uri, 'FILE_CONTENT'); } - $content = file_get_contents($uri); + $content = file_get_contents($uri, false, stream_context_create(['http' => ['timeout' => $this->httpTimeout]])); if ($content === false) { $e = new IOException("Failed to read file: '$uri'"); $e->fileName = $uri; @@ -230,6 +257,41 @@ public function fetchReferencedFile($uri) return $parsedContent; } + /** + * Check whether a referenced file may be loaded from the given URI. + */ + private function isUriAllowed(string $uri): bool + { + $scheme = $this->getUriScheme($uri); + if ($this->allowedSchemes !== null) { + $allowed = array_map('strtolower', $this->allowedSchemes); + } else { + $baseScheme = $this->getUriScheme($this->_uri); + $allowed = self::DEFAULT_ALLOWED_SCHEMES; + if ($baseScheme === 'http' || $baseScheme === 'https') { + // a remote document must not be able to read local files + $allowed = array_diff($allowed, ['file']); + } + $allowed[] = $baseScheme; + } + if (!in_array($scheme, $allowed, true)) { + return false; + } + return $this->uriFilter === null || call_user_func($this->uriFilter, $uri) === true; + } + + /** + * @return string the lowercase scheme of the URI. Paths without a scheme, including + * Windows paths with a drive letter, are local files and result in `file`. + */ + private function getUriScheme(string $uri): string + { + if (preg_match('/^([a-z][a-z0-9+.\-]+):/i', $uri, $matches)) { + return strtolower($matches[1]); + } + return 'file'; + } + /** * Retrieve the referenced data via JSON pointer. * diff --git a/tests/ReferenceContextTest.php b/tests/ReferenceContextTest.php index 549aec1a..dcb3cb2a 100644 --- a/tests/ReferenceContextTest.php +++ b/tests/ReferenceContextTest.php @@ -201,4 +201,133 @@ public function testNormalizeUri($uri, $expected) $this->assertEquals($expected, $context->getUri()); } + private const DATA_URI = 'data://text/plain;base64,ZGVzY3JpcHRpb246IGZyb20td3JhcHBlcgo='; + + public static function disallowedUriProvider() + { + return [ + ['file:///var/www/openapi.yaml', self::DATA_URI], + ['file:///var/www/openapi.yaml', 'php://filter/resource=/etc/passwd'], + ['file:///var/www/openapi.yaml', 'PHP://filter/resource=/etc/passwd'], + ['file:///var/www/openapi.yaml', 'phar:///var/www/archive.phar/definitions.yaml'], + ['file:///var/www/openapi.yaml', 'ftp://example.invalid/definitions.yaml'], + ['https://example.invalid/openapi.yaml', 'file:///etc/passwd'], + ['http://example.invalid/openapi.yaml', 'file:///etc/passwd'], + ]; + } + + /** + * @dataProvider disallowedUriProvider + */ + public function testFetchReferencedFileRejectsDisallowedUri($baseUri, $uri) + { + $context = new ReferenceContext(null, $baseUri); + + $this->expectException(\cebe\openapi\exceptions\IOException::class); + $this->expectExceptionMessage('not allowed'); + $context->fetchReferencedFile($uri); + } + + public function testFetchReferencedFileAllowsLocalFilesFromLocalDocument() + { + $file = $this->createTemporaryFile("description: from-file\n"); + try { + $context = new ReferenceContext(null, $file); + $this->assertSame(['description' => 'from-file'], $context->fetchReferencedFile($context->getUri())); + } finally { + unlink($file); + } + } + + public function testFetchReferencedFileAllowsSchemeOfBaseDocument() + { + $context = new ReferenceContext(null, 'data://text/plain;base64,e30='); + + $this->assertSame(['description' => 'from-wrapper'], $context->fetchReferencedFile(self::DATA_URI)); + } + + public function testAllowedSchemesCanBeExtended() + { + $context = new ReferenceContext(null, 'file:///var/www/openapi.yaml'); + $context->allowedSchemes = ['DATA']; + + $this->assertSame(['description' => 'from-wrapper'], $context->fetchReferencedFile(self::DATA_URI)); + } + + public function testAllowedSchemesCanBeRestricted() + { + $file = $this->createTemporaryFile("description: from-file\n"); + try { + $context = new ReferenceContext(null, $file); + $context->allowedSchemes = ['https']; + + $this->expectException(\cebe\openapi\exceptions\IOException::class); + $this->expectExceptionMessage('not allowed'); + $context->fetchReferencedFile($context->getUri()); + } finally { + unlink($file); + } + } + + public function testUriFilterCanRejectUri() + { + $file = $this->createTemporaryFile("description: from-file\n"); + try { + $context = new ReferenceContext(null, $file); + $seen = []; + $context->uriFilter = function ($uri) use (&$seen) { + $seen[] = $uri; + return false; + }; + + try { + $context->fetchReferencedFile($context->getUri()); + $this->fail('Expected the URI to be rejected.'); + } catch (\cebe\openapi\exceptions\IOException $e) { + $this->assertNotFalse(strpos($e->getMessage(), 'not allowed')); + } + $this->assertSame([$context->getUri()], $seen); + } finally { + unlink($file); + } + } + + public function testDisallowedReferenceIsNotResolved() + { + $openapi = $this->createSpecWithReference(self::DATA_URI); + + $this->expectException(\cebe\openapi\exceptions\UnresolvableReferenceException::class); + $this->expectExceptionMessage('not allowed'); + $openapi->resolveReferences(new ReferenceContext($openapi, 'file:///var/www/openapi.yaml')); + } + + public function testDisallowedReferenceIsReportedWithoutException() + { + $openapi = $this->createSpecWithReference(self::DATA_URI); + $context = new ReferenceContext($openapi, 'file:///var/www/openapi.yaml'); + $context->throwException = false; + + $openapi->resolveReferences($context); + + $reference = $openapi->components->schemas['Pet']; + $this->assertInstanceOf(\cebe\openapi\spec\Reference::class, $reference); + $this->assertNotFalse(strpos(implode("\n", $reference->getErrors()), 'not allowed')); + } + + private function createSpecWithReference(string $uri): OpenApi + { + return new OpenApi([ + 'openapi' => '3.0.3', + 'info' => ['title' => 'Test', 'version' => '1.0.0'], + 'paths' => [], + 'components' => ['schemas' => ['Pet' => ['$ref' => $uri]]], + ]); + } + + private function createTemporaryFile(string $content): string + { + $file = tempnam(sys_get_temp_dir(), 'openapi'); + file_put_contents($file, $content); + return $file; + } } From a424cfb4d85d92d90b32eedf8aefd89713fe4fee Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 15:06:10 +0100 Subject: [PATCH 03/10] Allow CI to install symfony/yaml versions with advisories Composer now blocks versions affected by security advisories, so the jobs for symfony/yaml ^3.4, ^4, 5.4.2 and ^6 on PHP 8.0 fail while installing. composer.json still allows these versions, so CI keeps testing them until support is dropped. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/php.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 3169321e..2c82f288 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -6,6 +6,11 @@ on: pull_request: branches: [ master ] +env: + # Composer refuses to install versions with security advisories, which includes the old + # symfony/yaml versions still allowed by composer.json. Remove when support for them is dropped. + COMPOSER_NO_BLOCKING: "1" + jobs: phpunit: name: Tests From 7f52879227d69f1eab01a51ea2dfe7bc26d8c71e Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 15:12:01 +0100 Subject: [PATCH 04/10] Fix writer tests for symfony/yaml 8.1 symfony/yaml 8.1 dumps empty maps as "{}" instead of "{ }". Both are the same YAML, so normalize the output before comparing it. Co-Authored-By: Claude Opus 5.5 --- tests/WriterTest.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/WriterTest.php b/tests/WriterTest.php index fc415b51..042a2e40 100644 --- a/tests/WriterTest.php +++ b/tests/WriterTest.php @@ -71,6 +71,8 @@ public function testWriteYaml() $openapi = $this->createOpenAPI(); $yaml = \cebe\openapi\Writer::writeToYaml($openapi); + // symfony/yaml before 8.1 dumps empty maps as "{ }" + $yaml = str_replace('{ }', '{}', $yaml); $this->assertEquals(preg_replace('~\R~', "\n", <<assertEquals(preg_replace('~\R~', "\n", <<assertEquals(preg_replace('~\R~', "\n", << Date: Fri, 6 Nov 2026 15:13:44 +0100 Subject: [PATCH 05/10] Require PHP 8.2 and supported dependency versions Drop PHP versions and symfony/yaml and justinrainbow/json-schema versions that are no longer supported. Composer already refuses to install the old symfony/yaml versions by default because of their security advisories. ReferenceContext::dirname() no longer needs ext-mbstring, which was used without being declared: "/" is a single byte in UTF-8. Co-Authored-By: Claude Opus 5.5 --- README.md | 4 ++-- composer.json | 13 +++++-------- src/ReferenceContext.php | 4 ++-- tests/bootstrap.php | 8 +------- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 280a0f9d..8593b9b3 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Supported OpenAPI versions: ## Requirements -- PHP 7.1 or higher (works fine with PHP 8) +- PHP 8.2 or higher ## Used by @@ -267,7 +267,7 @@ $errors = $openapi->getErrors(); You may use the docker environment for local development: - docker-compose build + docker compose build make IN_DOCKER=1 install make IN_DOCKER=1 test ... diff --git a/composer.json b/composer.json index ca863c40..45a65ab3 100755 --- a/composer.json +++ b/composer.json @@ -22,23 +22,20 @@ "source": "https://github.com/DEVizzent/cebe-php-openapi" }, "require": { - "php": ">=7.1.0", + "php": "^8.2", "ext-json": "*", - "symfony/yaml": "^3.4 || ^4 || ^5 || ^6 || ^7 || ^8", - "justinrainbow/json-schema": "^5.2 || ^6.0" + "symfony/yaml": "^6.4 || ^7.4 || ^8.0", + "justinrainbow/json-schema": "^6.0" }, "require-dev": { "cebe/indent": "*", - "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4 || ^11.4", + "phpunit/phpunit": "^11.5 || ^12.0 || ^13.0", "oai/openapi-specification-3.0": "3.0.3", "mermade/openapi3-examples": "1.0.0", "apis-guru/openapi-directory": "1.0.0", - "phpstan/phpstan": "^0.12.0" - }, - "conflict": { - "symfony/yaml": "3.4.0 - 3.4.4 || 4.0.0 - 4.4.17 || 5.0.0 - 5.1.9 || 5.2.0" + "phpstan/phpstan": "^2.0" }, "replace": { "cebe/php-openapi":"1.7.0" diff --git a/src/ReferenceContext.php b/src/ReferenceContext.php index 712538d6..9b993d1c 100644 --- a/src/ReferenceContext.php +++ b/src/ReferenceContext.php @@ -163,9 +163,9 @@ private function reduceDots($path) */ private function dirname($path) { - $pos = mb_strrpos(str_replace('\\', '/', $path), '/'); + $pos = strrpos(str_replace('\\', '/', $path), '/'); if ($pos !== false) { - return mb_substr($path, 0, $pos); + return substr($path, 0, $pos); } return ''; } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 711b4249..fb579b86 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,12 +1,6 @@ Date: Fri, 6 Nov 2026 15:13:45 +0100 Subject: [PATCH 06/10] Migrate tests to PHPUnit attributes PHPUnit 12 no longer reads metadata from doc-comments. Use attributes, which work on all supported PHPUnit versions, and keep a single PHPUnit config. Co-Authored-By: Claude Opus 5.5 --- phpunit.xml.dist | 38 +++++--------- phpunit11.xml.dist | 22 -------- tests/ReaderTest.php | 6 +-- tests/ReferenceContextTest.php | 13 ++--- tests/docker/Dockerfile | 84 +++++++++++++------------------ tests/json/JsonPointerTest.php | 17 ++----- tests/spec/CallbackTest.php | 5 +- tests/spec/ComponentsTest.php | 5 +- tests/spec/HeaderTest.php | 5 +- tests/spec/InfoTest.php | 9 ++-- tests/spec/LinkTest.php | 5 +- tests/spec/MediaTypeTest.php | 18 +++---- tests/spec/OpenApiTest.php | 16 ++---- tests/spec/OperationTest.php | 7 ++- tests/spec/ParameterTest.php | 5 +- tests/spec/PathTest.php | 12 ++--- tests/spec/ReferenceTest.php | 5 +- tests/spec/RequestBodyTest.php | 7 ++- tests/spec/ResponseTest.php | 12 ++--- tests/spec/SchemaTest.php | 12 ++--- tests/spec/SecuritySchemeTest.php | 11 ++-- tests/spec/ServerTest.php | 7 ++- tests/spec/TagTest.php | 5 +- tests/spec/XmlTest.php | 5 +- 24 files changed, 119 insertions(+), 212 deletions(-) delete mode 100644 phpunit11.xml.dist diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 484250ce..5ee25ac4 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,30 +1,18 @@ - - - ./tests - - - - - ./src - - - - - ./src - - - ./vendor - ./tests - - + colors="true" + stopOnFailure="false"> + + + ./tests + + + + + ./src + + diff --git a/phpunit11.xml.dist b/phpunit11.xml.dist deleted file mode 100644 index 972a3f32..00000000 --- a/phpunit11.xml.dist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - ./tests - - - - - ./src - - - ./vendor - ./tests - - - diff --git a/tests/ReaderTest.php b/tests/ReaderTest.php index 927ec9b6..e6bcf89a 100644 --- a/tests/ReaderTest.php +++ b/tests/ReaderTest.php @@ -99,11 +99,7 @@ public function testSymfonyYamlBugHunt() $inlineYamlExample = $openapi->paths['/']->get->responses['200']->content['application/json']->example; - if (method_exists($this, 'assertIsArray')) { - $this->assertIsArray($inlineYamlExample); - } else { - $this->assertInternalType('array', $inlineYamlExample); - } + $this->assertIsArray($inlineYamlExample); $expectedArray = json_decode(<< /etc/dpkg/dpkg.cfg.d/02apt-speedup && \ - echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache -RUN apt-get update && \ - apt-get -y install \ - gnupg2 && \ - apt-key update && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - libzip-dev \ - libonig-dev \ - vim \ - git \ - unzip\ - libxml2-dev \ - curl \ - libcurl4-openssl-dev \ - libssl-dev \ - --no-install-recommends && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ - && pecl install xdebug-3.1.5 \ - && docker-php-ext-enable xdebug \ - && docker-php-ext-install \ - zip \ - curl \ - mbstring - -# Install composer -ENV COMPOSER_ALLOW_SUPERUSER=1 \ - PHP_USER_ID=33 \ - PHP_ENABLE_XDEBUG=1 \ - COMPOSER_HOME=/root/.composer/ \ - PATH=/app:/app/vendor/bin:/root/.composer/vendor/bin:$PATH - -RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \ -&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \ -# Make sure we're installing what we think we're installing! -&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \ -&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer \ -&& rm -f /tmp/composer-setup.* - -COPY ./tests/docker/rootfs / - -WORKDIR /app +FROM php:8.2-cli + +ENV DEBIAN_FRONTEND=noninteractive + +RUN echo "force-unsafe-io" > /etc/dpkg/dpkg.cfg.d/02apt-speedup && \ + echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libzip-dev \ + vim \ + git \ + unzip \ + curl && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \ + pecl install xdebug && \ + docker-php-ext-enable xdebug && \ + docker-php-ext-install zip + +# Install composer +ENV COMPOSER_ALLOW_SUPERUSER=1 \ + PHP_USER_ID=33 \ + PHP_ENABLE_XDEBUG=1 \ + COMPOSER_HOME=/root/.composer/ \ + PATH=/app:/app/vendor/bin:/root/.composer/vendor/bin:$PATH + +RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \ +&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \ +# Make sure we're installing what we think we're installing! +&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \ +&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer \ +&& rm -f /tmp/composer-setup.* + +COPY ./tests/docker/rootfs / + +WORKDIR /app diff --git a/tests/json/JsonPointerTest.php b/tests/json/JsonPointerTest.php index af54ffcb..8d30e84a 100644 --- a/tests/json/JsonPointerTest.php +++ b/tests/json/JsonPointerTest.php @@ -2,6 +2,7 @@ use cebe\openapi\json\JsonPointer; use cebe\openapi\json\JsonReference; +use PHPUnit\Framework\Attributes\DataProvider; class JsonPointerTest extends \PHPUnit\Framework\TestCase { @@ -22,17 +23,13 @@ public static function encodeDecodeData() ]; } - /** - * @dataProvider encodeDecodeData - */ + #[DataProvider('encodeDecodeData')] public function testEncode($encoded, $decoded) { $this->assertEquals($encoded, JsonPointer::encode($decoded)); } - /** - * @dataProvider encodeDecodeData - */ + #[DataProvider('encodeDecodeData')] public function testDecode($encoded, $decoded) { $this->assertEquals($decoded, JsonPointer::decode($encoded)); @@ -92,9 +89,7 @@ public static function allExamples() yield ["/a#b" , "#/a%23b" , 16, '{"a#b": 16}']; } - /** - * @dataProvider allExamples - */ + #[DataProvider('allExamples')] public function testUriEncoding($jsonPointer, $uriJsonPointer, $expectedEvaluation) { $pointer = new JsonPointer($jsonPointer); @@ -112,9 +107,7 @@ public function testUriEncoding($jsonPointer, $uriJsonPointer, $expectedEvaluati $this->assertSame("somefile.json$uriJsonPointer", $reference->getReference()); } - /** - * @dataProvider rfcExamples - */ + #[DataProvider('rfcExamples')] public function testEvaluation($jsonPointer, $uriJsonPointer, $expectedEvaluation) { $document = json_decode(self::rfcJsonDocument()); diff --git a/tests/spec/CallbackTest.php b/tests/spec/CallbackTest.php index 1f466bde..ded33b23 100644 --- a/tests/spec/CallbackTest.php +++ b/tests/spec/CallbackTest.php @@ -2,10 +2,9 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Callback; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Callback - */ +#[CoversClass(\cebe\openapi\spec\Callback::class)] class CallbackTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/ComponentsTest.php b/tests/spec/ComponentsTest.php index 6418c340..f664d67b 100644 --- a/tests/spec/ComponentsTest.php +++ b/tests/spec/ComponentsTest.php @@ -2,10 +2,9 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Components; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Components - */ +#[CoversClass(\cebe\openapi\spec\Components::class)] class ComponentsTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/HeaderTest.php b/tests/spec/HeaderTest.php index eeced273..7ceada8d 100644 --- a/tests/spec/HeaderTest.php +++ b/tests/spec/HeaderTest.php @@ -2,10 +2,9 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Header; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Header - */ +#[CoversClass(\cebe\openapi\spec\Header::class)] class HeaderTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/InfoTest.php b/tests/spec/InfoTest.php index 932e5e0a..e185155d 100644 --- a/tests/spec/InfoTest.php +++ b/tests/spec/InfoTest.php @@ -4,12 +4,11 @@ use cebe\openapi\spec\Contact; use cebe\openapi\spec\Info; use cebe\openapi\spec\License; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Info - * @covers \cebe\openapi\spec\Contact - * @covers \cebe\openapi\spec\License - */ +#[CoversClass(\cebe\openapi\spec\Info::class)] +#[CoversClass(\cebe\openapi\spec\Contact::class)] +#[CoversClass(\cebe\openapi\spec\License::class)] class InfoTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/LinkTest.php b/tests/spec/LinkTest.php index ea373b69..df270704 100644 --- a/tests/spec/LinkTest.php +++ b/tests/spec/LinkTest.php @@ -2,10 +2,9 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Link; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Link - */ +#[CoversClass(\cebe\openapi\spec\Link::class)] class LinkTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/MediaTypeTest.php b/tests/spec/MediaTypeTest.php index 65b3e755..230cb456 100644 --- a/tests/spec/MediaTypeTest.php +++ b/tests/spec/MediaTypeTest.php @@ -6,11 +6,11 @@ use cebe\openapi\spec\OpenApi; use cebe\openapi\spec\Reference; use Symfony\Component\Yaml\Yaml; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * @covers \cebe\openapi\spec\MediaType - * @covers \cebe\openapi\spec\Example - */ +#[CoversClass(\cebe\openapi\spec\MediaType::class)] +#[CoversClass(\cebe\openapi\spec\Example::class)] class MediaTypeTest extends \PHPUnit\Framework\TestCase { public function testRead() @@ -47,11 +47,7 @@ public function testRead() $this->assertInstanceOf(Reference::class, $mediaType->schema); - if (method_exists($this, 'assertIsArray')) { - $this->assertIsArray($mediaType->examples); - } else { - $this->assertInternalType('array', $mediaType->examples); - } + $this->assertIsArray($mediaType->examples); $this->assertCount(3, $mediaType->examples); $this->assertArrayHasKey('cat', $mediaType->examples); @@ -112,9 +108,7 @@ public static function badEncodingProvider() // The last one can be supported in future, but now SpecBaseObjects::__construct() requires array explicitly } - /** - * @dataProvider badEncodingProvider - */ + #[DataProvider('badEncodingProvider')] public function testPathsCanNotBeCreatedFromBullshit($config, $expectedException) { $this->expectException(\cebe\openapi\exceptions\TypeErrorException::class); diff --git a/tests/spec/OpenApiTest.php b/tests/spec/OpenApiTest.php index 36a9046d..3b0338c5 100755 --- a/tests/spec/OpenApiTest.php +++ b/tests/spec/OpenApiTest.php @@ -3,10 +3,10 @@ use cebe\openapi\spec\OpenApi; use cebe\openapi\Reader; use Symfony\Component\Yaml\Yaml; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * @covers \cebe\openapi\spec\OpenApi - */ +#[CoversClass(\cebe\openapi\spec\OpenApi::class)] class OpenApiTest extends \PHPUnit\Framework\TestCase { public function testEmpty() @@ -53,11 +53,7 @@ public function testReadPetStore() // servers - if (method_exists($this, 'assertIsArray')) { - $this->assertIsArray($openapi->servers); - } else { - $this->assertInternalType('array', $openapi->servers); - } + $this->assertIsArray($openapi->servers); $this->assertCount(1, $openapi->servers); foreach ($openapi->servers as $server) { @@ -192,9 +188,7 @@ public static function specProvider() } } - /** - * @dataProvider specProvider - */ + #[DataProvider('specProvider')] public function testSpecs($openApiFile) { if (strtolower(substr($openApiFile, -5, 5)) === '.json') { diff --git a/tests/spec/OperationTest.php b/tests/spec/OperationTest.php index 6e30566f..b918cee0 100644 --- a/tests/spec/OperationTest.php +++ b/tests/spec/OperationTest.php @@ -3,11 +3,10 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Operation; use cebe\openapi\spec\ExternalDocumentation; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Operation - * @covers \cebe\openapi\spec\ExternalDocumentation - */ +#[CoversClass(\cebe\openapi\spec\Operation::class)] +#[CoversClass(\cebe\openapi\spec\ExternalDocumentation::class)] class OperationTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/ParameterTest.php b/tests/spec/ParameterTest.php index 14557f8c..ed6c9366 100644 --- a/tests/spec/ParameterTest.php +++ b/tests/spec/ParameterTest.php @@ -2,10 +2,9 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Parameter; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Parameter - */ +#[CoversClass(\cebe\openapi\spec\Parameter::class)] class ParameterTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/PathTest.php b/tests/spec/PathTest.php index b901aa71..0d857a87 100644 --- a/tests/spec/PathTest.php +++ b/tests/spec/PathTest.php @@ -7,11 +7,11 @@ use cebe\openapi\spec\Reference; use cebe\openapi\spec\Response; use cebe\openapi\spec\Responses; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * @covers \cebe\openapi\spec\Paths - * @covers \cebe\openapi\spec\PathItem - */ +#[CoversClass(\cebe\openapi\spec\Paths::class)] +#[CoversClass(\cebe\openapi\spec\PathItem::class)] class PathTest extends \PHPUnit\Framework\TestCase { public function testRead() @@ -97,9 +97,7 @@ public static function badPathsConfigProvider() // The last one can be supported in future, but now SpecBaseObjects::__construct() requires array explicitly } - /** - * @dataProvider badPathsConfigProvider - */ + #[DataProvider('badPathsConfigProvider')] public function testPathsCanNotBeCreatedFromBullshit($config, $expectedException) { $this->expectException(\cebe\openapi\exceptions\TypeErrorException::class); diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 6ee6c939..44fbfd12 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -8,10 +8,9 @@ use cebe\openapi\spec\Response; use cebe\openapi\spec\Schema; use cebe\openapi\spec\Example; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Reference - */ +#[CoversClass(\cebe\openapi\spec\Reference::class)] class ReferenceTest extends \PHPUnit\Framework\TestCase { public function testResolveInDocument() diff --git a/tests/spec/RequestBodyTest.php b/tests/spec/RequestBodyTest.php index 6e7e12cf..279a9c65 100644 --- a/tests/spec/RequestBodyTest.php +++ b/tests/spec/RequestBodyTest.php @@ -4,11 +4,10 @@ use cebe\openapi\spec\MediaType; use cebe\openapi\spec\RequestBody; use cebe\openapi\spec\Encoding; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\RequestBody - * @covers \cebe\openapi\spec\Encoding - */ +#[CoversClass(\cebe\openapi\spec\RequestBody::class)] +#[CoversClass(\cebe\openapi\spec\Encoding::class)] class RequestBodyTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/ResponseTest.php b/tests/spec/ResponseTest.php index be240bcd..d2009c86 100644 --- a/tests/spec/ResponseTest.php +++ b/tests/spec/ResponseTest.php @@ -4,11 +4,11 @@ use cebe\openapi\spec\MediaType; use cebe\openapi\spec\Response; use cebe\openapi\spec\Responses; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * @covers \cebe\openapi\spec\Response - * @covers \cebe\openapi\spec\Responses - */ +#[CoversClass(\cebe\openapi\spec\Response::class)] +#[CoversClass(\cebe\openapi\spec\Responses::class)] class ResponseTest extends \PHPUnit\Framework\TestCase { public function testRead() @@ -183,9 +183,7 @@ public static function badResponseProvider() // The last one can be supported in future, but now SpecBaseObjects::__construct() requires array explicitly } - /** - * @dataProvider badResponseProvider - */ + #[DataProvider('badResponseProvider')] public function testPathsCanNotBeCreatedFromBullshit($config, $expectedException) { $this->expectException(\cebe\openapi\exceptions\TypeErrorException::class); diff --git a/tests/spec/SchemaTest.php b/tests/spec/SchemaTest.php index 580dfefc..6825c8d9 100644 --- a/tests/spec/SchemaTest.php +++ b/tests/spec/SchemaTest.php @@ -6,11 +6,11 @@ use cebe\openapi\spec\Reference; use cebe\openapi\spec\Schema; use cebe\openapi\spec\Type; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * @covers \cebe\openapi\spec\Schema - * @covers \cebe\openapi\spec\Discriminator - */ +#[CoversClass(\cebe\openapi\spec\Schema::class)] +#[CoversClass(\cebe\openapi\spec\Discriminator::class)] class SchemaTest extends \PHPUnit\Framework\TestCase { public function testRead() @@ -252,9 +252,7 @@ public static function badSchemaProvider() // The last one can be supported in future, but now SpecBaseObjects::__construct() requires array explicitly } - /** - * @dataProvider badSchemaProvider - */ + #[DataProvider('badSchemaProvider')] public function testPathsCanNotBeCreatedFromBullshit($config, $expectedException) { $this->expectException(\cebe\openapi\exceptions\TypeErrorException::class); diff --git a/tests/spec/SecuritySchemeTest.php b/tests/spec/SecuritySchemeTest.php index 5e14d5f7..151b602f 100644 --- a/tests/spec/SecuritySchemeTest.php +++ b/tests/spec/SecuritySchemeTest.php @@ -5,13 +5,12 @@ use cebe\openapi\spec\OAuthFlows; use cebe\openapi\spec\SecurityRequirement; use cebe\openapi\spec\SecurityScheme; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\SecurityScheme - * @covers \cebe\openapi\spec\OAuthFlows - * @covers \cebe\openapi\spec\OAuthFlow - * @covers \cebe\openapi\spec\SecurityRequirement - */ +#[CoversClass(\cebe\openapi\spec\SecurityScheme::class)] +#[CoversClass(\cebe\openapi\spec\OAuthFlows::class)] +#[CoversClass(\cebe\openapi\spec\OAuthFlow::class)] +#[CoversClass(\cebe\openapi\spec\SecurityRequirement::class)] class SecuritySchemeTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/ServerTest.php b/tests/spec/ServerTest.php index ead1dc9d..87c8e195 100644 --- a/tests/spec/ServerTest.php +++ b/tests/spec/ServerTest.php @@ -3,11 +3,10 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Server; use cebe\openapi\spec\ServerVariable; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Server - * @covers \cebe\openapi\spec\ServerVariable - */ +#[CoversClass(\cebe\openapi\spec\Server::class)] +#[CoversClass(\cebe\openapi\spec\ServerVariable::class)] class ServerTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/TagTest.php b/tests/spec/TagTest.php index 07bc7594..68cfbb3e 100644 --- a/tests/spec/TagTest.php +++ b/tests/spec/TagTest.php @@ -3,10 +3,9 @@ use cebe\openapi\Reader; use cebe\openapi\spec\ExternalDocumentation; use cebe\openapi\spec\Tag; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Tag - */ +#[CoversClass(\cebe\openapi\spec\Tag::class)] class TagTest extends \PHPUnit\Framework\TestCase { public function testRead() diff --git a/tests/spec/XmlTest.php b/tests/spec/XmlTest.php index b24687dd..35f41a78 100644 --- a/tests/spec/XmlTest.php +++ b/tests/spec/XmlTest.php @@ -2,10 +2,9 @@ use cebe\openapi\Reader; use cebe\openapi\spec\Xml; +use PHPUnit\Framework\Attributes\CoversClass; -/** - * @covers \cebe\openapi\spec\Xml - */ +#[CoversClass(\cebe\openapi\spec\Xml::class)] class XmlTest extends \PHPUnit\Framework\TestCase { public function testRead() From 9137b91290593739182131cac638d363d4e27161 Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 15:13:45 +0100 Subject: [PATCH 07/10] Update tooling, CI and Docker for PHP 8.2 - Upgrade PHPStan to 2.x and PHP-CS-Fixer to 3.x, with a verified checksum - Test PHP 8.2 to 8.5 in CI and PHP 8.6 without failing the build - Update GitHub Actions and add Dependabot for Composer and Actions - Remove the Composer blocking override, which is not needed anymore - Update the Docker image and Xdebug settings Co-Authored-By: Claude Opus 5.5 --- .gitattributes | 3 +- .github/dependabot.yml | 10 +++ .github/workflows/code-style.yml | 42 +++++----- .github/workflows/php.yml | 101 +++++-------------------- .github/workflows/phpstan.yml | 50 ++++++------ .gitignore | 4 +- .php_cs.dist => .php-cs-fixer.dist.php | 3 +- Makefile | 19 +++-- docker-compose.yml | 3 +- 9 files changed, 93 insertions(+), 142 deletions(-) create mode 100644 .github/dependabot.yml rename .php_cs.dist => .php-cs-fixer.dist.php (92%) diff --git a/.gitattributes b/.gitattributes index 6c24c19c..6302c76a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,8 +3,7 @@ /tests export-ignore .gitattributes export-ignore .gitignore export-ignore -.php_cs.dist export-ignore +.php-cs-fixer.dist.php export-ignore docker-compose.yml export-ignore Makefile export-ignore phpunit.xml.dist export-ignore -phpunit11.xml.dist export-ignore diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..77a41d26 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: composer + directory: / + schedule: + interval: weekly + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly diff --git a/.github/workflows/code-style.yml b/.github/workflows/code-style.yml index 28818d8c..2e1967fd 100644 --- a/.github/workflows/code-style.yml +++ b/.github/workflows/code-style.yml @@ -1,21 +1,21 @@ -name: Code Style - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - code-style: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Install PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.1 - - - name: Check code style - run: make check-style +name: Code Style + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + code-style: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.2" + + - name: Check code style + run: make check-style diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 2c82f288..fb746ef3 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -6,11 +6,6 @@ on: pull_request: branches: [ master ] -env: - # Composer refuses to install versions with security advisories, which includes the old - # symfony/yaml versions still allowed by composer.json. Remove when support for them is dropped. - COMPOSER_NO_BLOCKING: "1" - jobs: phpunit: name: Tests @@ -19,105 +14,54 @@ jobs: matrix: os: [ubuntu-latest] php: - - "7.1" - - "7.2" - - "7.3" - - "7.4" - - "8.0" - - "8.1" + - "8.2" - "8.3" - "8.4" + - "8.5" dependencies: - "lowest" - "highest" - symfony-yaml: ['^3.4', '^4', '^5', '^6', '^7', '^8'] + symfony-yaml: ['^6.4', '^7.4', '^8.0'] include: - os: "windows-latest" - php: "8.0" + php: "8.5" dependencies: "highest" - symfony-yaml: '5.4.2' + symfony-yaml: '^7.4' - os: "macos-latest" - php: "8.0" + php: "8.5" + dependencies: "highest" + symfony-yaml: '^7.4' + # next PHP version: reports problems early, but does not fail the build + - os: "ubuntu-latest" + php: "8.6" dependencies: "highest" - symfony-yaml: '^5' + symfony-yaml: '^8.0' + experimental: true exclude: - # symfony/yaml v5 does not run on PHP 7.1 - - php: '7.1' - symfony-yaml: '^5' - # symfony/yaml v6 does not run on PHP 7.* - - php: '7.1' - symfony-yaml: '^6' - - php: '7.2' - symfony-yaml: '^6' - - php: '7.3' - symfony-yaml: '^6' - - php: '7.4' - symfony-yaml: '^6' - # symfony/yaml v7 does not run on PHP 7.* - - php: '7.1' - symfony-yaml: '^7' - - php: '7.2' - symfony-yaml: '^7' - - php: '7.3' - symfony-yaml: '^7' - - php: '7.4' - symfony-yaml: '^7' - # symfony/yaml v7 does not run on PHP 8.0 & 8.1 - - php: '8.0' - symfony-yaml: '^7' - - php: '8.1' - symfony-yaml: '^7' - # symfony/yaml v8 does not run on PHP 7.* - - php: '7.1' - symfony-yaml: '^8' - - php: '7.2' - symfony-yaml: '^8' - - php: '7.3' - symfony-yaml: '^8' - - php: '7.4' - symfony-yaml: '^8' # symfony/yaml v8 does not run on PHP < 8.4 - - php: '8.0' - symfony-yaml: '^8' - - php: '8.1' - symfony-yaml: '^8' + - php: '8.2' + symfony-yaml: '^8.0' - php: '8.3' - symfony-yaml: '^8' - # symfony/yaml v3.4 is not compatible with PHP 8.0 but has no upper-bound, so it installs on it - - php: '8.0' - symfony-yaml: '^3.4' - - php: '8.1' - symfony-yaml: '^3.4' - - php: '8.3' - symfony-yaml: '^3.4' - - php: '8.4' - symfony-yaml: '^3.4' + symfony-yaml: '^8.0' runs-on: ${{ matrix.os }} + continue-on-error: ${{ matrix.experimental == true }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v7 - name: Install PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - coverage: pcov + coverage: none tools: composer:v2 - name: Require specific symfony/yaml version run: "composer require symfony/yaml:'${{ matrix.symfony-yaml }}' --no-interaction --ansi --no-install" - - name: Require newer phpunit/phpunit version - run: "composer require phpunit/phpunit '^9.5' --dev --no-interaction --ansi --no-install" - if: matrix.php == '8.1' - - - name: Require newer phpunit/phpunit version - run: "composer require phpunit/phpunit '^11.4' --dev --no-interaction --ansi --no-install" - if: matrix.php >= '8.3' - - name: "Install dependencies with Composer" - uses: "ramsey/composer-install@v2" + uses: "ramsey/composer-install@v4" with: dependency-versions: "${{ matrix.dependencies }}" @@ -126,11 +70,6 @@ jobs: - name: PHPUnit tests run: make test - if: matrix.php < '8.3' - - - name: PHPUnit tests - run: make test-debug - if: matrix.php >= '8.3' - name: Code coverage run: make coverage diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 20c54421..81b8c289 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -1,25 +1,25 @@ -name: PHPStan - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - phpstan: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Install PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "7.1" - tools: composer:v2 - - - name: "Install dependencies with Composer" - uses: "ramsey/composer-install@v2" - - - name: PHPStan analysis - run: make stan +name: PHPStan + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + phpstan: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.2" + tools: composer:v2 + + - name: "Install dependencies with Composer" + uses: "ramsey/composer-install@v4" + + - name: PHPStan analysis + run: make stan diff --git a/.gitignore b/.gitignore index 677fbc19..f2ff2476 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,8 @@ /composer.lock /composer.phar -/.php_cs.cache -/.phpunit.result.cache +/.php-cs-fixer.cache +/.phpunit.cache /.idea xdebug_remote.log php-cs-fixer.phar diff --git a/.php_cs.dist b/.php-cs-fixer.dist.php similarity index 92% rename from .php_cs.dist rename to .php-cs-fixer.dist.php index 704f437b..7e769b35 100644 --- a/.php_cs.dist +++ b/.php-cs-fixer.dist.php @@ -1,6 +1,6 @@ setRules([ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], @@ -14,4 +14,3 @@ ] ]) ; - diff --git a/Makefile b/Makefile index 197a87fd..87bade1d 100755 --- a/Makefile +++ b/Makefile @@ -3,12 +3,14 @@ XDEBUG=0 PHPARGS=-dmemory_limit=512M XPHPARGS= ifeq ($(XDEBUG),1) -XPHPARGS=-dzend_extension=xdebug.so -dxdebug.remote_enable=1 -dxdebug.remote_autostart=1 +XPHPARGS=-dzend_extension=xdebug.so -dxdebug.mode=debug -dxdebug.start_with_request=yes endif # Run make with IN_DOCKER=1 to run php commands in a docker container DOCKER_PHP= IN_DOCKER=0 +PHP_CS_FIXER_VERSION=v3.95.28 +PHP_CS_FIXER_SHA256=44dd8aa9b83163b4913bc39d3e26ba94221ffa03957d000e9aec252f656b0f60 ifeq ($(IN_DOCKER),1) DOCKER_PHP=docker compose run --rm php endif @@ -32,7 +34,7 @@ check-style: php-cs-fixer.phar fix-style: php-cs-fixer.phar $(DOCKER_PHP) vendor/bin/indent --tabs composer.json - $(DOCKER_PHP) vendor/bin/indent --spaces .php_cs.dist + $(DOCKER_PHP) vendor/bin/indent --spaces .php-cs-fixer.dist.php $(DOCKER_PHP) ./php-cs-fixer.phar fix src/ --diff install: composer.lock @@ -41,12 +43,12 @@ install: composer.lock test: unit test-recursion.json test-recursion2.yaml test-recursion3_index.yaml test-empty-maps.json test-const.json unit: - $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --verbose --colors=always $(TESTCASE) + $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --colors=always $(TESTCASE) test-debug: unit-debug test-recursion.json test-recursion2.yaml test-recursion3_index.yaml test-empty-maps.json test-const.json unit-debug: - $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --debug --testdox --colors=always -c phpunit11.xml.dist $(TESTCASE) + $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --debug --testdox --colors=always $(TESTCASE) # test specific JSON files in tests/spec/data/ # e.g. test-recursion will run validation on tests/spec/data/recursion.json @@ -64,14 +66,17 @@ stan: $(DOCKER_PHP) php $(PHPARGS) vendor/bin/phpstan analyse -l 5 src php-cs-fixer.phar: - wget -q https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v2.16.7/php-cs-fixer.phar && chmod +x php-cs-fixer.phar + wget -q https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/releases/download/$(PHP_CS_FIXER_VERSION)/php-cs-fixer.phar -O $@.tmp + echo "$(PHP_CS_FIXER_SHA256) $@.tmp" | sha256sum -c - + mv $@.tmp $@ + chmod +x $@ -# find spec classes that are not mentioned in tests with @covers yet +# find spec classes that are not mentioned in tests with #[CoversClass] yet coverage: .php-openapi-covA .php-openapi-covB diff $^ .INTERMEDIATE: .php-openapi-covA .php-openapi-covB .php-openapi-covA: - grep -rhPo '@covers .+' tests |cut -c 28- |sort > $@ + grep -rhoE 'CoversClass\([^)]+::class' tests | sed -E 's/.*[\]([A-Za-z]+)::class/\1/' | sort > $@ .php-openapi-covB: grep -rhPo '^class \w+' src/spec/ | awk '{print $$2}' |grep -v '^Type$$' | sort > $@ diff --git a/docker-compose.yml b/docker-compose.yml index 92b101f5..cab97990 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: "3" services: php: build: @@ -14,7 +13,7 @@ services: - TIMEZONE=UTC - IN_DOCKER=docker - PHP_XDEBUG_ENABLED=1 - - XDEBUG_CONFIG="remote_host=host.docker.internal" + - XDEBUG_CONFIG="client_host=host.docker.internal" - PHP_IDE_CONFIG="serverName=Docker" extra_hosts: - "host.docker.internal:host-gateway" From f3c339bfe531779ffa2b4a5a898699ec2b511ab1 Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 15:28:48 +0100 Subject: [PATCH 08/10] Fix CI failures after the tooling update - Remove the unused fourth data set value, which PHPUnit 12 reports - Avoid a caret in the Windows constraint, composer.bat drops it - Do not treat PHPDoc types as certain in PHPStan: spec data is only known at runtime and the checks based on these types must stay - Report code style violations as annotations with cs2pr - Restore LF line endings in the workflows and the Dockerfile Co-Authored-By: Claude Opus 5.5 --- .gitattributes | 1 + .github/workflows/code-style.yml | 47 +++++++++++---------- .github/workflows/php.yml | 3 +- .github/workflows/phpstan.yml | 50 +++++++++++----------- Makefile | 3 +- phpstan.neon.dist | 4 ++ tests/docker/Dockerfile | 72 ++++++++++++++++---------------- tests/json/JsonPointerTest.php | 3 +- 8 files changed, 97 insertions(+), 86 deletions(-) create mode 100644 phpstan.neon.dist diff --git a/.gitattributes b/.gitattributes index 6302c76a..6a9d2280 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,4 +6,5 @@ .php-cs-fixer.dist.php export-ignore docker-compose.yml export-ignore Makefile export-ignore +phpstan.neon.dist export-ignore phpunit.xml.dist export-ignore diff --git a/.github/workflows/code-style.yml b/.github/workflows/code-style.yml index 2e1967fd..ba64aeff 100644 --- a/.github/workflows/code-style.yml +++ b/.github/workflows/code-style.yml @@ -1,21 +1,26 @@ -name: Code Style - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - code-style: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - - - name: Install PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "8.2" - - - name: Check code style - run: make check-style +name: Code Style + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + code-style: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.2" + tools: cs2pr + + - name: Install PHP-CS-Fixer + run: make php-cs-fixer.phar + + - name: Check code style + shell: bash + run: make -s check-style CS_ARGS=--format=checkstyle | cs2pr diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index fb746ef3..8a238bc4 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -23,10 +23,11 @@ jobs: - "highest" symfony-yaml: ['^6.4', '^7.4', '^8.0'] include: + # composer.bat on Windows drops the caret of a version constraint - os: "windows-latest" php: "8.5" dependencies: "highest" - symfony-yaml: '^7.4' + symfony-yaml: '7.4.*' - os: "macos-latest" php: "8.5" dependencies: "highest" diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 81b8c289..73fc61ae 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -1,25 +1,25 @@ -name: PHPStan - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - phpstan: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - - - name: Install PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "8.2" - tools: composer:v2 - - - name: "Install dependencies with Composer" - uses: "ramsey/composer-install@v4" - - - name: PHPStan analysis - run: make stan +name: PHPStan + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + phpstan: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.2" + tools: composer:v2 + + - name: "Install dependencies with Composer" + uses: "ramsey/composer-install@v4" + + - name: PHPStan analysis + run: make stan diff --git a/Makefile b/Makefile index 87bade1d..5fae1dd7 100755 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ endif # Run make with IN_DOCKER=1 to run php commands in a docker container DOCKER_PHP= IN_DOCKER=0 +CS_ARGS= PHP_CS_FIXER_VERSION=v3.95.28 PHP_CS_FIXER_SHA256=44dd8aa9b83163b4913bc39d3e26ba94221ffa03957d000e9aec252f656b0f60 ifeq ($(IN_DOCKER),1) @@ -30,7 +31,7 @@ all: check-style: php-cs-fixer.phar - PHP_CS_FIXER_IGNORE_ENV=1 ./php-cs-fixer.phar fix src/ --diff --dry-run + PHP_CS_FIXER_IGNORE_ENV=1 ./php-cs-fixer.phar fix src/ --diff --dry-run $(CS_ARGS) fix-style: php-cs-fixer.phar $(DOCKER_PHP) vendor/bin/indent --tabs composer.json diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 00000000..4d738c9b --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,4 @@ +parameters: + # Spec data comes from YAML and JSON at runtime, so PHPDoc types are not guaranteed + # and the runtime checks based on them must stay. + treatPhpDocTypesAsCertain: false diff --git a/tests/docker/Dockerfile b/tests/docker/Dockerfile index 6bdecd4e..f804f8a5 100644 --- a/tests/docker/Dockerfile +++ b/tests/docker/Dockerfile @@ -1,36 +1,36 @@ -FROM php:8.2-cli - -ENV DEBIAN_FRONTEND=noninteractive - -RUN echo "force-unsafe-io" > /etc/dpkg/dpkg.cfg.d/02apt-speedup && \ - echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - libzip-dev \ - vim \ - git \ - unzip \ - curl && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \ - pecl install xdebug && \ - docker-php-ext-enable xdebug && \ - docker-php-ext-install zip - -# Install composer -ENV COMPOSER_ALLOW_SUPERUSER=1 \ - PHP_USER_ID=33 \ - PHP_ENABLE_XDEBUG=1 \ - COMPOSER_HOME=/root/.composer/ \ - PATH=/app:/app/vendor/bin:/root/.composer/vendor/bin:$PATH - -RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \ -&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \ -# Make sure we're installing what we think we're installing! -&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \ -&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer \ -&& rm -f /tmp/composer-setup.* - -COPY ./tests/docker/rootfs / - -WORKDIR /app +FROM php:8.2-cli + +ENV DEBIAN_FRONTEND=noninteractive + +RUN echo "force-unsafe-io" > /etc/dpkg/dpkg.cfg.d/02apt-speedup && \ + echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libzip-dev \ + vim \ + git \ + unzip \ + curl && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \ + pecl install xdebug && \ + docker-php-ext-enable xdebug && \ + docker-php-ext-install zip + +# Install composer +ENV COMPOSER_ALLOW_SUPERUSER=1 \ + PHP_USER_ID=33 \ + PHP_ENABLE_XDEBUG=1 \ + COMPOSER_HOME=/root/.composer/ \ + PATH=/app:/app/vendor/bin:/root/.composer/vendor/bin:$PATH + +RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \ +&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \ +# Make sure we're installing what we think we're installing! +&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \ +&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer \ +&& rm -f /tmp/composer-setup.* + +COPY ./tests/docker/rootfs / + +WORKDIR /app diff --git a/tests/json/JsonPointerTest.php b/tests/json/JsonPointerTest.php index 8d30e84a..c63a05f6 100644 --- a/tests/json/JsonPointerTest.php +++ b/tests/json/JsonPointerTest.php @@ -77,7 +77,6 @@ public static function rfcExamples() ["/m~0n" , "#/m~0n" , 8], ]; foreach ($return as $example) { - $example[3] = self::rfcJsonDocument(); yield $example; } } @@ -86,7 +85,7 @@ public static function allExamples() { yield from self::rfcExamples(); - yield ["/a#b" , "#/a%23b" , 16, '{"a#b": 16}']; + yield ["/a#b" , "#/a%23b" , 16]; } #[DataProvider('allExamples')] From 07e2178a38ddc5286aabfc15396c999819a7964b Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 15:46:59 +0100 Subject: [PATCH 09/10] Indent commented code for PHP-CS-Fixer 3 Co-Authored-By: Claude Opus 5.5 --- src/json/JsonPointer.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/json/JsonPointer.php b/src/json/JsonPointer.php index 0e1f75e4..e5ac5fab 100644 --- a/src/json/JsonPointer.php +++ b/src/json/JsonPointer.php @@ -107,11 +107,11 @@ public function evaluate($jsonDocument) foreach ($this->getPath() as $part) { if (is_array($currentReference)) { -// if (!preg_match('~^([1-9]*[0-9]|-)$~', $part)) { -// throw new NonexistentJsonPointerReferenceException( -// "Failed to evaluate pointer '$this->_pointer'. Invalid pointer path '$part' for Array at path '$currentPath'." -// ); -// } + //if (!preg_match('~^([1-9]*[0-9]|-)$~', $part)) { + // throw new NonexistentJsonPointerReferenceException( + // "Failed to evaluate pointer '$this->_pointer'. Invalid pointer path '$part' for Array at path '$currentPath'." + // ); + //} if ($part === '-' || !array_key_exists($part, $currentReference)) { throw new NonexistentJsonPointerReferenceException( "Failed to evaluate pointer '$this->_pointer'. Array has no member $part at path '$currentPath'." From c883ac7d9387e35bf39f08ed28ea4d0e137eec74 Mon Sep 17 00:00:00 2001 From: Vizzent Date: Fri, 6 Nov 2026 15:55:02 +0100 Subject: [PATCH 10/10] Make the coverage check work on macOS grep -P does not exist on macOS. Its error left both class lists empty, so the check passed there without comparing anything. Co-Authored-By: Claude Opus 5.5 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5fae1dd7..6295bbaf 100755 --- a/Makefile +++ b/Makefile @@ -79,7 +79,7 @@ coverage: .php-openapi-covA .php-openapi-covB .php-openapi-covA: grep -rhoE 'CoversClass\([^)]+::class' tests | sed -E 's/.*[\]([A-Za-z]+)::class/\1/' | sort > $@ .php-openapi-covB: - grep -rhPo '^class \w+' src/spec/ | awk '{print $$2}' |grep -v '^Type$$' | sort > $@ + grep -rhoE '^class [A-Za-z0-9_]+' src/spec/ | awk '{print $$2}' |grep -v '^Type$$' | sort > $@ .PHONY: all check-style fix-style install test lint coverage