From f5eb2e66ce372c01b81433a2fc132a2fd16f954c Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 15 Jul 2024 16:26:36 -0700 Subject: [PATCH 01/74] change a sample for testing --- language/v2/language_classify_text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/language/v2/language_classify_text.py b/language/v2/language_classify_text.py index 8c51d03ee5d3..4b87ab820988 100644 --- a/language/v2/language_classify_text.py +++ b/language/v2/language_classify_text.py @@ -50,7 +50,7 @@ def sample_classify_text( } response = client.classify_text(request={"document": document}) - # Loop through classified categories returned from the API + # Loop through classified categories returned from the API. for category in response.categories: # Get the name of the category representing the document. # See the predefined taxonomy of categories: From ab3cf7dd667eabc4060bd461920e5b9f2b89a79d Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 15 Jul 2024 16:26:36 -0700 Subject: [PATCH 02/74] change a sample for testing --- README.md | 1 + language/README.md | 1 + language/v2/language_classify_text.py | 5 ++--- language/v2/language_entities_text_test.py | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e75d8df01608..d25d31a1b08a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Google Cloud Platform Python Samples + Python samples for [Google Cloud Platform products][cloud]. [![Build Status][py-2.7-shield]][py-2.7-link] [![Build Status][py-3.8-shield]][py-3.8-link] [![Build Status][py-3.9-shield]][py-3.9-link] [![Build Status][py-3.10-shield]][py-3.10-link] [![Build Status][py-3.11-shield]][py-3.11-link] diff --git a/language/README.md b/language/README.md index 0fb425ccf99a..d296980dbd10 100644 --- a/language/README.md +++ b/language/README.md @@ -1,3 +1,4 @@ These samples have been moved. + https://github.com/googleapis/python-language/tree/main/samples diff --git a/language/v2/language_classify_text.py b/language/v2/language_classify_text.py index 8c51d03ee5d3..60de48894b40 100644 --- a/language/v2/language_classify_text.py +++ b/language/v2/language_classify_text.py @@ -42,15 +42,14 @@ def sample_classify_text( # Optional. If not specified, the language is automatically detected. # For list of supported languages: # https://cloud.google.com/natural-language/docs/languages - language_code = "en" document = { "content": text_content, "type_": document_type_in_plain_text, - "language_code": language_code, + "language_code": "en", } response = client.classify_text(request={"document": document}) - # Loop through classified categories returned from the API + # Loop through classified categories returned from the API. for category in response.categories: # Get the name of the category representing the document. # See the predefined taxonomy of categories: diff --git a/language/v2/language_entities_text_test.py b/language/v2/language_entities_text_test.py index 48933347ae6f..bb9cf2af81ca 100644 --- a/language/v2/language_entities_text_test.py +++ b/language/v2/language_entities_text_test.py @@ -19,6 +19,7 @@ def test_sample_analyze_entities_text(capsys: ...) -> None: + # TODO: delete this comment assert os.environ["GOOGLE_CLOUD_PROJECT"] != "" language_entities_text.sample_analyze_entities() From 50a753c6343446b4db6770f4061b0d4be91296fb Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 17 Jul 2024 16:29:36 -0700 Subject: [PATCH 03/74] package-level testing prototype --- .github/testing/.editorconfig | 8 + .github/testing/.eslintignore | 1 + .github/testing/.eslintrc.json | 3 + .github/testing/.gitignore | 133 ++ .github/testing/.prettierrc.js | 3 + .github/testing/package-lock.json | 3066 ++++++++++++++++++++++++++ .github/testing/package.json | 17 + .github/testing/src/affected.ts | 53 + .github/testing/src/config/global.ts | 5 + .github/testing/src/config/python.ts | 13 + .github/testing/src/git.ts | 32 + .github/testing/src/main.ts | 31 + .github/testing/tsconfig.json | 12 + .github/workflows/test.yaml | 41 + 14 files changed, 3418 insertions(+) create mode 100644 .github/testing/.editorconfig create mode 100644 .github/testing/.eslintignore create mode 100644 .github/testing/.eslintrc.json create mode 100644 .github/testing/.gitignore create mode 100644 .github/testing/.prettierrc.js create mode 100644 .github/testing/package-lock.json create mode 100644 .github/testing/package.json create mode 100644 .github/testing/src/affected.ts create mode 100644 .github/testing/src/config/global.ts create mode 100644 .github/testing/src/config/python.ts create mode 100644 .github/testing/src/git.ts create mode 100644 .github/testing/src/main.ts create mode 100644 .github/testing/tsconfig.json create mode 100644 .github/workflows/test.yaml diff --git a/.github/testing/.editorconfig b/.github/testing/.editorconfig new file mode 100644 index 000000000000..79fe80267524 --- /dev/null +++ b/.github/testing/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +insert_final_newline = true diff --git a/.github/testing/.eslintignore b/.github/testing/.eslintignore new file mode 100644 index 000000000000..567609b1234a --- /dev/null +++ b/.github/testing/.eslintignore @@ -0,0 +1 @@ +build/ diff --git a/.github/testing/.eslintrc.json b/.github/testing/.eslintrc.json new file mode 100644 index 000000000000..f95bb333f0d7 --- /dev/null +++ b/.github/testing/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/gts/" +} diff --git a/.github/testing/.gitignore b/.github/testing/.gitignore new file mode 100644 index 000000000000..b7bc54b636f6 --- /dev/null +++ b/.github/testing/.gitignore @@ -0,0 +1,133 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# Build files +build/ diff --git a/.github/testing/.prettierrc.js b/.github/testing/.prettierrc.js new file mode 100644 index 000000000000..ff154833921f --- /dev/null +++ b/.github/testing/.prettierrc.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('gts/.prettierrc.json') +} diff --git a/.github/testing/package-lock.json b/.github/testing/package-lock.json new file mode 100644 index 000000000000..394b88775f9b --- /dev/null +++ b/.github/testing/package-lock.json @@ -0,0 +1,3066 @@ +{ + "name": "testing", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "minimatch": "^10.0.1" + }, + "devDependencies": { + "@types/node": "^20.12.7", + "gts": "^5.3.1", + "typescript": "^5.4.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gts": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/gts/-/gts-5.3.1.tgz", + "integrity": "sha512-P9F+krJkGOkisUX+P9pfUas1Xy+U+CxBFZT62uInkJbgvZpnW1ug/pIcMJJmLOthMq1J88lpQUGhXDC9UTvVcw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", + "chalk": "^4.1.2", + "eslint": "8.57.0", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-n": "15.7.0", + "eslint-plugin-prettier": "5.1.3", + "execa": "^5.0.0", + "inquirer": "^7.3.3", + "json5": "^2.1.3", + "meow": "^9.0.0", + "ncp": "^2.0.0", + "prettier": "3.2.5", + "rimraf": "3.0.2", + "write-file-atomic": "^4.0.0" + }, + "bin": { + "gts": "build/src/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "typescript": ">=3" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/.github/testing/package.json b/.github/testing/package.json new file mode 100644 index 000000000000..21767ec96cb5 --- /dev/null +++ b/.github/testing/package.json @@ -0,0 +1,17 @@ +{ + "devDependencies": { + "@types/node": "^20.12.7", + "gts": "^5.3.1", + "typescript": "^5.5.3" + }, + "scripts": { + "clean": "gts clean", + "lint": "gts lint", + "fix": "gts fix", + "build": "tsc", + "affected": "node build/src/main.js" + }, + "dependencies": { + "minimatch": "^10.0.1" + } +} diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts new file mode 100644 index 000000000000..9c7bbba5a7ea --- /dev/null +++ b/.github/testing/src/affected.ts @@ -0,0 +1,53 @@ +import * as fs from 'node:fs'; +import * as path from 'path'; +import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import * as git from './git'; + +// AffectedTests = TestAll | TestSome {String: String[]} +export type AffectedTests = TestAll | TestSome; +export interface TestAll { + kind: 'TestAll'; +} +export interface TestSome { + kind: 'TestSome'; + tests: Record; // {path: testNames} +} + +export type Affected = { + package: string; + tests: AffectedTests; +}; + +export class Config { + match: string[]; + ignore: string[]; + packageConfig: string[]; + + constructor({ match, ignore, packageConfig }: any) { + this.match = match || ['**']; + this.ignore = ignore || []; + this.packageConfig = packageConfig || []; + } + + matchFile = (diff: git.Diff): boolean => + this.match.some(p => minimatch(diff.filename, p)) && + this.ignore.some(p => !minimatch(diff.filename, p)); + + affected = (diff: git.Diff): Affected => ({ + package: this.findPackage(diff.filename), + tests: { kind: 'TestAll' }, // TODO: discover affected tests + }); + + findPackage = (filename: string): string => { + const dir = path.dirname(filename); + if (dir === '.' || this.isPackage(dir)) { + return dir; + } + return this.findPackage(dir); + }; + + isPackage = (dir: string): boolean => + this.packageConfig.some(file => + fs.existsSync(path.join(git.root(), dir, file)) + ); +} diff --git a/.github/testing/src/config/global.ts b/.github/testing/src/config/global.ts new file mode 100644 index 000000000000..a4846406bef5 --- /dev/null +++ b/.github/testing/src/config/global.ts @@ -0,0 +1,5 @@ +import {Config} from '../affected'; + +export const global = new Config({ + ignore: ['README.md'], +}); diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts new file mode 100644 index 000000000000..e4c590114b92 --- /dev/null +++ b/.github/testing/src/config/python.ts @@ -0,0 +1,13 @@ +import {Config} from '../affected'; + +export const python = new Config({ + match: ['**'], + ignore: ['**/README.md'], + packageConfig: [ + 'noxfile_config.py', + 'requirements.txt', + 'pyproject.toml', + 'setup.py', + 'setup.cfg', + ], +}); diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts new file mode 100644 index 000000000000..11289f682f77 --- /dev/null +++ b/.github/testing/src/git.ts @@ -0,0 +1,32 @@ +import {spawnSync} from 'child_process'; + +export type Diff = { + filename: string; + lineNumbers: number[]; +}; + +export function branchName(): string { + const p = spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); + return p.stdout.toString().trim(); +} + +export function diffs(commit1: string, commit2: string): Diff[] { + const p = spawnSync('git', ['diff', '--unified=0', commit1, commit2]); + return p.stdout + .toString() + .split(/^diff --git a\//m) + .map(output => output.split('\n').filter(line => line.length > 0)) + .filter(lines => lines.length > 0) + .map(lines => ({ + filename: lines[0].split(' ')[0], + lineNumbers: lines + .map(line => line.match(/^@@ -(\d+)/)?.at(1)) + .filter(match => match !== undefined) + .map(match => parseInt(match)), + })); +} + +export function root(): string { + const p = spawnSync('git', ['rev-parse', '--show-toplevel']); + return p.stdout.toString().trim(); +} diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts new file mode 100644 index 000000000000..d3f695745194 --- /dev/null +++ b/.github/testing/src/main.ts @@ -0,0 +1,31 @@ +import * as git from './git'; +import { Affected } from './affected'; +import { global } from './config/global'; +import { python } from './config/python'; + +function mergeAffected(affected: Affected[]): Affected[] { + console.log("TODO: main.ts:mergeAffected") + return affected; +} + +const diffsCommit = + process.argv.length > 2 // + ? process.argv[2] + : git.branchName(); + +const baseCommit = + process.argv.length > 3 // + ? process.argv[3] + : 'main'; + +const diffs = git // + .diffs(diffsCommit, baseCommit) + .filter(global.matchFile); + +const affectedPython = mergeAffected( + diffs // + .filter(python.matchFile) + .map(python.affected) +); + +console.log('affectedPython:', affectedPython); diff --git a/.github/testing/tsconfig.json b/.github/testing/tsconfig.json new file mode 100644 index 000000000000..2cc163c18310 --- /dev/null +++ b/.github/testing/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "./node_modules/gts/tsconfig-google.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts", + "src/diffs.ts" + ] +} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 000000000000..b3a993cfa58b --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,41 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: 🛠️ Test + +on: + push: + branches: main + pull_request: + workflow_dispatch: # Manual runs + +jobs: + find-tests: + runs-on: ubuntu-latest + outputs: + tests: ${{steps.affected.outputs.tests}} + steps: + - uses: actions/checkout@v4 + - id: affected + run: echo "tests=`TODO`" >> "$GITHUB_OUTPUT" + + test-python: + needs: find-tests + runs-on: ubuntu-latest + strategy: + matrix: + test: ${{fromJson(needs.find-tests.outputs.tests)}} + steps: + # - uses: actions/checkout@v4 + - run: echo ${{matrix.test}} From c8dca3360761dfe924da612d4b8f891dc6b1a161 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 18 Jul 2024 17:18:11 -0700 Subject: [PATCH 04/74] functional plumbing: zip, zipWith, mapMap, groupBy --- .github/testing/package-lock.json | 13 +++++++++++- .github/testing/package.json | 1 + .github/testing/src/affected.ts | 12 +++++------ .github/testing/src/main.ts | 35 ++++++++++++++++++++++++++++--- .github/testing/tsconfig.json | 3 +++ 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/.github/testing/package-lock.json b/.github/testing/package-lock.json index 394b88775f9b..39e5f781be29 100644 --- a/.github/testing/package-lock.json +++ b/.github/testing/package-lock.json @@ -5,12 +5,13 @@ "packages": { "": { "dependencies": { + "core-js": "^3.37.1", "minimatch": "^10.0.1" }, "devDependencies": { "@types/node": "^20.12.7", "gts": "^5.3.1", - "typescript": "^5.4.3" + "typescript": "^5.5.3" } }, "node_modules/@babel/code-frame": { @@ -778,6 +779,16 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/core-js": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/.github/testing/package.json b/.github/testing/package.json index 21767ec96cb5..658a948e460f 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -12,6 +12,7 @@ "affected": "node build/src/main.js" }, "dependencies": { + "core-js": "^3.37.1", "minimatch": "^10.0.1" } } diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 9c7bbba5a7ea..892da017ac10 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -1,16 +1,16 @@ import * as fs from 'node:fs'; import * as path from 'path'; -import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ import * as git from './git'; // AffectedTests = TestAll | TestSome {String: String[]} export type AffectedTests = TestAll | TestSome; export interface TestAll { - kind: 'TestAll'; + tag: 'TestAll'; } export interface TestSome { - kind: 'TestSome'; - tests: Record; // {path: testNames} + tag: 'TestSome'; + values: Map; // {path: testNames} } export type Affected = { @@ -23,7 +23,7 @@ export class Config { ignore: string[]; packageConfig: string[]; - constructor({ match, ignore, packageConfig }: any) { + constructor({match, ignore, packageConfig}: any) { this.match = match || ['**']; this.ignore = ignore || []; this.packageConfig = packageConfig || []; @@ -35,7 +35,7 @@ export class Config { affected = (diff: git.Diff): Affected => ({ package: this.findPackage(diff.filename), - tests: { kind: 'TestAll' }, // TODO: discover affected tests + tests: {tag: 'TestAll'}, // TODO: discover affected tests }); findPackage = (filename: string): string => { diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index d3f695745194..48f4544f3ca1 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -1,13 +1,42 @@ +import 'core-js/actual'; + import * as git from './git'; import { Affected } from './affected'; import { global } from './config/global'; import { python } from './config/python'; -function mergeAffected(affected: Affected[]): Affected[] { - console.log("TODO: main.ts:mergeAffected") +function zipWith(f: (x: a, y: b) => c, xs: a[], ys: b[]): c[] { + return xs.map((x, i) => f(x, ys[i])); +} + +function zip(xs: a[], ys: b[]): [a, b][] { + return zipWith((x, y) => [x, y], xs, ys); +} + +function mapMap(kvs: Map, f: (k: k, x: a) => b): Map { + const keys = [...kvs.keys()]; + const values = zipWith((k, vs) => f(k, vs), keys, [...kvs.values()]); + return new Map(zip(keys, values)); +} + +function groupBy(xs: a[], key: (x: a) => k, merge: (xs: a[]) => b): Map { + return mapMap(Map.groupBy(xs, key), (_, vs) => merge(vs)) +} + +function groupByPackage(affected: Affected[]): Affected[] { + const packages = groupBy( + affected, + x => x.package, + xs => xs.flatMap(x => x.tests) + ); return affected; } +const affected = [ + { package: 'language/v2', tests: { tag: 'TestAll' } }, + { package: 'language/v2', tests: { tag: 'TestAll' } }, +]; + const diffsCommit = process.argv.length > 2 // ? process.argv[2] @@ -22,7 +51,7 @@ const diffs = git // .diffs(diffsCommit, baseCommit) .filter(global.matchFile); -const affectedPython = mergeAffected( +const affectedPython = groupByPackage( diffs // .filter(python.matchFile) .map(python.affected) diff --git a/.github/testing/tsconfig.json b/.github/testing/tsconfig.json index 2cc163c18310..77b3e15e7902 100644 --- a/.github/testing/tsconfig.json +++ b/.github/testing/tsconfig.json @@ -1,6 +1,9 @@ { "extends": "./node_modules/gts/tsconfig-google.json", "compilerOptions": { + "lib": [ + "ESNext" + ], "rootDir": ".", "outDir": "build" }, From 4b977381c8e0b0932d451e327fb524a02a832578 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 13:18:42 -0700 Subject: [PATCH 05/74] find affected packages --- .github/testing/package-lock.json | 17 +++---- .github/testing/package.json | 2 +- .github/testing/src/affected.ts | 67 ++++++++++------------------ .github/testing/src/config.ts | 48 ++++++++++++++++++++ .github/testing/src/config/global.ts | 2 +- .github/testing/src/config/python.ts | 2 +- .github/testing/src/git.ts | 8 ++-- .github/testing/src/main.ts | 57 +++++------------------ .github/testing/tsconfig.json | 3 -- 9 files changed, 95 insertions(+), 111 deletions(-) create mode 100644 .github/testing/src/config.ts diff --git a/.github/testing/package-lock.json b/.github/testing/package-lock.json index 39e5f781be29..1728988c2ffc 100644 --- a/.github/testing/package-lock.json +++ b/.github/testing/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "dependencies": { - "core-js": "^3.37.1", + "immutable": "^4.3.7", "minimatch": "^10.0.1" }, "devDependencies": { @@ -779,16 +779,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1640,6 +1630,11 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", diff --git a/.github/testing/package.json b/.github/testing/package.json index 658a948e460f..c515e3b42991 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -12,7 +12,7 @@ "affected": "node build/src/main.js" }, "dependencies": { - "core-js": "^3.37.1", + "immutable": "^4.3.7", "minimatch": "^10.0.1" } } diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 892da017ac10..0f2c8e4e5237 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -1,53 +1,32 @@ -import * as fs from 'node:fs'; -import * as path from 'path'; -import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import * as git from './git'; +import {Map, List, Set} from 'immutable'; + +export type PackageName = string; +export type TestPath = string; +export type TestName = string; -// AffectedTests = TestAll | TestSome {String: String[]} -export type AffectedTests = TestAll | TestSome; export interface TestAll { tag: 'TestAll'; } +export const TestAll = (): Affected => ({tag: 'TestAll'}); export interface TestSome { tag: 'TestSome'; - values: Map; // {path: testNames} + tests: Map>; } - -export type Affected = { - package: string; - tests: AffectedTests; -}; - -export class Config { - match: string[]; - ignore: string[]; - packageConfig: string[]; - - constructor({match, ignore, packageConfig}: any) { - this.match = match || ['**']; - this.ignore = ignore || []; - this.packageConfig = packageConfig || []; - } - - matchFile = (diff: git.Diff): boolean => - this.match.some(p => minimatch(diff.filename, p)) && - this.ignore.some(p => !minimatch(diff.filename, p)); - - affected = (diff: git.Diff): Affected => ({ - package: this.findPackage(diff.filename), - tests: {tag: 'TestAll'}, // TODO: discover affected tests - }); - - findPackage = (filename: string): string => { - const dir = path.dirname(filename); - if (dir === '.' || this.isPackage(dir)) { - return dir; +export const TestSome = (tests: Map>): Affected => ({ + tag: 'TestSome', + tests: tests, +}); +export type Affected = TestAll | TestSome; + +export type Change = {package: PackageName; affected: Affected}; + +export function merge(affected: List): Affected { + return affected.reduce((result, current) => { + if (result.tag === 'TestSome' && current.tag === 'TestSome') { + return TestSome( + result.tests.mergeWith((xs, ys) => xs.union(ys), current.tests) + ); } - return this.findPackage(dir); - }; - - isPackage = (dir: string): boolean => - this.packageConfig.some(file => - fs.existsSync(path.join(git.root(), dir, file)) - ); + return TestAll(); + }, TestSome(Map())); } diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts new file mode 100644 index 000000000000..669c8b0de2c5 --- /dev/null +++ b/.github/testing/src/config.ts @@ -0,0 +1,48 @@ +import * as fs from 'node:fs'; +import * as git from './git'; +import * as path from 'path'; +import {Change, TestAll} from './affected'; +import {List} from 'immutable'; +import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ + +export class Config { + match: List; + ignore: List; + packageConfig: List; + + constructor({ + match, + ignore, + packageConfig, + }: { + match?: string[]; + ignore?: string[]; + packageConfig?: string[]; + }) { + this.match = List(match || ['**']); + this.ignore = List(ignore || []); + this.packageConfig = List(packageConfig || []); + } + + matchFile = (diff: git.Diff): boolean => + this.match.some(p => minimatch(diff.filename, p)) && + this.ignore.some(p => !minimatch(diff.filename, p)); + + changes = (diff: git.Diff): Change => ({ + package: this.findPackage(diff.filename), + affected: TestAll(), // TOOD: discover affected tests + }); + + findPackage = (filename: string): string => { + const dir = path.dirname(filename); + if (dir === '.' || this.isPackage(dir)) { + return dir; + } + return this.findPackage(dir); + }; + + isPackage = (dir: string): boolean => + this.packageConfig.some(file => + fs.existsSync(path.join(git.root(), dir, file)) + ); +} diff --git a/.github/testing/src/config/global.ts b/.github/testing/src/config/global.ts index a4846406bef5..5b7d86cbc705 100644 --- a/.github/testing/src/config/global.ts +++ b/.github/testing/src/config/global.ts @@ -1,4 +1,4 @@ -import {Config} from '../affected'; +import {Config} from '../config'; export const global = new Config({ ignore: ['README.md'], diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index e4c590114b92..0dfc236d496e 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -1,4 +1,4 @@ -import {Config} from '../affected'; +import {Config} from '../config'; export const python = new Config({ match: ['**'], diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts index 11289f682f77..dc7d46e75fae 100644 --- a/.github/testing/src/git.ts +++ b/.github/testing/src/git.ts @@ -1,3 +1,4 @@ +import {List} from 'immutable'; import {spawnSync} from 'child_process'; export type Diff = { @@ -10,11 +11,10 @@ export function branchName(): string { return p.stdout.toString().trim(); } -export function diffs(commit1: string, commit2: string): Diff[] { +export function diffs(commit1: string, commit2: string): List { const p = spawnSync('git', ['diff', '--unified=0', commit1, commit2]); - return p.stdout - .toString() - .split(/^diff --git a\//m) + const lines = List(p.stdout.toString().split(/^diff --git a\//m)); + return lines .map(output => output.split('\n').filter(line => line.length > 0)) .filter(lines => lines.length > 0) .map(lines => ({ diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 48f4544f3ca1..89f36afb5bd8 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -1,41 +1,7 @@ -import 'core-js/actual'; - +import * as affected from './affected'; import * as git from './git'; -import { Affected } from './affected'; -import { global } from './config/global'; -import { python } from './config/python'; - -function zipWith(f: (x: a, y: b) => c, xs: a[], ys: b[]): c[] { - return xs.map((x, i) => f(x, ys[i])); -} - -function zip(xs: a[], ys: b[]): [a, b][] { - return zipWith((x, y) => [x, y], xs, ys); -} - -function mapMap(kvs: Map, f: (k: k, x: a) => b): Map { - const keys = [...kvs.keys()]; - const values = zipWith((k, vs) => f(k, vs), keys, [...kvs.values()]); - return new Map(zip(keys, values)); -} - -function groupBy(xs: a[], key: (x: a) => k, merge: (xs: a[]) => b): Map { - return mapMap(Map.groupBy(xs, key), (_, vs) => merge(vs)) -} - -function groupByPackage(affected: Affected[]): Affected[] { - const packages = groupBy( - affected, - x => x.package, - xs => xs.flatMap(x => x.tests) - ); - return affected; -} - -const affected = [ - { package: 'language/v2', tests: { tag: 'TestAll' } }, - { package: 'language/v2', tests: { tag: 'TestAll' } }, -]; +import {global} from './config/global'; +import {python} from './config/python'; const diffsCommit = process.argv.length > 2 // @@ -47,14 +13,13 @@ const baseCommit = ? process.argv[3] : 'main'; -const diffs = git // - .diffs(diffsCommit, baseCommit) - .filter(global.matchFile); +const diffs = git.diffs(diffsCommit, baseCommit).filter(global.matchFile); -const affectedPython = groupByPackage( - diffs // - .filter(python.matchFile) - .map(python.affected) -); +const affectedPython = diffs + .filter(python.matchFile) + .map(python.changes) + .groupBy(change => change.package) + .map(change => change.map(pkg => pkg.affected)) + .map(affected.merge); -console.log('affectedPython:', affectedPython); +console.log('affectedPython:', affectedPython.toJS()); diff --git a/.github/testing/tsconfig.json b/.github/testing/tsconfig.json index 77b3e15e7902..2cc163c18310 100644 --- a/.github/testing/tsconfig.json +++ b/.github/testing/tsconfig.json @@ -1,9 +1,6 @@ { "extends": "./node_modules/gts/tsconfig-google.json", "compilerOptions": { - "lib": [ - "ESNext" - ], "rootDir": ".", "outDir": "build" }, From 0f60b21dc6693b806eed85b63cb6ff80bd8736ab Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:07:34 -0700 Subject: [PATCH 06/74] format strategy matrix --- .github/testing/src/main.ts | 26 ++++++++++++++++---------- .github/workflows/test.yaml | 17 +++++++++++------ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 89f36afb5bd8..0132c6b1162f 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -1,7 +1,8 @@ +import { List } from 'immutable'; import * as affected from './affected'; import * as git from './git'; -import {global} from './config/global'; -import {python} from './config/python'; +import { global } from './config/global'; +import { python } from './config/python'; const diffsCommit = process.argv.length > 2 // @@ -15,11 +16,16 @@ const baseCommit = const diffs = git.diffs(diffsCommit, baseCommit).filter(global.matchFile); -const affectedPython = diffs - .filter(python.matchFile) - .map(python.changes) - .groupBy(change => change.package) - .map(change => change.map(pkg => pkg.affected)) - .map(affected.merge); - -console.log('affectedPython:', affectedPython.toJS()); +const strategyMatrix = { + python: List( + diffs + .filter(python.matchFile) + .map(python.changes) + .groupBy(change => change.package) + .map(change => change.map(pkg => pkg.affected)) + .map(affected.merge) + .map((tests, pkg) => ({ package: pkg, tests: tests })) + .values() + ), +}; +console.log(JSON.stringify(strategyMatrix)); diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b3a993cfa58b..949ad45f43ad 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -24,18 +24,23 @@ jobs: find-tests: runs-on: ubuntu-latest outputs: - tests: ${{steps.affected.outputs.tests}} + affected: ${{steps.find-affected.outputs.affected}} steps: - uses: actions/checkout@v4 - - id: affected - run: echo "tests=`TODO`" >> "$GITHUB_OUTPUT" + - run: npm run build + working-directory: .github/testing + - id: find-affected + run: echo "affected=$AFFECTED" >> "$GITHUB_OUTPUT" + working-directory: .github/testing + env: + AFFECTED: $(npm run affected) + test-python: needs: find-tests runs-on: ubuntu-latest strategy: - matrix: - test: ${{fromJson(needs.find-tests.outputs.tests)}} + matrix: ${{fromJson(needs.find-tests.outputs.affected)}} steps: # - uses: actions/checkout@v4 - - run: echo ${{matrix.test}} + - run: echo ${{matrix}} From 6ee0a1d54627afa12d97d36062098f008211640d Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:11:56 -0700 Subject: [PATCH 07/74] add headers --- .github/testing/.prettierrc.js | 14 ++++++++++++++ .github/testing/src/affected.ts | 14 ++++++++++++++ .github/testing/src/config.ts | 14 ++++++++++++++ .github/testing/src/config/global.ts | 14 ++++++++++++++ .github/testing/src/config/python.ts | 14 ++++++++++++++ .github/testing/src/git.ts | 14 ++++++++++++++ .github/testing/src/main.ts | 22 ++++++++++++++++++---- 7 files changed, 102 insertions(+), 4 deletions(-) diff --git a/.github/testing/.prettierrc.js b/.github/testing/.prettierrc.js index ff154833921f..53e2e1e8ee2e 100644 --- a/.github/testing/.prettierrc.js +++ b/.github/testing/.prettierrc.js @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + module.exports = { ...require('gts/.prettierrc.json') } diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 0f2c8e4e5237..17834c0b4878 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import {Map, List, Set} from 'immutable'; export type PackageName = string; diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 669c8b0de2c5..67ce43a414ff 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; diff --git a/.github/testing/src/config/global.ts b/.github/testing/src/config/global.ts index 5b7d86cbc705..cbcd7cbf7fa1 100644 --- a/.github/testing/src/config/global.ts +++ b/.github/testing/src/config/global.ts @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import {Config} from '../config'; export const global = new Config({ diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 0dfc236d496e..80788608d014 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import {Config} from '../config'; export const python = new Config({ diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts index dc7d46e75fae..9dc43495ed18 100644 --- a/.github/testing/src/git.ts +++ b/.github/testing/src/git.ts @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import {List} from 'immutable'; import {spawnSync} from 'child_process'; diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 0132c6b1162f..42d69ef33cf1 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -1,8 +1,22 @@ -import { List } from 'immutable'; +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {List} from 'immutable'; import * as affected from './affected'; import * as git from './git'; -import { global } from './config/global'; -import { python } from './config/python'; +import {global} from './config/global'; +import {python} from './config/python'; const diffsCommit = process.argv.length > 2 // @@ -24,7 +38,7 @@ const strategyMatrix = { .groupBy(change => change.package) .map(change => change.map(pkg => pkg.affected)) .map(affected.merge) - .map((tests, pkg) => ({ package: pkg, tests: tests })) + .map((tests, pkg) => ({package: pkg, tests: tests})) .values() ), }; From 5ae25f5ca1e5acbc7d06c1cb7ddeb7546de735b3 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:13:52 -0700 Subject: [PATCH 08/74] install package --- .github/workflows/test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 949ad45f43ad..965f0a8294c5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -27,6 +27,8 @@ jobs: affected: ${{steps.find-affected.outputs.affected}} steps: - uses: actions/checkout@v4 + - run: npm ci + working-directory: .github/testing - run: npm run build working-directory: .github/testing - id: find-affected From 5d1124458fbe0eec14393d72add72e61cfa20e79 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:18:12 -0700 Subject: [PATCH 09/74] use default working directory --- .github/workflows/test.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 965f0a8294c5..8e08dae3f9c6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -25,15 +25,15 @@ jobs: runs-on: ubuntu-latest outputs: affected: ${{steps.find-affected.outputs.affected}} + defaults: + run: + working-directory: .github/testing steps: - uses: actions/checkout@v4 - run: npm ci - working-directory: .github/testing - run: npm run build - working-directory: .github/testing - id: find-affected - run: echo "affected=$AFFECTED" >> "$GITHUB_OUTPUT" - working-directory: .github/testing + run: echo "affected=$AFFECTED" # >> "$GITHUB_OUTPUT" env: AFFECTED: $(npm run affected) From d9a957550897b220f4abbee61e26e29d8bd7307a Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:19:58 -0700 Subject: [PATCH 10/74] pin node version --- .github/workflows/test.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8e08dae3f9c6..455870ab55ea 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -30,12 +30,13 @@ jobs: working-directory: .github/testing steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20.x' - run: npm ci - run: npm run build - id: find-affected - run: echo "affected=$AFFECTED" # >> "$GITHUB_OUTPUT" - env: - AFFECTED: $(npm run affected) + run: echo "affected=$(npm run affected)" # >> "$GITHUB_OUTPUT" test-python: From acd60dd196354ff1b36d66fe19fce1cc597c445c Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:30:27 -0700 Subject: [PATCH 11/74] run command silent --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 455870ab55ea..5b6897ea4eb4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,7 +36,7 @@ jobs: - run: npm ci - run: npm run build - id: find-affected - run: echo "affected=$(npm run affected)" # >> "$GITHUB_OUTPUT" + run: echo "affected=$(npm run --silent affected)" # >> "$GITHUB_OUTPUT" test-python: From c5fc61c960eaa24a57e5c5e3d92bcd601dc9154e Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:32:54 -0700 Subject: [PATCH 12/74] pass matrix variable --- .github/workflows/test.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 5b6897ea4eb4..4169be97a10c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,14 +36,14 @@ jobs: - run: npm ci - run: npm run build - id: find-affected - run: echo "affected=$(npm run --silent affected)" # >> "$GITHUB_OUTPUT" - + run: echo "affected=$(npm run --silent affected)" >> "$GITHUB_OUTPUT" test-python: needs: find-tests runs-on: ubuntu-latest - strategy: - matrix: ${{fromJson(needs.find-tests.outputs.affected)}} + # strategy: + # matrix: ${{fromJson(needs.find-tests.outputs.affected)}} steps: # - uses: actions/checkout@v4 - - run: echo ${{matrix}} + # - run: echo ${{matrix}} + - run: echo ${{needs.find-tests.outputs.affected}} From 9962eccf0ee39b627de659b76ca95989a1892272 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:35:46 -0700 Subject: [PATCH 13/74] actions matrix experiments --- .github/workflows/test.yaml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4169be97a10c..9ac09926a994 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -29,14 +29,18 @@ jobs: run: working-directory: .github/testing steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - run: npm ci - - run: npm run build + # - uses: actions/checkout@v4 + # - uses: actions/setup-node@v4 + # with: + # node-version: '20.x' + # - run: npm ci + # - run: npm run build + # - id: find-affected + # run: echo "affected=$(npm run --silent affected)" >> "$GITHUB_OUTPUT" - id: find-affected - run: echo "affected=$(npm run --silent affected)" >> "$GITHUB_OUTPUT" + run: echo "$MATRIX" >> "$GITHUB_OUTPUT" + env: + MATRIX: '{"python": ["py"], "nodejs": ["js"]}' test-python: needs: find-tests From e1d4ba70e45ccb9d64159cde3df008cd987e39a2 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 14:37:44 -0700 Subject: [PATCH 14/74] revert sample changes --- .github/workflows/test.yaml | 29 +++++++++++----------- README.md | 1 - language/README.md | 1 - language/v2/language_classify_text.py | 5 ++-- language/v2/language_entities_text_test.py | 1 - 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9ac09926a994..e5304722f884 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -21,13 +21,13 @@ on: workflow_dispatch: # Manual runs jobs: - find-tests: + affected: runs-on: ubuntu-latest outputs: - affected: ${{steps.find-affected.outputs.affected}} - defaults: - run: - working-directory: .github/testing + python: ${{steps.python.outputs.affected}} + # defaults: + # run: + # working-directory: .github/testing steps: # - uses: actions/checkout@v4 # - uses: actions/setup-node@v4 @@ -37,17 +37,18 @@ jobs: # - run: npm run build # - id: find-affected # run: echo "affected=$(npm run --silent affected)" >> "$GITHUB_OUTPUT" - - id: find-affected - run: echo "$MATRIX" >> "$GITHUB_OUTPUT" + - id: python + run: echo "affected=$MATRIX" >> "$GITHUB_OUTPUT" env: - MATRIX: '{"python": ["py"], "nodejs": ["js"]}' + MATRIX: '[{"A": ["a"]}, {"B": ["b"]}]' - test-python: - needs: find-tests + Python: + needs: affected runs-on: ubuntu-latest - # strategy: - # matrix: ${{fromJson(needs.find-tests.outputs.affected)}} + strategy: + matrix: + affected: ${{fromJson(needs.affected.outputs.python)}} steps: # - uses: actions/checkout@v4 - # - run: echo ${{matrix}} - - run: echo ${{needs.find-tests.outputs.affected}} + # - run: echo "matrix=${{needs.find-tests.outputs.affected}}" + - run: echo "affected=${{toJson(matrix.affected)}}" diff --git a/README.md b/README.md index d25d31a1b08a..e75d8df01608 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Google Cloud Platform Python Samples - Python samples for [Google Cloud Platform products][cloud]. [![Build Status][py-2.7-shield]][py-2.7-link] [![Build Status][py-3.8-shield]][py-3.8-link] [![Build Status][py-3.9-shield]][py-3.9-link] [![Build Status][py-3.10-shield]][py-3.10-link] [![Build Status][py-3.11-shield]][py-3.11-link] diff --git a/language/README.md b/language/README.md index d296980dbd10..0fb425ccf99a 100644 --- a/language/README.md +++ b/language/README.md @@ -1,4 +1,3 @@ These samples have been moved. - https://github.com/googleapis/python-language/tree/main/samples diff --git a/language/v2/language_classify_text.py b/language/v2/language_classify_text.py index 60de48894b40..8c51d03ee5d3 100644 --- a/language/v2/language_classify_text.py +++ b/language/v2/language_classify_text.py @@ -42,14 +42,15 @@ def sample_classify_text( # Optional. If not specified, the language is automatically detected. # For list of supported languages: # https://cloud.google.com/natural-language/docs/languages + language_code = "en" document = { "content": text_content, "type_": document_type_in_plain_text, - "language_code": "en", + "language_code": language_code, } response = client.classify_text(request={"document": document}) - # Loop through classified categories returned from the API. + # Loop through classified categories returned from the API for category in response.categories: # Get the name of the category representing the document. # See the predefined taxonomy of categories: diff --git a/language/v2/language_entities_text_test.py b/language/v2/language_entities_text_test.py index bb9cf2af81ca..48933347ae6f 100644 --- a/language/v2/language_entities_text_test.py +++ b/language/v2/language_entities_text_test.py @@ -19,7 +19,6 @@ def test_sample_analyze_entities_text(capsys: ...) -> None: - # TODO: delete this comment assert os.environ["GOOGLE_CLOUD_PROJECT"] != "" language_entities_text.sample_analyze_entities() From 89a0c03e176d7efdca8b576032f6cf0eb950b009 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 15:59:22 -0700 Subject: [PATCH 15/74] consistent strategy matrix format --- .github/testing/src/affected.ts | 22 +++++---------- .github/testing/src/config.ts | 10 +++---- .github/testing/src/git.ts | 3 +- .github/testing/src/main.ts | 50 ++++++++++++++++++++------------- .github/workflows/test.yaml | 32 +++++++++++---------- 5 files changed, 61 insertions(+), 56 deletions(-) diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 17834c0b4878..0025a44ad81c 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -12,33 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {Map, List, Set} from 'immutable'; +import { Map, List, Set } from 'immutable'; export type PackageName = string; export type TestPath = string; export type TestName = string; -export interface TestAll { - tag: 'TestAll'; -} -export const TestAll = (): Affected => ({tag: 'TestAll'}); -export interface TestSome { - tag: 'TestSome'; - tests: Map>; -} +export const TestAll = (): Affected => ({ 'TestAll': null }); export const TestSome = (tests: Map>): Affected => ({ - tag: 'TestSome', - tests: tests, + 'TestSome': tests, }); -export type Affected = TestAll | TestSome; +export type Affected = { 'TestAll': null } | { 'TestSome': Map> }; -export type Change = {package: PackageName; affected: Affected}; +export type Change = { package: PackageName; affected: Affected }; export function merge(affected: List): Affected { return affected.reduce((result, current) => { - if (result.tag === 'TestSome' && current.tag === 'TestSome') { + if ('TestSome' in result && 'TestSome' in current) { return TestSome( - result.tests.mergeWith((xs, ys) => xs.union(ys), current.tests) + result.TestSome.mergeWith((xs, ys) => xs.union(ys), current.TestSome) ); } return TestAll(); diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 67ce43a414ff..d3eef79e713e 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -20,9 +20,9 @@ import {List} from 'immutable'; import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ export class Config { - match: List; - ignore: List; - packageConfig: List; + match: List = List(['**']); + ignore: List = List(); + packageConfig: List = List(); constructor({ match, @@ -34,8 +34,8 @@ export class Config { packageConfig?: string[]; }) { this.match = List(match || ['**']); - this.ignore = List(ignore || []); - this.packageConfig = List(packageConfig || []); + this.ignore = List(ignore); + this.packageConfig = List(packageConfig); } matchFile = (diff: git.Diff): boolean => diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts index 9dc43495ed18..a92e50ebd502 100644 --- a/.github/testing/src/git.ts +++ b/.github/testing/src/git.ts @@ -27,8 +27,7 @@ export function branchName(): string { export function diffs(commit1: string, commit2: string): List { const p = spawnSync('git', ['diff', '--unified=0', commit1, commit2]); - const lines = List(p.stdout.toString().split(/^diff --git a\//m)); - return lines + return List(p.stdout.toString().split(/^diff --git a\//m)) .map(output => output.split('\n').filter(line => line.length > 0)) .filter(lines => lines.length > 0) .map(lines => ({ diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 42d69ef33cf1..a9c9dd9a1640 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -12,34 +12,46 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {List} from 'immutable'; +import { Map, List } from 'immutable'; import * as affected from './affected'; import * as git from './git'; -import {global} from './config/global'; -import {python} from './config/python'; +import { global } from './config/global'; +import { python } from './config/python'; -const diffsCommit = +const language = process.argv.length > 2 // ? process.argv[2] - : git.branchName(); + : ''; -const baseCommit = +const diffsCommit = process.argv.length > 3 // ? process.argv[3] + : git.branchName(); + +const baseCommit = + process.argv.length > 4 // + ? process.argv[4] : 'main'; const diffs = git.diffs(diffsCommit, baseCommit).filter(global.matchFile); -const strategyMatrix = { - python: List( - diffs - .filter(python.matchFile) - .map(python.changes) - .groupBy(change => change.package) - .map(change => change.map(pkg => pkg.affected)) - .map(affected.merge) - .map((tests, pkg) => ({package: pkg, tests: tests})) - .values() - ), -}; -console.log(JSON.stringify(strategyMatrix)); +const config = Map({ + python: python, +}).get(language); + +if (!config) { + throw `unsupported language: ${language}`; +} + +const affectedTests = List( + diffs + .filter(config.matchFile) + .map(config.changes) + .groupBy(change => change.package) + .map(change => change.map(pkg => pkg.affected)) + .map(affected.merge) + .map((tests, pkg) => ({ package: pkg, ...tests })) + .values() +); + +console.log(JSON.stringify(affectedTests)); diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e5304722f884..71b716141cfa 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -25,28 +25,30 @@ jobs: runs-on: ubuntu-latest outputs: python: ${{steps.python.outputs.affected}} - # defaults: - # run: - # working-directory: .github/testing + defaults: + run: + working-directory: .github/testing steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-node@v4 - # with: - # node-version: '20.x' - # - run: npm ci - # - run: npm run build - # - id: find-affected - # run: echo "affected=$(npm run --silent affected)" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20.x' + - run: npm ci + - run: npm run build - id: python - run: echo "affected=$MATRIX" >> "$GITHUB_OUTPUT" - env: - MATRIX: '[{"A": ["a"]}, {"B": ["b"]}]' + run: echo "affected=$(npm run --silent affected python)" >> "$GITHUB_OUTPUT" + # - id: python + # run: echo "affected=$MATRIX" >> "$GITHUB_OUTPUT" + # env: + # # MATRIX: '[{"package": "language/v2", "tests": {"tag":"TestAll"}}]' + # # MATRIX: '[{"package": "language/v2", "tests": {"tag":"TestSome", "tests": {"T1": ["a", "b"], "T2": ["c"]}}}]' + # MATRIX: '[{"package": "language/v2", "TestSome": {"T1": ["a", "b"], "T2": ["c"]}}]' Python: needs: affected runs-on: ubuntu-latest strategy: - matrix: + matrix: affected: ${{fromJson(needs.affected.outputs.python)}} steps: # - uses: actions/checkout@v4 From 6732f1a50d7ef285fb3a4c81c8dbf850d78bd7e6 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 22 Jul 2024 16:24:00 -0700 Subject: [PATCH 16/74] change sample file --- language/v2/language_classify_text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/language/v2/language_classify_text.py b/language/v2/language_classify_text.py index 8c51d03ee5d3..f21a3b540ebb 100644 --- a/language/v2/language_classify_text.py +++ b/language/v2/language_classify_text.py @@ -36,7 +36,7 @@ def sample_classify_text( client = language_v2.LanguageServiceClient() - # Available types: PLAIN_TEXT, HTML + # Available types: PLAIN_TEXT, HTML. document_type_in_plain_text = language_v2.Document.Type.PLAIN_TEXT # Optional. If not specified, the language is automatically detected. From 1a397df732556bd57eb343254dfd990fa0b60aee Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 10:31:52 -0700 Subject: [PATCH 17/74] add debugging information --- .github/workflows/test.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 71b716141cfa..aba713666f72 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,7 +36,10 @@ jobs: - run: npm ci - run: npm run build - id: python - run: echo "affected=$(npm run --silent affected python)" >> "$GITHUB_OUTPUT" + run: | + AFFECTED=$(npm --silent run affected python) + echo "python affected: $AFFECTED" + echo "affected=$AFFECTED" >> "$GITHUB_OUTPUT" # - id: python # run: echo "affected=$MATRIX" >> "$GITHUB_OUTPUT" # env: @@ -48,7 +51,7 @@ jobs: needs: affected runs-on: ubuntu-latest strategy: - matrix: + matrix: affected: ${{fromJson(needs.affected.outputs.python)}} steps: # - uses: actions/checkout@v4 From 71e5e053a7917503681e2a506fa2ad03f9109f85 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 10:36:08 -0700 Subject: [PATCH 18/74] use pull request commit sha --- .github/workflows/test.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index aba713666f72..2f06877e6787 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,11 +35,12 @@ jobs: node-version: '20.x' - run: npm ci - run: npm run build + - run: git diff --name-only origin/main origin/$GITHUB_HEAD_REF - id: python run: | - AFFECTED=$(npm --silent run affected python) - echo "python affected: $AFFECTED" - echo "affected=$AFFECTED" >> "$GITHUB_OUTPUT" + PYTHON_AFFECTED=$(npm --silent run affected python ${{github.event.pull_request.head.sha}} main) + echo "$PYTHON_AFFECTED" + echo "affected=$PYTHON_AFFECTED" >> "$GITHUB_OUTPUT" # - id: python # run: echo "affected=$MATRIX" >> "$GITHUB_OUTPUT" # env: From 87b207ab8300383ed8c0d34bef07999741f3bee5 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 10:49:26 -0700 Subject: [PATCH 19/74] fetch origin --- .github/testing/src/affected.ts | 12 +++++++----- .github/testing/src/git.ts | 8 +++++++- .github/testing/src/main.ts | 8 ++++---- .github/workflows/test.yaml | 3 ++- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 0025a44ad81c..68421c8092d2 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -12,19 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Map, List, Set } from 'immutable'; +import {Map, List, Set} from 'immutable'; export type PackageName = string; export type TestPath = string; export type TestName = string; -export const TestAll = (): Affected => ({ 'TestAll': null }); +export const TestAll = (): Affected => ({TestAll: null}); export const TestSome = (tests: Map>): Affected => ({ - 'TestSome': tests, + TestSome: tests, }); -export type Affected = { 'TestAll': null } | { 'TestSome': Map> }; +export type Affected = + | {TestAll: null} + | {TestSome: Map>}; -export type Change = { package: PackageName; affected: Affected }; +export type Change = {package: PackageName; affected: Affected}; export function merge(affected: List): Affected { return affected.reduce((result, current) => { diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts index a92e50ebd502..5a6ff7b344f9 100644 --- a/.github/testing/src/git.ts +++ b/.github/testing/src/git.ts @@ -26,7 +26,13 @@ export function branchName(): string { } export function diffs(commit1: string, commit2: string): List { - const p = spawnSync('git', ['diff', '--unified=0', commit1, commit2]); + const p = spawnSync('git', [ + '--no-pager', + 'diff', + '--unified=0', + commit1, + commit2, + ]); return List(p.stdout.toString().split(/^diff --git a\//m)) .map(output => output.split('\n').filter(line => line.length > 0)) .filter(lines => lines.length > 0) diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index a9c9dd9a1640..e8ac60270bb3 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -12,11 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Map, List } from 'immutable'; +import {Map, List} from 'immutable'; import * as affected from './affected'; import * as git from './git'; -import { global } from './config/global'; -import { python } from './config/python'; +import {global} from './config/global'; +import {python} from './config/python'; const language = process.argv.length > 2 // @@ -50,7 +50,7 @@ const affectedTests = List( .groupBy(change => change.package) .map(change => change.map(pkg => pkg.affected)) .map(affected.merge) - .map((tests, pkg) => ({ package: pkg, ...tests })) + .map((tests, pkg) => ({package: pkg, ...tests})) .values() ); diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2f06877e6787..39f4dd47ce47 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,7 +35,8 @@ jobs: node-version: '20.x' - run: npm ci - run: npm run build - - run: git diff --name-only origin/main origin/$GITHUB_HEAD_REF + - run: git fetch origin + - run: git diff --name-only main HEAD - id: python run: | PYTHON_AFFECTED=$(npm --silent run affected python ${{github.event.pull_request.head.sha}} main) From ae281070ba13fe8fb2da916be8c109c62b227310 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 10:51:55 -0700 Subject: [PATCH 20/74] fetch origin main --- .github/workflows/test.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 39f4dd47ce47..153a52136348 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -33,13 +33,12 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '20.x' + - run: git fetch origin main - run: npm ci - run: npm run build - - run: git fetch origin - - run: git diff --name-only main HEAD - id: python run: | - PYTHON_AFFECTED=$(npm --silent run affected python ${{github.event.pull_request.head.sha}} main) + PYTHON_AFFECTED=$(npm --silent run affected python HEAD origin/main) echo "$PYTHON_AFFECTED" echo "affected=$PYTHON_AFFECTED" >> "$GITHUB_OUTPUT" # - id: python From 0b1544b08bbeccbdbae390ae774e107ee3f9478c Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 12:47:00 -0700 Subject: [PATCH 21/74] initial testing infrastructure --- .github/testing/package.json | 3 +- .github/testing/src/affected.ts | 20 ++++---- .github/testing/src/config.ts | 63 +++++++++++++++++++------ .github/testing/src/config/global.ts | 19 -------- .github/testing/src/config/python.ts | 10 +++- .github/testing/src/main.ts | 69 ++++++++++++---------------- .github/workflows/test.yaml | 27 ++++++----- 7 files changed, 114 insertions(+), 97 deletions(-) delete mode 100644 .github/testing/src/config/global.ts diff --git a/.github/testing/package.json b/.github/testing/package.json index c515e3b42991..de366df20f83 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -9,7 +9,8 @@ "lint": "gts lint", "fix": "gts fix", "build": "tsc", - "affected": "node build/src/main.js" + "affected": "node --enable-source-maps build/src/main.js affected", + "tests": "node --enable-source-maps build/src/main.js tests" }, "dependencies": { "immutable": "^4.3.7", diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 68421c8092d2..30e005b6bccd 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -12,29 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {Map, List, Set} from 'immutable'; +import { Map, List, Set } from 'immutable'; export type PackageName = string; export type TestPath = string; export type TestName = string; -export const TestAll = (): Affected => ({TestAll: null}); -export const TestSome = (tests: Map>): Affected => ({ +export const TestAll = (path: string): Affected => ({ path: path, TestAll: null }); +export const TestSome = (path: string, tests: Map>): Affected => ({ + path: path, TestSome: tests, }); export type Affected = - | {TestAll: null} - | {TestSome: Map>}; + | { path: string, TestAll: null } + | { path: string, TestSome: Map> }; -export type Change = {package: PackageName; affected: Affected}; - -export function merge(affected: List): Affected { +export function mergeAffected(path: string, affected: List): Affected { return affected.reduce((result, current) => { if ('TestSome' in result && 'TestSome' in current) { return TestSome( + path, result.TestSome.mergeWith((xs, ys) => xs.union(ys), current.TestSome) ); } - return TestAll(); - }, TestSome(Map())); + return TestAll(path); + }, TestSome(path || '', Map())); } diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index d3eef79e713e..73f3e80238be 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,37 +15,72 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import {Change, TestAll} from './affected'; -import {List} from 'immutable'; -import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import { List, Map, Set } from 'immutable'; +import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import { + Affected, + PackageName, + TestAll, + TestName, + TestPath, + mergeAffected, +} from './affected'; export class Config { - match: List = List(['**']); - ignore: List = List(); - packageConfig: List = List(); + match: List; + ignore: List; + packageFile: List; + testAll: (path: PackageName) => void; + testSome: (path: PackageName, tests: Map>) => void; constructor({ match, ignore, - packageConfig, + packageFile, + testAll, + testSome, }: { match?: string[]; ignore?: string[]; - packageConfig?: string[]; + packageFile?: string[]; + testAll?: (path: PackageName) => void; + testSome?: (path: PackageName, tests: Map>) => void; }) { this.match = List(match || ['**']); this.ignore = List(ignore); - this.packageConfig = List(packageConfig); + this.packageFile = List(packageFile); + this.testAll = testAll || (path => { }); + this.testSome = testSome || ((path, tests) => { }); + } + + affected = (head: string, main: string): List => + List( + git + .diffs(head, main) + .filter(this.matchFile) + .map(this.findAffected) + .groupBy(affected => affected.path) + .map((affected, path) => mergeAffected(path, affected)) + .values() + ); + + test = (affected: Affected) => { + if ('TestAll' in affected) { + return this.testAll(affected.path) + } + if ('TestSome' in affected) { + return this.testSome(affected.path, affected.TestSome) + } } matchFile = (diff: git.Diff): boolean => this.match.some(p => minimatch(diff.filename, p)) && this.ignore.some(p => !minimatch(diff.filename, p)); - changes = (diff: git.Diff): Change => ({ - package: this.findPackage(diff.filename), - affected: TestAll(), // TOOD: discover affected tests - }); + findAffected = (diff: git.Diff): Affected => { + const path = this.findPackage(diff.filename) + return TestAll(path) // TOOD: discover affected tests only + } findPackage = (filename: string): string => { const dir = path.dirname(filename); @@ -56,7 +91,7 @@ export class Config { }; isPackage = (dir: string): boolean => - this.packageConfig.some(file => + this.packageFile.some(file => fs.existsSync(path.join(git.root(), dir, file)) ); } diff --git a/.github/testing/src/config/global.ts b/.github/testing/src/config/global.ts deleted file mode 100644 index cbcd7cbf7fa1..000000000000 --- a/.github/testing/src/config/global.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import {Config} from '../config'; - -export const global = new Config({ - ignore: ['README.md'], -}); diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 80788608d014..50d5ac98466d 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -12,16 +12,22 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {Config} from '../config'; +import { Config } from '../config'; export const python = new Config({ match: ['**'], ignore: ['**/README.md'], - packageConfig: [ + packageFile: [ 'noxfile_config.py', 'requirements.txt', 'pyproject.toml', 'setup.py', 'setup.cfg', ], + testAll: path => { + throw `TODO: config/python.ts testAll ${path}` + }, + testSome: (path, tests) => { + throw `TODO: config/python.ts testSome ${path} ${JSON.stringify(tests)}` + } }); diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index e8ac60270bb3..dc492f7832b4 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -12,46 +12,37 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {Map, List} from 'immutable'; -import * as affected from './affected'; import * as git from './git'; -import {global} from './config/global'; -import {python} from './config/python'; - -const language = - process.argv.length > 2 // - ? process.argv[2] - : ''; - -const diffsCommit = - process.argv.length > 3 // - ? process.argv[3] - : git.branchName(); - -const baseCommit = - process.argv.length > 4 // - ? process.argv[4] - : 'main'; - -const diffs = git.diffs(diffsCommit, baseCommit).filter(global.matchFile); - -const config = Map({ - python: python, -}).get(language); - -if (!config) { - throw `unsupported language: ${language}`; +import { Config } from './config'; +import { python } from './config/python'; +import { Affected } from './affected'; + +function getConfig(lang: string): Config { + switch (lang) { + case 'python': + return python; + } + throw `unsupported language: ${lang}`; } -const affectedTests = List( - diffs - .filter(config.matchFile) - .map(config.changes) - .groupBy(change => change.package) - .map(change => change.map(pkg => pkg.affected)) - .map(affected.merge) - .map((tests, pkg) => ({package: pkg, ...tests})) - .values() -); +function main(command: string) { + switch (command) { + case 'affected': { + const config = getConfig(process.argv[3]); + const head = process.argv[4] || git.branchName(); + const main = process.argv[5] || 'main'; + const affected = config.affected(head, main); + console.log(JSON.stringify(affected)); + return; + } + case 'tests': { + const config = getConfig(process.argv[3]); + const affected: Affected = JSON.parse(process.argv[4]); + config.test(affected); + return; + } + } + throw `unsupported command: ${command}`; +} -console.log(JSON.stringify(affectedTests)); +main(process.argv[2]); diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 153a52136348..0feada6d26da 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -38,15 +38,9 @@ jobs: - run: npm run build - id: python run: | - PYTHON_AFFECTED=$(npm --silent run affected python HEAD origin/main) - echo "$PYTHON_AFFECTED" - echo "affected=$PYTHON_AFFECTED" >> "$GITHUB_OUTPUT" - # - id: python - # run: echo "affected=$MATRIX" >> "$GITHUB_OUTPUT" - # env: - # # MATRIX: '[{"package": "language/v2", "tests": {"tag":"TestAll"}}]' - # # MATRIX: '[{"package": "language/v2", "tests": {"tag":"TestSome", "tests": {"T1": ["a", "b"], "T2": ["c"]}}}]' - # MATRIX: '[{"package": "language/v2", "TestSome": {"T1": ["a", "b"], "T2": ["c"]}}]' + affected_python=$(npm --silent run affected python HEAD origin/main) + echo "$affected_python" + echo "affected=$affected_python" >> "$GITHUB_OUTPUT" Python: needs: affected @@ -54,7 +48,16 @@ jobs: strategy: matrix: affected: ${{fromJson(needs.affected.outputs.python)}} + defaults: + run: + working-directory: .github/testing steps: - # - uses: actions/checkout@v4 - # - run: echo "matrix=${{needs.find-tests.outputs.affected}}" - - run: echo "affected=${{toJson(matrix.affected)}}" + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20.x' + - run: npm ci + - run: npm run build + - run: npm run tests python "$AFFECTED" + env: + AFFECTED: ${{toJson(matrix.affected)}} From 9508dbaf062ac1808293744564cca80730525320 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 13:21:23 -0700 Subject: [PATCH 22/74] change directory for test --- .github/testing/src/config.ts | 7 +++++-- .github/testing/src/git.ts | 14 +++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 73f3e80238be..9e0ccfd86d4c 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -65,12 +65,15 @@ export class Config { ); test = (affected: Affected) => { + const cwd = process.cwd() + process.chdir(git.root()) if ('TestAll' in affected) { - return this.testAll(affected.path) + this.testAll(affected.path) } if ('TestSome' in affected) { - return this.testSome(affected.path, affected.TestSome) + this.testSome(affected.path, affected.TestSome) } + process.chdir(cwd) } matchFile = (diff: git.Diff): boolean => diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts index 5a6ff7b344f9..08f12ce68563 100644 --- a/.github/testing/src/git.ts +++ b/.github/testing/src/git.ts @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {List} from 'immutable'; -import {spawnSync} from 'child_process'; +import { List } from 'immutable'; +import { spawnSync } from 'child_process'; export type Diff = { filename: string; @@ -25,6 +25,11 @@ export function branchName(): string { return p.stdout.toString().trim(); } +export function root(): string { + const p = spawnSync('git', ['rev-parse', '--show-toplevel']); + return p.stdout.toString().trim(); +} + export function diffs(commit1: string, commit2: string): List { const p = spawnSync('git', [ '--no-pager', @@ -44,8 +49,3 @@ export function diffs(commit1: string, commit2: string): List { .map(match => parseInt(match)), })); } - -export function root(): string { - const p = spawnSync('git', ['rev-parse', '--show-toplevel']); - return p.stdout.toString().trim(); -} From a5c0722c53399320a8b9bbda8fdb0775207cd09d Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 13:24:31 -0700 Subject: [PATCH 23/74] avoid git fetch --- .github/workflows/test.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0feada6d26da..dae5064952a4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -30,17 +30,18 @@ jobs: working-directory: .github/testing steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: '20.x' - - run: git fetch origin main - run: npm ci - run: npm run build - id: python run: | - affected_python=$(npm --silent run affected python HEAD origin/main) - echo "$affected_python" - echo "affected=$affected_python" >> "$GITHUB_OUTPUT" + AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) + echo "$AFFECTED_PYTHON" + echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" Python: needs: affected From 48904f7023e0c4ad71f8e779e255cbd464d5800d Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 23 Jul 2024 13:33:01 -0700 Subject: [PATCH 24/74] simplified code --- .github/testing/src/affected.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 30e005b6bccd..5599ffb45429 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -30,11 +30,9 @@ export type Affected = export function mergeAffected(path: string, affected: List): Affected { return affected.reduce((result, current) => { if ('TestSome' in result && 'TestSome' in current) { - return TestSome( - path, - result.TestSome.mergeWith((xs, ys) => xs.union(ys), current.TestSome) - ); + const tests = result.TestSome.mergeWith((xs, ys) => xs.union(ys), current.TestSome) + return TestSome(path, tests); } return TestAll(path); - }, TestSome(path || '', Map())); + }, TestSome(path, Map())); } From 940668b216dbc407e6a3b7264ebc71416a23dc48 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 15:08:01 -0700 Subject: [PATCH 25/74] run package tests --- .github/testing/.eslintrc.json | 12 ++++++- .github/testing/src/affected.ts | 41 ++++++++++++++++-------- .github/testing/src/config.ts | 47 +++++++++++++--------------- .github/testing/src/config/python.ts | 13 ++++---- .github/testing/src/git.ts | 12 +++---- .github/testing/src/main.ts | 6 ++-- .github/testing/src/subprocess.ts | 27 ++++++++++++++++ .github/workflows/test.yaml | 7 +++++ 8 files changed, 110 insertions(+), 55 deletions(-) create mode 100644 .github/testing/src/subprocess.ts diff --git a/.github/testing/.eslintrc.json b/.github/testing/.eslintrc.json index f95bb333f0d7..5bb5ae24e3c7 100644 --- a/.github/testing/.eslintrc.json +++ b/.github/testing/.eslintrc.json @@ -1,3 +1,13 @@ { - "extends": "./node_modules/gts/" + "extends": "./node_modules/gts/", + "rules": { + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ] + } } diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index 5599ffb45429..c4fe72db35cd 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -12,27 +12,42 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Map, List, Set } from 'immutable'; +import {Map, List, Set} from 'immutable'; export type PackageName = string; export type TestPath = string; export type TestName = string; -export const TestAll = (path: string): Affected => ({ path: path, TestAll: null }); -export const TestSome = (path: string, tests: Map>): Affected => ({ +export const TestAll = (path: string): Affected => ({ + path: path, + TestAll: null, +}); +export const TestSome = ( + path: string, + tests: Map> +): Affected => ({ path: path, TestSome: tests, }); export type Affected = - | { path: string, TestAll: null } - | { path: string, TestSome: Map> }; + | {path: string; TestAll: null} + | {path: string; TestSome: Map>}; -export function mergeAffected(path: string, affected: List): Affected { - return affected.reduce((result, current) => { - if ('TestSome' in result && 'TestSome' in current) { - const tests = result.TestSome.mergeWith((xs, ys) => xs.union(ys), current.TestSome) - return TestSome(path, tests); - } - return TestAll(path); - }, TestSome(path, Map())); +export function mergeAffected( + path: string, + affected: List +): Affected { + return affected.reduce( + (result, current) => { + if ('TestSome' in result && 'TestSome' in current) { + const tests = result.TestSome.mergeWith( + (xs, ys) => xs.union(ys), + current.TestSome + ); + return TestSome(path, tests); + } + return TestAll(path); + }, + TestSome(path, Map()) + ); } diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 9e0ccfd86d4c..dde123d7d413 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,23 +15,16 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import { List, Map, Set } from 'immutable'; -import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import { - Affected, - PackageName, - TestAll, - TestName, - TestPath, - mergeAffected, -} from './affected'; +import {List, Map, Set} from 'immutable'; +import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import {Affected, TestAll, TestName, TestPath, mergeAffected} from './affected'; export class Config { match: List; ignore: List; packageFile: List; - testAll: (path: PackageName) => void; - testSome: (path: PackageName, tests: Map>) => void; + testAll: () => void; + testSome: (tests: Map>) => void; constructor({ match, @@ -43,14 +36,16 @@ export class Config { match?: string[]; ignore?: string[]; packageFile?: string[]; - testAll?: (path: PackageName) => void; - testSome?: (path: PackageName, tests: Map>) => void; + testAll?: () => void; + testSome?: (tests: Map>) => void; }) { this.match = List(match || ['**']); this.ignore = List(ignore); this.packageFile = List(packageFile); - this.testAll = testAll || (path => { }); - this.testSome = testSome || ((path, tests) => { }); + this.testAll = testAll || (() => {}); + this.testSome = + testSome || + (_ => {}); /* eslint-disable @typescript-eslint/no-unused-vars */ } affected = (head: string, main: string): List => @@ -65,25 +60,27 @@ export class Config { ); test = (affected: Affected) => { - const cwd = process.cwd() - process.chdir(git.root()) + const cwd = process.cwd(); + const dir = path.join(git.root(), affected.path); + console.log(`>> cd ${dir}`); + process.chdir(dir); if ('TestAll' in affected) { - this.testAll(affected.path) + this.testAll(); } if ('TestSome' in affected) { - this.testSome(affected.path, affected.TestSome) + this.testSome(affected.TestSome); } - process.chdir(cwd) - } + process.chdir(cwd); + }; matchFile = (diff: git.Diff): boolean => this.match.some(p => minimatch(diff.filename, p)) && this.ignore.some(p => !minimatch(diff.filename, p)); findAffected = (diff: git.Diff): Affected => { - const path = this.findPackage(diff.filename) - return TestAll(path) // TOOD: discover affected tests only - } + const path = this.findPackage(diff.filename); + return TestAll(path); // TOOD: discover affected tests only + }; findPackage = (filename: string): string => { const dir = path.dirname(filename); diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 50d5ac98466d..9bc5fd1ad2f0 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Config } from '../config'; +import * as subprocess from '../subprocess'; +import {Config} from '../config'; export const python = new Config({ match: ['**'], @@ -24,10 +25,10 @@ export const python = new Config({ 'setup.py', 'setup.cfg', ], - testAll: path => { - throw `TODO: config/python.ts testAll ${path}` + testAll: () => { + subprocess.run('nox', ['-s', 'py-3.11']); + }, + testSome: tests => { + throw `TODO: config/python.ts testSome ${JSON.stringify(tests)}`; }, - testSome: (path, tests) => { - throw `TODO: config/python.ts testSome ${path} ${JSON.stringify(tests)}` - } }); diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts index 08f12ce68563..b63094c209ec 100644 --- a/.github/testing/src/git.ts +++ b/.github/testing/src/git.ts @@ -13,7 +13,7 @@ // limitations under the License. import { List } from 'immutable'; -import { spawnSync } from 'child_process'; +import * as subprocess from './subprocess'; export type Diff = { filename: string; @@ -21,24 +21,22 @@ export type Diff = { }; export function branchName(): string { - const p = spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); - return p.stdout.toString().trim(); + return subprocess.output('git', ['rev-parse', '--abbrev-ref', 'HEAD']); } export function root(): string { - const p = spawnSync('git', ['rev-parse', '--show-toplevel']); - return p.stdout.toString().trim(); + return subprocess.output('git', ['rev-parse', '--show-toplevel']); } export function diffs(commit1: string, commit2: string): List { - const p = spawnSync('git', [ + const output = subprocess.output('git', [ '--no-pager', 'diff', '--unified=0', commit1, commit2, ]); - return List(p.stdout.toString().split(/^diff --git a\//m)) + return List(output.split(/^diff --git a\//m)) .map(output => output.split('\n').filter(line => line.length > 0)) .filter(lines => lines.length > 0) .map(lines => ({ diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index dc492f7832b4..4f26d3c4c616 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -13,9 +13,9 @@ // limitations under the License. import * as git from './git'; -import { Config } from './config'; -import { python } from './config/python'; -import { Affected } from './affected'; +import {Config} from './config'; +import {python} from './config/python'; +import {Affected} from './affected'; function getConfig(lang: string): Config { switch (lang) { diff --git a/.github/testing/src/subprocess.ts b/.github/testing/src/subprocess.ts new file mode 100644 index 000000000000..d4dfe4183af0 --- /dev/null +++ b/.github/testing/src/subprocess.ts @@ -0,0 +1,27 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { spawnSync } from 'child_process'; + +export function run(cmd: string, args: string[]) { + const p = spawnSync(cmd, args, { stdio: 'inherit' }); + process.exitCode = p.status || undefined; +} + +export function output(cmd: string, args: string[]): string { + const p = spawnSync(cmd, args); + process.exitCode = p.status || undefined; + return p.stdout.toString().trim(); +} + diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index dae5064952a4..cba70a8a9f39 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -57,6 +57,13 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '20.x' + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - run: python --version + - run: pip --version + - run: pip install --upgrade pip + - run: pip install nox - run: npm ci - run: npm run build - run: npm run tests python "$AFFECTED" From 726f867338352a5321d5b73805bb64cacbc1c006 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 15:20:35 -0700 Subject: [PATCH 26/74] pass more information and copy noxfile --- .github/testing/src/config.ts | 42 ++++++++++++++++++---------- .github/testing/src/config/python.ts | 11 +++++--- .github/testing/src/git.ts | 2 +- .github/testing/src/subprocess.ts | 5 ++-- 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index dde123d7d413..4659a5b401ed 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,16 +15,27 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import {List, Map, Set} from 'immutable'; -import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import {Affected, TestAll, TestName, TestPath, mergeAffected} from './affected'; +import { List, Map, Set } from 'immutable'; +import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import { Affected, TestAll, TestName, TestPath, mergeAffected } from './affected'; + +type RunTestsAll = { + root: string + path: string +} + +type RunTestsSome = { + root: string + path: string + tests: Map>; +} export class Config { match: List; ignore: List; packageFile: List; - testAll: () => void; - testSome: (tests: Map>) => void; + testAll: (_: RunTestsAll) => void; + testSome: (_: RunTestsSome) => void; constructor({ match, @@ -36,16 +47,14 @@ export class Config { match?: string[]; ignore?: string[]; packageFile?: string[]; - testAll?: () => void; - testSome?: (tests: Map>) => void; + testAll?: (_: RunTestsAll) => void; + testSome?: (_: RunTestsSome) => void; }) { this.match = List(match || ['**']); this.ignore = List(ignore); this.packageFile = List(packageFile); - this.testAll = testAll || (() => {}); - this.testSome = - testSome || - (_ => {}); /* eslint-disable @typescript-eslint/no-unused-vars */ + this.testAll = testAll || (_ => { }); + this.testSome = testSome || (_ => { }); } affected = (head: string, main: string): List => @@ -61,14 +70,19 @@ export class Config { test = (affected: Affected) => { const cwd = process.cwd(); - const dir = path.join(git.root(), affected.path); + const root = git.root(); + const dir = path.join(root, affected.path); console.log(`>> cd ${dir}`); process.chdir(dir); if ('TestAll' in affected) { - this.testAll(); + this.testAll({ root: root, path: affected.path }); } if ('TestSome' in affected) { - this.testSome(affected.TestSome); + this.testSome({ + root: root, + path: affected.path, + tests: affected.TestSome, + }); } process.chdir(cwd); }; diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 9bc5fd1ad2f0..3fe4d2aaad94 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -12,8 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +import * as path from 'path' import * as subprocess from '../subprocess'; -import {Config} from '../config'; +import { Config } from '../config'; export const python = new Config({ match: ['**'], @@ -25,10 +26,12 @@ export const python = new Config({ 'setup.py', 'setup.cfg', ], - testAll: () => { + testAll: args => { + subprocess.run('cp', [path.join(args.root, 'noxfile-template.py'), 'noxfile.py']) subprocess.run('nox', ['-s', 'py-3.11']); }, - testSome: tests => { - throw `TODO: config/python.ts testSome ${JSON.stringify(tests)}`; + testSome: args => { + subprocess.run('cp', [path.join(args.root, 'noxfile-template.py'), 'noxfile.py']) + throw `TODO: config/python.ts testSome ${JSON.stringify(args)}`; }, }); diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts index b63094c209ec..4cb0cb876174 100644 --- a/.github/testing/src/git.ts +++ b/.github/testing/src/git.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { List } from 'immutable'; +import {List} from 'immutable'; import * as subprocess from './subprocess'; export type Diff = { diff --git a/.github/testing/src/subprocess.ts b/.github/testing/src/subprocess.ts index d4dfe4183af0..491094df5898 100644 --- a/.github/testing/src/subprocess.ts +++ b/.github/testing/src/subprocess.ts @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { spawnSync } from 'child_process'; +import {spawnSync} from 'child_process'; export function run(cmd: string, args: string[]) { - const p = spawnSync(cmd, args, { stdio: 'inherit' }); + const p = spawnSync(cmd, args, {stdio: 'inherit'}); process.exitCode = p.status || undefined; } @@ -24,4 +24,3 @@ export function output(cmd: string, args: string[]): string { process.exitCode = p.status || undefined; return p.stdout.toString().trim(); } - From 194695694343a5beb29402511d5342e3aaa16520 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 15:23:52 -0700 Subject: [PATCH 27/74] define cloud project --- .github/workflows/test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index cba70a8a9f39..1dfbb0defb22 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -49,6 +49,8 @@ jobs: strategy: matrix: affected: ${{fromJson(needs.affected.outputs.python)}} + env: + GOOGLE_CLOUD_PROJECT: python-docs-samples-tests defaults: run: working-directory: .github/testing From 8a46ad3ee0ea28aaa2dabe2ad89a511ce9a2bde2 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 15:38:32 -0700 Subject: [PATCH 28/74] configure workload identity provider --- .github/workflows/test.yaml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1dfbb0defb22..6bae66bd9a43 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -49,8 +49,13 @@ jobs: strategy: matrix: affected: ${{fromJson(needs.affected.outputs.python)}} + # Needed to generate the identity token for google-github-actions/auth. + # https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-google-cloud-platform + permissions: + id-token: write # This is required for requesting the JWT + contents: read # This is required for actions/checkout env: - GOOGLE_CLOUD_PROJECT: python-docs-samples-tests + GOOGLE_CLOUD_PROJECT: jss-22p1-test defaults: run: working-directory: .github/testing @@ -62,6 +67,10 @@ jobs: - uses: actions/setup-python@v5 with: python-version: '3.11' + - uses: 'google-github-actions/auth@v2' + with: + workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + service_account: github-actions@jss-22p1-test.iam.gserviceaccount.com - run: python --version - run: pip --version - run: pip install --upgrade pip From 25115d7c52500135985ee66ad6f8dda6bc9d8b7b Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 15:58:22 -0700 Subject: [PATCH 29/74] add norecurse directories --- .github/testing/src/config.ts | 7 ++++++- .github/testing/src/config/python.ts | 5 ++++- .github/testing/src/subprocess.ts | 4 ++-- pytest.ini | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 4659a5b401ed..547a7e7ba0bb 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -30,6 +30,10 @@ type RunTestsSome = { tests: Map>; } +const IGNORE_GLOBAL = [ + 'README.md', +] + export class Config { match: List; ignore: List; @@ -61,6 +65,7 @@ export class Config { List( git .diffs(head, main) + .filter(diff => IGNORE_GLOBAL.some(p => minimatch(diff.filename, p))) .filter(this.matchFile) .map(this.findAffected) .groupBy(affected => affected.path) @@ -72,7 +77,7 @@ export class Config { const cwd = process.cwd(); const root = git.root(); const dir = path.join(root, affected.path); - console.log(`>> cd ${dir}`); + console.log(`> cd ${dir}`); process.chdir(dir); if ('TestAll' in affected) { this.testAll({ root: root, path: affected.path }); diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 3fe4d2aaad94..0e3545cb2946 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -18,7 +18,10 @@ import { Config } from '../config'; export const python = new Config({ match: ['**'], - ignore: ['**/README.md'], + ignore: [ + '**/README.md', + 'pytest.ini', + ], packageFile: [ 'noxfile_config.py', 'requirements.txt', diff --git a/.github/testing/src/subprocess.ts b/.github/testing/src/subprocess.ts index 491094df5898..dba0576cdb80 100644 --- a/.github/testing/src/subprocess.ts +++ b/.github/testing/src/subprocess.ts @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {spawnSync} from 'child_process'; +import { spawnSync } from 'child_process'; export function run(cmd: string, args: string[]) { - const p = spawnSync(cmd, args, {stdio: 'inherit'}); + const p = spawnSync(cmd, args, { stdio: 'inherit' }); process.exitCode = p.status || undefined; } diff --git a/pytest.ini b/pytest.ini index 22ce71c1b7da..6fd8b378beb3 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,5 +2,5 @@ addopts = -v --tb=native -norecursedirs = .git env lib .tox .nox +norecursedirs = .git env lib .tox .nox .github junit_family = xunit2 From f715daa42d86a0ccfc160c030be0af32e8109822 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 16:10:07 -0700 Subject: [PATCH 30/74] use github sha --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 6bae66bd9a43..a554095fb083 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -39,7 +39,7 @@ jobs: - run: npm run build - id: python run: | - AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) + AFFECTED_PYTHON=$(npm --silent run affected python $GITHUB_SHA origin/main) echo "$AFFECTED_PYTHON" echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" From 546630882b2217b058e6c337804623ee1bff8330 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 16:10:07 -0700 Subject: [PATCH 31/74] use github sha --- .github/testing/src/config.ts | 2 +- .github/workflows/test.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 547a7e7ba0bb..01e6d0859107 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -65,7 +65,7 @@ export class Config { List( git .diffs(head, main) - .filter(diff => IGNORE_GLOBAL.some(p => minimatch(diff.filename, p))) + .filter(diff => !IGNORE_GLOBAL.some(p => minimatch(diff.filename, p))) .filter(this.matchFile) .map(this.findAffected) .groupBy(affected => affected.path) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 6bae66bd9a43..7e2a26de1917 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -37,9 +37,10 @@ jobs: node-version: '20.x' - run: npm ci - run: npm run build + - run: git diff --name-only HEAD origin/main - id: python run: | - AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) + AFFECTED_PYTHON=$(npm --silent run affected python $GITHUB_SHA origin/main) echo "$AFFECTED_PYTHON" echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" From 1c411df7692fa8e1c12240ccb8729c795b6da2a0 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 16:26:17 -0700 Subject: [PATCH 32/74] fix ignore paths --- .github/testing/src/config.ts | 32 +++++++++++++--------------- .github/testing/src/config/python.ts | 17 ++++++++------- .github/testing/src/subprocess.ts | 4 ++-- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 01e6d0859107..39cc428b90ad 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,24 +15,22 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import { List, Map, Set } from 'immutable'; -import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Affected, TestAll, TestName, TestPath, mergeAffected } from './affected'; +import {List, Map, Set} from 'immutable'; +import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import {Affected, TestAll, TestName, TestPath, mergeAffected} from './affected'; type RunTestsAll = { - root: string - path: string -} + root: string; + path: string; +}; type RunTestsSome = { - root: string - path: string + root: string; + path: string; tests: Map>; -} +}; -const IGNORE_GLOBAL = [ - 'README.md', -] +const IGNORE_GLOBAL = ['README.md']; export class Config { match: List; @@ -57,15 +55,15 @@ export class Config { this.match = List(match || ['**']); this.ignore = List(ignore); this.packageFile = List(packageFile); - this.testAll = testAll || (_ => { }); - this.testSome = testSome || (_ => { }); + this.testAll = testAll || (_ => {}); + this.testSome = testSome || (_ => {}); } affected = (head: string, main: string): List => List( git .diffs(head, main) - .filter(diff => !IGNORE_GLOBAL.some(p => minimatch(diff.filename, p))) + .filter(diff => !IGNORE_GLOBAL.every(p => minimatch(diff.filename, p))) .filter(this.matchFile) .map(this.findAffected) .groupBy(affected => affected.path) @@ -80,7 +78,7 @@ export class Config { console.log(`> cd ${dir}`); process.chdir(dir); if ('TestAll' in affected) { - this.testAll({ root: root, path: affected.path }); + this.testAll({root: root, path: affected.path}); } if ('TestSome' in affected) { this.testSome({ @@ -94,7 +92,7 @@ export class Config { matchFile = (diff: git.Diff): boolean => this.match.some(p => minimatch(diff.filename, p)) && - this.ignore.some(p => !minimatch(diff.filename, p)); + this.ignore.every(p => !minimatch(diff.filename, p)); findAffected = (diff: git.Diff): Affected => { const path = this.findPackage(diff.filename); diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 0e3545cb2946..09a615db1c90 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -12,16 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as path from 'path' +import * as path from 'path'; import * as subprocess from '../subprocess'; -import { Config } from '../config'; +import {Config} from '../config'; export const python = new Config({ match: ['**'], - ignore: [ - '**/README.md', - 'pytest.ini', - ], + ignore: ['**/README.md', 'pytest.ini'], packageFile: [ 'noxfile_config.py', 'requirements.txt', @@ -30,11 +27,15 @@ export const python = new Config({ 'setup.cfg', ], testAll: args => { - subprocess.run('cp', [path.join(args.root, 'noxfile-template.py'), 'noxfile.py']) + const noxfile = path.join(args.root, 'noxfile-template.py'); + subprocess.run('cp', [noxfile, 'noxfile.py']); subprocess.run('nox', ['-s', 'py-3.11']); }, testSome: args => { - subprocess.run('cp', [path.join(args.root, 'noxfile-template.py'), 'noxfile.py']) + subprocess.run('cp', [ + path.join(args.root, 'noxfile-template.py'), + 'noxfile.py', + ]); throw `TODO: config/python.ts testSome ${JSON.stringify(args)}`; }, }); diff --git a/.github/testing/src/subprocess.ts b/.github/testing/src/subprocess.ts index dba0576cdb80..491094df5898 100644 --- a/.github/testing/src/subprocess.ts +++ b/.github/testing/src/subprocess.ts @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { spawnSync } from 'child_process'; +import {spawnSync} from 'child_process'; export function run(cmd: string, args: string[]) { - const p = spawnSync(cmd, args, { stdio: 'inherit' }); + const p = spawnSync(cmd, args, {stdio: 'inherit'}); process.exitCode = p.status || undefined; } From 5a7ee112cfd2dad5568d67f980208786e087d88d Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Wed, 24 Jul 2024 16:43:40 -0700 Subject: [PATCH 33/74] run pytest directly --- .github/testing/src/config/python.ts | 10 ++++++---- .github/workflows/test.yaml | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 09a615db1c90..9c5b07843ac9 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import * as subprocess from '../subprocess'; -import {Config} from '../config'; +import { Config } from '../config'; export const python = new Config({ match: ['**'], @@ -27,9 +27,11 @@ export const python = new Config({ 'setup.cfg', ], testAll: args => { - const noxfile = path.join(args.root, 'noxfile-template.py'); - subprocess.run('cp', [noxfile, 'noxfile.py']); - subprocess.run('nox', ['-s', 'py-3.11']); + // const noxfile = path.join(args.root, 'noxfile-template.py'); + // subprocess.run('cp', [noxfile, 'noxfile.py']); + // subprocess.run('nox', ['-s', 'py-3.11']); + subprocess.run('python', ['-m', 'pip', 'install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) + subprocess.run('python', ['-m', 'pytest', '--verbose', '-s']) }, testSome: args => { subprocess.run('cp', [ diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7e2a26de1917..6dce34bfce4a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -40,7 +40,7 @@ jobs: - run: git diff --name-only HEAD origin/main - id: python run: | - AFFECTED_PYTHON=$(npm --silent run affected python $GITHUB_SHA origin/main) + AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) echo "$AFFECTED_PYTHON" echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" @@ -67,15 +67,15 @@ jobs: node-version: '20.x' - uses: actions/setup-python@v5 with: - python-version: '3.11' + python-version: '3.12' - uses: 'google-github-actions/auth@v2' with: workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - service_account: github-actions@jss-22p1-test.iam.gserviceaccount.com + service_account: github-actions-python@jss-22p1-test.iam.gserviceaccount.com - run: python --version - run: pip --version - run: pip install --upgrade pip - - run: pip install nox + # - run: pip install nox - run: npm ci - run: npm run build - run: npm run tests python "$AFFECTED" From 3f85f0b71ff02dea34d9ab9c914a6d21c5e8e523 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 25 Jul 2024 15:36:09 -0700 Subject: [PATCH 34/74] use direct auth instead of service account --- .github/workflows/test.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 6dce34bfce4a..0942e7f61ad7 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -70,8 +70,9 @@ jobs: python-version: '3.12' - uses: 'google-github-actions/auth@v2' with: + project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - service_account: github-actions-python@jss-22p1-test.iam.gserviceaccount.com + # service_account: github-actions-python@jss-22p1-test.iam.gserviceaccount.com - run: python --version - run: pip --version - run: pip install --upgrade pip From 425b3b12e5221fe6c328b4cfc09a719282bc1253 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 25 Jul 2024 15:48:20 -0700 Subject: [PATCH 35/74] debug permissions --- .github/workflows/test.yaml | 69 +++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0942e7f61ad7..eec26cb64581 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -21,35 +21,35 @@ on: workflow_dispatch: # Manual runs jobs: - affected: - runs-on: ubuntu-latest - outputs: - python: ${{steps.python.outputs.affected}} - defaults: - run: - working-directory: .github/testing - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - run: npm ci - - run: npm run build - - run: git diff --name-only HEAD origin/main - - id: python - run: | - AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) - echo "$AFFECTED_PYTHON" - echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + # affected: + # runs-on: ubuntu-latest + # outputs: + # python: ${{steps.python.outputs.affected}} + # defaults: + # run: + # working-directory: .github/testing + # steps: + # - uses: actions/checkout@v4 + # with: + # fetch-depth: 0 + # - uses: actions/setup-node@v4 + # with: + # node-version: '20.x' + # - run: npm ci + # - run: npm run build + # - run: git diff --name-only HEAD origin/main + # - id: python + # run: | + # AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) + # echo "$AFFECTED_PYTHON" + # echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" Python: - needs: affected + # needs: affected runs-on: ubuntu-latest - strategy: - matrix: - affected: ${{fromJson(needs.affected.outputs.python)}} + # strategy: + # matrix: + # affected: ${{fromJson(needs.affected.outputs.python)}} # Needed to generate the identity token for google-github-actions/auth. # https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-google-cloud-platform permissions: @@ -75,10 +75,13 @@ jobs: # service_account: github-actions-python@jss-22p1-test.iam.gserviceaccount.com - run: python --version - run: pip --version - - run: pip install --upgrade pip - # - run: pip install nox - - run: npm ci - - run: npm run build - - run: npm run tests python "$AFFECTED" - env: - AFFECTED: ${{toJson(matrix.affected)}} + # - run: pip install --upgrade pip + # # - run: pip install nox + # - run: npm ci + # - run: npm run build + # - run: npm run tests python "$AFFECTED" + # env: + # AFFECTED: ${{toJson(matrix.affected)}} + - run: gcloud storage ls + - run: pip install google-cloud-storage + - run: python -c 'from google.cloud import storage; client = storage.Client(); print("\n".join(b.name for b in client.list_buckets()))' From a01f337014c7078677be14069ebdd3736518735a Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 25 Jul 2024 16:07:23 -0700 Subject: [PATCH 36/74] re-enable tests --- .github/workflows/test.yaml | 70 +++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index eec26cb64581..d84769d31f20 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -21,35 +21,35 @@ on: workflow_dispatch: # Manual runs jobs: - # affected: - # runs-on: ubuntu-latest - # outputs: - # python: ${{steps.python.outputs.affected}} - # defaults: - # run: - # working-directory: .github/testing - # steps: - # - uses: actions/checkout@v4 - # with: - # fetch-depth: 0 - # - uses: actions/setup-node@v4 - # with: - # node-version: '20.x' - # - run: npm ci - # - run: npm run build - # - run: git diff --name-only HEAD origin/main - # - id: python - # run: | - # AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) - # echo "$AFFECTED_PYTHON" - # echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + affected: + runs-on: ubuntu-latest + outputs: + python: ${{steps.python.outputs.affected}} + defaults: + run: + working-directory: .github/testing + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: '20.x' + - run: npm ci + - run: npm run build + - run: git diff --name-only HEAD origin/main + - id: python + run: | + AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) + echo "$AFFECTED_PYTHON" + echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" Python: - # needs: affected + needs: affected runs-on: ubuntu-latest - # strategy: - # matrix: - # affected: ${{fromJson(needs.affected.outputs.python)}} + strategy: + matrix: + affected: ${{fromJson(needs.affected.outputs.python)}} # Needed to generate the identity token for google-github-actions/auth. # https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-google-cloud-platform permissions: @@ -72,16 +72,12 @@ jobs: with: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - # service_account: github-actions-python@jss-22p1-test.iam.gserviceaccount.com - run: python --version - run: pip --version - # - run: pip install --upgrade pip - # # - run: pip install nox - # - run: npm ci - # - run: npm run build - # - run: npm run tests python "$AFFECTED" - # env: - # AFFECTED: ${{toJson(matrix.affected)}} - - run: gcloud storage ls - - run: pip install google-cloud-storage - - run: python -c 'from google.cloud import storage; client = storage.Client(); print("\n".join(b.name for b in client.list_buckets()))' + - run: pip install --upgrade pip + # - run: pip install nox + - run: npm ci + - run: npm run build + - run: npm run tests python "$AFFECTED" + env: + AFFECTED: ${{toJson(matrix.affected)}} From 02b93a286b132c3763c46fa7bfb5b59933110e21 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 25 Jul 2024 17:14:44 -0700 Subject: [PATCH 37/74] update dependencies and slight performance improvements --- .github/testing/package-lock.json | 114 +++++++++++++++--------------- .github/testing/package.json | 6 +- .github/workflows/test.yaml | 6 +- 3 files changed, 63 insertions(+), 63 deletions(-) diff --git a/.github/testing/package-lock.json b/.github/testing/package-lock.json index 1728988c2ffc..74771b8fa1b1 100644 --- a/.github/testing/package-lock.json +++ b/.github/testing/package-lock.json @@ -9,9 +9,9 @@ "minimatch": "^10.0.1" }, "devDependencies": { - "@types/node": "^20.12.7", + "@types/node": "^20.14.12", "gts": "^5.3.1", - "typescript": "^5.5.3" + "typescript": "^5.5.4" } }, "node_modules/@babel/code-frame": { @@ -317,9 +317,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1473,6 +1473,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1485,6 +1506,28 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -1717,9 +1760,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "dependencies": { "hasown": "^2.0.2" @@ -2592,49 +2635,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -2686,9 +2686,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2961,9 +2961,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/.github/testing/package.json b/.github/testing/package.json index de366df20f83..2a82ff5beeb0 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -1,14 +1,14 @@ { "devDependencies": { - "@types/node": "^20.12.7", + "@types/node": "^20.14.12", "gts": "^5.3.1", - "typescript": "^5.5.3" + "typescript": "^5.5.4" }, "scripts": { "clean": "gts clean", "lint": "gts lint", "fix": "gts fix", - "build": "tsc", + "build": "tsc -b", "affected": "node --enable-source-maps build/src/main.js affected", "tests": "node --enable-source-maps build/src/main.js tests" }, diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d84769d31f20..d65b88b482bd 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,7 +35,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: '20.x' - - run: npm ci + - run: npm ci --no-audit - run: npm run build - run: git diff --name-only HEAD origin/main - id: python @@ -72,12 +72,12 @@ jobs: with: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + - run: npm ci --no-audit + - run: npm run build - run: python --version - run: pip --version - run: pip install --upgrade pip # - run: pip install nox - - run: npm ci - - run: npm run build - run: npm run tests python "$AFFECTED" env: AFFECTED: ${{toJson(matrix.affected)}} From 8eb3ed1be8b9c50d0e6a24251915ae05d60c5905 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 25 Jul 2024 17:18:28 -0700 Subject: [PATCH 38/74] use nox for testing --- .github/testing/src/config/python.ts | 10 +++++----- .github/workflows/test.yaml | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 9c5b07843ac9..0315507910bc 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -27,11 +27,11 @@ export const python = new Config({ 'setup.cfg', ], testAll: args => { - // const noxfile = path.join(args.root, 'noxfile-template.py'); - // subprocess.run('cp', [noxfile, 'noxfile.py']); - // subprocess.run('nox', ['-s', 'py-3.11']); - subprocess.run('python', ['-m', 'pip', 'install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) - subprocess.run('python', ['-m', 'pytest', '--verbose', '-s']) + const noxfile = path.join(args.root, 'noxfile-template.py'); + subprocess.run('cp', [noxfile, 'noxfile.py']); + subprocess.run('nox', ['-s', 'py-3.11']); + // subprocess.run('python', ['-m', 'pip', 'install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) + // subprocess.run('python', ['-m', 'pytest', '-s']) }, testSome: args => { subprocess.run('cp', [ diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d65b88b482bd..8e75f20858b9 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -67,7 +67,7 @@ jobs: node-version: '20.x' - uses: actions/setup-python@v5 with: - python-version: '3.12' + python-version: '3.11' - uses: 'google-github-actions/auth@v2' with: project_id: jss-22p1-test @@ -77,7 +77,7 @@ jobs: - run: python --version - run: pip --version - run: pip install --upgrade pip - # - run: pip install nox + - run: pip install nox - run: npm run tests python "$AFFECTED" env: AFFECTED: ${{toJson(matrix.affected)}} From a6d6857a5a3ea9643f603187da676fe1bc16ba3e Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 25 Jul 2024 17:22:19 -0700 Subject: [PATCH 39/74] simplify workflow --- .github/workflows/test.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8e75f20858b9..f10457cf7eff 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -37,7 +37,6 @@ jobs: node-version: '20.x' - run: npm ci --no-audit - run: npm run build - - run: git diff --name-only HEAD origin/main - id: python run: | AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) @@ -72,12 +71,9 @@ jobs: with: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + - run: pip install nox - run: npm ci --no-audit - run: npm run build - - run: python --version - - run: pip --version - - run: pip install --upgrade pip - - run: pip install nox - run: npm run tests python "$AFFECTED" env: AFFECTED: ${{toJson(matrix.affected)}} From 5c873b7bca8f59d20e1aafe1f946f03b19102db0 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Fri, 26 Jul 2024 14:26:08 -0700 Subject: [PATCH 40/74] use bun instead of node --- .github/testing/bun.lockb | Bin 0 -> 100067 bytes .github/testing/package-lock.json | 3072 ----------------------------- .github/testing/package.json | 7 +- .github/testing/src/main.ts | 8 +- .github/testing/src/subprocess.ts | 12 +- .github/workflows/test.yaml | 18 +- 6 files changed, 21 insertions(+), 3096 deletions(-) create mode 100755 .github/testing/bun.lockb delete mode 100644 .github/testing/package-lock.json diff --git a/.github/testing/bun.lockb b/.github/testing/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..833515e6207cfcb5857c1cadd8a40d6355edc59f GIT binary patch literal 100067 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ú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.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.14.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", - "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", - "dev": true, - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gts": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/gts/-/gts-5.3.1.tgz", - "integrity": "sha512-P9F+krJkGOkisUX+P9pfUas1Xy+U+CxBFZT62uInkJbgvZpnW1ug/pIcMJJmLOthMq1J88lpQUGhXDC9UTvVcw==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "5.62.0", - "@typescript-eslint/parser": "5.62.0", - "chalk": "^4.1.2", - "eslint": "8.57.0", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-n": "15.7.0", - "eslint-plugin-prettier": "5.1.3", - "execa": "^5.0.0", - "inquirer": "^7.3.3", - "json5": "^2.1.3", - "meow": "^9.0.0", - "ncp": "^2.0.0", - "prettier": "3.2.5", - "rimraf": "3.0.2", - "write-file-atomic": "^4.0.0" - }, - "bin": { - "gts": "build/src/cli.js" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "typescript": ">=3" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "dev": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/synckit/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/.github/testing/package.json b/.github/testing/package.json index 2a82ff5beeb0..3718d3b4b73e 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "@types/node": "^20.14.12", + "@types/bun": "^1.1.6", "gts": "^5.3.1", "typescript": "^5.5.4" }, @@ -8,9 +8,8 @@ "clean": "gts clean", "lint": "gts lint", "fix": "gts fix", - "build": "tsc -b", - "affected": "node --enable-source-maps build/src/main.js affected", - "tests": "node --enable-source-maps build/src/main.js tests" + "affected": "bun run ./src/main.ts affected", + "tests": "bun run ./src/main.ts tests" }, "dependencies": { "immutable": "^4.3.7", diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 4f26d3c4c616..7bbf15477359 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -13,9 +13,9 @@ // limitations under the License. import * as git from './git'; -import {Config} from './config'; -import {python} from './config/python'; -import {Affected} from './affected'; +import { Config } from './config'; +import { python } from './config/python'; +import { Affected } from './affected'; function getConfig(lang: string): Config { switch (lang) { @@ -37,7 +37,7 @@ function main(command: string) { } case 'tests': { const config = getConfig(process.argv[3]); - const affected: Affected = JSON.parse(process.argv[4]); + const affected: Affected = JSON.parse(process.env[process.argv[4]] || ""); config.test(affected); return; } diff --git a/.github/testing/src/subprocess.ts b/.github/testing/src/subprocess.ts index 491094df5898..c2179abcf17d 100644 --- a/.github/testing/src/subprocess.ts +++ b/.github/testing/src/subprocess.ts @@ -12,15 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {spawnSync} from 'child_process'; +import { spawnSync } from 'child_process'; export function run(cmd: string, args: string[]) { - const p = spawnSync(cmd, args, {stdio: 'inherit'}); - process.exitCode = p.status || undefined; + const p = spawnSync(cmd, args, { stdio: 'inherit' }); + if (p.status !== 0) { + process.exitCode = p.status || undefined; + } } export function output(cmd: string, args: string[]): string { const p = spawnSync(cmd, args); - process.exitCode = p.status || undefined; + if (p.status !== 0) { + process.exitCode = p.status || undefined; + } return p.stdout.toString().trim(); } diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f10457cf7eff..410bbd24683a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -32,14 +32,11 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - run: npm ci --no-audit - - run: npm run build + - uses: oven-sh/setup-bun@v2 + - run: bun install - id: python run: | - AFFECTED_PYTHON=$(npm --silent run affected python HEAD origin/main) + AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) echo "$AFFECTED_PYTHON" echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" @@ -61,9 +58,7 @@ jobs: working-directory: .github/testing steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '20.x' + - uses: oven-sh/setup-bun@v2 - uses: actions/setup-python@v5 with: python-version: '3.11' @@ -72,8 +67,7 @@ jobs: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - run: pip install nox - - run: npm ci --no-audit - - run: npm run build - - run: npm run tests python "$AFFECTED" + - run: bun install + - run: bun run tests python AFFECTED env: AFFECTED: ${{toJson(matrix.affected)}} From 5912e784f1b2eef671a600fb5c11b13961650868 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Fri, 26 Jul 2024 14:32:24 -0700 Subject: [PATCH 41/74] do not use nox --- .github/testing/src/config/python.ts | 10 +++++----- .github/workflows/test.yaml | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 0315507910bc..7cf0234187cb 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -27,11 +27,11 @@ export const python = new Config({ 'setup.cfg', ], testAll: args => { - const noxfile = path.join(args.root, 'noxfile-template.py'); - subprocess.run('cp', [noxfile, 'noxfile.py']); - subprocess.run('nox', ['-s', 'py-3.11']); - // subprocess.run('python', ['-m', 'pip', 'install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) - // subprocess.run('python', ['-m', 'pytest', '-s']) + // const noxfile = path.join(args.root, 'noxfile-template.py'); + // subprocess.run('cp', [noxfile, 'noxfile.py']); + // subprocess.run('nox', ['-s', 'py-3.11']); + subprocess.run('pip', ['install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) + subprocess.run('pytest', ['-s']) }, testSome: args => { subprocess.run('cp', [ diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 410bbd24683a..50721e3a15cc 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -66,7 +66,6 @@ jobs: with: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - - run: pip install nox - run: bun install - run: bun run tests python AFFECTED env: From bc963e6528d4f9f78f95f271549083aa04f35e7f Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Fri, 26 Jul 2024 14:34:08 -0700 Subject: [PATCH 42/74] use nox --- .github/testing/src/config/python.ts | 10 +++++----- .github/workflows/test.yaml | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 7cf0234187cb..f485a54607e6 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -27,11 +27,11 @@ export const python = new Config({ 'setup.cfg', ], testAll: args => { - // const noxfile = path.join(args.root, 'noxfile-template.py'); - // subprocess.run('cp', [noxfile, 'noxfile.py']); - // subprocess.run('nox', ['-s', 'py-3.11']); - subprocess.run('pip', ['install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) - subprocess.run('pytest', ['-s']) + const noxfile = path.join(args.root, 'noxfile-template.py'); + subprocess.run('cp', [noxfile, 'noxfile.py']); + subprocess.run('nox', ['-s', 'py-3.11']); + // subprocess.run('pip', ['install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) + // subprocess.run('pytest', ['-s']) }, testSome: args => { subprocess.run('cp', [ diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 50721e3a15cc..410bbd24683a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -66,6 +66,7 @@ jobs: with: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + - run: pip install nox - run: bun install - run: bun run tests python AFFECTED env: From 7808de0164242877abbee334a5f95abe07cec1b3 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Sat, 27 Jul 2024 13:22:12 -0700 Subject: [PATCH 43/74] do not install, run directly --- .github/testing/package.json | 3 +-- .github/workflows/test.yaml | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/testing/package.json b/.github/testing/package.json index 3718d3b4b73e..b4c09cbd0241 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -1,8 +1,7 @@ { "devDependencies": { "@types/bun": "^1.1.6", - "gts": "^5.3.1", - "typescript": "^5.5.4" + "gts": "^5.3.1" }, "scripts": { "clean": "gts clean", diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 410bbd24683a..448275f9dd8d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -33,7 +33,6 @@ jobs: with: fetch-depth: 0 - uses: oven-sh/setup-bun@v2 - - run: bun install - id: python run: | AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) @@ -67,7 +66,6 @@ jobs: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - run: pip install nox - - run: bun install - run: bun run tests python AFFECTED env: AFFECTED: ${{toJson(matrix.affected)}} From 617f1137d7521a6395778680d6004c97db8e79be Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Sat, 27 Jul 2024 13:26:09 -0700 Subject: [PATCH 44/74] bun install, without typescript --- .github/workflows/test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 448275f9dd8d..410bbd24683a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -33,6 +33,7 @@ jobs: with: fetch-depth: 0 - uses: oven-sh/setup-bun@v2 + - run: bun install - id: python run: | AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) @@ -66,6 +67,7 @@ jobs: project_id: jss-22p1-test workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - run: pip install nox + - run: bun install - run: bun run tests python AFFECTED env: AFFECTED: ${{toJson(matrix.affected)}} From 5c2f5f6c4d861c244a9db3bebab1fe906d943c31 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 13:04:56 -0700 Subject: [PATCH 45/74] multiple python versions --- .github/testing/bun.lockb | Bin 100067 -> 100035 bytes .github/testing/src/config/python.ts | 51 +++++++++++++-------------- .github/testing/src/main.ts | 13 +++++-- .github/testing/src/subprocess.ts | 4 +-- .github/workflows/test.yaml | 24 +++++++------ 5 files changed, 51 insertions(+), 41 deletions(-) diff --git a/.github/testing/bun.lockb b/.github/testing/bun.lockb index 833515e6207cfcb5857c1cadd8a40d6355edc59f..03b58e6c99201042999afd12b2f09e7e91798f0b 100755 GIT binary patch delta 6105 zcmeI0dvH|M9mnr)lU=f5HzZle=7mWJkMdd)HjqT(CV(WEq`Zcj1WI@(#t@CdI6iPT zR&WLsOL}KGePQTKMW;gtr|Gy;XKag|PHl^IqG+vJdDX{Yr1cFVX}{myU-05Yr!)Pp zli%>k_xygpbIv{I-m~|f!`XeF-|h44Unb$+<&|>-mSuS@tEUM%4tfNd22Is?`;P4> zS=J@7EW~=wN$*n;@0C{lBF`tKoDJFgPN6R{2=nwt0Z%WUsnY*`c>d*Fer%1lNC!^ZihJn?h zwaf0!D3_;fZ)UY?$g=A*Bi^OxIE0kj?#-HR~j8D<{Na{nbRP!S#+lK+KUZ(Y&nuJ)n zWkusD6yj4}pcSdS1=Z?1l^xb-oXQI=QlH9pxaD!9@c0i0eVwx1+wocnW&3mLL!<9<(lDmyr@zEc_hr{@2qd1^BFNaG)C{Hqm< zkr(__8(h!^RK`Ek_$7^xq@2-^*84YFPU` z^)nHtj@P_X8JeJRDldEul%WFrVY?#LiN%b=sjRn+wimBs5-m#Ee<2&1xCr^;_94VrjeFu)7fYl2F@5$c0BYn;mYZq)o{ zjgO=p=uOD8N{80(RDTf{0<0e?nkNN0F{QvqRj=c-l zepmm+EhogD(%xWaxBKnq+8X-1+sCi5YhF%HsXzsMuzT#C$MWq%;|uK-8Tm}~4<0*S zH=TP5+F8J!_|hEN#H21NKT=*O)x6MrX!685!-a4nDd`moH zS=>Ie-Z-$`46uuDXzBw^Wk6?X>_aHK&ji^T<4&7h1VF1P8jCJc;B)@Nd+Z4)Uk02% z_t~t@T@oiny9gKyf?{(UyWsyT@XGwfGL-}70ovz)qsRsMfTJ1Sj_09VVUDqjwJ631 ziT3PbB2$1}aktJct^w-+yGhb|1t`~;3?I5!j3Qk(Qhe4$pcWJYP7?pDNnj}`1YV65 zqg-z``eeC>+f9#Up7cq?&mAPUoi~F)hI)TD*@EjNb_khW`NDH(HGy@)Rc<9-K@&n*L@EveJ*a_|honRa2 z0&Soj+ypj&&45d$6wC#D?p!i?JYaA!@Zs}VQx5npxE3q`4GC$=&}qRHYh0~6$|_msZseCFvanP~>Iq%4THVo!M4J3nup zIxFIm*0NAIgqs{ND}$0FO{SA_#1zei++q6Y9WcKN$~Wg9#USz4>FL`vIJmKPz;a1t zs5Df9Ar1eBaBXhv(c3Tl`iM(P=Y`6dIw7ViTmIrYC&rf}*{(}srsl{mC1765k#=0} z`I6zwg&*6WD}L8eiG6RH98Quzta7Gw%GGsZAIy?xlJfYjCyyJ3b+R(FFZKgR^C8e>?tMKMA+avN!>W;g*w{G8j Wdq?*UGb18Pjj5Bo*otbg>;3~Y1zCgu delta 5949 zcmeI0ZE#f88OQH)lig%P7Lt%;^8&?05=3Ch5~2w%36V&EkRYOvO)wZBq`b$<2W_PZ z7OJ9AnLFe09hq@t9LI5-IIKFO4mzW#fCd$-tyYbrX^XV9wiVie{{MHMO_!Oi(|+rR zJd@x4&-0w;oO54J?mg$e-tQgi_ukhc%l9s=nKjX}ET3idbwbBM4?@R6b2Xj;1%2Jy zZ$ink!uH;mYJDTE21MRX$tbriD<4T>JD;SkNT{vxJS+cpozvba30_Is>g)hoa@dg$ zoxN#wGVBbd?UTdKjp-(9Us>PuX}i1D%=oTl)A51e69Walo^&a9?#!<9_27UOptbD` z2C5xjPMw`D&f=U}yG5M0b86)w=gyqEf%Ng=`iKXqM1WT{4N6OyPP7Q2LQ!A(KnKdK)!w`x6=2ew0fYKn9H%7C+LWmbs6om!KqY;l{$ zsXT<;K%AFX#%A#CTAQeBbqC;y>;d%e0yHY){eba%0F6rjUe)`cG%DkJ>Aq_^{K2ssXo}a1U4$RDFIAn)AdHH6*B)3#?-F>dn2I01VuH{#Xcd&LFNboz z&4tnumHAg{UIXi$PupX&xlyyJEG|@Cr13=MC`}rt(r<=lLL(Zd^4!*F{W^^&(O&m7 zHXwmH8@0h^^|vqxqq4YFl`)!KouliU270=4+nfgu<@)%R z+=HJi=kyzm&b$+;11Aq1X`Gs&4}>8oQ}~qRl7RLVV2l%Gqxr%ojV?cq~$u5fF z^FU8&6*oTn0WH3g#Rm%Ro?MHsYRAFbZU))KRIU0ml)ZC3K0{-FfwKD?zy$^^z5wRB zW3?$6gD!YUdH#O~>>>}G13dru`ZphCo&b$&VCM0Y!DMqIyQo5uBgdD;9PKhdIT;E-5tslTM|{8e&@Yob z52Couobk)Wo?B4-nJF17GkZfQ@)Gc7a8A;0|2yh?T57JQ10KDql-0-Gy zZg4Jq2e{3A1Uw3OL%#)_+`j`~0&d|x1D}A8xw+vE@k4MF90SL}t)L8pv_V@z1aP0h zy~iGuZwI%5Uw~a;2lzSI47Px+pd0)cYyh2L9pIFi1u6ljOEJH;@MiPI^UiX6Q4MOq z6(9`mMVz~&ao`NfX91@zXZk+y7#IRyf!~5(fp+jqup4v%?rp9C)nE>o4a&emel)2E z+;(wte+@nd>%j`J9E8DKPz&k+_c-&x7bw@$2lD{;JU2k+gR2Pq1%M9?J_)$VSPeKW z&mr~==>0W*PJqb>mI7|qasd}UJHaNv|Gvw?M6ech+(Vv6`4pIf@+xQzxB`@bI>b7l z&0r~54H`frSP1z4(F7Lrd*u=ozSrI7^ZDkdnNsTYq64pG&SuFq;)ynAOK+-p%+Wj< z@(t_$GH71Rmucqne5nrMDcBePw3#j)Rl%wtE^sb7_MxV-W%!xa^69m`nNSGC@2;x8DpgA9sLOE=9AWw#k2}tt1nm0@q`)q>O;Ldyn-E4K9#(z+vRA_mgEPC_fh(AqVVTrId0r-( z=R%Ti-Yt}6(rHSHFo-*3<$&aJmJddoY|6Y+Zk50;WBAWk>Tj0HL}h2-OPUj z*b62vEcK=}EER>Egqb+WUDZ`b<>#QWBV;VT{o@$$%dZo(c@t}w#>0w UX}rHyUN@)fq&QkpCr;zP0DCA`i2wiq diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index f485a54607e6..98e1528b47a1 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -14,30 +14,29 @@ import * as path from 'path'; import * as subprocess from '../subprocess'; -import { Config } from '../config'; +import {Config} from '../config'; -export const python = new Config({ - match: ['**'], - ignore: ['**/README.md', 'pytest.ini'], - packageFile: [ - 'noxfile_config.py', - 'requirements.txt', - 'pyproject.toml', - 'setup.py', - 'setup.cfg', - ], - testAll: args => { - const noxfile = path.join(args.root, 'noxfile-template.py'); - subprocess.run('cp', [noxfile, 'noxfile.py']); - subprocess.run('nox', ['-s', 'py-3.11']); - // subprocess.run('pip', ['install', '-r', 'requirements.txt', '-r', 'requirements-test.txt', '--only-binary', ':all']) - // subprocess.run('pytest', ['-s']) - }, - testSome: args => { - subprocess.run('cp', [ - path.join(args.root, 'noxfile-template.py'), - 'noxfile.py', - ]); - throw `TODO: config/python.ts testSome ${JSON.stringify(args)}`; - }, -}); +export const python = (version = '3.11') => + new Config({ + match: ['**'], + ignore: ['**/README.md', 'pytest.ini'], + packageFile: [ + 'noxfile_config.py', + 'requirements.txt', + 'pyproject.toml', + 'setup.py', + 'setup.cfg', + ], + testAll: args => { + const noxfile = path.join(args.root, 'noxfile-template.py'); + subprocess.run('cp', [noxfile, 'noxfile.py']); + subprocess.run('nox', ['-s', `py-${version}`]); + }, + testSome: args => { + subprocess.run('cp', [ + path.join(args.root, 'noxfile-template.py'), + 'noxfile.py', + ]); + throw `TODO: config/python.ts testSome ${JSON.stringify(args)}`; + }, + }); diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 7bbf15477359..5f5908c1de34 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -19,8 +19,17 @@ import { Affected } from './affected'; function getConfig(lang: string): Config { switch (lang) { + case 'python3.8': + return python('3.8'); + case 'python3.9': + return python('3.9'); + case 'python3.10': + return python('3.10'); + case 'python3.11': + return python('3.11'); + case 'python3.12': case 'python': - return python; + return python('3.12'); } throw `unsupported language: ${lang}`; } @@ -37,7 +46,7 @@ function main(command: string) { } case 'tests': { const config = getConfig(process.argv[3]); - const affected: Affected = JSON.parse(process.env[process.argv[4]] || ""); + const affected: Affected = JSON.parse(process.env[process.argv[4]] || ''); config.test(affected); return; } diff --git a/.github/testing/src/subprocess.ts b/.github/testing/src/subprocess.ts index c2179abcf17d..3f33be062a1e 100644 --- a/.github/testing/src/subprocess.ts +++ b/.github/testing/src/subprocess.ts @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { spawnSync } from 'child_process'; +import {spawnSync} from 'child_process'; export function run(cmd: string, args: string[]) { - const p = spawnSync(cmd, args, { stdio: 'inherit' }); + const p = spawnSync(cmd, args, {stdio: 'inherit'}); if (p.status !== 0) { process.exitCode = p.status || undefined; } diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 410bbd24683a..60daeff76b87 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -20,6 +20,10 @@ on: pull_request: workflow_dispatch: # Manual runs +env: + PROJECT: jss-22p1-test + WORKLOAD_IDENTITY_PROVIDER: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + jobs: affected: runs-on: ubuntu-latest @@ -40,19 +44,17 @@ jobs: echo "$AFFECTED_PYTHON" echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" - Python: + python-311: + name: Python ${{matrix.python-version}} needs: affected runs-on: ubuntu-latest strategy: matrix: + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] affected: ${{fromJson(needs.affected.outputs.python)}} - # Needed to generate the identity token for google-github-actions/auth. - # https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-google-cloud-platform permissions: - id-token: write # This is required for requesting the JWT - contents: read # This is required for actions/checkout - env: - GOOGLE_CLOUD_PROJECT: jss-22p1-test + id-token: write + contents: read defaults: run: working-directory: .github/testing @@ -61,13 +63,13 @@ jobs: - uses: oven-sh/setup-bun@v2 - uses: actions/setup-python@v5 with: - python-version: '3.11' + python-version: ${{matrix.python-version}} - uses: 'google-github-actions/auth@v2' with: - project_id: jss-22p1-test - workload_identity_provider: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + project_id: $PROJECT + workload_identity_provider: $WORKLOAD_IDENTITY_PROVIDER - run: pip install nox - run: bun install - - run: bun run tests python AFFECTED + - run: bun run tests python${{matrix.python-version}} AFFECTED env: AFFECTED: ${{toJson(matrix.affected)}} From aeba0d1794cfce075843386ed16b8831e57822ad Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 13:09:35 -0700 Subject: [PATCH 46/74] fix environment variables --- .github/workflows/test.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 60daeff76b87..9a3d9b688551 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: 🛠️ Test +name: Test on: push: @@ -52,7 +52,7 @@ jobs: matrix: python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] affected: ${{fromJson(needs.affected.outputs.python)}} - permissions: + permissions: # needed for google-github-actions/auth id-token: write contents: read defaults: @@ -66,8 +66,8 @@ jobs: python-version: ${{matrix.python-version}} - uses: 'google-github-actions/auth@v2' with: - project_id: $PROJECT - workload_identity_provider: $WORKLOAD_IDENTITY_PROVIDER + project_id: ${{env.PROJECT}} + workload_identity_provider: ${{env.WORKLOAD_IDENTITY_PROVIDER}} - run: pip install nox - run: bun install - run: bun run tests python${{matrix.python-version}} AFFECTED From 9d71fbc109e92d2a5426f3273f6e562d4987379f Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 13:34:49 -0700 Subject: [PATCH 47/74] improve ui messages --- .github/workflows/test.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9a3d9b688551..8df3dc7f82ab 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: Test +name: 🪿 on: push: @@ -26,6 +26,7 @@ env: jobs: affected: + name: Finding affected tests runs-on: ubuntu-latest outputs: python: ${{steps.python.outputs.affected}} @@ -44,8 +45,8 @@ jobs: echo "$AFFECTED_PYTHON" echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" - python-311: - name: Python ${{matrix.python-version}} + python-test: + name: Test Python ${{matrix.python-version}} needs: affected runs-on: ubuntu-latest strategy: From 02404327fa3f69513702899c60ea857f250b8a03 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 13:50:38 -0700 Subject: [PATCH 48/74] add linter --- .github/testing/package.json | 1 + .github/testing/src/config.ts | 40 +++++++++++++++++++--------- .github/testing/src/config/python.ts | 7 ++++- .github/testing/src/main.ts | 6 +++++ .github/workflows/test.yaml | 24 ++++++++++++++++- 5 files changed, 63 insertions(+), 15 deletions(-) diff --git a/.github/testing/package.json b/.github/testing/package.json index b4c09cbd0241..dea6dfc24745 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -8,6 +8,7 @@ "lint": "gts lint", "fix": "gts fix", "affected": "bun run ./src/main.ts affected", + "linter": "bun run ./src/main.ts linter", "tests": "bun run ./src/main.ts tests" }, "dependencies": { diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 39cc428b90ad..4d464aaf3511 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,16 +15,16 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import {List, Map, Set} from 'immutable'; -import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import {Affected, TestAll, TestName, TestPath, mergeAffected} from './affected'; +import { List, Map, Set } from 'immutable'; +import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import { Affected, TestAll, TestName, TestPath, mergeAffected } from './affected'; -type RunTestsAll = { +type Args = { root: string; path: string; }; -type RunTestsSome = { +type ArgsTestSome = { root: string; path: string; tests: Map>; @@ -36,27 +36,31 @@ export class Config { match: List; ignore: List; packageFile: List; - testAll: (_: RunTestsAll) => void; - testSome: (_: RunTestsSome) => void; + _lint: (_: Args) => void; + _testAll: (_: Args) => void; + _testSome: (_: ArgsTestSome) => void; constructor({ match, ignore, packageFile, + lint, testAll, testSome, }: { match?: string[]; ignore?: string[]; packageFile?: string[]; - testAll?: (_: RunTestsAll) => void; - testSome?: (_: RunTestsSome) => void; + lint?: (_: Args) => void; + testAll?: (_: Args) => void; + testSome?: (_: ArgsTestSome) => void; }) { this.match = List(match || ['**']); this.ignore = List(ignore); this.packageFile = List(packageFile); - this.testAll = testAll || (_ => {}); - this.testSome = testSome || (_ => {}); + this._lint = lint || (_ => { }); + this._testAll = testAll || (_ => { }); + this._testSome = testSome || (_ => { }); } affected = (head: string, main: string): List => @@ -71,6 +75,16 @@ export class Config { .values() ); + lint = (affected: Affected) => { + const cwd = process.cwd(); + const root = git.root(); + const dir = path.join(root, affected.path); + console.log(`> cd ${dir}`); + process.chdir(dir); + this._lint({ root: root, path: affected.path }); + process.chdir(cwd); + }; + test = (affected: Affected) => { const cwd = process.cwd(); const root = git.root(); @@ -78,10 +92,10 @@ export class Config { console.log(`> cd ${dir}`); process.chdir(dir); if ('TestAll' in affected) { - this.testAll({root: root, path: affected.path}); + this._testAll({ root: root, path: affected.path }); } if ('TestSome' in affected) { - this.testSome({ + this._testSome({ root: root, path: affected.path, tests: affected.TestSome, diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 98e1528b47a1..388fa99b0e6f 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import * as subprocess from '../subprocess'; -import {Config} from '../config'; +import { Config } from '../config'; export const python = (version = '3.11') => new Config({ @@ -27,6 +27,11 @@ export const python = (version = '3.11') => 'setup.py', 'setup.cfg', ], + lint: args => { + const noxfile = path.join(args.root, 'noxfile-template.py'); + subprocess.run('cp', [noxfile, 'noxfile.py']); + subprocess.run('nox', ['-s', 'lint']); + }, testAll: args => { const noxfile = path.join(args.root, 'noxfile-template.py'); subprocess.run('cp', [noxfile, 'noxfile.py']); diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 5f5908c1de34..03f589ee2fec 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -44,6 +44,12 @@ function main(command: string) { console.log(JSON.stringify(affected)); return; } + case 'linter': { + const config = getConfig(process.argv[3]); + const affected: Affected = JSON.parse(process.env[process.argv[4]] || ''); + config.lint(affected); + return; + } case 'tests': { const config = getConfig(process.argv[3]); const affected: Affected = JSON.parse(process.env[process.argv[4]] || ''); diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8df3dc7f82ab..8723a1c11fa5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -45,8 +45,30 @@ jobs: echo "$AFFECTED_PYTHON" echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + python-lint: + name: Lint Python + needs: affected + runs-on: ubuntu-latest + strategy: + matrix: + affected: ${{fromJson(needs.affected.outputs.python)}} + defaults: + run: + working-directory: .github/testing + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - run: pip install nox + - run: bun install + - run: bun run linter python AFFECTED + env: + AFFECTED: ${{toJson(matrix.affected)}} + python-test: - name: Test Python ${{matrix.python-version}} + name: Test Python needs: affected runs-on: ubuntu-latest strategy: From 0f806cbf09cc6033e11afb60d3a741c36d33d138 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 14:14:44 -0700 Subject: [PATCH 49/74] format code --- .github/testing/src/config.ts | 16 ++++++++-------- .github/testing/src/config/python.ts | 8 +++----- .github/testing/src/main.ts | 6 +++--- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 4d464aaf3511..3ac198b29c5d 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,9 +15,9 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import { List, Map, Set } from 'immutable'; -import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Affected, TestAll, TestName, TestPath, mergeAffected } from './affected'; +import {List, Map, Set} from 'immutable'; +import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import {Affected, TestAll, TestName, TestPath, mergeAffected} from './affected'; type Args = { root: string; @@ -58,9 +58,9 @@ export class Config { this.match = List(match || ['**']); this.ignore = List(ignore); this.packageFile = List(packageFile); - this._lint = lint || (_ => { }); - this._testAll = testAll || (_ => { }); - this._testSome = testSome || (_ => { }); + this._lint = lint || (_ => {}); + this._testAll = testAll || (_ => {}); + this._testSome = testSome || (_ => {}); } affected = (head: string, main: string): List => @@ -81,7 +81,7 @@ export class Config { const dir = path.join(root, affected.path); console.log(`> cd ${dir}`); process.chdir(dir); - this._lint({ root: root, path: affected.path }); + this._lint({root: root, path: affected.path}); process.chdir(cwd); }; @@ -92,7 +92,7 @@ export class Config { console.log(`> cd ${dir}`); process.chdir(dir); if ('TestAll' in affected) { - this._testAll({ root: root, path: affected.path }); + this._testAll({root: root, path: affected.path}); } if ('TestSome' in affected) { this._testSome({ diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 388fa99b0e6f..608a39a12302 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import * as subprocess from '../subprocess'; -import { Config } from '../config'; +import {Config} from '../config'; export const python = (version = '3.11') => new Config({ @@ -38,10 +38,8 @@ export const python = (version = '3.11') => subprocess.run('nox', ['-s', `py-${version}`]); }, testSome: args => { - subprocess.run('cp', [ - path.join(args.root, 'noxfile-template.py'), - 'noxfile.py', - ]); + const noxfile = path.join(args.root, 'noxfile-template.py'); + subprocess.run('cp', [noxfile, 'noxfile.py']); throw `TODO: config/python.ts testSome ${JSON.stringify(args)}`; }, }); diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 03f589ee2fec..79721ff70bb2 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -13,9 +13,9 @@ // limitations under the License. import * as git from './git'; -import { Config } from './config'; -import { python } from './config/python'; -import { Affected } from './affected'; +import {Config} from './config'; +import {python} from './config/python'; +import {Affected} from './affected'; function getConfig(lang: string): Config { switch (lang) { From dd748a59e1fe7b194d48c124a9115f8b6c3ab4b6 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 14:19:49 -0700 Subject: [PATCH 50/74] change command names --- .github/testing/package.json | 4 ++-- .github/testing/src/config/python.ts | 3 ++- .github/testing/src/main.ts | 10 +++++----- .github/workflows/test.yaml | 6 +++--- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/testing/package.json b/.github/testing/package.json index dea6dfc24745..7c3e22cf7bdf 100644 --- a/.github/testing/package.json +++ b/.github/testing/package.json @@ -8,8 +8,8 @@ "lint": "gts lint", "fix": "gts fix", "affected": "bun run ./src/main.ts affected", - "linter": "bun run ./src/main.ts linter", - "tests": "bun run ./src/main.ts tests" + "ci-lint": "bun run ./src/main.ts lint", + "ci-test": "bun run ./src/main.ts test" }, "dependencies": { "immutable": "^4.3.7", diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 608a39a12302..6fd970d27809 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import * as subprocess from '../subprocess'; -import {Config} from '../config'; +import { Config } from '../config'; export const python = (version = '3.11') => new Config({ @@ -30,6 +30,7 @@ export const python = (version = '3.11') => lint: args => { const noxfile = path.join(args.root, 'noxfile-template.py'); subprocess.run('cp', [noxfile, 'noxfile.py']); + subprocess.run('nox', ['-s', 'blacken']); subprocess.run('nox', ['-s', 'lint']); }, testAll: args => { diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index 79721ff70bb2..debaf6013438 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -13,9 +13,9 @@ // limitations under the License. import * as git from './git'; -import {Config} from './config'; -import {python} from './config/python'; -import {Affected} from './affected'; +import { Config } from './config'; +import { python } from './config/python'; +import { Affected } from './affected'; function getConfig(lang: string): Config { switch (lang) { @@ -44,13 +44,13 @@ function main(command: string) { console.log(JSON.stringify(affected)); return; } - case 'linter': { + case 'lint': { const config = getConfig(process.argv[3]); const affected: Affected = JSON.parse(process.env[process.argv[4]] || ''); config.lint(affected); return; } - case 'tests': { + case 'test': { const config = getConfig(process.argv[3]); const affected: Affected = JSON.parse(process.env[process.argv[4]] || ''); config.test(affected); diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8723a1c11fa5..5c3a956964a2 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -61,9 +61,9 @@ jobs: - uses: actions/setup-python@v5 with: python-version: '3.12' - - run: pip install nox + - run: pip install nox black - run: bun install - - run: bun run linter python AFFECTED + - run: bun run ci-lint python AFFECTED env: AFFECTED: ${{toJson(matrix.affected)}} @@ -93,6 +93,6 @@ jobs: workload_identity_provider: ${{env.WORKLOAD_IDENTITY_PROVIDER}} - run: pip install nox - run: bun install - - run: bun run tests python${{matrix.python-version}} AFFECTED + - run: bun run ci-test python${{matrix.python-version}} AFFECTED env: AFFECTED: ${{toJson(matrix.affected)}} From c7faba00289a3b66a4398ab5be78b51b6ab54758 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 14:29:32 -0700 Subject: [PATCH 51/74] code cleanup --- .github/testing/src/affected.ts | 10 +++--- .github/testing/src/config.ts | 48 +++++++++++----------------- .github/testing/src/config/python.ts | 2 +- .github/testing/tsconfig.json | 3 +- 4 files changed, 27 insertions(+), 36 deletions(-) diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index c4fe72db35cd..af8c890f36d4 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -12,26 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {Map, List, Set} from 'immutable'; +import { Map, List, Set } from 'immutable'; export type PackageName = string; export type TestPath = string; export type TestName = string; +export type AffectedTests = Map> + export const TestAll = (path: string): Affected => ({ path: path, TestAll: null, }); export const TestSome = ( path: string, - tests: Map> + tests: AffectedTests ): Affected => ({ path: path, TestSome: tests, }); export type Affected = - | {path: string; TestAll: null} - | {path: string; TestSome: Map>}; + | { path: string; TestAll: null } + | { path: string; TestSome: AffectedTests }; export function mergeAffected( path: string, diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 3ac198b29c5d..00b7cccd54eb 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,30 +15,24 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import {List, Map, Set} from 'immutable'; -import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import {Affected, TestAll, TestName, TestPath, mergeAffected} from './affected'; +import { List, Map, Set } from 'immutable'; +import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import { Affected, AffectedTests, TestAll, TestName, TestPath, mergeAffected } from './affected'; type Args = { root: string; path: string; }; -type ArgsTestSome = { - root: string; - path: string; - tests: Map>; -}; - const IGNORE_GLOBAL = ['README.md']; export class Config { match: List; ignore: List; packageFile: List; - _lint: (_: Args) => void; - _testAll: (_: Args) => void; - _testSome: (_: ArgsTestSome) => void; + _lint: (args: Args) => void; + _testAll: (args: Args) => void; + _testSome: (args: Args, tests: AffectedTests) => void; constructor({ match, @@ -51,16 +45,16 @@ export class Config { match?: string[]; ignore?: string[]; packageFile?: string[]; - lint?: (_: Args) => void; - testAll?: (_: Args) => void; - testSome?: (_: ArgsTestSome) => void; + lint?: (args: Args) => void; + testAll?: (args: Args) => void; + testSome?: (args: Args, tests: AffectedTests) => void; }) { this.match = List(match || ['**']); this.ignore = List(ignore); this.packageFile = List(packageFile); - this._lint = lint || (_ => {}); - this._testAll = testAll || (_ => {}); - this._testSome = testSome || (_ => {}); + this._lint = lint || (_ => { }); + this._testAll = testAll || (_ => { }); + this._testSome = testSome || (_ => { }); } affected = (head: string, main: string): List => @@ -76,30 +70,26 @@ export class Config { ); lint = (affected: Affected) => { + const args = { root: git.root(), path: affected.path }; const cwd = process.cwd(); - const root = git.root(); - const dir = path.join(root, affected.path); + const dir = path.join(args.root, affected.path); console.log(`> cd ${dir}`); process.chdir(dir); - this._lint({root: root, path: affected.path}); + this._lint(args); process.chdir(cwd); }; test = (affected: Affected) => { + const args = { root: git.root(), path: affected.path }; const cwd = process.cwd(); - const root = git.root(); - const dir = path.join(root, affected.path); + const dir = path.join(args.root, affected.path); console.log(`> cd ${dir}`); process.chdir(dir); if ('TestAll' in affected) { - this._testAll({root: root, path: affected.path}); + this._testAll(args); } if ('TestSome' in affected) { - this._testSome({ - root: root, - path: affected.path, - tests: affected.TestSome, - }); + this._testSome(args, affected.TestSome); } process.chdir(cwd); }; diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index 6fd970d27809..f145379720cd 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -38,7 +38,7 @@ export const python = (version = '3.11') => subprocess.run('cp', [noxfile, 'noxfile.py']); subprocess.run('nox', ['-s', `py-${version}`]); }, - testSome: args => { + testSome: (args, tests) => { const noxfile = path.join(args.root, 'noxfile-template.py'); subprocess.run('cp', [noxfile, 'noxfile.py']); throw `TODO: config/python.ts testSome ${JSON.stringify(args)}`; diff --git a/.github/testing/tsconfig.json b/.github/testing/tsconfig.json index 2cc163c18310..d1646f0118f7 100644 --- a/.github/testing/tsconfig.json +++ b/.github/testing/tsconfig.json @@ -6,7 +6,6 @@ }, "include": [ "src/**/*.ts", - "test/**/*.ts", - "src/diffs.ts" + "test/**/*.ts" ] } From 23e4f88e17513bdd98fa8fa6b054c7c990decebb Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 15:43:13 -0700 Subject: [PATCH 52/74] cleanup and refactor reusable code --- .github/testing/src/affected.ts | 13 +++----- .github/testing/src/config.ts | 50 +++++++++++++--------------- .github/testing/src/config/python.ts | 2 +- .github/testing/src/main.ts | 6 ++-- .github/workflows/test.yaml | 2 +- 5 files changed, 34 insertions(+), 39 deletions(-) diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts index af8c890f36d4..fa74a712ce7f 100644 --- a/.github/testing/src/affected.ts +++ b/.github/testing/src/affected.ts @@ -12,28 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Map, List, Set } from 'immutable'; +import {Map, List, Set} from 'immutable'; export type PackageName = string; export type TestPath = string; export type TestName = string; -export type AffectedTests = Map> +export type AffectedTests = Map>; export const TestAll = (path: string): Affected => ({ path: path, TestAll: null, }); -export const TestSome = ( - path: string, - tests: AffectedTests -): Affected => ({ +export const TestSome = (path: string, tests: AffectedTests): Affected => ({ path: path, TestSome: tests, }); export type Affected = - | { path: string; TestAll: null } - | { path: string; TestSome: AffectedTests }; + | {path: string; TestAll: null} + | {path: string; TestSome: AffectedTests}; export function mergeAffected( path: string, diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 00b7cccd54eb..fa032bdebb22 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -15,9 +15,9 @@ import * as fs from 'node:fs'; import * as git from './git'; import * as path from 'path'; -import { List, Map, Set } from 'immutable'; -import { minimatch } from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Affected, AffectedTests, TestAll, TestName, TestPath, mergeAffected } from './affected'; +import {List} from 'immutable'; +import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ +import {Affected, AffectedTests, TestAll, mergeAffected} from './affected'; type Args = { root: string; @@ -52,9 +52,9 @@ export class Config { this.match = List(match || ['**']); this.ignore = List(ignore); this.packageFile = List(packageFile); - this._lint = lint || (_ => { }); - this._testAll = testAll || (_ => { }); - this._testSome = testSome || (_ => { }); + this._lint = lint || (_ => {}); + this._testAll = testAll || (_ => {}); + this._testSome = testSome || (_ => {}); } affected = (head: string, main: string): List => @@ -69,28 +69,26 @@ export class Config { .values() ); - lint = (affected: Affected) => { - const args = { root: git.root(), path: affected.path }; - const cwd = process.cwd(); - const dir = path.join(args.root, affected.path); - console.log(`> cd ${dir}`); - process.chdir(dir); - this._lint(args); - process.chdir(cwd); - }; + lint = (affected: Affected) => + this.withDir(affected.path, args => this._lint(args)); - test = (affected: Affected) => { - const args = { root: git.root(), path: affected.path }; + test = (affected: Affected) => + this.withDir(affected.path, args => { + if ('TestAll' in affected) { + this._testAll(args); + } + if ('TestSome' in affected) { + this._testSome(args, affected.TestSome); + } + }); + + withDir = (dir: string, f: (args: Args) => void) => { + const args = {root: git.root(), path: dir}; const cwd = process.cwd(); - const dir = path.join(args.root, affected.path); - console.log(`> cd ${dir}`); - process.chdir(dir); - if ('TestAll' in affected) { - this._testAll(args); - } - if ('TestSome' in affected) { - this._testSome(args, affected.TestSome); - } + const absDir = path.join(args.root, dir); + console.log(`> cd ${absDir}`); + process.chdir(absDir); + f(args); process.chdir(cwd); }; diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts index f145379720cd..4ddfc1164f37 100644 --- a/.github/testing/src/config/python.ts +++ b/.github/testing/src/config/python.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import * as subprocess from '../subprocess'; -import { Config } from '../config'; +import {Config} from '../config'; export const python = (version = '3.11') => new Config({ diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts index debaf6013438..239f5395b08e 100644 --- a/.github/testing/src/main.ts +++ b/.github/testing/src/main.ts @@ -13,9 +13,9 @@ // limitations under the License. import * as git from './git'; -import { Config } from './config'; -import { python } from './config/python'; -import { Affected } from './affected'; +import {Config} from './config'; +import {python} from './config/python'; +import {Affected} from './affected'; function getConfig(lang: string): Config { switch (lang) { diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 5c3a956964a2..e2c6f30a68e4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -61,7 +61,7 @@ jobs: - uses: actions/setup-python@v5 with: python-version: '3.12' - - run: pip install nox black + - run: pip install nox - run: bun install - run: bun run ci-lint python AFFECTED env: From 099ec33c074e38783a5e9bfe4be608ee4c56cd96 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 15:55:34 -0700 Subject: [PATCH 53/74] fix default values for config --- .github/testing/src/config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index fa032bdebb22..709f33e7a290 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -50,8 +50,8 @@ export class Config { testSome?: (args: Args, tests: AffectedTests) => void; }) { this.match = List(match || ['**']); - this.ignore = List(ignore); - this.packageFile = List(packageFile); + this.ignore = List(ignore || []); + this.packageFile = List(packageFile || []); this._lint = lint || (_ => {}); this._testAll = testAll || (_ => {}); this._testSome = testSome || (_ => {}); From b8f39f66d99bb8aa81a4cb2f778aeb391995338a Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 30 Jul 2024 15:58:54 -0700 Subject: [PATCH 54/74] more error handling --- .github/testing/src/config.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts index 709f33e7a290..234c3663e601 100644 --- a/.github/testing/src/config.ts +++ b/.github/testing/src/config.ts @@ -76,9 +76,10 @@ export class Config { this.withDir(affected.path, args => { if ('TestAll' in affected) { this._testAll(args); - } - if ('TestSome' in affected) { + } else if ('TestSome' in affected) { this._testSome(args, affected.TestSome); + } else { + throw `affected must contain either a "TestAll" or "TestSome" field, got ${affected}`; } }); From 7272c57099aed86af095e682c2977c4dcf6d25f2 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 15 Aug 2024 16:29:20 -0700 Subject: [PATCH 55/74] initial workflow_run setup --- .github/workflows/affected.yaml | 43 +++++++++ .github/workflows/test.yaml | 161 +++++++++++++++++--------------- 2 files changed, 129 insertions(+), 75 deletions(-) create mode 100644 .github/workflows/affected.yaml diff --git a/.github/workflows/affected.yaml b/.github/workflows/affected.yaml new file mode 100644 index 000000000000..162f8b01f79e --- /dev/null +++ b/.github/workflows/affected.yaml @@ -0,0 +1,43 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: 🔍 + +on: + push: + branches: main + pull_request: + +jobs: + affected: + name: Finding affected tests + runs-on: ubuntu-latest + # outputs: + # python: ${{steps.python.outputs.affected}} + # defaults: + # run: + # working-directory: .github/testing + # steps: + # - uses: actions/checkout@v4 + # with: + # fetch-depth: 0 + # - uses: oven-sh/setup-bun@v2 + # - run: bun install + # - id: python + # run: | + # AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) + # echo "$AFFECTED_PYTHON" + # echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + steps: + - run: echo "Success!" diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e2c6f30a68e4..49f7af7e4a98 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -15,84 +15,95 @@ name: 🪿 on: - push: - branches: main - pull_request: - workflow_dispatch: # Manual runs - -env: - PROJECT: jss-22p1-test - WORKLOAD_IDENTITY_PROVIDER: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + workflow_run: + workflows: ["🔍"] + types: ["completed"] jobs: - affected: - name: Finding affected tests + test: runs-on: ubuntu-latest - outputs: - python: ${{steps.python.outputs.affected}} - defaults: - run: - working-directory: .github/testing steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: oven-sh/setup-bun@v2 - - run: bun install - - id: python - run: | - AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) - echo "$AFFECTED_PYTHON" - echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + - run: echo "Running tests" - python-lint: - name: Lint Python - needs: affected - runs-on: ubuntu-latest - strategy: - matrix: - affected: ${{fromJson(needs.affected.outputs.python)}} - defaults: - run: - working-directory: .github/testing - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - run: pip install nox - - run: bun install - - run: bun run ci-lint python AFFECTED - env: - AFFECTED: ${{toJson(matrix.affected)}} +# on: +# push: +# branches: main +# pull_request: +# workflow_dispatch: # Manual runs - python-test: - name: Test Python - needs: affected - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] - affected: ${{fromJson(needs.affected.outputs.python)}} - permissions: # needed for google-github-actions/auth - id-token: write - contents: read - defaults: - run: - working-directory: .github/testing - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - - uses: actions/setup-python@v5 - with: - python-version: ${{matrix.python-version}} - - uses: 'google-github-actions/auth@v2' - with: - project_id: ${{env.PROJECT}} - workload_identity_provider: ${{env.WORKLOAD_IDENTITY_PROVIDER}} - - run: pip install nox - - run: bun install - - run: bun run ci-test python${{matrix.python-version}} AFFECTED - env: - AFFECTED: ${{toJson(matrix.affected)}} +# env: +# PROJECT: jss-22p1-test +# WORKLOAD_IDENTITY_PROVIDER: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python + +# jobs: +# affected: +# name: Finding affected tests +# runs-on: ubuntu-latest +# outputs: +# python: ${{steps.python.outputs.affected}} +# defaults: +# run: +# working-directory: .github/testing +# steps: +# - uses: actions/checkout@v4 +# with: +# fetch-depth: 0 +# - uses: oven-sh/setup-bun@v2 +# - run: bun install +# - id: python +# run: | +# AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) +# echo "$AFFECTED_PYTHON" +# echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + +# python-lint: +# name: Lint Python +# needs: affected +# runs-on: ubuntu-latest +# strategy: +# matrix: +# affected: ${{fromJson(needs.affected.outputs.python)}} +# defaults: +# run: +# working-directory: .github/testing +# steps: +# - uses: actions/checkout@v4 +# - uses: oven-sh/setup-bun@v2 +# - uses: actions/setup-python@v5 +# with: +# python-version: '3.12' +# - run: pip install nox +# - run: bun install +# - run: bun run ci-lint python AFFECTED +# env: +# AFFECTED: ${{toJson(matrix.affected)}} + +# python-test: +# name: Test Python +# needs: affected +# runs-on: ubuntu-latest +# strategy: +# matrix: +# python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] +# affected: ${{fromJson(needs.affected.outputs.python)}} +# permissions: # needed for google-github-actions/auth +# id-token: write +# contents: read +# defaults: +# run: +# working-directory: .github/testing +# steps: +# - uses: actions/checkout@v4 +# - uses: oven-sh/setup-bun@v2 +# - uses: actions/setup-python@v5 +# with: +# python-version: ${{matrix.python-version}} +# - uses: 'google-github-actions/auth@v2' +# with: +# project_id: ${{env.PROJECT}} +# workload_identity_provider: ${{env.WORKLOAD_IDENTITY_PROVIDER}} +# - run: pip install nox +# - run: bun install +# - run: bun run ci-test python${{matrix.python-version}} AFFECTED +# env: +# AFFECTED: ${{toJson(matrix.affected)}} From 0934aa068366a327664372f968a0223ed12fe497 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Thu, 15 Aug 2024 16:35:49 -0700 Subject: [PATCH 56/74] rename action --- .github/workflows/affected.yaml | 2 +- .github/workflows/test.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/affected.yaml b/.github/workflows/affected.yaml index 162f8b01f79e..94c743baec9b 100644 --- a/.github/workflows/affected.yaml +++ b/.github/workflows/affected.yaml @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: 🔍 +name: PR on: push: diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 49f7af7e4a98..9524e6b0b64f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -16,7 +16,7 @@ name: 🪿 on: workflow_run: - workflows: ["🔍"] + workflows: ["PR"] types: ["completed"] jobs: From e174f5b57aedbe87667d2f11397ad92b922381c4 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 13:35:00 -0700 Subject: [PATCH 57/74] use go tooling --- .github/testing/.editorconfig | 8 -- .github/testing/.eslintignore | 1 - .github/testing/.eslintrc.json | 13 --- .github/testing/.gitignore | 133 --------------------------- .github/testing/.prettierrc.js | 17 ---- .github/testing/bun.lockb | Bin 100035 -> 0 bytes .github/testing/package.json | 18 ---- .github/testing/src/affected.ts | 52 ----------- .github/testing/src/config.ts | 117 ----------------------- .github/testing/src/config/python.ts | 46 --------- .github/testing/src/git.ts | 49 ---------- .github/testing/src/main.ts | 63 ------------- .github/testing/src/subprocess.ts | 30 ------ .github/testing/tsconfig.json | 11 --- .github/workflows/affected.yaml | 27 ++---- .github/workflows/python/config.json | 11 +++ .github/workflows/python/lint.yaml | 0 .github/workflows/python/test.yaml | 0 18 files changed, 21 insertions(+), 575 deletions(-) delete mode 100644 .github/testing/.editorconfig delete mode 100644 .github/testing/.eslintignore delete mode 100644 .github/testing/.eslintrc.json delete mode 100644 .github/testing/.gitignore delete mode 100644 .github/testing/.prettierrc.js delete mode 100755 .github/testing/bun.lockb delete mode 100644 .github/testing/package.json delete mode 100644 .github/testing/src/affected.ts delete mode 100644 .github/testing/src/config.ts delete mode 100644 .github/testing/src/config/python.ts delete mode 100644 .github/testing/src/git.ts delete mode 100644 .github/testing/src/main.ts delete mode 100644 .github/testing/src/subprocess.ts delete mode 100644 .github/testing/tsconfig.json create mode 100644 .github/workflows/python/config.json create mode 100644 .github/workflows/python/lint.yaml create mode 100644 .github/workflows/python/test.yaml diff --git a/.github/testing/.editorconfig b/.github/testing/.editorconfig deleted file mode 100644 index 79fe80267524..000000000000 --- a/.github/testing/.editorconfig +++ /dev/null @@ -1,8 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -insert_final_newline = true diff --git a/.github/testing/.eslintignore b/.github/testing/.eslintignore deleted file mode 100644 index 567609b1234a..000000000000 --- a/.github/testing/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -build/ diff --git a/.github/testing/.eslintrc.json b/.github/testing/.eslintrc.json deleted file mode 100644 index 5bb5ae24e3c7..000000000000 --- a/.github/testing/.eslintrc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "./node_modules/gts/", - "rules": { - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ] - } -} diff --git a/.github/testing/.gitignore b/.github/testing/.gitignore deleted file mode 100644 index b7bc54b636f6..000000000000 --- a/.github/testing/.gitignore +++ /dev/null @@ -1,133 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -# Build files -build/ diff --git a/.github/testing/.prettierrc.js b/.github/testing/.prettierrc.js deleted file mode 100644 index 53e2e1e8ee2e..000000000000 --- a/.github/testing/.prettierrc.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -module.exports = { - ...require('gts/.prettierrc.json') -} diff --git a/.github/testing/bun.lockb b/.github/testing/bun.lockb deleted file mode 100755 index 03b58e6c99201042999afd12b2f09e7e91798f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100035 zcmeFacUTq4wm!T`N|2mEBr7?JN|GD|1VKQ8faIKm5+q1QiGqS6iUA}k0t$j8K~#b$ zIR`slc-SHI6~kPAKbrIpC426(;$Af z(wKfy$fkhVKRi`Jq!smdd2KqX1iwx+CSncEN?qltM!8p2k+Q9yq1Q-kzX!rE6 zwTI=CKGt4df&Z_)UcyaYXAdWPA7?*bXAcKAXGbT$M1Y6_M-DVXzs~{w@G#sa|y?cPY4+i67@9XInV2@#^!C=@yJw4EncRSEnKRi!*U@)d&;(yr% zB#1?C*t108T>x!m!#4rlz%@JYt*%k~N*wR_0d_$fe@B3G|CP-cjJ3-z zw=n)b&cZOmz5G1_Z9VPm5AWUFk0gNxsT2NV&*pk~4>TN?gSD@pH{kKH_xFVhb^E?e z{|11D{_yPI9M>~YhW$GM4y1f|1<+ur{Xg?&d0=xtD+KK@UYD?Tbfh$g&N)6Ui1o8tiI>W4n#Nvzwo@hwlZz2mLsy0QP*K{jl>4^UEd>gYk9ywQYd= zmye@8m^&t=O+OlehH==gyjiyKv9<-<3MLekVSO{uFpn8jHrtW>v~%|PmDruwdUC)6 z^Y$yS5BGg5pqYSH0Gb2n0K84zrnWiX-?dBcSSqwQ_TdF$m=Uy0h+88|oLZ*-@KQWD#+r)YnlITazM!*F~+t;yE5W6wvQ^CM2x z54wS&fMBWXXDKyuSiCD;FU??%R`^8zIl5jh~ThMR^|FpOXk6` zgt5!Zv_(xLS>!Tzbu4BMEBWni<9S#=@h)V$f?Gm0N1a`eqTp*uVM8+dLvM`9(|D%% z#BX)7zVrX`yb#3YPo&z8WF4xi*%Q`NsNfy4F+`Py4y$wnqoX#;jT#Irqc2 zRUqP+AY5O{n?o*6p>?~sqOuLlL zxgz-QOP{1^WQ;3FH>nJqU!h$Tz5ixUa&sTY^(P_d_Yh1;TS&Vrqp(WqR5YK9OkQG%G<74@s5 zh1VHt)|R=B(8hkf-6WWN8B@ZQ(bVudK>mufZcn%d$IhYqBqx#iq@-2!*-=lcDX2mh zuru^>;GiuV5K`kvoo>4N0*X;V|S6Q9oS z^fKx+nK|YY7H~|0Eipv5wad4Dqt`%=q>XrXx0Y^ed!Md){(SP}-dh)P7Kk`bDDiz5 zTk>UGt~?Uz_Gsi@d2zdY(w7^0E9$p}jtw29nd?`iAJ3GjCq7L&dyGxt+PQDv4aC+W zsO^)l+AJ(stG~iLGz<^EOLcqAXmC=HhFv>|BS5Rvhfb@ZfnugWqulPpfeXUvoJ};( z%b$m(DLWSPN)q!PKBQxwaO&aeej=GeMT6WOyiuA9iu6?XYJ!qIGXJ=5czl&!JM3b> zYRsbfiv2_R^Q6JElwWTY_+UoOGbvc*phWiywWKJO3`5!gL$GSJ%dS?mS>GWPX-PG8$c4bV^`?HKd{0 zqfc`69eFvQy{mkBoOk!g(>z8s7luc15;J!KQ;)s&{*sxl*xXZP!Zi3L*{=H9^oPq? zJavc9=YK-_TR-M}qLInGijaZ2nMN5iyLKZj_x5_B%R{n8Oj-f2 zwYtT06D=rt)C?6egpPOYINW1)e~CYKJAcmM8)f;j?3$KAX`a7X4W6kMnjgPXGE>E4L5^B2zY9w#eu9p|dA_Oegd8N?x6O-_I=d$Npmv ziYRRjZe3egvl+FbCEi=aX>$Er^iQ7o9URPLXLuzh9!L4J~Ar0gHQP(#?T{P zIP`lTvVO%q9FEw8o0R+YcYYl9s5J^IRf^J;%QaGGsl4U0R#*H-d*fLv5_w^HipV@j z6VlvxNIJJoCr-M3_G?JJ`oVr{Jv&Rw}RxSZ}XGkwu~jGJ0mp#^%&eeVE|^t1LCb1X+JMb;`mxEddF;@qwqeA0`5 zQTdN~l@stt*tv_y=h^JuV*k>yh1ANXCTA}3xYlj_wc274pMn=0JK|{Oxl%>V5_jL1 zmnQL)Ynju(RCA*(Gw`ZQmoriijx+z2;A7F?u@3`|h~eO@^-FN&Meq&)1&&JLNO`OH zYJgV-cm#*=Yvkmpat*<4ypeg2hy(ud^ia3aO_aFI{tYq9%A9x5kFx0?*y^W z4-A7xr+?W;>i-T4+mL=101qA&!=c}>4jBjR^LK*aZvy~0djBhbwmN^ySo>QUJM;^& z&jA7k$B)=W>i^DnG~N*4VgAB#LyoQDlK@@=YaimlGYL+D*ck_Sn7;@J83$7SD~;e; zLDGXq+Hj-{=x`FG|4}R+vAYc?^uObD7T{t2BX}I)|BCY<);^3s^a&Jk62yOM;4s`j zkTOnS&nl4`FDcg&j7qK zz{B`K!F3)Gd^5nK_m54M-~UDM)WjH!BFg^nk()gbyg9(b{73vo^zV2O{6&CQ26$Za z9^pmsg8&cn7lh%LY}Gy^m~gm%Kro=%a{ToH9vw|mEk)VKb?riK1V0Dx z$o&(k`<-nx-X0uW;QbTE4dQW~2gKH0fVTm7SVs0>$p1S*@YG<#h4F*-kv-&hSlEu> z4FMj`KT@~V`A-9QRe*>21KwwC`ToBQ@c&Kz3xStk%KwG^EPzMOZ!iY93KG9=fCsM= zf6X79d!+t%JV-wY@G=#~59U9vdq3nx@Bsi1=O5YserFeHNAPz5{s_P$^Ny6mA@82-?a1L?hK>ED|c<>dc_0g8^Tig+ts{<`A);0q}7D!__V_HU!^| z#cyTrfE);(8vG~$?*ISP|3d%|#}E0CJqYpf?=)gR4B#cOc%<&{a7Y`{_a49-0z6_H z(MZ3)(g>agEZV&Q57*5$aBUT@4)8Gl{%QO&03MznpzW;);(sT=@59>vCwL<8;|b0G z!hchMhxQTww;I1>fL8=~xOV=@`soCCIDZHh(Z7oY5euz{B~6 zSmc83zY_$X2=Fj|h;2mUif;mVWdBDve}{$bNZ+5>@x%Fpbx1wz^LK*uGXh_lqtCxv z^*LlNL%{vhjjtMQA$;*q#*75^CE6@h)Yeqi9K4_(xCnw5;=*7Q0Uq%m zss9}Z($5XxWdR=chkGZkF+lM701xLM$-k|RUz8hz(FJ&f5Bh zT7ZZ7566wn!B*_AV(laT;DUvHkp5CU|Gt01`mOr!3Gm9;_~D90+rJ0!F#rDP`RhHv z!}Wvgy)cfr2r_;H-hZE8Ar7hk9S71c>JRwe;gEI&{{Z0O{TC@C?Z4AVf0Ess@yB)C z2rq)y26*`X09ik{@*wyQEFQjh`X}=*vIm2a0`}qgQyOs&2aVW&#aS_DVe3X4$Z9{$pKZV7^*uy$p=K#U83v8a>At$uI zRlFX+Yl8Vh__jeJ90ciq5#W*Y6SR$M3=n(=z^eoMTfsv25d8o4?>A@#F&IVQKO8rV z9pV@G__u=eI|}eV*zrTaR_Cu9;F0GST(Qs&VxL6l-{-e~VqXd1Re}G=zJqAU^>>2U zj|O~?ajvv<;AolTu|NZ?5w7pfl6u=|<2d=pf%=|0AWZfh6e}{!_NIwpde?LF`4uft-@Wud-wvX=f zcb^e_I>5vD;ks`loCv-h>;G2f9ú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%0D*+`us0YW>hCphx6X! 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 diff --git a/.github/testing/package.json b/.github/testing/package.json deleted file mode 100644 index 7c3e22cf7bdf..000000000000 --- a/.github/testing/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "devDependencies": { - "@types/bun": "^1.1.6", - "gts": "^5.3.1" - }, - "scripts": { - "clean": "gts clean", - "lint": "gts lint", - "fix": "gts fix", - "affected": "bun run ./src/main.ts affected", - "ci-lint": "bun run ./src/main.ts lint", - "ci-test": "bun run ./src/main.ts test" - }, - "dependencies": { - "immutable": "^4.3.7", - "minimatch": "^10.0.1" - } -} diff --git a/.github/testing/src/affected.ts b/.github/testing/src/affected.ts deleted file mode 100644 index fa74a712ce7f..000000000000 --- a/.github/testing/src/affected.ts +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import {Map, List, Set} from 'immutable'; - -export type PackageName = string; -export type TestPath = string; -export type TestName = string; - -export type AffectedTests = Map>; - -export const TestAll = (path: string): Affected => ({ - path: path, - TestAll: null, -}); -export const TestSome = (path: string, tests: AffectedTests): Affected => ({ - path: path, - TestSome: tests, -}); -export type Affected = - | {path: string; TestAll: null} - | {path: string; TestSome: AffectedTests}; - -export function mergeAffected( - path: string, - affected: List -): Affected { - return affected.reduce( - (result, current) => { - if ('TestSome' in result && 'TestSome' in current) { - const tests = result.TestSome.mergeWith( - (xs, ys) => xs.union(ys), - current.TestSome - ); - return TestSome(path, tests); - } - return TestAll(path); - }, - TestSome(path, Map()) - ); -} diff --git a/.github/testing/src/config.ts b/.github/testing/src/config.ts deleted file mode 100644 index 234c3663e601..000000000000 --- a/.github/testing/src/config.ts +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import * as fs from 'node:fs'; -import * as git from './git'; -import * as path from 'path'; -import {List} from 'immutable'; -import {minimatch} from 'minimatch'; /* eslint-disable @typescript-eslint/no-explicit-any */ -import {Affected, AffectedTests, TestAll, mergeAffected} from './affected'; - -type Args = { - root: string; - path: string; -}; - -const IGNORE_GLOBAL = ['README.md']; - -export class Config { - match: List; - ignore: List; - packageFile: List; - _lint: (args: Args) => void; - _testAll: (args: Args) => void; - _testSome: (args: Args, tests: AffectedTests) => void; - - constructor({ - match, - ignore, - packageFile, - lint, - testAll, - testSome, - }: { - match?: string[]; - ignore?: string[]; - packageFile?: string[]; - lint?: (args: Args) => void; - testAll?: (args: Args) => void; - testSome?: (args: Args, tests: AffectedTests) => void; - }) { - this.match = List(match || ['**']); - this.ignore = List(ignore || []); - this.packageFile = List(packageFile || []); - this._lint = lint || (_ => {}); - this._testAll = testAll || (_ => {}); - this._testSome = testSome || (_ => {}); - } - - affected = (head: string, main: string): List => - List( - git - .diffs(head, main) - .filter(diff => !IGNORE_GLOBAL.every(p => minimatch(diff.filename, p))) - .filter(this.matchFile) - .map(this.findAffected) - .groupBy(affected => affected.path) - .map((affected, path) => mergeAffected(path, affected)) - .values() - ); - - lint = (affected: Affected) => - this.withDir(affected.path, args => this._lint(args)); - - test = (affected: Affected) => - this.withDir(affected.path, args => { - if ('TestAll' in affected) { - this._testAll(args); - } else if ('TestSome' in affected) { - this._testSome(args, affected.TestSome); - } else { - throw `affected must contain either a "TestAll" or "TestSome" field, got ${affected}`; - } - }); - - withDir = (dir: string, f: (args: Args) => void) => { - const args = {root: git.root(), path: dir}; - const cwd = process.cwd(); - const absDir = path.join(args.root, dir); - console.log(`> cd ${absDir}`); - process.chdir(absDir); - f(args); - process.chdir(cwd); - }; - - matchFile = (diff: git.Diff): boolean => - this.match.some(p => minimatch(diff.filename, p)) && - this.ignore.every(p => !minimatch(diff.filename, p)); - - findAffected = (diff: git.Diff): Affected => { - const path = this.findPackage(diff.filename); - return TestAll(path); // TOOD: discover affected tests only - }; - - findPackage = (filename: string): string => { - const dir = path.dirname(filename); - if (dir === '.' || this.isPackage(dir)) { - return dir; - } - return this.findPackage(dir); - }; - - isPackage = (dir: string): boolean => - this.packageFile.some(file => - fs.existsSync(path.join(git.root(), dir, file)) - ); -} diff --git a/.github/testing/src/config/python.ts b/.github/testing/src/config/python.ts deleted file mode 100644 index 4ddfc1164f37..000000000000 --- a/.github/testing/src/config/python.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import * as path from 'path'; -import * as subprocess from '../subprocess'; -import {Config} from '../config'; - -export const python = (version = '3.11') => - new Config({ - match: ['**'], - ignore: ['**/README.md', 'pytest.ini'], - packageFile: [ - 'noxfile_config.py', - 'requirements.txt', - 'pyproject.toml', - 'setup.py', - 'setup.cfg', - ], - lint: args => { - const noxfile = path.join(args.root, 'noxfile-template.py'); - subprocess.run('cp', [noxfile, 'noxfile.py']); - subprocess.run('nox', ['-s', 'blacken']); - subprocess.run('nox', ['-s', 'lint']); - }, - testAll: args => { - const noxfile = path.join(args.root, 'noxfile-template.py'); - subprocess.run('cp', [noxfile, 'noxfile.py']); - subprocess.run('nox', ['-s', `py-${version}`]); - }, - testSome: (args, tests) => { - const noxfile = path.join(args.root, 'noxfile-template.py'); - subprocess.run('cp', [noxfile, 'noxfile.py']); - throw `TODO: config/python.ts testSome ${JSON.stringify(args)}`; - }, - }); diff --git a/.github/testing/src/git.ts b/.github/testing/src/git.ts deleted file mode 100644 index 4cb0cb876174..000000000000 --- a/.github/testing/src/git.ts +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import {List} from 'immutable'; -import * as subprocess from './subprocess'; - -export type Diff = { - filename: string; - lineNumbers: number[]; -}; - -export function branchName(): string { - return subprocess.output('git', ['rev-parse', '--abbrev-ref', 'HEAD']); -} - -export function root(): string { - return subprocess.output('git', ['rev-parse', '--show-toplevel']); -} - -export function diffs(commit1: string, commit2: string): List { - const output = subprocess.output('git', [ - '--no-pager', - 'diff', - '--unified=0', - commit1, - commit2, - ]); - return List(output.split(/^diff --git a\//m)) - .map(output => output.split('\n').filter(line => line.length > 0)) - .filter(lines => lines.length > 0) - .map(lines => ({ - filename: lines[0].split(' ')[0], - lineNumbers: lines - .map(line => line.match(/^@@ -(\d+)/)?.at(1)) - .filter(match => match !== undefined) - .map(match => parseInt(match)), - })); -} diff --git a/.github/testing/src/main.ts b/.github/testing/src/main.ts deleted file mode 100644 index 239f5395b08e..000000000000 --- a/.github/testing/src/main.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import * as git from './git'; -import {Config} from './config'; -import {python} from './config/python'; -import {Affected} from './affected'; - -function getConfig(lang: string): Config { - switch (lang) { - case 'python3.8': - return python('3.8'); - case 'python3.9': - return python('3.9'); - case 'python3.10': - return python('3.10'); - case 'python3.11': - return python('3.11'); - case 'python3.12': - case 'python': - return python('3.12'); - } - throw `unsupported language: ${lang}`; -} - -function main(command: string) { - switch (command) { - case 'affected': { - const config = getConfig(process.argv[3]); - const head = process.argv[4] || git.branchName(); - const main = process.argv[5] || 'main'; - const affected = config.affected(head, main); - console.log(JSON.stringify(affected)); - return; - } - case 'lint': { - const config = getConfig(process.argv[3]); - const affected: Affected = JSON.parse(process.env[process.argv[4]] || ''); - config.lint(affected); - return; - } - case 'test': { - const config = getConfig(process.argv[3]); - const affected: Affected = JSON.parse(process.env[process.argv[4]] || ''); - config.test(affected); - return; - } - } - throw `unsupported command: ${command}`; -} - -main(process.argv[2]); diff --git a/.github/testing/src/subprocess.ts b/.github/testing/src/subprocess.ts deleted file mode 100644 index 3f33be062a1e..000000000000 --- a/.github/testing/src/subprocess.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import {spawnSync} from 'child_process'; - -export function run(cmd: string, args: string[]) { - const p = spawnSync(cmd, args, {stdio: 'inherit'}); - if (p.status !== 0) { - process.exitCode = p.status || undefined; - } -} - -export function output(cmd: string, args: string[]): string { - const p = spawnSync(cmd, args); - if (p.status !== 0) { - process.exitCode = p.status || undefined; - } - return p.stdout.toString().trim(); -} diff --git a/.github/testing/tsconfig.json b/.github/testing/tsconfig.json deleted file mode 100644 index d1646f0118f7..000000000000 --- a/.github/testing/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./node_modules/gts/tsconfig-google.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "build" - }, - "include": [ - "src/**/*.ts", - "test/**/*.ts" - ] -} diff --git a/.github/workflows/affected.yaml b/.github/workflows/affected.yaml index 94c743baec9b..662009303d08 100644 --- a/.github/workflows/affected.yaml +++ b/.github/workflows/affected.yaml @@ -23,21 +23,14 @@ jobs: affected: name: Finding affected tests runs-on: ubuntu-latest - # outputs: - # python: ${{steps.python.outputs.affected}} - # defaults: - # run: - # working-directory: .github/testing - # steps: - # - uses: actions/checkout@v4 - # with: - # fetch-depth: 0 - # - uses: oven-sh/setup-bun@v2 - # - run: bun install - # - id: python - # run: | - # AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) - # echo "$AFFECTED_PYTHON" - # echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + outputs: + python: ${{steps.python.outputs.affected}} steps: - - run: echo "Success!" + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-go@v5 + with: + go-version: ^1.23.0 + - run: go version + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.1 diff --git a/.github/workflows/python/config.json b/.github/workflows/python/config.json new file mode 100644 index 000000000000..dd5926cd66b1 --- /dev/null +++ b/.github/workflows/python/config.json @@ -0,0 +1,11 @@ +{ + "match": [ + "*/*.py" + ], + "ignore": [ + "README.py" + ], + "package": [ + "noxfile_config.py" + ] +} diff --git a/.github/workflows/python/lint.yaml b/.github/workflows/python/lint.yaml new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/.github/workflows/python/test.yaml b/.github/workflows/python/test.yaml new file mode 100644 index 000000000000..e69de29bb2d1 From 43212113a8445b6f51fefa35c15453c39bb9a2d6 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 13:59:07 -0700 Subject: [PATCH 58/74] revert change --- pytest.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 6fd8b378beb3..22ce71c1b7da 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,5 +2,5 @@ addopts = -v --tb=native -norecursedirs = .git env lib .tox .nox .github +norecursedirs = .git env lib .tox .nox junit_family = xunit2 From f716a7254773903aa1456d8b520dc33af893308b Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 14:19:23 -0700 Subject: [PATCH 59/74] configure python lint with go tooling --- .github/workflows/affected.yaml | 28 ++++++++++++++++++++++++++-- .github/workflows/config/python.json | 5 +++++ .github/workflows/python/config.json | 11 ----------- .github/workflows/python/lint.yaml | 0 .github/workflows/python/test.yaml | 0 5 files changed, 31 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/config/python.json delete mode 100644 .github/workflows/python/config.json delete mode 100644 .github/workflows/python/lint.yaml delete mode 100644 .github/workflows/python/test.yaml diff --git a/.github/workflows/affected.yaml b/.github/workflows/affected.yaml index 662009303d08..2c9752f7803c 100644 --- a/.github/workflows/affected.yaml +++ b/.github/workflows/affected.yaml @@ -24,7 +24,7 @@ jobs: name: Finding affected tests runs-on: ubuntu-latest outputs: - python: ${{steps.python.outputs.affected}} + python: ${{ steps.python.outputs.affected }} steps: - uses: actions/checkout@v4 with: @@ -33,4 +33,28 @@ jobs: with: go-version: ^1.23.0 - run: go version - - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.1 + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.2 + - id: python + run: | + PYTHON=$(affected .github/workflows/python/config.json) + echo "$PYTHON" + echo "affected=$PYTHON" >> "$GITHUB_OUTPUT" + + python-lint: + name: Lint Python + needs: affected + runs-on: ubuntu-latest + strategy: + matrix: + affected: ${{ fromJson(needs.affected.outputs.python) }} + env: + PACKAGE: ${{ toJson(matrix.affected.packages) }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - run: pip install nox + - run: echo "$PACKAGE" + - working-directory: ${{ env.PACKAGE }} + run: nox -s lint diff --git a/.github/workflows/config/python.json b/.github/workflows/config/python.json new file mode 100644 index 000000000000..6868157b20f6 --- /dev/null +++ b/.github/workflows/config/python.json @@ -0,0 +1,5 @@ +{ + "package": [ + "noxfile_config.py" + ] +} diff --git a/.github/workflows/python/config.json b/.github/workflows/python/config.json deleted file mode 100644 index dd5926cd66b1..000000000000 --- a/.github/workflows/python/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "match": [ - "*/*.py" - ], - "ignore": [ - "README.py" - ], - "package": [ - "noxfile_config.py" - ] -} diff --git a/.github/workflows/python/lint.yaml b/.github/workflows/python/lint.yaml deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/.github/workflows/python/test.yaml b/.github/workflows/python/test.yaml deleted file mode 100644 index e69de29bb2d1..000000000000 From d66542007170af2104de3b0eee70ba1346a4f6a5 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 14:20:48 -0700 Subject: [PATCH 60/74] fix config path --- .github/workflows/affected.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/affected.yaml b/.github/workflows/affected.yaml index 2c9752f7803c..1699d6766cc7 100644 --- a/.github/workflows/affected.yaml +++ b/.github/workflows/affected.yaml @@ -36,7 +36,7 @@ jobs: - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.2 - id: python run: | - PYTHON=$(affected .github/workflows/python/config.json) + PYTHON=$(affected .github/workflows/config/python.json) echo "$PYTHON" echo "affected=$PYTHON" >> "$GITHUB_OUTPUT" From d3a4eb89970377185238e9e53bfffa20ca5b89e4 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 14:22:39 -0700 Subject: [PATCH 61/74] simplify workflows --- .github/workflows/affected.yaml | 60 ------------------- .github/workflows/test.yaml | 101 ++++++++++++++------------------ 2 files changed, 43 insertions(+), 118 deletions(-) delete mode 100644 .github/workflows/affected.yaml diff --git a/.github/workflows/affected.yaml b/.github/workflows/affected.yaml deleted file mode 100644 index 1699d6766cc7..000000000000 --- a/.github/workflows/affected.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: PR - -on: - push: - branches: main - pull_request: - -jobs: - affected: - name: Finding affected tests - runs-on: ubuntu-latest - outputs: - python: ${{ steps.python.outputs.affected }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: actions/setup-go@v5 - with: - go-version: ^1.23.0 - - run: go version - - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.2 - - id: python - run: | - PYTHON=$(affected .github/workflows/config/python.json) - echo "$PYTHON" - echo "affected=$PYTHON" >> "$GITHUB_OUTPUT" - - python-lint: - name: Lint Python - needs: affected - runs-on: ubuntu-latest - strategy: - matrix: - affected: ${{ fromJson(needs.affected.outputs.python) }} - env: - PACKAGE: ${{ toJson(matrix.affected.packages) }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - run: pip install nox - - run: echo "$PACKAGE" - - working-directory: ${{ env.PACKAGE }} - run: nox -s lint diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9524e6b0b64f..c58da9499f2a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,71 +12,56 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: 🪿 +name: PR on: - workflow_run: - workflows: ["PR"] - types: ["completed"] + push: + branches: main + pull_request: + +env: + PROJECT: jss-22p1-test + WORKLOAD_IDENTITY_PROVIDER: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python jobs: - test: + affected: + name: Finding affected tests runs-on: ubuntu-latest + outputs: + python: ${{ steps.python.outputs.affected }} steps: - - run: echo "Running tests" - -# on: -# push: -# branches: main -# pull_request: -# workflow_dispatch: # Manual runs - -# env: -# PROJECT: jss-22p1-test -# WORKLOAD_IDENTITY_PROVIDER: projects/886556137211/locations/global/workloadIdentityPools/github-actions/providers/github-actions-python - -# jobs: -# affected: -# name: Finding affected tests -# runs-on: ubuntu-latest -# outputs: -# python: ${{steps.python.outputs.affected}} -# defaults: -# run: -# working-directory: .github/testing -# steps: -# - uses: actions/checkout@v4 -# with: -# fetch-depth: 0 -# - uses: oven-sh/setup-bun@v2 -# - run: bun install -# - id: python -# run: | -# AFFECTED_PYTHON=$(bun run affected python HEAD origin/main) -# echo "$AFFECTED_PYTHON" -# echo "affected=$AFFECTED_PYTHON" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-go@v5 + with: + go-version: ^1.23.0 + - run: go version + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.2 + - id: python + run: | + PYTHON=$(affected .github/workflows/config/python.json) + echo "$PYTHON" + echo "affected=$PYTHON" >> "$GITHUB_OUTPUT" -# python-lint: -# name: Lint Python -# needs: affected -# runs-on: ubuntu-latest -# strategy: -# matrix: -# affected: ${{fromJson(needs.affected.outputs.python)}} -# defaults: -# run: -# working-directory: .github/testing -# steps: -# - uses: actions/checkout@v4 -# - uses: oven-sh/setup-bun@v2 -# - uses: actions/setup-python@v5 -# with: -# python-version: '3.12' -# - run: pip install nox -# - run: bun install -# - run: bun run ci-lint python AFFECTED -# env: -# AFFECTED: ${{toJson(matrix.affected)}} + python-lint: + name: Lint Python + needs: affected + runs-on: ubuntu-latest + strategy: + matrix: + affected: ${{ fromJson(needs.affected.outputs.python) }} + env: + PACKAGE: ${{ toJson(matrix.affected.packages) }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - run: pip install nox + - run: echo "$PACKAGE" + - working-directory: ${{ env.PACKAGE }} + run: nox -s lint # python-test: # name: Test Python From 71b67e0a34373a0046c87329c9fa8417622090a8 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 14:31:56 -0700 Subject: [PATCH 62/74] update affected --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c58da9499f2a..9aa03a1075e4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -37,7 +37,7 @@ jobs: with: go-version: ^1.23.0 - run: go version - - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.2 + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.3 - id: python run: | PYTHON=$(affected .github/workflows/config/python.json) From 4de7589bc1e942557afc2c70b1fdddf4c68467d1 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 14:37:23 -0700 Subject: [PATCH 63/74] debug strategy matrix --- .github/workflows/test.yaml | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9aa03a1075e4..c6055fdea6f1 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -48,20 +48,24 @@ jobs: name: Lint Python needs: affected runs-on: ubuntu-latest - strategy: - matrix: - affected: ${{ fromJson(needs.affected.outputs.python) }} - env: - PACKAGE: ${{ toJson(matrix.affected.packages) }} + # strategy: + # matrix: + # affected: ${{ fromJson(needs.affected.outputs.python) }} + # env: + # PACKAGE: ${{ toJson(matrix.affected.package) }} + # steps: + # - uses: actions/checkout@v4 + # - uses: actions/setup-python@v5 + # with: + # python-version: '3.12' + # - run: pip install nox + # - run: echo "$PACKAGE" + # - working-directory: ${{ env.PACKAGE }} + # run: nox -s lint steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - run: pip install nox - - run: echo "$PACKAGE" - - working-directory: ${{ env.PACKAGE }} - run: nox -s lint + - run: echo "$AFFECTED" + env: + AFFECTED: "${{ needs.affected.outputs.python }}" # python-test: # name: Test Python From f18acd0512598b82140c917374bd4c45c406e4eb Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 14:45:04 -0700 Subject: [PATCH 64/74] add more debugging --- .github/workflows/test.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c6055fdea6f1..cde0a08eaa10 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -28,7 +28,7 @@ jobs: name: Finding affected tests runs-on: ubuntu-latest outputs: - python: ${{ steps.python.outputs.affected }} + python: ${{ steps.python.outputs.AFFECTED }} steps: - uses: actions/checkout@v4 with: @@ -42,7 +42,7 @@ jobs: run: | PYTHON=$(affected .github/workflows/config/python.json) echo "$PYTHON" - echo "affected=$PYTHON" >> "$GITHUB_OUTPUT" + echo "AFFECTED=$PYTHON" >> "$GITHUB_OUTPUT" python-lint: name: Lint Python @@ -63,6 +63,9 @@ jobs: # - working-directory: ${{ env.PACKAGE }} # run: nox -s lint steps: + - run: echo "$OUTPUTS" + env: + OUTPUTS: "${{ needs.affected.outputs }}" - run: echo "$AFFECTED" env: AFFECTED: "${{ needs.affected.outputs.python }}" From e9b7f764a8f7d5f329df43971b76aa38592674ee Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Mon, 9 Sep 2024 14:46:36 -0700 Subject: [PATCH 65/74] add more debugging --- .github/workflows/test.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index cde0a08eaa10..614412ca5deb 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -28,7 +28,7 @@ jobs: name: Finding affected tests runs-on: ubuntu-latest outputs: - python: ${{ steps.python.outputs.AFFECTED }} + python: ${{ steps.python.outputs.jobs }} steps: - uses: actions/checkout@v4 with: @@ -40,9 +40,9 @@ jobs: - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.3 - id: python run: | - PYTHON=$(affected .github/workflows/config/python.json) - echo "$PYTHON" - echo "AFFECTED=$PYTHON" >> "$GITHUB_OUTPUT" + JOBS=$(affected .github/workflows/config/python.json) + echo "$JOBS" + echo "jobs=$JOBS" >> "$GITHUB_OUTPUT" python-lint: name: Lint Python @@ -65,10 +65,10 @@ jobs: steps: - run: echo "$OUTPUTS" env: - OUTPUTS: "${{ needs.affected.outputs }}" - - run: echo "$AFFECTED" + OUTPUTS: ${{ toJson(needs.affected.outputs) }} + - run: echo "$PYTHON" env: - AFFECTED: "${{ needs.affected.outputs.python }}" + PYTHON: ${{ toJson(needs.affected.outputs.python) }} # python-test: # name: Test Python From bb429014f7b41b3646d8653e04f00cbccefdb36e Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 14:14:03 -0700 Subject: [PATCH 66/74] update testing tools --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 614412ca5deb..e094126b5f6e 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -37,11 +37,11 @@ jobs: with: go-version: ^1.23.0 - run: go version - - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.3 + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.4 - id: python run: | JOBS=$(affected .github/workflows/config/python.json) - echo "$JOBS" + echo "jobs=$JOBS" echo "jobs=$JOBS" >> "$GITHUB_OUTPUT" python-lint: From 3a53a68e3a46120a823d19b0920ddb502e11c753 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 14:17:19 -0700 Subject: [PATCH 67/74] run python lint --- .github/workflows/test.yaml | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e094126b5f6e..2cc76a429c27 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -48,27 +48,20 @@ jobs: name: Lint Python needs: affected runs-on: ubuntu-latest - # strategy: - # matrix: - # affected: ${{ fromJson(needs.affected.outputs.python) }} - # env: - # PACKAGE: ${{ toJson(matrix.affected.package) }} - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-python@v5 - # with: - # python-version: '3.12' - # - run: pip install nox - # - run: echo "$PACKAGE" - # - working-directory: ${{ env.PACKAGE }} - # run: nox -s lint + strategy: + matrix: + affected: ${{ fromJson(needs.affected.outputs.python) }} + env: + PACKAGE: ${{ toJson(matrix.affected.package) }} steps: - - run: echo "$OUTPUTS" - env: - OUTPUTS: ${{ toJson(needs.affected.outputs) }} - - run: echo "$PYTHON" - env: - PYTHON: ${{ toJson(needs.affected.outputs.python) }} + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - run: pip install nox + - run: echo "$PACKAGE" + - working-directory: ${{ env.PACKAGE }} + run: nox -s lint # python-test: # name: Test Python From 94c6feb475dff32aff155fb8faf5d50c8daceb3c Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 14:58:38 -0700 Subject: [PATCH 68/74] update testing tools --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2cc76a429c27..e183219a5987 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -37,7 +37,7 @@ jobs: with: go-version: ^1.23.0 - run: go version - - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.4 + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.5 - id: python run: | JOBS=$(affected .github/workflows/config/python.json) From 8f164a976784fdface2d63cc1176e9a82f525875 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 14:59:22 -0700 Subject: [PATCH 69/74] downgrade go version to use cached version --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e183219a5987..63bd7a84029f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,7 +35,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@v5 with: - go-version: ^1.23.0 + go-version: ^1.22.0 - run: go version - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.5 - id: python From 138dee3a68a9a73a976a011c55eb4cdd6e213cbd Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 15:08:51 -0700 Subject: [PATCH 70/74] exclude . for lint --- .github/workflows/test.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 63bd7a84029f..243e972edbf9 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,8 +36,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ^1.22.0 - - run: go version - - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.5 + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.6 - id: python run: | JOBS=$(affected .github/workflows/config/python.json) @@ -51,8 +50,10 @@ jobs: strategy: matrix: affected: ${{ fromJson(needs.affected.outputs.python) }} + exclude: + - package: "." env: - PACKAGE: ${{ toJson(matrix.affected.package) }} + PACKAGE: ${{ matrix.affected.package }} steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 From 77a02dad297babb280215ab58fab9a154eca03f1 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 15:10:18 -0700 Subject: [PATCH 71/74] fix exclude --- .github/workflows/test.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 243e972edbf9..6d474716cc15 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -51,7 +51,8 @@ jobs: matrix: affected: ${{ fromJson(needs.affected.outputs.python) }} exclude: - - package: "." + - affected: + package: "." env: PACKAGE: ${{ matrix.affected.package }} steps: From a7b2add2c6906a59503de58e68f05c70094b8fba Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 15:13:10 -0700 Subject: [PATCH 72/74] fix lint commands --- .github/workflows/test.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 6d474716cc15..9a81bc9b4a94 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -61,9 +61,10 @@ jobs: with: python-version: '3.12' - run: pip install nox - - run: echo "$PACKAGE" - - working-directory: ${{ env.PACKAGE }} - run: nox -s lint + - run: | + cp noxfile-template.py ${{ env.PACKAGE }}/noxfile.py + cd ${{ env.PACKAGE }} + nox -s lint # python-test: # name: Test Python From aa44a62e361138565854652dead8d675b0216938 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 15:20:28 -0700 Subject: [PATCH 73/74] use package names only --- .github/workflows/test.yaml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9a81bc9b4a94..1603a8b33b32 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,7 +36,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ^1.22.0 - - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.6 + - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.7 - id: python run: | JOBS=$(affected .github/workflows/config/python.json) @@ -49,12 +49,9 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - affected: ${{ fromJson(needs.affected.outputs.python) }} + package: ${{ fromJson(needs.affected.outputs.python) }} exclude: - - affected: - package: "." - env: - PACKAGE: ${{ matrix.affected.package }} + - package: "." steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 @@ -62,8 +59,8 @@ jobs: python-version: '3.12' - run: pip install nox - run: | - cp noxfile-template.py ${{ env.PACKAGE }}/noxfile.py - cd ${{ env.PACKAGE }} + cp noxfile-template.py ${{ matrix.package }}/noxfile.py + cd ${{ matrix.package }} nox -s lint # python-test: From e05749f70117e450ed31082f535f2e4180549587 Mon Sep 17 00:00:00 2001 From: David Cavazos Date: Tue, 10 Sep 2024 15:21:23 -0700 Subject: [PATCH 74/74] rename jobs to packages --- .github/workflows/test.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1603a8b33b32..c6ba45e7c832 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -28,7 +28,7 @@ jobs: name: Finding affected tests runs-on: ubuntu-latest outputs: - python: ${{ steps.python.outputs.jobs }} + python: ${{ steps.python.outputs.packages }} steps: - uses: actions/checkout@v4 with: @@ -39,9 +39,9 @@ jobs: - run: go install github.com/davidcavazos/testing-infra/cmd/affected@v0.0.7 - id: python run: | - JOBS=$(affected .github/workflows/config/python.json) - echo "jobs=$JOBS" - echo "jobs=$JOBS" >> "$GITHUB_OUTPUT" + PACKAGES=$(affected .github/workflows/config/python.json) + echo "packages=$PACKAGES" + echo "packages=$PACKAGES " >> "$GITHUB_OUTPUT" python-lint: name: Lint Python