From 7f34462b620ca1b81a1e31457febb5fd38ff3c0a Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 15 Sep 2025 15:11:50 +0530 Subject: [PATCH 01/53] feat: update packages to eslint v9 Signed-off-by: gokulprasanth-ni --- package-lock.json | 3490 ++++++++++------- package.json | 2 +- packages/eslint-config-angular/.eslintrc.js | 3 - .../eslint-config-angular/eslint.config.js | 13 + packages/eslint-config-angular/index.js | 277 +- packages/eslint-config-angular/package.json | 83 +- .../requiring-type-checking.js | 39 +- packages/eslint-config-angular/template.js | 219 +- .../eslint-config-angular/template/options.js | 8 +- .../tools/print-available-rules.js | 42 +- .../eslint-config-javascript/.eslintrc.js | 3 - .../eslint-config-javascript/eslint.config.js | 13 + packages/eslint-config-javascript/index.js | 50 +- .../eslint-config-javascript/package.json | 7 +- .../rules/best-practices.js | 2 +- .../eslint-config-javascript/rules/errors.js | 2 +- .../eslint-config-javascript/rules/es6.js | 14 +- .../eslint-config-javascript/rules/imports.js | 14 +- .../eslint-config-javascript/rules/node.js | 6 +- .../eslint-config-javascript/rules/strict.js | 2 +- .../eslint-config-javascript/rules/style.js | 2 +- .../rules/variables.js | 2 +- .../eslint-config-playwright/.eslintrc.js | 3 - .../eslint-config-playwright/eslint.config.js | 12 + packages/eslint-config-playwright/index.js | 145 +- .../eslint-config-playwright/package.json | 75 +- .../requiring-type-checking.js | 9 +- .../tools/print-available-rules.js | 11 +- .../eslint-config-typescript/.eslintrc.js | 3 - .../eslint-config-typescript/eslint.config.js | 14 + packages/eslint-config-typescript/index.js | 449 +-- .../lib/extensions-requiring-type-checking.js | 2 +- .../lib/extensions.js | 2 +- .../eslint-config-typescript/package.json | 78 +- .../requiring-type-checking.js | 361 +- tests/angular/.eslintrc.js | 21 - .../custom-ignore-attributes/.eslintrc.js | 21 - tests/angular/eslint.config.js | 59 + tests/angular/package.json | 1 + tests/javascript/.eslintrc.js | 4 - tests/javascript/eslint.config.js | 11 + tests/javascript/package.json | 1 + .../.eslintrc.js | 25 - .../eslint.config.js | 33 + .../package.json | 1 + tests/playwright/.eslintrc.js | 15 - tests/playwright/eslint.config.js | 18 + tests/playwright/package.json | 1 + tests/print-evaluated-rules/.eslintrc.js | 4 - tests/print-evaluated-rules/eslint.config.js | 12 + tests/print-evaluated-rules/index.js | 123 +- tests/print-evaluated-rules/package.json | 3 +- .../.eslintrc.js | 14 - .../eslint.config.js | 23 + .../package.json | 1 + tests/typescript/.eslintrc.js | 4 - tests/typescript/eslint.config.js | 16 + tests/typescript/package.json | 1 + 58 files changed, 3251 insertions(+), 2618 deletions(-) delete mode 100644 packages/eslint-config-angular/.eslintrc.js create mode 100644 packages/eslint-config-angular/eslint.config.js delete mode 100644 packages/eslint-config-javascript/.eslintrc.js create mode 100644 packages/eslint-config-javascript/eslint.config.js delete mode 100644 packages/eslint-config-playwright/.eslintrc.js create mode 100644 packages/eslint-config-playwright/eslint.config.js delete mode 100644 packages/eslint-config-typescript/.eslintrc.js create mode 100644 packages/eslint-config-typescript/eslint.config.js delete mode 100644 tests/angular/.eslintrc.js delete mode 100644 tests/angular/custom-ignore-attributes/.eslintrc.js create mode 100644 tests/angular/eslint.config.js delete mode 100644 tests/javascript/.eslintrc.js create mode 100644 tests/javascript/eslint.config.js delete mode 100644 tests/playwright-requiring-type-checking/.eslintrc.js create mode 100644 tests/playwright-requiring-type-checking/eslint.config.js delete mode 100644 tests/playwright/.eslintrc.js create mode 100644 tests/playwright/eslint.config.js delete mode 100644 tests/print-evaluated-rules/.eslintrc.js create mode 100644 tests/print-evaluated-rules/eslint.config.js delete mode 100644 tests/typescript-requiring-type-checking/.eslintrc.js create mode 100644 tests/typescript-requiring-type-checking/eslint.config.js delete mode 100644 tests/typescript/.eslintrc.js create mode 100644 tests/typescript/eslint.config.js diff --git a/package-lock.json b/package-lock.json index f85a7bc4..94899be1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,26 +25,17 @@ "beachball": "^2.41.0" }, "peerDependencies": { - "typescript": "~4.8.2" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "peer": true, - "engines": { - "node": ">=0.10.0" + "typescript": "^5.0.0" } }, "node_modules/@angular-devkit/architect": { - "version": "0.1802.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.12.tgz", - "integrity": "sha512-bepVb2/GtJppYKaeW8yTGE6egmoWZ7zagFDsmBdbF+BYp+HmeoPsclARcdryBPVq68zedyTRdvhWSUTbw1AYuw==", + "version": "0.1902.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.16.tgz", + "integrity": "sha512-E5cM4D5nHmCpuQkvyYJjJ/GEfygfU5NoN1YAWRnIMLwTyC9s6ms13L/FuCfr7HqGPY8NjkOWG2517Xda03+jAw==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/core": "18.2.12", + "@angular-devkit/core": "19.2.16", "rxjs": "7.8.1" }, "engines": { @@ -53,10 +44,20 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/core": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.12.tgz", - "integrity": "sha512-NtB6ypsaDyPE6/fqWOdfTmACs+yK5RqfH5tStEzWFeeDsIEDYKsJ06ypuRep7qTjYus5Rmttk0Ds+cFgz8JdUQ==", + "version": "19.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.16.tgz", + "integrity": "sha512-3MHfTTUMT/nSXLdhoilQATCY38XcnoJd7u7K0tLajTT7C+iNknvkzaV4g5qMA+E3yNzefcAkY7MZpgreNJuKEg==", "license": "MIT", "peer": true, "dependencies": { @@ -73,7 +74,7 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -94,16 +95,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/schematics": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.12.tgz", - "integrity": "sha512-mMea9txHbnCX5lXLHlo0RAgfhFHDio45/jMsREM2PA8UtVf2S8ltXz7ZwUrUyMQRv8vaSfn4ijDstF4hDMnRgQ==", + "version": "19.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.16.tgz", + "integrity": "sha512-YO1J8H9zzb/EfKzoZFs+YU7JRYNaZVjp/H/EBSpyI8zvpSjNZzi7+P6K+/uNQyH1RQyZ9NFn8+eHygsG47qA8w==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/core": "18.2.12", + "@angular-devkit/core": "19.2.16", "jsonc-parser": "3.3.1", - "magic-string": "0.30.11", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -113,15 +124,25 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-eslint/builder": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.4.3.tgz", - "integrity": "sha512-NzmrXlr7GFE+cjwipY/CxBscZXNqnuK0us1mO6Z2T6MeH6m+rRcdlY/rZyKoRniyNNvuzl6vpEsfMIMmnfebrA==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.8.1.tgz", + "integrity": "sha512-NOMkw0xgDoDVCLkL5nkkvdd3ouDYkOGqtEmabTR7N4/kQnk1R4coOTWGCqAgMXCFdxlyjuxquDwuJ+yni81pRg==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/architect": ">= 0.1800.0 < 0.1900.0", - "@angular-devkit/core": ">= 18.0.0 < 19.0.0" + "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", + "@angular-devkit/core": ">= 19.0.0 < 20.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", @@ -152,32 +173,40 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.4.3.tgz", - "integrity": "sha512-ijGlX2N01ayMXTpeQivOA31AszO8OEbu9ZQUCxnu9AyMMhxyi2q50bujRChAvN9YXQfdQtbxuajxV6+aiWb5BQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.8.1.tgz", + "integrity": "sha512-0ZVQldndLrDfB0tzFe/uIwvkUcakw8qGxvkEU0l7kSbv/ngNQ/qrkRi7P64otB15inIDUNZI2jtmVat52dqSfQ==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3", + "@angular-eslint/bundled-angular-compiler": "19.8.1", + "@angular-eslint/utils": "19.8.1", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { + "@angular-eslint/template-parser": "19.8.1", "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", + "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", + "license": "MIT", + "peer": true + }, "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", + "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" + "@angular-eslint/bundled-angular-compiler": "19.8.1" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -185,14 +214,38 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", + "node_modules/@angular-eslint/schematics": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.8.1.tgz", + "integrity": "sha512-MKzfO3puOCuQFgP8XDUkEr5eaqcCQLAdYLLMcywEO/iRs1eRHL46+rkW+SjDp1cUqlxKtu+rLiTYr0T/O4fi9Q==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" + "@angular-devkit/core": ">= 19.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", + "@angular-eslint/eslint-plugin": "19.8.1", + "@angular-eslint/eslint-plugin-template": "19.8.1", + "ignore": "7.0.5", + "semver": "7.7.2", + "strip-json-comments": "3.1.1" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", + "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", + "license": "MIT", + "peer": true + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz", + "integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.8.1", + "@angular-eslint/utils": "19.8.1" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -200,26 +253,25 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/schematics": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.4.3.tgz", - "integrity": "sha512-D5maKn5e6n58+8n7jLFLD4g+RGPOPeDSsvPc1sqial5tEKLxAJQJS9WZ28oef3bhkob6C60D+1H0mMmEEVvyVA==", + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/utils": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", + "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/core": ">= 18.0.0 < 19.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "ignore": "6.0.2", - "semver": "7.6.3", - "strip-json-comments": "3.1.1" + "@angular-eslint/bundled-angular-compiler": "19.8.1" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, "node_modules/@angular-eslint/schematics/node_modules/ignore": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", - "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", "peer": true, "engines": { @@ -227,13 +279,13 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.4.3.tgz", - "integrity": "sha512-JZMPtEB8yNip3kg4WDEWQyObSo2Hwf+opq2ElYuwe85GQkGhfJSJ2CQYo4FSwd+c5MUQAqESNRg9QqGYauDsiw==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.8.1.tgz", + "integrity": "sha512-pQiOg+se1AU/ncMlnJ9V6xYnMQ84qI1BGWuJpbU6A99VTXJg90scg0+T7DWmKssR1YjP5qmmBtrZfKsHEcLW/A==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", + "@angular-eslint/bundled-angular-compiler": "19.8.1", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -241,27 +293,32 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "license": "BSD-2-Clause", + "node_modules/@angular-eslint/template-parser/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", + "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", + "license": "MIT", + "peer": true + }, + "node_modules/@angular-eslint/utils": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", + "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", + "license": "MIT", "peer": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@angular-eslint/bundled-angular-compiler": "18.4.3" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, "node_modules/@angular/core": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.13.tgz", - "integrity": "sha512-8mbWHMgO95OuFV1Ejy4oKmbe9NOJ3WazQf/f7wks8Bck7pcihd0IKhlPBNjFllbF5o+04EYSwFhEtvEgjMDClA==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.14.tgz", + "integrity": "sha512-BIPrCs93ZZTY9ym7yfoTgAQ5rs706yoYeAdrgc8kh/bDbM9DawxKlgeKBx2FLt09Y0YQ1bFhKVp0cV4gDEaMxQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -275,37 +332,26 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -329,25 +375,78 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/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==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "license": "MIT", "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -355,7 +454,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -365,6 +464,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -381,35 +481,75 @@ "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==", + "license": "MIT", "peer": true }, "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==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "license": "MIT", "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "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==", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "license": "Apache-2.0", "peer": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, "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==", + "license": "Apache-2.0", "peer": true, "engines": { "node": ">=12.22" @@ -419,16 +559,24 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "peer": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT", "peer": true }, @@ -480,6 +628,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -492,6 +641,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -500,6 +650,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -509,74 +660,112 @@ } }, "node_modules/@playwright/test": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", - "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", + "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright": "1.42.1" + "playwright": "1.55.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT", + "peer": true + }, "node_modules/@stylistic/eslint-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.1.0.tgz", - "integrity": "sha512-pA6VOrOqk0+S8toJYhQGv2MWpQQR0QpeUo9AhNkC49Y26nxBQ/nH1rta9bUU1rPw2fJ1zZEMV5oCX5AazT7J2g==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/utils": "^8.13.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.41.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "estraverse": "^5.3.0", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=8.40.0" + "eslint": ">=9.0.0" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz", - "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==", + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/jasmine": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.9.tgz", + "integrity": "sha512-8t4HtkW4wxiPVedMpeZ63n3vlWxEIquo/zc1Tm8ElU+SqVV7+D3Na2PWaJUp179AzTragMWVwkMv7mvty0NfyQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/parse-path": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", + "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz", - "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz", + "integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/project-service": "8.43.0", - "@typescript-eslint/tsconfig-utils": "8.43.0", - "@typescript-eslint/types": "8.43.0", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/type-utils": "8.43.0", + "@typescript-eslint/utils": "8.43.0", "@typescript-eslint/visitor-keys": "8.43.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "engines": { @@ -587,20 +776,33 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "@typescript-eslint/parser": "^8.43.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": { + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz", - "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.43.0.tgz", + "integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==", "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.43.0", "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0" + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", + "debug": "^4.3.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -614,198 +816,7 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz", - "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.43.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/@types/jasmine": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.4.tgz", - "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "peer": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/project-service": { + "node_modules/@typescript-eslint/project-service": { "version": "8.43.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.43.0.tgz", "integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==", @@ -828,31 +839,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz", + "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -877,31 +874,28 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz", + "integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/utils": "8.43.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { @@ -919,52 +913,38 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "license": "BSD-2-Clause", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz", + "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==", + "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/project-service": "8.43.0", + "@typescript-eslint/tsconfig-utils": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "peer": true, "dependencies": { @@ -988,85 +968,53 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz", + "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==", "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz", + "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "@typescript-eslint/types": "8.43.0", + "eslint-visitor-keys": "^4.2.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "license": "MIT", - "peer": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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==", - "peer": true - }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/acorn": { "version": "8.15.0", @@ -1085,6 +1033,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -1125,30 +1074,96 @@ } } }, + "node_modules/angular-eslint": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-19.8.1.tgz", + "integrity": "sha512-A6mPcVAXEDdJk7bKKBwd+1b/VA/xwpWWN2fExTGO1dkVNPz550LlgxBjEio9G7u4i+pD2aLrl6Cx6O+9o1iusQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@angular-devkit/core": ">= 19.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", + "@angular-eslint/builder": "19.8.1", + "@angular-eslint/eslint-plugin": "19.8.1", + "@angular-eslint/eslint-plugin-template": "19.8.1", + "@angular-eslint/schematics": "19.8.1", + "@angular-eslint/template-parser": "19.8.1", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" + } + }, + "node_modules/angular-eslint/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", + "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", + "license": "MIT", + "peer": true + }, + "node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz", + "integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.8.1", + "@angular-eslint/utils": "19.8.1" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/angular-eslint/node_modules/@angular-eslint/utils": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", + "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.8.1" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, "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==", + "license": "MIT", "engines": { "node": ">=8" } }, "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, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "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==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", @@ -1161,13 +1176,14 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -1177,16 +1193,20 @@ } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1199,40 +1219,26 @@ "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, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", - "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1242,15 +1248,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1260,15 +1267,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1278,19 +1286,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -1299,10 +1307,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -1327,7 +1346,8 @@ "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==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -1351,22 +1371,23 @@ "peer": true }, "node_modules/beachball": { - "version": "2.41.0", - "resolved": "https://registry.npmjs.org/beachball/-/beachball-2.41.0.tgz", - "integrity": "sha512-hp6BBAiA2UYmm9E+JWwopMK+2njAeV3r6uJR91ICi7jYnjD+DFKxJjrcaW0pb4SOikMdQITw/GfjsMUs07oJqg==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/beachball/-/beachball-2.55.1.tgz", + "integrity": "sha512-JtZnFkr0CX68/qPsRJX6viIbkjEGbIbWjaY8TnDgk3VYuh8mpl7wEOM9Kw6Hz5Bk/tI4CbGTWvSN/n6VHM3r9A==", "dev": true, + "license": "MIT", "dependencies": { - "cosmiconfig": "^8.3.6", + "cosmiconfig": "^9.0.0", "execa": "^5.0.0", "fs-extra": "^11.1.1", "lodash": "^4.17.15", "minimatch": "^3.0.4", + "p-graph": "^1.1.2", "p-limit": "^3.0.2", "prompts": "^2.4.2", "semver": "^7.0.0", "toposort": "^2.0.2", - "uuid": "^9.0.0", - "workspace-tools": "^0.36.3", + "workspace-tools": "^0.38.2", "yargs-parser": "^21.0.0" }, "bin": { @@ -1376,47 +1397,6 @@ "node": ">=14.0.0" } }, - "node_modules/beachball/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/beachball/node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -1430,20 +1410,22 @@ } }, "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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1475,16 +1457,47 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", "peer": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -1497,22 +1510,26 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "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, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/cli-cursor": { @@ -1545,6 +1562,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1565,29 +1583,61 @@ } }, "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, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "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 + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": 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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1597,13 +1647,68 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "peer": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1618,6 +1723,7 @@ "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==", + "license": "MIT", "peer": true }, "node_modules/defaults": { @@ -1637,6 +1743,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "peer": true, "dependencies": { "es-define-property": "^1.0.0", @@ -1654,6 +1761,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "peer": true, "dependencies": { "define-data-property": "^1.0.1", @@ -1671,6 +1779,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1679,78 +1789,120 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", "peer": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, "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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, "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, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", "peer": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -1759,20 +1911,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "peer": true - }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "peer": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -1781,43 +1925,64 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "peer": true, "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", "peer": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", "peer": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -1827,81 +1992,93 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, "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, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=0.8.0" + "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==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "license": "MIT", "peer": 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", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.35.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "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", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "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" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", "peer": true, "dependencies": { "debug": "^3.2.7", @@ -1913,15 +2090,17 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "license": "MIT", "peer": true, "dependencies": { "debug": "^3.2.7" @@ -1939,80 +2118,78 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "license": "MIT", "peer": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-playwright": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.12.0.tgz", - "integrity": "sha512-KXuzQjVzca5irMT/7rvzJKsVDGbQr43oQPc8i+SLEBqmfrTxlwMwRqfv9vtZqh4hpU0jmrnA/EOfwtls+5QC1w==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.18.0.tgz", + "integrity": "sha512-VLvKOAaDvRTonUeI3J8plXIJQuReXjbjrgDGoNwsiydwdqk3lt+mbzgsBcxJscMJDHc9XgnLVo0nWTiaYHLGYQ==", + "license": "MIT", "peer": true, + "dependencies": { + "globals": "^13.23.0" + }, "peerDependencies": { "eslint": ">=7", - "eslint-plugin-jest": ">=24" + "eslint-plugin-jest": ">=25" }, "peerDependenciesMeta": { "eslint-plugin-jest": { @@ -2020,29 +2197,47 @@ } } }, + "node_modules/eslint-plugin-playwright/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2052,6 +2247,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2064,71 +2260,11 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/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==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": 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/eslint/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==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/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==", - "peer": true - }, - "node_modules/eslint/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==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/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==", + "license": "ISC", "peer": true, "dependencies": { "is-glob": "^4.0.3" @@ -2137,54 +2273,36 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/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==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/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==", + "license": "MIT", "peer": true }, - "node_modules/eslint/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==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "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==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "estraverse": "^5.1.0" @@ -2197,6 +2315,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "estraverse": "^5.2.0" @@ -2209,6 +2328,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=4.0" @@ -2218,6 +2338,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=0.10.0" @@ -2228,6 +2349,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -2250,18 +2372,20 @@ "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==", + "license": "MIT", "peer": 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==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "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" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -2271,18 +2395,20 @@ "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==", + "license": "MIT", "peer": 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==", + "license": "MIT", "peer": true }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -2297,29 +2423,32 @@ "peer": true }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "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==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "license": "MIT", "peer": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2331,6 +2460,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "peer": true, "dependencies": { "locate-path": "^6.0.0", @@ -2344,39 +2474,48 @@ } }, "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==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "license": "MIT", "peer": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC", "peer": true }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "peer": true, "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2386,18 +2525,13 @@ "node": ">=14.14" } }, - "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==", - "peer": true - }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2410,21 +2544,25 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -2437,6 +2575,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2446,21 +2585,28 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "peer": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2469,11 +2615,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "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, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2482,14 +2643,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -2499,28 +2661,31 @@ } }, "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", + "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", "dev": true, + "license": "MIT", "dependencies": { "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "parse-url": "^9.2.0" } }, "node_modules/git-url-parse": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.1.tgz", - "integrity": "sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", + "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", "dev": true, + "license": "MIT", "dependencies": { - "git-up": "^7.0.0" + "git-up": "^8.1.0" } }, "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==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2529,27 +2694,27 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "license": "MIT", "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", "peer": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2562,6 +2727,8 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2578,12 +2745,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "peer": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2593,36 +2761,44 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT", "peer": true }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", "peer": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "peer": true, "dependencies": { "es-define-property": "^1.0.0" @@ -2632,10 +2808,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", "peer": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2644,9 +2824,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -2659,6 +2840,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "peer": true, "dependencies": { "has-symbols": "^1.0.3" @@ -2671,9 +2853,10 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "peer": true, "dependencies": { "function-bind": "^1.1.2" @@ -2687,6 +2870,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -2713,17 +2897,19 @@ "peer": true }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2739,49 +2925,44 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.8.19" } }, - "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==", - "peer": 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==", + "license": "ISC", "peer": true }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", "peer": true, "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -2794,28 +2975,54 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", "peer": true, "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2828,6 +3035,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -2837,24 +3045,48 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "peer": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", "peer": true, "dependencies": { - "hasown": "^2.0.0" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2867,22 +3099,60 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2900,10 +3170,24 @@ "node": ">=8" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -2916,17 +3200,20 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2935,24 +3222,31 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -2961,12 +3255,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -2976,10 +3271,11 @@ } }, "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", "dev": true, + "license": "MIT", "dependencies": { "protocols": "^2.0.1" } @@ -2989,6 +3285,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2997,12 +3294,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3012,12 +3311,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", "peer": true, "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3027,12 +3329,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", "peer": true, "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -3054,13 +3357,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3070,29 +3407,34 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT", "peer": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3104,13 +3446,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT", "peer": 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 + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -3123,12 +3467,14 @@ "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==", + "license": "MIT", "peer": true }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.0" @@ -3145,10 +3491,11 @@ "peer": true }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -3160,6 +3507,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", "peer": true, "dependencies": { "json-buffer": "3.0.1" @@ -3170,6 +3518,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3178,6 +3527,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "^1.2.1", @@ -3191,12 +3541,14 @@ "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 + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "peer": true, "dependencies": { "p-locate": "^5.0.0" @@ -3212,12 +3564,14 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "peer": true }, "node_modules/log-symbols": { @@ -3227,122 +3581,59 @@ "license": "MIT", "peer": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/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==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/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==", - "license": "MIT", - "peer": true - }, - "node_modules/log-symbols/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/log-symbols/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==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "node": ">= 0.4" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -3353,6 +3644,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3361,6 +3653,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3372,21 +3665,24 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT", "peer": 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==", + "license": "MIT", "peer": true }, "node_modules/npm-run-path": { @@ -3394,6 +3690,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -3402,10 +3699,14 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "peer": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3414,20 +3715,24 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -3438,14 +3743,16 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3455,27 +3762,31 @@ } }, "node_modules/object.groupby": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", - "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", "peer": true, "dependencies": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3484,19 +3795,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "peer": 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==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -3508,17 +3811,18 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", "peer": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -3548,86 +3852,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "license": "MIT", "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/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==", - "license": "MIT", - "peer": true - }, - "node_modules/ora/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ora/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/p-graph": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-graph/-/p-graph-1.2.0.tgz", + "integrity": "sha512-tJcm42n9DPoTKtt/m2/KAoSSVuFrxV+p32A+58mtt8ta7sjcUBcOTS7AIPpz2miqEpVNuDYjPzs+3lM/hJWAQQ==", + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3642,6 +3896,7 @@ "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==", + "license": "MIT", "peer": true, "dependencies": { "p-limit": "^3.0.2" @@ -3657,6 +3912,7 @@ "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==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3669,6 +3925,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -3683,45 +3940,44 @@ } }, "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", "dev": true, + "license": "MIT", "dependencies": { "protocols": "^2.0.0" } }, "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", + "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", "dev": true, + "license": "MIT", "dependencies": { + "@types/parse-path": "^7.0.0", "parse-path": "^7.0.0" + }, + "engines": { + "node": ">=14.13.0" } }, "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==", + "license": "MIT", "peer": 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==", - "peer": 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==", + "license": "MIT", "engines": { "node": ">=8" } @@ -3730,20 +3986,31 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT", "peer": 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, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -3752,39 +4019,42 @@ } }, "node_modules/playwright": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", - "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", + "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.42.1" + "playwright-core": "1.55.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", - "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", + "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -3794,6 +4064,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8.0" @@ -3804,6 +4075,7 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -3813,15 +4085,17 @@ } }, "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -3844,7 +4118,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/readable-stream": { "version": "3.6.2", @@ -3861,16 +4136,42 @@ "node": ">= 6" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -3883,6 +4184,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3898,18 +4200,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", "peer": true, "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3918,6 +4224,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -3937,49 +4244,15 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "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==", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "peer": 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/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3998,28 +4271,32 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -4050,15 +4327,33 @@ "license": "MIT", "peer": true }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -4068,9 +4363,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4080,17 +4375,18 @@ } }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "peer": true, "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4100,6 +4396,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", "peer": true, "dependencies": { "define-data-property": "^1.1.4", @@ -4111,10 +4408,26 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "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==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4126,20 +4439,79 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4151,18 +4523,22 @@ "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==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4177,6 +4553,20 @@ "node": ">= 8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4191,6 +4581,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4201,14 +4592,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4218,28 +4614,37 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4249,6 +4654,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4260,6 +4666,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -4270,6 +4677,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4278,6 +4686,7 @@ "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==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -4287,21 +4696,23 @@ } }, "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, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "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==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -4310,16 +4721,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "peer": true - }, "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==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4331,25 +4737,27 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "license": "MIT", "peer": true, "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", "peer": true, "dependencies": { "@types/json5": "^0.0.29", @@ -4359,14 +4767,16 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "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==", + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "^1.2.1" @@ -4379,6 +4789,7 @@ "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==", + "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { "node": ">=10" @@ -4388,30 +4799,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -4421,17 +4834,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -4441,17 +4856,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -4461,28 +4877,57 @@ } }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "license": "Apache-2.0", "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.43.0.tgz", + "integrity": "sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.43.0", + "@typescript-eslint/parser": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/utils": "8.43.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4493,6 +4938,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -4501,6 +4947,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "punycode": "^2.1.0" @@ -4513,19 +4960,6 @@ "license": "MIT", "peer": true }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -4540,6 +4974,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4551,32 +4986,86 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", "peer": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", "peer": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4585,15 +5074,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/workspace-tools": { - "version": "0.36.4", - "resolved": "https://registry.npmjs.org/workspace-tools/-/workspace-tools-0.36.4.tgz", - "integrity": "sha512-v0UFVvw9BjHtRu2Dau5PEJKkuG8u4jPlpXZQWjSz9XgbSutpPURqtO2P0hp3cVmQVATh8lkMFCewFgJuDnyC/w==", + "version": "0.38.4", + "resolved": "https://registry.npmjs.org/workspace-tools/-/workspace-tools-0.38.4.tgz", + "integrity": "sha512-wCei5WNlhHswuU5tPjTYy4yVd7jnavtRUNbqpiHAmWRPOJtkvUpBQZExrrgFs3h9jdx6Qf6inCDSwjqnXhf+vQ==", "dev": true, + "license": "MIT", "dependencies": { "@yarnpkg/lockfile": "^1.1.0", "fast-glob": "^3.3.1", - "git-url-parse": "^13.0.0", + "git-url-parse": "^16.0.0", "globby": "^11.0.0", "jju": "^1.4.0", "js-yaml": "^4.1.0", @@ -4604,6 +5104,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4616,46 +5117,11 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/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==" - }, - "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==", - "peer": true - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -4664,6 +5130,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4681,6 +5148,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -4689,6 +5157,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4708,12 +5177,8 @@ "version": "9.0.7", "license": "MIT", "peerDependencies": { - "@angular-eslint/builder": "^18.4.3", - "@angular-eslint/eslint-plugin": "^18.4.3", - "@angular-eslint/eslint-plugin-template": "^18.4.3", - "@angular-eslint/schematics": "^18.4.3", - "@angular-eslint/template-parser": "^18.4.3", - "@ni/eslint-config-typescript": "^4.4.4" + "@ni/eslint-config-typescript": "^4.4.4", + "angular-eslint": "^19.0.0" } }, "packages/eslint-config-javascript": { @@ -4721,9 +5186,9 @@ "version": "4.4.0", "license": "MIT", "peerDependencies": { - "@stylistic/eslint-plugin": "^3.0.0", - "eslint": "^8.57.0", - "eslint-plugin-import": "^2.29.1" + "@stylistic/eslint-plugin": "^5.0.0", + "eslint": "^9.0.0", + "eslint-plugin-import": "^2.31.1" } }, "packages/eslint-config-playwright": { @@ -4732,7 +5197,7 @@ "license": "MIT", "peerDependencies": { "@ni/eslint-config-typescript": "^4.4.4", - "eslint-plugin-playwright": "^0.12.0" + "eslint-plugin-playwright": "^0.18.0" } }, "packages/eslint-config-typescript": { @@ -4741,8 +5206,7 @@ "license": "MIT", "peerDependencies": { "@ni/eslint-config-javascript": "^4.4.0", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0" + "typescript-eslint": "^8.0.0" } }, "tests/angular": { @@ -4798,7 +5262,7 @@ "@ni/javascript-test": "*", "@ni/typescript-requiring-type-checking-test": "*", "@ni/typescript-test": "*", - "eslint": "^8.57.0" + "eslint": "^9.0.0" } }, "tests/typescript": { diff --git a/package.json b/package.json index cd039f4e..a32b14aa 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,6 @@ "beachball": "^2.41.0" }, "peerDependencies": { - "typescript": "~4.8.2" + "typescript": "^5.0.0" } } \ No newline at end of file diff --git a/packages/eslint-config-angular/.eslintrc.js b/packages/eslint-config-angular/.eslintrc.js deleted file mode 100644 index b61604d7..00000000 --- a/packages/eslint-config-angular/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-javascript' -}; diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js new file mode 100644 index 00000000..68b70b75 --- /dev/null +++ b/packages/eslint-config-angular/eslint.config.js @@ -0,0 +1,13 @@ +import javascript from '@ni/eslint-config-javascript'; + +export default [ + ...javascript, + { + files: ['**/*.js'], + rules: { + 'import/no-default-export': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-unresolved': 'off', + }, + }, +]; \ No newline at end of file diff --git a/packages/eslint-config-angular/index.js b/packages/eslint-config-angular/index.js index d74c6846..ad34f3ce 100644 --- a/packages/eslint-config-angular/index.js +++ b/packages/eslint-config-angular/index.js @@ -1,139 +1,140 @@ -module.exports = { - extends: [ - 'plugin:@angular-eslint/recommended', - 'plugin:@angular-eslint/template/process-inline-templates', - '@ni/eslint-config-typescript' - ], - rules: { - /* - Overrides to Angular recommended rules: - https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.json - */ - - '@angular-eslint/no-host-metadata-property': 'error', - - /* - '@angular-eslint/no-input-rename' rule notes: - Disallow renaming directive inputs generally. Use an inline comment to disable the rule for exceptions where the - context changes significantly, or disable the rule for files of directives that need to prefix their inputs to avoid conflicts. - */ - - /* - '@angular-eslint/no-output-rename' rule notes: - Disallow renaming directive outputs generally. Use an inline comment to disable the rule for exceptions where the - context changes significantly, or disable the rule for projects that use the dollar sign postfix for EventEmitters. - */ - - /* - Upgrade the recommended rule configuration from a warning to an error. - */ - '@angular-eslint/use-lifecycle-interface': 'error', - - // We intended to use the default from @typescript-eslint/recommended, but we adopted this override accidentally. - // See https://github.com/ni/javascript-styleguide/issues/139 - '@typescript-eslint/no-inferrable-types': [ - 'error', - { ignoreParameters: true } - ], - - /* - Overrides to Angular rules outside of the recommended configuration: - */ - - /* - Extract templates and styles into a separate files. In rare cases, allow for inline templates of a few - elements with attributes and three minimal CSS declarations. - */ - '@angular-eslint/component-max-inline-declarations': ['error', { animations: 15, styles: 15, template: 15 }], - - /* [application-prefix] */ - '@angular-eslint/component-selector': 'off', - - '@angular-eslint/contextual-decorator': 'error', - - /* - Do not require a directive to select an element or attribute exclusively, because there are valid use cases - for both. - */ - '@angular-eslint/directive-selector': 'off', - - '@angular-eslint/no-attribute-decorator': 'error', - - /* - `forwardRef` is needed for certain Dependency Injection use cases and abuse is not widespread so its use is permitted. - */ - '@angular-eslint/no-forward-ref': 'off', - - /* - We don't yet have a general naming conventions so enforcing a convention just for inputs would be inconsistent. - */ - '@angular-eslint/no-input-prefix': 'off', - - '@angular-eslint/no-lifecycle-call': 'error', - - '@angular-eslint/no-pipe-impure': 'error', - - '@angular-eslint/no-queries-metadata-property': 'error', - - /* [application-prefix] */ - '@angular-eslint/pipe-prefix': 'error', - - /* - This rule is for specific applications such as libraries that want to minimize global dependencies or parts - of an application that have specific performance goals. - */ - '@angular-eslint/prefer-on-push-component-change-detection': 'off', - - /* - While marking @Output properties as readonly does better capture the intention of how they should generally be used, - it does not appear that there is wide-spread abuse of not marking @Output properties readonly. Marking them readonly - would deviate from the style given in most Angular docs and examples so this rule is not enabled. - */ - '@angular-eslint/prefer-output-readonly': 'off', - - '@angular-eslint/relative-url-prefix': 'error', - - '@angular-eslint/runtime-localize': 'error', - - /* - Generally not expected in practice to sort NgModule metadata arrays. Projects may enable if desired. - */ - '@angular-eslint/sort-ngmodule-metadata-arrays': 'off', - - '@angular-eslint/use-component-selector': 'error', - - '@angular-eslint/use-component-view-encapsulation': 'error', - - /* - Provide root services with the application root injector in the Injectable decorator. However, NgModule - providers are frequently preferred for non-root, module scoped services in applications where tree-shaking - is usually irrelevant. Additionally, libraries commonly export services from modules in order to manage - dependencies. Consider enabling this rule for libraries to ensure proper tree-shaking when appropriate. - */ - '@angular-eslint/use-injectable-provided-in': 'off' +import typescript from '@ni/eslint-config-typescript'; +import angular from 'angular-eslint'; + +export default [ + ...angular.configs.tsRecommended, + ...typescript, + { + processor: angular.processInlineTemplates, + rules: { + /* + Overrides to Angular recommended rules: + https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.json + */ + + '@angular-eslint/no-host-metadata-property': 'error', + + /* + '@angular-eslint/no-input-rename' rule notes: + Disallow renaming directive inputs generally. Use an inline comment to disable the rule for exceptions where the + context changes significantly, or disable the rule for files of directives that need to prefix their inputs to avoid conflicts. + */ + + /* + '@angular-eslint/no-output-rename' rule notes: + Disallow renaming directive outputs generally. Use an inline comment to disable the rule for exceptions where the + context changes significantly, or disable the rule for projects that use the dollar sign postfix for EventEmitters. + */ + + /* + Upgrade the recommended rule configuration from a warning to an error. + */ + '@angular-eslint/use-lifecycle-interface': 'error', + + // We intended to use the default from @typescript-eslint/recommended, but we adopted this override accidentally. + // See https://github.com/ni/javascript-styleguide/issues/139 + '@typescript-eslint/no-inferrable-types': [ + 'error', + { ignoreParameters: true } + ], + + /* + Overrides to Angular rules outside of the recommended configuration: + */ + + /* + Extract templates and styles into a separate files. In rare cases, allow for inline templates of a few + elements with attributes and three minimal CSS declarations. + */ + '@angular-eslint/component-max-inline-declarations': ['error', { animations: 15, styles: 15, template: 15 }], + + /* [application-prefix] */ + '@angular-eslint/component-selector': 'off', + + '@angular-eslint/contextual-decorator': 'error', + + /* + Do not require a directive to select an element or attribute exclusively, because there are valid use cases + for both. + */ + '@angular-eslint/directive-selector': 'off', + + '@angular-eslint/no-attribute-decorator': 'error', + + /* + `forwardRef` is needed for certain Dependency Injection use cases and abuse is not widespread so its use is permitted. + */ + '@angular-eslint/no-forward-ref': 'off', + + /* + We don't yet have a general naming conventions so enforcing a convention just for inputs would be inconsistent. + */ + '@angular-eslint/no-input-prefix': 'off', + + '@angular-eslint/no-lifecycle-call': 'error', + + '@angular-eslint/no-pipe-impure': 'error', + + '@angular-eslint/no-queries-metadata-property': 'error', + + /* [application-prefix] */ + '@angular-eslint/pipe-prefix': 'error', + + /* + This rule is for specific applications such as libraries that want to minimize global dependencies or parts + of an application that have specific performance goals. + */ + '@angular-eslint/prefer-on-push-component-change-detection': 'off', + + /* + While marking @Output properties as readonly does better capture the intention of how they should generally be used, + it does not appear that there is wide-spread abuse of not marking @Output properties readonly. Marking them readonly + would deviate from the style given in most Angular docs and examples so this rule is not enabled. + */ + '@angular-eslint/prefer-output-readonly': 'off', + + '@angular-eslint/relative-url-prefix': 'error', + + '@angular-eslint/runtime-localize': 'error', + + /* + Generally not expected in practice to sort NgModule metadata arrays. Projects may enable if desired. + */ + '@angular-eslint/sort-ngmodule-metadata-arrays': 'off', + + '@angular-eslint/use-component-selector': 'error', + + '@angular-eslint/use-component-view-encapsulation': 'error', + + /* + Provide root services with the application root injector in the Injectable decorator. However, NgModule + providers are frequently preferred for non-root, module scoped services in applications where tree-shaking + is usually irrelevant. Additionally, libraries commonly export services from modules in order to manage + dependencies. Consider enabling this rule for libraries to ensure proper tree-shaking when appropriate. + */ + '@angular-eslint/use-injectable-provided-in': 'off' + } }, - overrides: [ - { - files: ['*.spec.ts'], - rules: { - /* - Tests often define helper components and it improves test readability if they are in the same - file as the tests. - */ - '@angular-eslint/component-max-inline-declarations': 'off', - - /* - Components defined in tests are typically only used within a single test file so don't need. - a compontent selector. - */ - '@angular-eslint/use-component-selector': 'off', - - /* - Tests often define additional classes as mocks or helper components and it improves test readability - if those are in the same file as the tests. - */ - 'max-classes-per-file': 'off' - } - }, - ] -}; + { + files: ['**/*.spec.ts'], + rules: { + /* + Tests often define helper components and it improves test readability if they are in the same + file as the tests. + */ + '@angular-eslint/component-max-inline-declarations': 'off', + + /* + Components defined in tests are typically only used within a single test file so don't need. + a compontent selector. + */ + '@angular-eslint/use-component-selector': 'off', + + /* + Tests often define additional classes as mocks or helper components and it improves test readability + if those are in the same file as the tests. + */ + 'max-classes-per-file': 'off' + } + } +]; diff --git a/packages/eslint-config-angular/package.json b/packages/eslint-config-angular/package.json index 8d81a1bb..08394bb7 100644 --- a/packages/eslint-config-angular/package.json +++ b/packages/eslint-config-angular/package.json @@ -1,42 +1,45 @@ { - "name": "@ni/eslint-config-angular", - "version": "9.0.7", - "description": "NI's Angular ESLint Shareable Config", - "main": "index.js", - "scripts": { - "lint": "eslint .", - "pack": "npm pack", - "print-available-rules": "node tools/print-available-rules" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ni/javascript-styleguide.git" - }, - "keywords": [ - "eslint", - "eslintconfig", - "ni" - ], - "author": "National Instruments", - "license": "MIT", - "bugs": { - "url": "https://github.com/ni/javascript-styleguide/issues" - }, - "homepage": "https://github.com/ni/javascript-styleguide#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "**/*.js", - "!/.*.js", - "!/tools" - ], - "peerDependencies": { - "@angular-eslint/builder": "^18.4.3", - "@angular-eslint/eslint-plugin": "^18.4.3", - "@angular-eslint/eslint-plugin-template": "^18.4.3", - "@angular-eslint/schematics": "^18.4.3", - "@angular-eslint/template-parser": "^18.4.3", - "@ni/eslint-config-typescript": "^4.4.4" - } + "type": "module", + "name": "@ni/eslint-config-angular", + "version": "9.0.7", + "description": "NI's Angular ESLint Shareable Config", + "main": "index.js", + "scripts": { + "lint": "eslint .", + "pack": "npm pack", + "print-available-rules": "node tools/print-available-rules" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ni/javascript-styleguide.git" + }, + "keywords": [ + "eslint", + "eslintconfig", + "ni" + ], + "author": "National Instruments", + "license": "MIT", + "bugs": { + "url": "https://github.com/ni/javascript-styleguide/issues" + }, + "homepage": "https://github.com/ni/javascript-styleguide#readme", + "publishConfig": { + "access": "public" + }, + "files": [ + "**/*.js", + "!/.*.js", + "!/tools" + ], + "peerDependencies": { + "angular-eslint": "^19.0.0", + "@ni/eslint-config-typescript": "^4.4.4" + }, + "exports": { + ".": "./index.js", + "./template": "./template.js", + "./requiring-type-checking": "./requiring-type-checking.js", + "./template/options": "./template/options.js" + } } diff --git a/packages/eslint-config-angular/requiring-type-checking.js b/packages/eslint-config-angular/requiring-type-checking.js index a36883ee..4e59d0b8 100644 --- a/packages/eslint-config-angular/requiring-type-checking.js +++ b/packages/eslint-config-angular/requiring-type-checking.js @@ -1,18 +1,21 @@ -module.exports = { - extends: [ - '@ni/eslint-config-typescript/requiring-type-checking' - ], - parser: '@typescript-eslint/parser', - overrides: [ - { - files: ['*.spec.ts'], - rules: { - /* - Spies used by Angular application tests result in a significant number of - unbound methods so this rule is disabled for test specs in Angular projects. - */ - '@typescript-eslint/unbound-method': 'off', - } - }, - ] -}; +import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; +import typescriptPlugin from 'typescript-eslint'; + +export default [ + ...typescriptRequiringTypeChecking, + { + languageOptions: { + parser: typescriptPlugin.parser, + }, + }, + { + files: ['**/*.spec.ts'], + rules: { + /* + Spies used by Angular application tests result in a significant number of + unbound methods so this rule is disabled for test specs in Angular projects. + */ + '@typescript-eslint/unbound-method': 'off', + }, + }, +]; diff --git a/packages/eslint-config-angular/template.js b/packages/eslint-config-angular/template.js index 3a07418d..23607506 100644 --- a/packages/eslint-config-angular/template.js +++ b/packages/eslint-config-angular/template.js @@ -1,111 +1,110 @@ -const { ignoreAttributes } = require('./template/options'); - -module.exports = { - extends: [ - 'plugin:@angular-eslint/template/recommended' - ], - rules: { - /* - Overrides to Angular template recommended rules: - https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/src/configs/recommended.json - */ - - /* - Angular template accessibility rules: - https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/src/configs/accessibility.json - */ - - /* [accessibility] */ - '@angular-eslint/template/alt-text': 'off', - - /* [accessibility] */ - '@angular-eslint/template/click-events-have-key-events': 'off', - - /* [accessibility] */ - '@angular-eslint/template/elements-content': 'off', - - /* [accessibility] */ - '@angular-eslint/template/interactive-supports-focus': 'off', - - /* [accessibility] */ - '@angular-eslint/template/label-has-associated-control': 'off', - - /* [accessibility] */ - '@angular-eslint/template/mouse-events-have-key-events': 'off', - - /* [accessibility] */ - '@angular-eslint/template/no-autofocus': 'off', - - /* [accessibility] */ - '@angular-eslint/template/no-distracting-elements': 'error', - - /* [accessibility] */ - '@angular-eslint/template/no-positive-tabindex': 'off', - - /* [accessibility] */ - '@angular-eslint/template/role-has-required-aria': 'off', - - /* [accessibility] */ - '@angular-eslint/template/table-scope': 'off', - - /* [accessibility] */ - '@angular-eslint/template/valid-aria': 'error', - - /* - Overrides to Angular rules outside of the recommended configuration: - */ - - '@angular-eslint/template/conditional-complexity': 'error', - - /* - In practice, independent paths in templates tend to be parallel rather than linear. Templates are - declarative whereas procedural code is more likely to result in cyclomatic complexity. While this rule may - be applicable to specific features, a template should not result in an error simply because it exceeds the - number of statements allotted by this rule. - */ - '@angular-eslint/template/cyclomatic-complexity': 'off', - - /* - Enable this rule by default to enforce internationalization for existing applications that are localized - and new applications in the chance that they'll need to be localized in the future. Disable this rule - if an application will never be localized. - */ - '@angular-eslint/template/i18n': [ - 'error', - { - checkId: false, - ignoreAttributes: [...ignoreAttributes.all] - } - ], - - '@angular-eslint/template/no-any': 'error', - - /* - When considering efficient bindings use memoization and pipes. Avoid heavy array iteratoration, nested - function calls, and calls into uncontrolled third-party imports. However, there are many cases where a - function call significantly improves template readability and has no impact on performance—where a 1ms - execution is imperceivable for users. - */ - '@angular-eslint/template/no-call-expression': 'off', - - '@angular-eslint/template/no-duplicate-attributes': 'error', - - /* - Providing a `trackBy` function in `ngFor` loops can improve performance in specific cases where Angular can't track references, but it's overkill to require it for every `ngFor` so this rule is disabled. - */ - '@angular-eslint/template/use-track-by-function': 'off' +import { ignoreAttributes } from '@ni/eslint-config-angular/template/options'; +import angularTemplate from 'angular-eslint'; + +export default [ + ...angularTemplate.configs.templateRecommended, + { + rules: { + /* + Overrides to Angular template recommended rules: + https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/src/configs/recommended.json + */ + + /* + Angular template accessibility rules: + https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/src/configs/accessibility.json + */ + + /* [accessibility] */ + '@angular-eslint/template/alt-text': 'off', + + /* [accessibility] */ + '@angular-eslint/template/click-events-have-key-events': 'off', + + /* [accessibility] */ + '@angular-eslint/template/elements-content': 'off', + + /* [accessibility] */ + '@angular-eslint/template/interactive-supports-focus': 'off', + + /* [accessibility] */ + '@angular-eslint/template/label-has-associated-control': 'off', + + /* [accessibility] */ + '@angular-eslint/template/mouse-events-have-key-events': 'off', + + /* [accessibility] */ + '@angular-eslint/template/no-autofocus': 'off', + + /* [accessibility] */ + '@angular-eslint/template/no-distracting-elements': 'error', + + /* [accessibility] */ + '@angular-eslint/template/no-positive-tabindex': 'off', + + /* [accessibility] */ + '@angular-eslint/template/role-has-required-aria': 'off', + + /* [accessibility] */ + '@angular-eslint/template/table-scope': 'off', + + /* [accessibility] */ + '@angular-eslint/template/valid-aria': 'error', + + /* + Overrides to Angular rules outside of the recommended configuration: + */ + + '@angular-eslint/template/conditional-complexity': 'error', + + /* + In practice, independent paths in templates tend to be parallel rather than linear. Templates are + declarative whereas procedural code is more likely to result in cyclomatic complexity. While this rule may + be applicable to specific features, a template should not result in an error simply because it exceeds the + number of statements allotted by this rule. + */ + '@angular-eslint/template/cyclomatic-complexity': 'off', + + /* + Enable this rule by default to enforce internationalization for existing applications that are localized + and new applications in the chance that they'll need to be localized in the future. Disable this rule + if an application will never be localized. + */ + '@angular-eslint/template/i18n': [ + 'error', + { + checkId: false, + ignoreAttributes: [...ignoreAttributes.all] + } + ], + + '@angular-eslint/template/no-any': 'error', + + /* + When considering efficient bindings use memoization and pipes. Avoid heavy array iteratoration, nested + function calls, and calls into uncontrolled third-party imports. However, there are many cases where a + function call significantly improves template readability and has no impact on performance—where a 1ms + execution is imperceivable for users. + */ + '@angular-eslint/template/no-call-expression': 'off', + + '@angular-eslint/template/no-duplicate-attributes': 'error', + + /* + Providing a `trackBy` function in `ngFor` loops can improve performance in specific cases where Angular can't track references, but it's overkill to require it for every `ngFor` so this rule is disabled. + */ + '@angular-eslint/template/use-track-by-function': 'off' + } }, - overrides: [ - { - // Ignore inline templates in tests using the inline template naming convention - // See naming details: https://github.com/angular-eslint/angular-eslint/releases/tag/v14.0.0 - files: ['*.spec.ts*.html'], - rules: { - /* - Tests often define helper components that don't need to be marked for i18n. - */ - '@angular-eslint/template/i18n': 'off' - } - }, - ] -}; + { + // Ignore inline templates in tests using the inline template naming convention + // See naming details: https://github.com/angular-eslint/angular-eslint/releases/tag/v14.0.0 + files: ['*.spec.ts*.html'], + rules: { + /* + Tests often define helper components that don't need to be marked for i18n. + */ + '@angular-eslint/template/i18n': 'off' + } + } +]; diff --git a/packages/eslint-config-angular/template/options.js b/packages/eslint-config-angular/template/options.js index 79fd42f2..f2ccb929 100644 --- a/packages/eslint-config-angular/template/options.js +++ b/packages/eslint-config-angular/template/options.js @@ -139,11 +139,7 @@ const ignoreAttributeSets = { ] }; -const ignoreAttributes = { +export const ignoreAttributes = { ...ignoreAttributeSets, all: Object.values(ignoreAttributeSets).flat() -}; - -module.exports = { - ignoreAttributes -}; +}; \ No newline at end of file diff --git a/packages/eslint-config-angular/tools/print-available-rules.js b/packages/eslint-config-angular/tools/print-available-rules.js index 503a9afd..1ce8ceb9 100644 --- a/packages/eslint-config-angular/tools/print-available-rules.js +++ b/packages/eslint-config-angular/tools/print-available-rules.js @@ -1,28 +1,32 @@ -const plugin = require('@angular-eslint/eslint-plugin'); -const templatePlugin = require('@angular-eslint/eslint-plugin-template'); +/* eslint-disable no-undef */ +/* eslint-disable no-console */ +import angularPlugin from 'angular-eslint'; -const isTrue = val => val !== undefined && val !== false; -const recommended = rule => isTrue(rule.meta.docs.recommended); -const print = (keys, prefix = '@angular-eslint') => { +const print = keys => { const results = {}; keys.forEach(key => { - results[`${prefix}/${key}`] = ''; + results[`${key}`] = ''; }); - global.console.log(JSON.stringify(results, null, 4)); + console.log(JSON.stringify(results, null, 4)); }; -const sortedRules = Object.keys(plugin.rules).sort(); -const sortedTemplateRules = Object.keys(templatePlugin.rules).sort(); +const getRules = (configs, configName) => { + const config = configs.find(cfg => cfg.name === configName); + return config ? Object.keys(config.rules).sort() : {}; +}; + +const angularTsRecommended = getRules(angularPlugin.configs.tsRecommended, 'angular-eslint/ts-recommended'); +const angularTemplateRecommended = getRules(angularPlugin.configs.templateRecommended, 'angular-eslint/template-recommended'); +const angularTsAll = getRules(angularPlugin.configs.tsAll, 'angular-eslint/ts-all'); +const angularTemplateAll = getRules(angularPlugin.configs.templateAll, 'angular-eslint/template-all'); -const angular = sortedRules.filter(key => !recommended(plugin.rules[key])); -const angularRecommended = sortedRules.filter(key => recommended(plugin.rules[key])); -const template = sortedTemplateRules.filter(key => !recommended(templatePlugin.rules[key])); -const templateRecommended = sortedTemplateRules.filter(key => recommended(templatePlugin.rules[key])); +const angular = angularTsAll.filter(key => !angularTsRecommended.includes(key)); +const template = angularTemplateAll.filter(key => !angularTemplateRecommended.includes(key)); -global.console.log('Angular Recommended:'); -print(angularRecommended); -global.console.log('Remaining Angular Rules:'); +console.log('Angular Recommended:'); +print(angularTsRecommended); +console.log('Remaining Angular Rules:'); print(angular); -global.console.log('Angular Template Recommended:'); -print(templateRecommended, '@angular-eslint/template'); -global.console.log('Remaining Angular Template Rules:'); +console.log('Angular Template Recommended:'); +print(angularTemplateRecommended, '@angular-eslint/template'); +console.log('Remaining Angular Template Rules:'); print(template, '@angular-eslint/template'); diff --git a/packages/eslint-config-javascript/.eslintrc.js b/packages/eslint-config-javascript/.eslintrc.js deleted file mode 100644 index b61604d7..00000000 --- a/packages/eslint-config-javascript/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-javascript' -}; diff --git a/packages/eslint-config-javascript/eslint.config.js b/packages/eslint-config-javascript/eslint.config.js new file mode 100644 index 00000000..d64a8b4d --- /dev/null +++ b/packages/eslint-config-javascript/eslint.config.js @@ -0,0 +1,13 @@ +import javascript from '@ni/eslint-config-javascript'; + +export default [ + ...javascript, + { + files: ['**/*.js'], + rules: { + 'import/no-default-export': 'off', + 'import/extensions': 'off', + 'import/no-extraneous-dependencies': 'off', + }, + }, +]; diff --git a/packages/eslint-config-javascript/index.js b/packages/eslint-config-javascript/index.js index 7f61bb3b..421ec2dc 100644 --- a/packages/eslint-config-javascript/index.js +++ b/packages/eslint-config-javascript/index.js @@ -1,18 +1,32 @@ -module.exports = { - extends: [ - require.resolve('./rules/best-practices'), - require.resolve('./rules/errors'), - require.resolve('./rules/node'), - require.resolve('./rules/style'), - require.resolve('./rules/variables'), - require.resolve('./rules/es6'), - require.resolve('./rules/imports'), - require.resolve('./rules/strict'), - 'plugin:@stylistic/disable-legacy', - ], - plugins: ['@stylistic'], - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module', - } -}; \ No newline at end of file +import importPlugin from 'eslint-plugin-import'; +import stylisticPlugin from '@stylistic/eslint-plugin'; +import { bestPractices } from './rules/best-practices.js'; +import { errors } from './rules/errors.js'; +import { node } from './rules/node.js'; +import { style } from './rules/style.js'; +import { variables } from './rules/variables.js'; +import { es6 } from './rules/es6.js'; +import { imports } from './rules/imports.js'; +import { strict } from './rules/strict.js'; + +export default [ + stylisticPlugin.configs['disable-legacy'], + bestPractices, + errors, + node, + style, + variables, + es6, + imports, + strict, + { + plugins: { + '@stylistic': stylisticPlugin, + import: importPlugin, + }, + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module' + } + }, +]; \ No newline at end of file diff --git a/packages/eslint-config-javascript/package.json b/packages/eslint-config-javascript/package.json index 3a5744a2..c5180b09 100644 --- a/packages/eslint-config-javascript/package.json +++ b/packages/eslint-config-javascript/package.json @@ -1,4 +1,5 @@ { + "type":"module", "name": "@ni/eslint-config-javascript", "version": "4.4.0", "description": "NI's JavaScript ESLint Shareable Config", @@ -31,8 +32,8 @@ "!/.*.js" ], "peerDependencies": { - "eslint": "^8.57.0", - "eslint-plugin-import": "^2.29.1", - "@stylistic/eslint-plugin": "^3.0.0" + "eslint": "^9.0.0", + "eslint-plugin-import": "^2.31.1", + "@stylistic/eslint-plugin": "^5.0.0" } } diff --git a/packages/eslint-config-javascript/rules/best-practices.js b/packages/eslint-config-javascript/rules/best-practices.js index 1a8ab52a..89a049e2 100644 --- a/packages/eslint-config-javascript/rules/best-practices.js +++ b/packages/eslint-config-javascript/rules/best-practices.js @@ -1,4 +1,4 @@ -module.exports = { +export const bestPractices ={ rules: { /* enforces getter/setter pairs in objects diff --git a/packages/eslint-config-javascript/rules/errors.js b/packages/eslint-config-javascript/rules/errors.js index 2b50e5ff..9f15d5a4 100644 --- a/packages/eslint-config-javascript/rules/errors.js +++ b/packages/eslint-config-javascript/rules/errors.js @@ -1,4 +1,4 @@ -module.exports = { +export const errors = { rules: { /* Enforce “for” loop update clause moving the counter in the right direction diff --git a/packages/eslint-config-javascript/rules/es6.js b/packages/eslint-config-javascript/rules/es6.js index 0e1a2a75..d6d92cdb 100644 --- a/packages/eslint-config-javascript/rules/es6.js +++ b/packages/eslint-config-javascript/rules/es6.js @@ -1,16 +1,4 @@ -module.exports = { - env: { - es6: true - }, - parserOptions: { - ecmaVersion: 6, - sourceType: 'module', - ecmaFeatures: { - generators: false, - objectLiteralDuplicateProperties: false - } - }, - +export const es6 = { rules: { /* Developers should consider readability, and no braces may be preferred when unnecessary. However, this rule diff --git a/packages/eslint-config-javascript/rules/imports.js b/packages/eslint-config-javascript/rules/imports.js index 0e4c19c6..866b5281 100644 --- a/packages/eslint-config-javascript/rules/imports.js +++ b/packages/eslint-config-javascript/rules/imports.js @@ -1,15 +1,4 @@ -module.exports = { - env: { - es6: true - }, - parserOptions: { - ecmaVersion: 6, - sourceType: 'module' - }, - plugins: [ - 'import' - ], - +export const imports = { settings: { 'import/resolver': { node: { @@ -28,7 +17,6 @@ module.exports = { '\\.(coffee|scss|css|less|hbs|svg|json)$', ], }, - rules: { /* Static analysis: diff --git a/packages/eslint-config-javascript/rules/node.js b/packages/eslint-config-javascript/rules/node.js index eaa14064..1ef0138d 100644 --- a/packages/eslint-config-javascript/rules/node.js +++ b/packages/eslint-config-javascript/rules/node.js @@ -1,8 +1,4 @@ -module.exports = { - env: { - node: true - }, - +export const node = { rules: { /* enforce return after a callback diff --git a/packages/eslint-config-javascript/rules/strict.js b/packages/eslint-config-javascript/rules/strict.js index d1101a39..793e32ed 100644 --- a/packages/eslint-config-javascript/rules/strict.js +++ b/packages/eslint-config-javascript/rules/strict.js @@ -1,4 +1,4 @@ -module.exports = { +export const strict = { rules: { /* babel inserts `'use strict';` for us diff --git a/packages/eslint-config-javascript/rules/style.js b/packages/eslint-config-javascript/rules/style.js index ca601644..272a24f3 100644 --- a/packages/eslint-config-javascript/rules/style.js +++ b/packages/eslint-config-javascript/rules/style.js @@ -1,4 +1,4 @@ -module.exports = { +export const style = { rules: { /* enforce line breaks after opening and before closing array brackets diff --git a/packages/eslint-config-javascript/rules/variables.js b/packages/eslint-config-javascript/rules/variables.js index 59d11644..5e8ac4b4 100644 --- a/packages/eslint-config-javascript/rules/variables.js +++ b/packages/eslint-config-javascript/rules/variables.js @@ -1,4 +1,4 @@ -module.exports = { +export const variables = { rules: { /* enforce or disallow variable initializations at definition diff --git a/packages/eslint-config-playwright/.eslintrc.js b/packages/eslint-config-playwright/.eslintrc.js deleted file mode 100644 index b61604d7..00000000 --- a/packages/eslint-config-playwright/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-javascript' -}; diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js new file mode 100644 index 00000000..cfa57ecd --- /dev/null +++ b/packages/eslint-config-playwright/eslint.config.js @@ -0,0 +1,12 @@ +import javascript from '@ni/eslint-config-javascript'; + +export default [ + ...javascript, + { + rules: { + 'import/no-default-export': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-unresolved': 'off', + }, + }, +]; diff --git a/packages/eslint-config-playwright/index.js b/packages/eslint-config-playwright/index.js index aa7948ae..af347b8e 100644 --- a/packages/eslint-config-playwright/index.js +++ b/packages/eslint-config-playwright/index.js @@ -1,82 +1,85 @@ -module.exports = { - extends: [ - '@ni/eslint-config-typescript', - 'plugin:playwright/playwright-test' - ], - rules: { - /* - In UI tests it is common to have a loop that performs async operations which must be sequential. - For example, clicking on a list of elements one after another. - While there are still some cases where the rule would suggest valid improvements, they are not common - enough to justify the noise that comes from needing to suppress it. - */ - 'no-await-in-loop': 'off', +import typescript from '@ni/eslint-config-typescript'; +import playwright from 'eslint-plugin-playwright'; - /* - Playwright marks this as recommended but configures it as 'warn'. - Deeply nested describe blocks are likely an indication that test files are too complicated. - */ - 'playwright/max-nested-describe': 'error', +export default [ + ...typescript, + playwright.configs['flat/recommended'], + { + rules: { + /* + In UI tests it is common to have a loop that performs async operations which must be sequential. + For example, clicking on a list of elements one after another. + While there are still some cases where the rule would suggest valid improvements, they are not common + enough to justify the noise that comes from needing to suppress it. + */ + 'no-await-in-loop': 'off', - /* - Playwright marks this as recommended but configures it as 'warn'. - Conditional logic in tests is usually an indication that a test is attempting to cover too much, and not testing the logic it intends to. - Each branch of code executing within a conditional statement will usually be better served by a test devoted to it. - */ - 'playwright/no-conditional-in-test': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + Deeply nested describe blocks are likely an indication that test files are too complicated. + */ + 'playwright/max-nested-describe': 'error', - /* - Playwright marks this as recommended but configures it as 'warn'. - Instead of element handles (page.$) use locators (page.locator). - */ - 'playwright/no-element-handle': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + Conditional logic in tests is usually an indication that a test is attempting to cover too much, and not testing the logic it intends to. + Each branch of code executing within a conditional statement will usually be better served by a test devoted to it. + */ + 'playwright/no-conditional-in-test': 'error', - /* - Playwright marks this as recommended but configures it as 'warn'. - Instead of page.$eval use locators (page.locator). - */ - 'playwright/no-eval': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + Instead of element handles (page.$) use locators (page.locator). + */ + 'playwright/no-element-handle': 'error', - /* - Playwright marks this as recommended but configures it as 'warn'. - We should generally avoid using {"force: true"} to force Playwright to interact with an element that isn't visible. - In some cases it is necessary and this rule may be suppressed if explained with a comment. - */ - 'playwright/no-force-option': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + Instead of page.$eval use locators (page.locator). + */ + 'playwright/no-eval': 'error', - /* - Playwright marks this as recommended but configures it as 'warn'. - Using page.pause should be reserved for debugging, not production code. - */ - 'playwright/no-page-pause': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + We should generally avoid using {"force: true"} to force Playwright to interact with an element that isn't visible. + In some cases it is necessary and this rule may be suppressed if explained with a comment. + */ + 'playwright/no-force-option': 'error', - /* - Playwright marks this as recommended but configures it as 'warn'. - We allow skipped tests as a mechanism of temporarily disabling them in production. - Skipped tests should be accompanied by a comment linking to a work item that tracks re-enabling them. - */ - 'playwright/no-skipped-test': 'off', + /* + Playwright marks this as recommended but configures it as 'warn'. + Using page.pause should be reserved for debugging, not production code. + */ + 'playwright/no-page-pause': 'error', - /* - Playwright marks this as recommended but configures it as 'warn'. - Assertions are easier to read when using a dedicated matcher rather than negating the opposite matcher. - */ - 'playwright/no-useless-not': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + We allow skipped tests as a mechanism of temporarily disabling them in production. + Skipped tests should be accompanied by a comment linking to a work item that tracks re-enabling them. + */ + 'playwright/no-skipped-test': 'off', - /* - Playwright marks this as recommended but configures it as 'warn'. - Waiting for arbitrary amounts of time can cause test intermittency. Instead wait for a specific condition. - */ - 'playwright/no-wait-for-timeout': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + Assertions are easier to read when using a dedicated matcher rather than negating the opposite matcher. + */ + 'playwright/no-useless-not': 'error', - /* - In order to have a better failure message, toHaveLength() should be used when asserting expectations on objects length property. - */ - 'playwright/prefer-to-have-length': 'error', + /* + Playwright marks this as recommended but configures it as 'warn'. + Waiting for arbitrary amounts of time can cause test intermittency. Instead wait for a specific condition. + */ + 'playwright/no-wait-for-timeout': 'error', - /* - Having a top-level describe block in each test file is common practice which aligns with patterns we use in Jasmine - */ - 'playwright/require-top-level-describe': 'error' - }, -}; + /* + In order to have a better failure message, toHaveLength() should be used when asserting expectations on objects length property. + */ + 'playwright/prefer-to-have-length': 'error', + + /* + Having a top-level describe block in each test file is common practice which aligns with patterns we use in Jasmine + */ + 'playwright/require-top-level-describe': 'error' + } + } +]; diff --git a/packages/eslint-config-playwright/package.json b/packages/eslint-config-playwright/package.json index 2ddc7d06..09cdc5ff 100644 --- a/packages/eslint-config-playwright/package.json +++ b/packages/eslint-config-playwright/package.json @@ -1,37 +1,42 @@ { - "name": "@ni/eslint-config-playwright", - "version": "1.1.5", - "description": "NI's Playwright ESLint Shareable Config", - "main": "index.js", - "scripts": { - "lint": "eslint .", - "pack": "npm pack", - "print-available-rules": "node tools/print-available-rules" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ni/javascript-styleguide.git" - }, - "keywords": [ - "eslint", - "eslintconfig", - "ni" - ], - "author": "National Instruments", - "license": "MIT", - "bugs": { - "url": "https://github.com/ni/javascript-styleguide/issues" - }, - "homepage": "https://github.com/ni/javascript-styleguide#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "/*.js", - "!/.*.js" - ], - "peerDependencies": { - "@ni/eslint-config-typescript": "^4.4.4", - "eslint-plugin-playwright": "^0.12.0" - } + "type": "module", + "name": "@ni/eslint-config-playwright", + "version": "1.1.5", + "description": "NI's Playwright ESLint Shareable Config", + "main": "index.js", + "scripts": { + "lint": "eslint .", + "pack": "npm pack", + "print-available-rules": "node tools/print-available-rules" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ni/javascript-styleguide.git" + }, + "keywords": [ + "eslint", + "eslintconfig", + "ni" + ], + "author": "National Instruments", + "license": "MIT", + "bugs": { + "url": "https://github.com/ni/javascript-styleguide/issues" + }, + "homepage": "https://github.com/ni/javascript-styleguide#readme", + "publishConfig": { + "access": "public" + }, + "files": [ + "/*.js", + "!/.*.js" + ], + "peerDependencies": { + "@ni/eslint-config-typescript": "^4.4.4", + "eslint-plugin-playwright": "^0.18.0" + }, + "exports": { + ".": "./index.js", + "./requiring-type-checking": "./requiring-type-checking.js" + } } diff --git a/packages/eslint-config-playwright/requiring-type-checking.js b/packages/eslint-config-playwright/requiring-type-checking.js index 97b401fc..da60cb7b 100644 --- a/packages/eslint-config-playwright/requiring-type-checking.js +++ b/packages/eslint-config-playwright/requiring-type-checking.js @@ -1,6 +1,3 @@ -module.exports = { - extends: [ - '@ni/eslint-config-typescript/requiring-type-checking' - ], - parser: '@typescript-eslint/parser', -}; +import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; + +export default [...typescriptRequiringTypeChecking]; \ No newline at end of file diff --git a/packages/eslint-config-playwright/tools/print-available-rules.js b/packages/eslint-config-playwright/tools/print-available-rules.js index 5d657029..3f87c86a 100644 --- a/packages/eslint-config-playwright/tools/print-available-rules.js +++ b/packages/eslint-config-playwright/tools/print-available-rules.js @@ -1,4 +1,6 @@ -const plugin = require('eslint-plugin-playwright'); +/* eslint-disable no-undef */ +/* eslint-disable no-console */ +import plugin from 'eslint-plugin-playwright'; const isTrue = val => val !== undefined && val !== false; const recommended = rule => isTrue(rule.meta.docs.recommended); @@ -7,14 +9,15 @@ const print = (keys, prefix = 'playwright') => { keys.forEach(key => { results[`${prefix}/${key}`] = ''; }); - global.console.log(JSON.stringify(results, null, 4)); + console.log(JSON.stringify(results, null, 4)); }; const sortedRules = Object.keys(plugin.rules).sort(); const playwright = sortedRules.filter(key => !recommended(plugin.rules[key])); const playwrightRecommended = sortedRules.filter(key => recommended(plugin.rules[key])); -global.console.log('Playwright Recommended:'); +console.log('Playwright Recommended:'); print(playwrightRecommended); -global.console.log('Remaining Playwright Rules:'); +console.log('Remaining Playwright Rules:'); print(playwright); + diff --git a/packages/eslint-config-typescript/.eslintrc.js b/packages/eslint-config-typescript/.eslintrc.js deleted file mode 100644 index b61604d7..00000000 --- a/packages/eslint-config-typescript/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-javascript' -}; diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js new file mode 100644 index 00000000..76d66b38 --- /dev/null +++ b/packages/eslint-config-typescript/eslint.config.js @@ -0,0 +1,14 @@ +import javascript from '@ni/eslint-config-javascript'; + +export default [ + ...javascript, + { + files: ['**/*.js'], + rules: { + 'import/no-default-export': 'off', + 'import/extensions': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-unresolved': 'off', + }, + }, +]; diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index 34c79a01..c1ce1330 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -1,226 +1,231 @@ -module.exports = { - extends: [ - '@ni/eslint-config-javascript', - 'plugin:@typescript-eslint/recommended', - 'plugin:import/typescript', - './lib/extensions' - ], - parser: '@typescript-eslint/parser', - rules: { - /* - Overrides to import rules (already handled by the TypeScript compiler): - https://github.com/benmosher/eslint-plugin-import/blob/main/config/typescript.js - */ - - /* - Already enforced by TypeScript compiler. - */ - 'import/named': 'off', - - /* - Already enforced by TypeScript compiler. - */ - 'import/no-unresolved': 'off', - - /* - Overrides to TypeScript recommended rules: - https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.ts - */ - - '@typescript-eslint/explicit-module-boundary-types': 'error', - - /* - [strict-null-checks] - With `stickNullChecks` disabled, non-null assertions are discouraged (this rule is configured as 'error') - as non-null assertions do not provide additional type safety and if used inconsistently add to visual noise. - With `strictNullChecks` enabled, the non-null assertion operator (this rule configured as 'off') - is useful for asserting that a value will no longer be null and usage of operator should be allowed. - */ - '@typescript-eslint/no-non-null-assertion': 'error', - - 'valid-typeof': 'off', - - /* - Overrides to TypeScript stylistic rules: - https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/stylistic.ts - */ - - /* - Overrides to Typescript rules outside of the recommended configuration: - */ - - /* - Prefer the array straight bracket syntax over generics in all cases. - */ - '@typescript-eslint/array-type': 'error', - - '@typescript-eslint/ban-tslint-comment': 'error', - - '@typescript-eslint/class-literal-property-style': 'error', - - /* - Prefer the index signature syntax over the builtin `Record` type in all cases. - */ - '@typescript-eslint/consistent-indexed-object-style': ['error', 'index-signature'], - - '@typescript-eslint/consistent-type-assertions': 'error', - - '@typescript-eslint/consistent-type-definitions': ['error', 'interface'], - - /* - Type imports are useful for uncommon use cases such as modules with - side-efects and file-by-file transpiling. Usage will be determined - on a case-by-case basis. - */ - '@typescript-eslint/consistent-type-imports': 'off', - - '@typescript-eslint/explicit-function-return-type': 'error', - - /* - Requiring an accessibility modifier helps when creating classes to ensure the - accessibility of a class member is intentionally decided and not relying on - the default of public accessibility. Constructors are omitted because they are - almost always public. - */ - '@typescript-eslint/explicit-member-accessibility': ['error', - { accessibility: 'explicit', overrides: { constructors: 'off' } } - ], - - /* - All interface members should be terminated with a semicolon including single line - definitions, consistent with classes. Object literal types should use commas - consistent with object literals. - */ - '@typescript-eslint/member-delimiter-style': ['error', { - overrides: { - interface: { - singleline: { - delimiter: 'semi', - requireLast: true - } - }, - typeLiteral: { - multiline: { - delimiter: 'comma', - requireLast: false +import javascript from '@ni/eslint-config-javascript'; +import typescriptPlugin from 'typescript-eslint'; +import extensions from './lib/extensions.js'; + +export default [ + ...javascript, + ...typescriptPlugin.configs.recommended, + ...extensions, + { + languageOptions: { + parser: typescriptPlugin.parser + }, + rules: { + /* + Overrides to import rules (already handled by the TypeScript compiler): + https://github.com/benmosher/eslint-plugin-import/blob/main/config/typescript.js + */ + + /* + Already enforced by TypeScript compiler. + */ + 'import/named': 'off', + + /* + Already enforced by TypeScript compiler. + */ + 'import/no-unresolved': 'off', + + /* + Overrides to TypeScript recommended rules: + https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.ts + */ + + '@typescript-eslint/explicit-module-boundary-types': 'error', + + /* + [strict-null-checks] + With `stickNullChecks` disabled, non-null assertions are discouraged (this rule is configured as 'error') + as non-null assertions do not provide additional type safety and if used inconsistently add to visual noise. + With `strictNullChecks` enabled, the non-null assertion operator (this rule configured as 'off') + is useful for asserting that a value will no longer be null and usage of operator should be allowed. + */ + '@typescript-eslint/no-non-null-assertion': 'error', + + 'valid-typeof': 'off', + + /* + Overrides to TypeScript stylistic rules: + https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/stylistic.ts + */ + + /* + Overrides to Typescript rules outside of the recommended configuration: + */ + + /* + Prefer the array straight bracket syntax over generics in all cases. + */ + '@typescript-eslint/array-type': 'error', + + '@typescript-eslint/ban-tslint-comment': 'error', + + '@typescript-eslint/class-literal-property-style': 'error', + + /* + Prefer the index signature syntax over the builtin `Record` type in all cases. + */ + '@typescript-eslint/consistent-indexed-object-style': ['error', 'index-signature'], + + '@typescript-eslint/consistent-type-assertions': 'error', + + '@typescript-eslint/consistent-type-definitions': ['error', 'interface'], + + /* + Type imports are useful for uncommon use cases such as modules with + side-efects and file-by-file transpiling. Usage will be determined + on a case-by-case basis. + */ + '@typescript-eslint/consistent-type-imports': 'off', + + '@typescript-eslint/explicit-function-return-type': 'error', + + /* + Requiring an accessibility modifier helps when creating classes to ensure the + accessibility of a class member is intentionally decided and not relying on + the default of public accessibility. Constructors are omitted because they are + almost always public. + */ + '@typescript-eslint/explicit-member-accessibility': ['error', + { accessibility: 'explicit', overrides: { constructors: 'off' } } + ], + + /* + All interface members should be terminated with a semicolon including single line + definitions, consistent with classes. Object literal types should use commas + consistent with object literals. + */ + '@typescript-eslint/member-delimiter-style': ['error', { + overrides: { + interface: { + singleline: { + delimiter: 'semi', + requireLast: true + } }, - singleline: { - delimiter: 'comma', - requireLast: false + typeLiteral: { + multiline: { + delimiter: 'comma', + requireLast: false + }, + singleline: { + delimiter: 'comma', + requireLast: false + } } } - } - }], - - /* - Group members by fields and methods and then order them by accessibility starting - with statics. Order members within these groups in a logical organization where - readability is the most important thing. Private fields that back public accessors - may be grouped with their accessor by disabling the rule with a comment. - */ - '@typescript-eslint/member-ordering': ['error', { - default: [ - 'signature', - 'public-static-field', - 'protected-static-field', - 'private-static-field', - 'static-field', - 'public-field', - 'protected-field', - 'private-field', - 'field', - 'public-constructor', - 'protected-constructor', - 'private-constructor', - 'constructor', - 'public-static-method', - 'protected-static-method', - 'private-static-method', - 'static-method', - 'public-method', - 'protected-method', - 'private-method', - 'method' - ] - }], - - /* - The stricter type checking that's possible by using property style when declaring - method signatures only has benefits in some cases of inheritance. Therefore we - prefer to align the style between interface and class definitions and to align - with other languages used by NI like C#. - */ - '@typescript-eslint/method-signature-style': 'off', - - '@typescript-eslint/no-confusing-non-null-assertion': 'error', - - /* - This rule is unnecessary because delete is banned via 'no-restricted-syntax' - */ - '@typescript-eslint/no-dynamic-delete': 'off', - - '@typescript-eslint/no-extraneous-class': ['error', { allowWithDecorator: true, allowStaticOnly: true }], - - /* - TypeScript only supports catching `any` and `unknown` so this rule does not add - much value. With the rule no-throw-literal we enforce throwing `Error` objects, - which should be sufficient most of the time. For more type safety, consider - using type guards. - */ - '@typescript-eslint/no-implicit-any-catch': 'off', - - '@typescript-eslint/no-invalid-void-type': 'error', - - /* - Parameter properties are a nice shorthand for defining properties ingested - in the constructor. - */ - '@typescript-eslint/no-parameter-properties': 'off', - - '@typescript-eslint/no-require-imports': 'error', - - /* - Type aliases are in-use in many applications and do not seem to generally be abused - by, for example, aliasing built-in types unnecessarily. - */ - '@typescript-eslint/no-type-alias': 'off', - - '@typescript-eslint/no-unnecessary-type-constraint': 'error', - - /* - As the rule is experimental it is not enabled by default. - */ - '@typescript-eslint/no-unused-vars-experimental': 'off', - - /* - If an enum is crossing a code boundary (being serialized to JSON for example) then - you should initialize its values. But in most other cases code shouldn't care about - the values of enum items, so you can safely leave them implicit. - */ - '@typescript-eslint/prefer-enum-initializers': 'off', - - '@typescript-eslint/prefer-for-of': 'error', - - '@typescript-eslint/prefer-function-type': 'error', - - '@typescript-eslint/prefer-literal-enum-member': 'error', - - '@typescript-eslint/prefer-ts-expect-error': 'error', - - /* - Generally not expected in practice to sort union intersection members. - Projects may enable if desired. - */ - '@typescript-eslint/sort-type-union-intersection-members': 'off', - - '@typescript-eslint/type-annotation-spacing': 'error', - - /* - This rule is better enforced with the TypeScript `noImplicitAny` and - `strictPropertyInitialization` compiler options. - */ - '@typescript-eslint/typedef': 'off', - - '@typescript-eslint/unified-signatures': 'error', + }], + + /* + Group members by fields and methods and then order them by accessibility starting + with statics. Order members within these groups in a logical organization where + readability is the most important thing. Private fields that back public accessors + may be grouped with their accessor by disabling the rule with a comment. + */ + '@typescript-eslint/member-ordering': ['error', { + default: [ + 'signature', + 'public-static-field', + 'protected-static-field', + 'private-static-field', + 'static-field', + 'public-field', + 'protected-field', + 'private-field', + 'field', + 'public-constructor', + 'protected-constructor', + 'private-constructor', + 'constructor', + 'public-static-method', + 'protected-static-method', + 'private-static-method', + 'static-method', + 'public-method', + 'protected-method', + 'private-method', + 'method' + ] + }], + + /* + The stricter type checking that's possible by using property style when declaring + method signatures only has benefits in some cases of inheritance. Therefore we + prefer to align the style between interface and class definitions and to align + with other languages used by NI like C#. + */ + '@typescript-eslint/method-signature-style': 'off', + + '@typescript-eslint/no-confusing-non-null-assertion': 'error', + + /* + This rule is unnecessary because delete is banned via 'no-restricted-syntax' + */ + '@typescript-eslint/no-dynamic-delete': 'off', + + '@typescript-eslint/no-extraneous-class': ['error', { allowWithDecorator: true, allowStaticOnly: true }], + + /* + TypeScript only supports catching `any` and `unknown` so this rule does not add + much value. With the rule no-throw-literal we enforce throwing `Error` objects, + which should be sufficient most of the time. For more type safety, consider + using type guards. + */ + '@typescript-eslint/no-implicit-any-catch': 'off', + + '@typescript-eslint/no-invalid-void-type': 'error', + + /* + Parameter properties are a nice shorthand for defining properties ingested + in the constructor. + */ + '@typescript-eslint/no-parameter-properties': 'off', + + '@typescript-eslint/no-require-imports': 'error', + + /* + Type aliases are in-use in many applications and do not seem to generally be abused + by, for example, aliasing built-in types unnecessarily. + */ + '@typescript-eslint/no-type-alias': 'off', + + '@typescript-eslint/no-unnecessary-type-constraint': 'error', + + /* + As the rule is experimental it is not enabled by default. + */ + '@typescript-eslint/no-unused-vars-experimental': 'off', + + /* + If an enum is crossing a code boundary (being serialized to JSON for example) then + you should initialize its values. But in most other cases code shouldn't care about + the values of enum items, so you can safely leave them implicit. + */ + '@typescript-eslint/prefer-enum-initializers': 'off', + + '@typescript-eslint/prefer-for-of': 'error', + + '@typescript-eslint/prefer-function-type': 'error', + + '@typescript-eslint/prefer-literal-enum-member': 'error', + + '@typescript-eslint/prefer-ts-expect-error': 'error', + + /* + Generally not expected in practice to sort union intersection members. + Projects may enable if desired. + */ + '@typescript-eslint/sort-type-union-intersection-members': 'off', + + '@typescript-eslint/type-annotation-spacing': 'error', + + /* + This rule is better enforced with the TypeScript `noImplicitAny` and + `strictPropertyInitialization` compiler options. + */ + '@typescript-eslint/typedef': 'off', + + '@typescript-eslint/unified-signatures': 'error', + } } -}; +]; diff --git a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js index 427fcfa3..153d7322 100644 --- a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js +++ b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js @@ -1,4 +1,4 @@ -module.exports = { +export const extensionsRequiringTypeChecking = { rules: { 'dot-notation': 'off', '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }], diff --git a/packages/eslint-config-typescript/lib/extensions.js b/packages/eslint-config-typescript/lib/extensions.js index b5e2e9cd..da4e9312 100644 --- a/packages/eslint-config-typescript/lib/extensions.js +++ b/packages/eslint-config-typescript/lib/extensions.js @@ -1,4 +1,4 @@ -module.exports = { +export const extensions = { rules: { /* The following are extension rules that replace core JavaScript rules to support diff --git a/packages/eslint-config-typescript/package.json b/packages/eslint-config-typescript/package.json index 0b51b6ae..14bd487c 100644 --- a/packages/eslint-config-typescript/package.json +++ b/packages/eslint-config-typescript/package.json @@ -1,39 +1,43 @@ { - "name": "@ni/eslint-config-typescript", - "version": "4.4.4", - "description": "NI's TypeScript ESLint Shareable Config", - "main": "index.js", - "scripts": { - "lint": "eslint .", - "pack": "npm pack", - "print-available-rules": "node tools/print-available-rules" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ni/javascript-styleguide.git" - }, - "keywords": [ - "eslint", - "eslintconfig", - "ni" - ], - "author": "National Instruments", - "license": "MIT", - "bugs": { - "url": "https://github.com/ni/javascript-styleguide/issues" - }, - "homepage": "https://github.com/ni/javascript-styleguide#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "/*.js", - "!/.*.js", - "/lib/*" - ], - "peerDependencies": { - "@ni/eslint-config-javascript": "^4.4.0", - "@typescript-eslint/parser": "^7.18.0", - "@typescript-eslint/eslint-plugin": "^7.18.0" - } + "type": "module", + "name": "@ni/eslint-config-typescript", + "version": "4.4.4", + "description": "NI's TypeScript ESLint Shareable Config", + "main": "index.js", + "scripts": { + "lint": "eslint .", + "pack": "npm pack", + "print-available-rules": "node tools/print-available-rules" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ni/javascript-styleguide.git" + }, + "keywords": [ + "eslint", + "eslintconfig", + "ni" + ], + "author": "National Instruments", + "license": "MIT", + "bugs": { + "url": "https://github.com/ni/javascript-styleguide/issues" + }, + "homepage": "https://github.com/ni/javascript-styleguide#readme", + "publishConfig": { + "access": "public" + }, + "files": [ + "/*.js", + "!/.*.js", + "/lib/*" + ], + "peerDependencies": { + "@ni/eslint-config-javascript": "^4.4.0", + "typescript-eslint": "^8.0.0" + }, + "exports": { + ".": "./index.js", + "./requiring-type-checking": "./requiring-type-checking.js" + } } diff --git a/packages/eslint-config-typescript/requiring-type-checking.js b/packages/eslint-config-typescript/requiring-type-checking.js index 70a6cbaa..919de051 100644 --- a/packages/eslint-config-typescript/requiring-type-checking.js +++ b/packages/eslint-config-typescript/requiring-type-checking.js @@ -1,180 +1,185 @@ -module.exports = { - extends: [ - 'plugin:@typescript-eslint/recommended-type-checked', - 'plugin:@typescript-eslint/stylistic-type-checked', - './lib/extensions-requiring-type-checking' - ], - parser: '@typescript-eslint/parser', - rules: { - /* - Overrides to TypeScript recommended rules: - https://github.com/typescript-eslint/typescript-eslint/tree/v7.18.0/packages/eslint-plugin/src/configs/recommended-type-checked.ts - */ - - '@typescript-eslint/no-duplicate-enum-values': 'off', - '@typescript-eslint/no-duplicate-type-constituents': 'off', - '@typescript-eslint/no-loss-of-precision': 'off', - '@typescript-eslint/no-redundant-type-constituents': 'off', - '@typescript-eslint/no-unsafe-declaration-merging': 'off', - '@typescript-eslint/no-unsafe-enum-comparison': 'off', - - /* - This rule can be confusing if you're not familiar with JavaScript's rules for binding `this`, - but in our experience when it reports an error it is usually indicitave of a real bug. - - Common ways to resolve this error include: - 1. Wrapping the function with an arrow function, which establishes `this` based on the context - the function is defined in rather than where it's called from. - ``` - // Good, this will refer to the class where this code is defined - array.sort(() => this.compare()); - - // Bad, this will refer to the context where this code is invoked from - array.sort(this.compare); +import typescriptPlugin from 'typescript-eslint'; +import extensionsTypeChecked from './lib/extensions-requiring-type-checking.js'; + +export default [ + ...typescriptPlugin.configs.recommendedTypeChecked, + ...typescriptPlugin.configs.stylisticTypeChecked, + ...extensionsTypeChecked, + { + languageOptions: { + parser: typescriptPlugin.parser + }, + rules: { + /* + Overrides to TypeScript recommended rules: + https://github.com/typescript-eslint/typescript-eslint/tree/v7.18.0/packages/eslint-plugin/src/configs/recommended-type-checked.ts + */ + + '@typescript-eslint/no-duplicate-enum-values': 'off', + '@typescript-eslint/no-duplicate-type-constituents': 'off', + '@typescript-eslint/no-loss-of-precision': 'off', + '@typescript-eslint/no-redundant-type-constituents': 'off', + '@typescript-eslint/no-unsafe-declaration-merging': 'off', + '@typescript-eslint/no-unsafe-enum-comparison': 'off', + + /* + This rule can be confusing if you're not familiar with JavaScript's rules for binding `this`, + but in our experience when it reports an error it is usually indicitave of a real bug. + + Common ways to resolve this error include: + 1. Wrapping the function with an arrow function, which establishes `this` based on the context + the function is defined in rather than where it's called from. ``` - 2. For callbacks passed to `addEventListener` which need to be referenced in `removeEventListener`, - the arrow function should be stored in a variable since it must refer to the same instance of the function. - ``` - // Good - const handler = event => this.clickHandler(); - elt.addEventListener('click', handler); - elt.removeEventListener('click', handler); - - // Bad, violates this rule - elt.addEventListener('click', this.clickHandler); - elt.removeEventListener('click', this.clickHandler); - - // Bad, removeEventListener isn't removing the original handler - elt.addEventListener('click', event => this.clickHandler()); - elt.removeEventListener('click', event => this.clickHandler()); - 3. If the function doesn't use `this` to refer to an instance or other static members, you can change the function to be static and the rule will ignore it. - */ - '@typescript-eslint/unbound-method': ['error', { ignoreStatic: true }], - - /* - Overrides to TypeScript type-checked stylistic rules: - https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/stylistic-type-checked.ts - */ - - '@typescript-eslint/consistent-generic-constructors': 'off', - '@typescript-eslint/prefer-regexp-exec': 'off', - - /* - Overrides to Typescript rules outside of the recommended configuration: - */ - - /* - Most of this configuration is identitical to the default with exceptions called out in comments below - */ - '@typescript-eslint/naming-convention': [ - 'error', - // Allow properties with custom-element-names, commonly used in HTMLElementNameTagMap - { - selector: 'property', - format: null, - filter: { - // custom element regex adapted from https://html-validate.org/rules/element-name.html - regex: '^[a-z][a-z0-9\\-._]*-[a-z0-9\\-._]*$', - match: true - } - }, - // The default configuration for this rule requires that enum members - // follow the camelCase style, which doesn't match the existing convention - // within NI and the broader TS community to use PascalCase. - { - selector: 'enumMember', - format: ['PascalCase'], - }, - { - selector: 'variable', - format: ['camelCase', 'UPPER_CASE'], - leadingUnderscore: 'allow', - trailingUnderscore: 'allow', - }, - { - selector: 'typeLike', - format: ['PascalCase'], - }, - { - selector: 'import', - format: ['camelCase', 'PascalCase'], - }, - { - selector: 'default', - format: ['camelCase'], - leadingUnderscore: 'allow', - trailingUnderscore: 'allow', - }, - ], - - '@typescript-eslint/no-base-to-string': 'error', - - '@typescript-eslint/no-confusing-void-expression': ['error', { ignoreArrowShorthand: true }], - - /* [strict-null-checks] */ - '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'off', - - /* [strict-null-checks] */ - '@typescript-eslint/no-unnecessary-condition': 'off', - - '@typescript-eslint/no-unnecessary-qualifier': 'error', - - '@typescript-eslint/no-unnecessary-type-arguments': 'error', - - '@typescript-eslint/no-unsafe-argument': 'error', - - '@typescript-eslint/non-nullable-type-assertion-style': 'error', - - '@typescript-eslint/prefer-includes': 'error', - - /* - Both nullish coalescing (`??`) and logical OR (`||`) may be used - to provide default values in specific cases. - - Developers should choose the strictest operator for their use case: - - `??` to provide a default for nullish values (null or undefined). - - `||` to provide a default for values that are nullish or one of: empty string / boolean false. - - Logical OR checks should not be used for other falsy values such as numbers (0, -0, 0n, NaN). - */ - '@typescript-eslint/prefer-nullish-coalescing': 'off', - - '@typescript-eslint/prefer-optional-chain': 'error', - - '@typescript-eslint/prefer-readonly': 'error', - - /* - This rule requires adding `readonly` keywords to all levels of non-primitive parameters in order to prevent - any part of the parameter from being mutated. While the spirit of preferring not to mutate inputs is correct, - requiring it to be encoded via `readonly` is overly burdensome. - */ - '@typescript-eslint/prefer-readonly-parameter-types': 'off', - - '@typescript-eslint/prefer-reduce-type-parameter': 'error', - - '@typescript-eslint/prefer-return-this-type': 'error', - - '@typescript-eslint/prefer-string-starts-ends-with': 'error', - - '@typescript-eslint/promise-function-async': 'error', - - '@typescript-eslint/require-array-sort-compare': 'error', - - /* - [strict-null-checks] This rule requires the TypeScript strictNullChecks compiler flag. If strictNullChecks is enabled, disallow numbers - with the following configuration: - '@typescript-eslint/strict-boolean-expressions': ['error', { - allowNumber: false, - allowNullableBoolean: true, - allowNullableString: true, - allowNullableNumber: false - }] - */ - '@typescript-eslint/strict-boolean-expressions': 'off', - - /* - This rule is made redundant by `default-case` so it will never fire and is disabled. - */ - '@typescript-eslint/switch-exhaustiveness-check': 'off' + // Good, this will refer to the class where this code is defined + array.sort(() => this.compare()); + + // Bad, this will refer to the context where this code is invoked from + array.sort(this.compare); + ``` + 2. For callbacks passed to `addEventListener` which need to be referenced in `removeEventListener`, + the arrow function should be stored in a variable since it must refer to the same instance of the function. + ``` + // Good + const handler = event => this.clickHandler(); + elt.addEventListener('click', handler); + elt.removeEventListener('click', handler); + + // Bad, violates this rule + elt.addEventListener('click', this.clickHandler); + elt.removeEventListener('click', this.clickHandler); + + // Bad, removeEventListener isn't removing the original handler + elt.addEventListener('click', event => this.clickHandler()); + elt.removeEventListener('click', event => this.clickHandler()); + 3. If the function doesn't use `this` to refer to an instance or other static members, you can change the function to be static and the rule will ignore it. + */ + '@typescript-eslint/unbound-method': ['error', { ignoreStatic: true }], + + /* + Overrides to TypeScript type-checked stylistic rules: + https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/stylistic-type-checked.ts + */ + + '@typescript-eslint/consistent-generic-constructors': 'off', + '@typescript-eslint/prefer-regexp-exec': 'off', + + /* + Overrides to Typescript rules outside of the recommended configuration: + */ + + /* + Most of this configuration is identitical to the default with exceptions called out in comments below + */ + '@typescript-eslint/naming-convention': [ + 'error', + // Allow properties with custom-element-names, commonly used in HTMLElementNameTagMap + { + selector: 'property', + format: null, + filter: { + // custom element regex adapted from https://html-validate.org/rules/element-name.html + regex: '^[a-z][a-z0-9\\-._]*-[a-z0-9\\-._]*$', + match: true + } + }, + // The default configuration for this rule requires that enum members + // follow the camelCase style, which doesn't match the existing convention + // within NI and the broader TS community to use PascalCase. + { + selector: 'enumMember', + format: ['PascalCase'], + }, + { + selector: 'variable', + format: ['camelCase', 'UPPER_CASE'], + leadingUnderscore: 'allow', + trailingUnderscore: 'allow', + }, + { + selector: 'typeLike', + format: ['PascalCase'], + }, + { + selector: 'import', + format: ['camelCase', 'PascalCase'], + }, + { + selector: 'default', + format: ['camelCase'], + leadingUnderscore: 'allow', + trailingUnderscore: 'allow', + }, + ], + + '@typescript-eslint/no-base-to-string': 'error', + + '@typescript-eslint/no-confusing-void-expression': ['error', { ignoreArrowShorthand: true }], + + /* [strict-null-checks] */ + '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'off', + + /* [strict-null-checks] */ + '@typescript-eslint/no-unnecessary-condition': 'off', + + '@typescript-eslint/no-unnecessary-qualifier': 'error', + + '@typescript-eslint/no-unnecessary-type-arguments': 'error', + + '@typescript-eslint/no-unsafe-argument': 'error', + + '@typescript-eslint/non-nullable-type-assertion-style': 'error', + + '@typescript-eslint/prefer-includes': 'error', + + /* + Both nullish coalescing (`??`) and logical OR (`||`) may be used + to provide default values in specific cases. + + Developers should choose the strictest operator for their use case: + - `??` to provide a default for nullish values (null or undefined). + - `||` to provide a default for values that are nullish or one of: empty string / boolean false. + + Logical OR checks should not be used for other falsy values such as numbers (0, -0, 0n, NaN). + */ + '@typescript-eslint/prefer-nullish-coalescing': 'off', + + '@typescript-eslint/prefer-optional-chain': 'error', + + '@typescript-eslint/prefer-readonly': 'error', + + /* + This rule requires adding `readonly` keywords to all levels of non-primitive parameters in order to prevent + any part of the parameter from being mutated. While the spirit of preferring not to mutate inputs is correct, + requiring it to be encoded via `readonly` is overly burdensome. + */ + '@typescript-eslint/prefer-readonly-parameter-types': 'off', + + '@typescript-eslint/prefer-reduce-type-parameter': 'error', + + '@typescript-eslint/prefer-return-this-type': 'error', + + '@typescript-eslint/prefer-string-starts-ends-with': 'error', + + '@typescript-eslint/promise-function-async': 'error', + + '@typescript-eslint/require-array-sort-compare': 'error', + + /* + [strict-null-checks] This rule requires the TypeScript strictNullChecks compiler flag. If strictNullChecks is enabled, disallow numbers + with the following configuration: + '@typescript-eslint/strict-boolean-expressions': ['error', { + allowNumber: false, + allowNullableBoolean: true, + allowNullableString: true, + allowNullableNumber: false + }] + */ + '@typescript-eslint/strict-boolean-expressions': 'off', + + /* + This rule is made redundant by `default-case` so it will never fire and is disabled. + */ + '@typescript-eslint/switch-exhaustiveness-check': 'off' + } } -}; +]; diff --git a/tests/angular/.eslintrc.js b/tests/angular/.eslintrc.js deleted file mode 100644 index 71770892..00000000 --- a/tests/angular/.eslintrc.js +++ /dev/null @@ -1,21 +0,0 @@ -// Test TypeScript and templates together to process inline templates. -module.exports = { - ignorePatterns: ['*.js'], - overrides: [{ - extends: [ - '@ni/eslint-config-angular', - '@ni/eslint-config-angular/requiring-type-checking' - ], - files: ['*.ts'], - parserOptions: { - project: './tsconfig.json', - // Resolve the project relative to this file's directory. - // https://stackoverflow.com/questions/64933543/parsing-error-cannot-read-file-tsconfig-json-eslint - tsconfigRootDir: __dirname - } - }, { - extends: '@ni/eslint-config-angular/template', - files: ['*.html'] - }], - root: true -}; diff --git a/tests/angular/custom-ignore-attributes/.eslintrc.js b/tests/angular/custom-ignore-attributes/.eslintrc.js deleted file mode 100644 index f0dfcf33..00000000 --- a/tests/angular/custom-ignore-attributes/.eslintrc.js +++ /dev/null @@ -1,21 +0,0 @@ -const {ignoreAttributes} = require('@ni/eslint-config-angular/template/options'); - -module.exports = { - overrides: [{ - files: ['*.html'], - rules: { - '@angular-eslint/template/i18n': [ - 'error', - { - checkId: false, - ignoreAttributes: [...ignoreAttributes.all, 'custom-field'] - } - ], - } - }, { - files: ['*.spec.ts*.html'], - rules: { - '@angular-eslint/template/i18n': 'off' - } - }] -}; diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js new file mode 100644 index 00000000..0f2d504f --- /dev/null +++ b/tests/angular/eslint.config.js @@ -0,0 +1,59 @@ +import { fileURLToPath } from 'url'; +import path from 'path'; + +import angular from '@ni/eslint-config-angular'; +import angularTemplate from '@ni/eslint-config-angular/template'; +import angularRequiringTypeChecking from '@ni/eslint-config-angular/requiring-type-checking'; +import { ignoreAttributes } from '@ni/eslint-config-angular/template/options'; + +import typescriptPlugin from 'typescript-eslint'; +import angularTemplatePlugin from 'angular-eslint'; +import { defineConfig } from 'eslint/config'; + +const tsconfigRootDir = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig([ + { ignores: ['*.js'] }, + { + files: ['**/*.ts'], + extends: [...angular, ...angularRequiringTypeChecking], + languageOptions: { + parser: typescriptPlugin.parser, + parserOptions: { + project: ['./tsconfig.json'], + tsconfigRootDir, + }, + }, + }, + { + files: ['*.html'], + extends: [...angularTemplate], + languageOptions: { parser: angularTemplatePlugin.templateParser }, + }, + { + files: ['custom-ignore-attributes/**/*.html'], + languageOptions: { parser: angularTemplatePlugin.templateParser }, + plugins: { + '@angular-eslint/template': angularTemplatePlugin.templatePlugin, + }, + rules: { + '@angular-eslint/template/i18n': [ + 'error', + { + checkId: false, + ignoreAttributes: [...ignoreAttributes.all, 'custom-field'], + }, + ], + }, + }, + { + files: ['**/*.spec.ts*.html'], + languageOptions: { parser: angularTemplatePlugin.templateParser }, + plugins: { + '@angular-eslint/template': angularTemplatePlugin.templatePlugin, + }, + rules: { + '@angular-eslint/template/i18n': 'off', + }, + }, +]); diff --git a/tests/angular/package.json b/tests/angular/package.json index 34635835..b35c1e8d 100644 --- a/tests/angular/package.json +++ b/tests/angular/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "@ni/angular-test", "version": "1.0.0", "private": true, diff --git a/tests/javascript/.eslintrc.js b/tests/javascript/.eslintrc.js deleted file mode 100644 index dbabe919..00000000 --- a/tests/javascript/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-javascript', - root: true -}; \ No newline at end of file diff --git a/tests/javascript/eslint.config.js b/tests/javascript/eslint.config.js new file mode 100644 index 00000000..9ff51f5c --- /dev/null +++ b/tests/javascript/eslint.config.js @@ -0,0 +1,11 @@ +import javascript from '@ni/eslint-config-javascript'; + +export default [ + ...javascript, + { + files: ['*.config.js'], + rules: { + 'import/no-default-export': 'off', + }, + }, +]; diff --git a/tests/javascript/package.json b/tests/javascript/package.json index 0788365b..db9cc8f8 100644 --- a/tests/javascript/package.json +++ b/tests/javascript/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "@ni/javascript-test", "version": "1.0.0", "private": true, diff --git a/tests/playwright-requiring-type-checking/.eslintrc.js b/tests/playwright-requiring-type-checking/.eslintrc.js deleted file mode 100644 index f328aeb8..00000000 --- a/tests/playwright-requiring-type-checking/.eslintrc.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - extends: [ - '@ni/eslint-config-playwright', - '@ni/eslint-config-playwright/requiring-type-checking' - ], - ignorePatterns: ['*.js'], - parserOptions: { - project: ['./tsconfig.json'], - // Resolve the project relative to this file's directory. - // https://stackoverflow.com/questions/64933543/parsing-error-cannot-read-file-tsconfig-json-eslint - tsconfigRootDir: __dirname, - }, - root: true, - overrides: [ - { - files: [ - '*.ts', - ], - rules: { - // In this example app, all files are allowed to refer to playwright packages from devDependencies - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - } - } - ] -}; diff --git a/tests/playwright-requiring-type-checking/eslint.config.js b/tests/playwright-requiring-type-checking/eslint.config.js new file mode 100644 index 00000000..9d63af33 --- /dev/null +++ b/tests/playwright-requiring-type-checking/eslint.config.js @@ -0,0 +1,33 @@ +import { fileURLToPath } from 'url'; +import path from 'path'; +import playwright from '@ni/eslint-config-playwright'; +import playwrightRequiringTypeChecking from '@ni/eslint-config-playwright/requiring-type-checking'; + +const tsconfigRootDir = path.dirname(fileURLToPath(import.meta.url)); + +export default [ + ...playwright, + ...playwrightRequiringTypeChecking, + { + ignores: ['*.js'], + }, + { + files: ['*.ts'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.json'], + tsconfigRootDir, + }, + }, + rules: { + // In this example app, all files are allowed to refer to playwright packages from devDependencies + 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], + }, + }, + { + files: ['*.config.js'], + rules: { + 'import/no-default-export': 'off', + }, + }, +]; \ No newline at end of file diff --git a/tests/playwright-requiring-type-checking/package.json b/tests/playwright-requiring-type-checking/package.json index 16f4d4cc..63f94624 100644 --- a/tests/playwright-requiring-type-checking/package.json +++ b/tests/playwright-requiring-type-checking/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "@ni/playwright-requiring-type-checking-test", "version": "1.0.0", "private": true, diff --git a/tests/playwright/.eslintrc.js b/tests/playwright/.eslintrc.js deleted file mode 100644 index 137406ee..00000000 --- a/tests/playwright/.eslintrc.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-playwright', - root: true, - overrides: [ - { - files: [ - '*.ts', - ], - rules: { - // In this example app, all files are allowed to refer to playwright packages from devDependencies - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - } - } - ] -}; diff --git a/tests/playwright/eslint.config.js b/tests/playwright/eslint.config.js new file mode 100644 index 00000000..bbc51e6e --- /dev/null +++ b/tests/playwright/eslint.config.js @@ -0,0 +1,18 @@ +import playwright from '@ni/eslint-config-playwright'; + +export default [ + ...playwright, + { + files: ['*.ts'], + rules: { + // In this example app, all files are allowed to refer to playwright packages from devDependencies + 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], + }, + }, + { + files: ['*.config.js'], + rules: { + 'import/no-default-export': 'off', + }, + }, +]; diff --git a/tests/playwright/package.json b/tests/playwright/package.json index 87bcf55e..5e49a7fe 100644 --- a/tests/playwright/package.json +++ b/tests/playwright/package.json @@ -1,4 +1,5 @@ { + "type": "commonjs", "name": "@ni/playwright-test", "version": "1.0.0", "private": true, diff --git a/tests/print-evaluated-rules/.eslintrc.js b/tests/print-evaluated-rules/.eslintrc.js deleted file mode 100644 index b97633f2..00000000 --- a/tests/print-evaluated-rules/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-javascript', - root: true -}; diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js new file mode 100644 index 00000000..744b76f0 --- /dev/null +++ b/tests/print-evaluated-rules/eslint.config.js @@ -0,0 +1,12 @@ +import javascript from '@ni/eslint-config-javascript'; + +export default [ + ...javascript, + { + files: ['*.js'], + rules: { + 'import/no-default-export': 'off', + 'import/no-extraneous-dependencies': 'off', + }, + }, +]; \ No newline at end of file diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index e9ad36c0..f87d9392 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -1,30 +1,48 @@ -const { ESLint } = require('eslint'); -const angularRules = require('@ni/eslint-config-angular').rules; -const angularTemplateRules = require('@ni/eslint-config-angular/template').rules; -const fs = require('fs'); -const path = require('path'); -const yargs = require('yargs/yargs'); -const { hideBin } = require('yargs/helpers'); +/* eslint-disable no-console */ +/* eslint-disable no-undef */ +import { ESLint } from 'eslint'; +import angularRules from '@ni/eslint-config-angular'; +import angularTemplateRules from '@ni/eslint-config-angular/template'; +import fs from 'fs'; +import path from 'path'; +import yargs from 'yargs/yargs'; +import { hideBin } from 'yargs/helpers'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); (async () => { const argv = yargs(hideBin(process.argv)) .option('audit', { default: true, type: 'boolean' }) - .option('diff', { default: false, description: 'diff the evaluated rules with old rules from rules.txt', type: 'boolean' }) - .option('no-audit', { description: 'return the evaluated rules only', type: 'boolean' }) + .option('diff', { + default: false, + description: 'diff the evaluated rules with old rules from rules.txt', + type: 'boolean', + }) + .option('no-audit', { + description: 'return the evaluated rules only', + type: 'boolean', + }) .scriptName('') - .wrap(null) - .argv; + .wrap(null).argv; const hasWarn = function (config) { - return JSON.stringify(config).indexOf('"warn"') !== -1; + return JSON.stringify(config).includes('"warn"'); }; - const eslint = new ESLint(); - const configEslint = await eslint.calculateConfigForFile(require.resolve('@ni/javascript-test/index.js')); - const configTypescript = await eslint.calculateConfigForFile(require.resolve('@ni/typescript-test/index.ts')); - const configTypescriptTypechecked = await eslint.calculateConfigForFile(require.resolve('@ni/typescript-requiring-type-checking-test/index.ts')); - const configAngular = await eslint.calculateConfigForFile(require.resolve('@ni/angular-test/index.ts')); - const configAngularTemplate = await eslint.calculateConfigForFile(require.resolve('@ni/angular-test/index.html')); + const testDir = path.resolve(__dirname, '..'); + const jsPath = path.join(testDir, 'javascript', 'index.js'); + const tsPath = path.join(testDir, 'typescript', 'index.ts'); + const tsTypePath = path.join(testDir, 'typescript-requiring-type-checking', 'index.ts'); + const angularTsPath = path.join(testDir, 'angular', 'index.ts'); + const angularHtmlPath = path.join(testDir, 'angular', 'index.html'); + + const configEslint = await calculateConfigForFile(jsPath); + const configTypescript = await calculateConfigForFile(tsPath); + const configTypescriptTypechecked = await calculateConfigForFile(tsTypePath); + const configAngular = await calculateConfigForFile(angularTsPath); + const configAngularTemplate = await calculateConfigForFile(angularHtmlPath); const getRules = function () { return { @@ -59,9 +77,9 @@ const { hideBin } = require('yargs/helpers'); if (logs.length) { fs.writeFileSync(path.join(dir, 'rules-diff.txt'), logs.join('')); - global.console.log(logs.join('')); + console.log(logs.join('')); } else { - global.console.log('There were no changes.'); + console.log('There were no changes.'); } return; @@ -73,28 +91,53 @@ const { hideBin } = require('yargs/helpers'); fs.mkdirSync(dir); } fs.writeFileSync(path.join(dir, 'rules.txt'), json); - global.console.log(json); + console.log(json); return; } - const getDivergedRules = rules => ( - Object.keys(rules) - .filter(key => !key.startsWith('@angular-eslint')) - .filter(key => !configTypescript.rules[key] && !configTypescriptTypechecked.rules[key]) - .reduce((config, key) => { - config[key] = rules[key]; - return config; - }, {}) + const getDivergedRules = rules => Object.keys(rules) + .filter(key => !key.startsWith('@angular-eslint')) + .filter( + key => !configTypescript.rules[key] + && !configTypescriptTypechecked.rules[key] + ) + .reduce((config, key) => { + config[key] = rules[key]; + return config; + }, {}); + + const angularDivergedRules = getDivergedRules( + angularRules.map(cfg => cfg.rules) + ); + const angularTemplateDivergedRules = getDivergedRules( + angularTemplateRules.map(cfg => cfg.rules) + ); + const angularHasDivergedRules = !!Object.keys(angularDivergedRules).length + || !!Object.keys(angularTemplateDivergedRules).length; + + console.log('-------- Audits:'); + console.log(`Evaluated ESLint rules has warn?: ${hasWarn(configEslint)}`); + console.log( + `Evaluated TypeScript rules has warn?: ${hasWarn(configTypescript)}` + ); + console.log( + `Evaluated TypeScript type checking rules has warn?: ${hasWarn( + configTypescriptTypechecked + )}` + ); + console.log(`Evaluated Angular rules has warn?: ${hasWarn(configAngular)}`); + console.log( + `Evaluated Angular Template rules has warn?: ${hasWarn( + configAngularTemplate + )}` ); - const angularDivergedRules = getDivergedRules(angularRules); - const angularTemplateDivergedRules = getDivergedRules(angularTemplateRules); - const angularHasDivergedRules = !!Object.keys(angularDivergedRules).length || !!Object.keys(angularTemplateDivergedRules).length; - - global.console.log('-------- Audits:'); - global.console.log(`Evaluated ESLint rules has warn?: ${hasWarn(configEslint)}`); - global.console.log(`Evaluated TypeScript rules has warn?: ${hasWarn(configTypescript)}`); - global.console.log(`Evaluated TypeScript type checking rules has warn?: ${hasWarn(configTypescriptTypechecked)}`); - global.console.log(`Evaluated Angular rules has warn?: ${hasWarn(configAngular)}`); - global.console.log(`Evaluated Angular Template rules has warn?: ${hasWarn(configAngularTemplate)}`); - global.console.log(`Angular has diverged rules?: ${angularHasDivergedRules}`); + console.log(`Angular has diverged rules?: ${angularHasDivergedRules}`); })(); + +async function calculateConfigForFile(filePath) { + const eslint = new ESLint({ + cwd: path.resolve(filePath, '..') + }); + + return await eslint.calculateConfigForFile(filePath); +} diff --git a/tests/print-evaluated-rules/package.json b/tests/print-evaluated-rules/package.json index 8846c7a0..5fb87860 100644 --- a/tests/print-evaluated-rules/package.json +++ b/tests/print-evaluated-rules/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "@ni/print-evaluated-rules-test", "version": "1.0.0", "private": true, @@ -16,7 +17,7 @@ "@ni/javascript-test": "*", "@ni/typescript-test": "*", "@ni/typescript-requiring-type-checking-test": "*", - "eslint": "^8.57.0" + "eslint": "^9.0.0" }, "dependencies": { "yargs": "^17.7.2" diff --git a/tests/typescript-requiring-type-checking/.eslintrc.js b/tests/typescript-requiring-type-checking/.eslintrc.js deleted file mode 100644 index a907b9f7..00000000 --- a/tests/typescript-requiring-type-checking/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - extends: [ - '@ni/eslint-config-typescript', - '@ni/eslint-config-typescript/requiring-type-checking' - ], - ignorePatterns: ['*.js'], - parserOptions: { - project: ['./tsconfig.json'], - // Resolve the project relative to this file's directory. - // https://stackoverflow.com/questions/64933543/parsing-error-cannot-read-file-tsconfig-json-eslint - tsconfigRootDir: __dirname, - }, - root: true -}; diff --git a/tests/typescript-requiring-type-checking/eslint.config.js b/tests/typescript-requiring-type-checking/eslint.config.js new file mode 100644 index 00000000..774e9d92 --- /dev/null +++ b/tests/typescript-requiring-type-checking/eslint.config.js @@ -0,0 +1,23 @@ +import { fileURLToPath } from 'url'; +import path from 'path'; +import typescript from '@ni/eslint-config-typescript'; +import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; + +const tsconfigRootDir = path.dirname(fileURLToPath(import.meta.url)); + +export default [ + { + ignores: ['*.js'], + }, + ...typescript, + ...typescriptRequiringTypeChecking, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.json'], + tsconfigRootDir, + }, + }, + }, +]; diff --git a/tests/typescript-requiring-type-checking/package.json b/tests/typescript-requiring-type-checking/package.json index 937c0191..fa42018d 100644 --- a/tests/typescript-requiring-type-checking/package.json +++ b/tests/typescript-requiring-type-checking/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "@ni/typescript-requiring-type-checking-test", "version": "1.0.0", "private": true, diff --git a/tests/typescript/.eslintrc.js b/tests/typescript/.eslintrc.js deleted file mode 100644 index 2680f663..00000000 --- a/tests/typescript/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - extends: '@ni/eslint-config-typescript', - root: true -}; diff --git a/tests/typescript/eslint.config.js b/tests/typescript/eslint.config.js new file mode 100644 index 00000000..038801a1 --- /dev/null +++ b/tests/typescript/eslint.config.js @@ -0,0 +1,16 @@ +import { fileURLToPath } from 'url'; +import path from 'path'; +import typescript from '@ni/eslint-config-typescript'; +import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; + +import typescript from '@ni/eslint-config-typescript'; + +export default [ + ...typescript, + { + files: ['*.js'], + rules: { + 'import/no-default-export': 'off', + }, + }, +]; \ No newline at end of file diff --git a/tests/typescript/package.json b/tests/typescript/package.json index 9b3acb14..b389c04e 100644 --- a/tests/typescript/package.json +++ b/tests/typescript/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "@ni/typescript-test", "version": "1.0.0", "private": true, From ff130281ac34a68e0a9764491f9f9208868ac4da Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 15 Sep 2025 15:52:55 +0530 Subject: [PATCH 02/53] fix: issues Signed-off-by: gokulprasanth-ni --- .../eslint-config-angular/eslint.config.js | 18 +++++------ packages/eslint-config-angular/index.js | 6 ---- .../requiring-type-checking.js | 26 ++++++++-------- packages/eslint-config-javascript/index.js | 22 ++++++------- .../rules/best-practices.js | 2 +- .../eslint-config-javascript/rules/style.js | 8 +---- .../eslint-config-playwright/eslint.config.js | 16 +++++----- .../tools/print-available-rules.js | 1 - .../eslint-config-typescript/eslint.config.js | 20 ++++++------ packages/eslint-config-typescript/index.js | 4 +-- .../lib/extensions-requiring-type-checking.js | 6 ++-- .../lib/extensions.js | 4 +-- .../tools/print-available-rules.js | 31 ++++++++++--------- tests/javascript/eslint.config.js | 14 ++++----- tests/playwright/eslint.config.js | 28 ++++++++--------- tests/print-evaluated-rules/eslint.config.js | 16 +++++----- tests/typescript/eslint.config.js | 19 +++++------- 17 files changed, 112 insertions(+), 129 deletions(-) diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index 68b70b75..50b45f34 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -1,13 +1,13 @@ import javascript from '@ni/eslint-config-javascript'; export default [ - ...javascript, - { - files: ['**/*.js'], - rules: { - 'import/no-default-export': 'off', - 'import/no-extraneous-dependencies': 'off', - 'import/no-unresolved': 'off', - }, - }, + ...javascript, + { + files: ['**/*.js'], + rules: { + 'import/no-default-export': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-unresolved': 'off', + }, + }, ]; \ No newline at end of file diff --git a/packages/eslint-config-angular/index.js b/packages/eslint-config-angular/index.js index ad34f3ce..ed9a2c61 100644 --- a/packages/eslint-config-angular/index.js +++ b/packages/eslint-config-angular/index.js @@ -7,12 +7,6 @@ export default [ { processor: angular.processInlineTemplates, rules: { - /* - Overrides to Angular recommended rules: - https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.json - */ - - '@angular-eslint/no-host-metadata-property': 'error', /* '@angular-eslint/no-input-rename' rule notes: diff --git a/packages/eslint-config-angular/requiring-type-checking.js b/packages/eslint-config-angular/requiring-type-checking.js index 4e59d0b8..4cc11c10 100644 --- a/packages/eslint-config-angular/requiring-type-checking.js +++ b/packages/eslint-config-angular/requiring-type-checking.js @@ -2,20 +2,20 @@ import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requir import typescriptPlugin from 'typescript-eslint'; export default [ - ...typescriptRequiringTypeChecking, - { - languageOptions: { - parser: typescriptPlugin.parser, - }, - }, - { - files: ['**/*.spec.ts'], - rules: { - /* + ...typescriptRequiringTypeChecking, + { + languageOptions: { + parser: typescriptPlugin.parser, + }, + }, + { + files: ['**/*.spec.ts'], + rules: { + /* Spies used by Angular application tests result in a significant number of unbound methods so this rule is disabled for test specs in Angular projects. */ - '@typescript-eslint/unbound-method': 'off', - }, - }, + '@typescript-eslint/unbound-method': 'off', + }, + }, ]; diff --git a/packages/eslint-config-javascript/index.js b/packages/eslint-config-javascript/index.js index 421ec2dc..10f95075 100644 --- a/packages/eslint-config-javascript/index.js +++ b/packages/eslint-config-javascript/index.js @@ -10,7 +10,7 @@ import { imports } from './rules/imports.js'; import { strict } from './rules/strict.js'; export default [ - stylisticPlugin.configs['disable-legacy'], + stylisticPlugin.configs['disable-legacy'], bestPractices, errors, node, @@ -19,14 +19,14 @@ export default [ es6, imports, strict, - { - plugins: { - '@stylistic': stylisticPlugin, - import: importPlugin, - }, - languageOptions: { - ecmaVersion: 2022, - sourceType: 'module' - } - }, + { + plugins: { + '@stylistic': stylisticPlugin, + import: importPlugin, + }, + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module' + } + }, ]; \ No newline at end of file diff --git a/packages/eslint-config-javascript/rules/best-practices.js b/packages/eslint-config-javascript/rules/best-practices.js index 89a049e2..609fd042 100644 --- a/packages/eslint-config-javascript/rules/best-practices.js +++ b/packages/eslint-config-javascript/rules/best-practices.js @@ -1,4 +1,4 @@ -export const bestPractices ={ +export const bestPractices = { rules: { /* enforces getter/setter pairs in objects diff --git a/packages/eslint-config-javascript/rules/style.js b/packages/eslint-config-javascript/rules/style.js index 272a24f3..4c392f92 100644 --- a/packages/eslint-config-javascript/rules/style.js +++ b/packages/eslint-config-javascript/rules/style.js @@ -111,12 +111,6 @@ export const style = { */ '@stylistic/function-call-argument-newline': ['error', 'consistent'], - /* - enforce spacing between functions and their invocations - https://eslint.style/rules/func-call-spacing - */ - '@stylistic/func-call-spacing': ['error', 'never'], - /* requires function names to match the name of the variable or property to which they are assigned https://eslint.org/docs/rules/func-name-matching @@ -465,7 +459,7 @@ export const style = { deprecated in favor of func-call-spacing https://eslint.style/rules/function-call-spacing */ - '@stylistic/function-call-spacing': 'off', + '@stylistic/function-call-spacing': ['error', 'never'], /* disallow tab characters entirely diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index cfa57ecd..b9af386f 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -1,12 +1,12 @@ import javascript from '@ni/eslint-config-javascript'; export default [ - ...javascript, - { - rules: { - 'import/no-default-export': 'off', - 'import/no-extraneous-dependencies': 'off', - 'import/no-unresolved': 'off', - }, - }, + ...javascript, + { + rules: { + 'import/no-default-export': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-unresolved': 'off', + }, + }, ]; diff --git a/packages/eslint-config-playwright/tools/print-available-rules.js b/packages/eslint-config-playwright/tools/print-available-rules.js index 3f87c86a..0dcedb37 100644 --- a/packages/eslint-config-playwright/tools/print-available-rules.js +++ b/packages/eslint-config-playwright/tools/print-available-rules.js @@ -20,4 +20,3 @@ console.log('Playwright Recommended:'); print(playwrightRecommended); console.log('Remaining Playwright Rules:'); print(playwright); - diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index 76d66b38..deaa4741 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -1,14 +1,14 @@ import javascript from '@ni/eslint-config-javascript'; export default [ - ...javascript, - { - files: ['**/*.js'], - rules: { - 'import/no-default-export': 'off', - 'import/extensions': 'off', - 'import/no-extraneous-dependencies': 'off', - 'import/no-unresolved': 'off', - }, - }, + ...javascript, + { + files: ['**/*.js'], + rules: { + 'import/no-default-export': 'off', + 'import/extensions': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-unresolved': 'off', + }, + }, ]; diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index c1ce1330..f6a907fe 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -95,7 +95,7 @@ export default [ definitions, consistent with classes. Object literal types should use commas consistent with object literals. */ - '@typescript-eslint/member-delimiter-style': ['error', { + '@stylistic/member-delimiter-style': ['error', { overrides: { interface: { singleline: { @@ -217,7 +217,7 @@ export default [ */ '@typescript-eslint/sort-type-union-intersection-members': 'off', - '@typescript-eslint/type-annotation-spacing': 'error', + '@stylistic/type-annotation-spacing': 'error', /* This rule is better enforced with the TypeScript `noImplicitAny` and diff --git a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js index 153d7322..64208561 100644 --- a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js +++ b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js @@ -1,4 +1,4 @@ -export const extensionsRequiringTypeChecking = { +export default [{ rules: { 'dot-notation': 'off', '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }], @@ -7,7 +7,7 @@ export const extensionsRequiringTypeChecking = { '@typescript-eslint/no-implied-eval': 'error', 'no-throw-literal': 'off', - '@typescript-eslint/no-throw-literal': 'error', + '@typescript-eslint/only-throw-error': 'error', 'require-await': 'off', '@typescript-eslint/require-await': 'error', @@ -15,4 +15,4 @@ export const extensionsRequiringTypeChecking = { 'no-return-await': 'off', '@typescript-eslint/return-await': ['error', 'always'], } -}; +}]; diff --git a/packages/eslint-config-typescript/lib/extensions.js b/packages/eslint-config-typescript/lib/extensions.js index da4e9312..bf6e6fc9 100644 --- a/packages/eslint-config-typescript/lib/extensions.js +++ b/packages/eslint-config-typescript/lib/extensions.js @@ -1,4 +1,4 @@ -export const extensions = { +export default [{ rules: { /* The following are extension rules that replace core JavaScript rules to support @@ -75,4 +75,4 @@ export const extensions = { 'no-useless-constructor': 'off', '@typescript-eslint/no-useless-constructor': 'error', } -}; +}]; diff --git a/packages/eslint-config-typescript/tools/print-available-rules.js b/packages/eslint-config-typescript/tools/print-available-rules.js index 79822771..f368bf88 100644 --- a/packages/eslint-config-typescript/tools/print-available-rules.js +++ b/packages/eslint-config-typescript/tools/print-available-rules.js @@ -1,22 +1,23 @@ +/* eslint-disable no-undef */ +/* eslint-disable no-console */ // eslint-plugin-import doesn't know how to resolve entry points in commonjs modules that are // declared using "export" rather than the old "main" syntax in package.json. // See https://github.com/typescript-eslint/typescript-eslint/issues/7565 // and https://github.com/import-js/eslint-plugin-import/issues/2703 -// eslint-disable-next-line import/no-unresolved -const plugin = require('@typescript-eslint/eslint-plugin'); +import typescriptPlugin from 'typescript-eslint'; const isTrue = val => val !== undefined && val !== false; -const recommended = key => isTrue(plugin.rules[key].meta.docs.recommended); -const requiresTypeChecking = key => isTrue(plugin.rules[key].meta.docs.requiresTypeChecking); -const extendsBaseRule = key => isTrue(plugin.rules[key].meta.docs.extendsBaseRule); +const recommended = key => isTrue(typescriptPlugin.plugin.rules[key].meta.docs.recommended); +const requiresTypeChecking = key => isTrue(typescriptPlugin.plugin.rules[key].meta.docs.requiresTypeChecking); +const extendsBaseRule = key => isTrue(typescriptPlugin.plugin.rules[key].meta.docs.extendsBaseRule); const print = keys => { const results = {}; keys.forEach(key => { - results[`@typescript-eslint/${key}`] = ''; + results[`typescript-eslint/${key}`] = ''; }); - global.console.log(JSON.stringify(results, null, 4)); + console.log(JSON.stringify(results, null, 4)); }; -const sortedRules = Object.keys(plugin.rules).sort(); +const sortedRules = Object.keys(typescriptPlugin.plugin.rules).sort(); const typeScriptExtensions = sortedRules .filter(key => extendsBaseRule(key)) @@ -46,16 +47,16 @@ const typeScriptRecommendedTypeChecks = sortedRules .filter(key => recommended(key)) .filter(key => requiresTypeChecking(key)); -global.console.log('TypeScript Extensions:'); +console.log('TypeScript Extensions:'); print(typeScriptExtensions); -global.console.log('TypeScript Recommended:'); +console.log('TypeScript Recommended:'); print(typeScriptRecommended); -global.console.log('Remaining TypeScript Rules:'); +console.log('Remaining TypeScript Rules:'); print(typeScript); -global.console.log('TypeScript Extensions Requiring Type Checks:'); +console.log('TypeScript Extensions Requiring Type Checks:'); print(typeScriptExtensionsRequiringTypeChecks); -global.console.log('TypeScript Recommended Requiring Type Checks:'); +console.log('TypeScript Recommended Requiring Type Checks:'); print(typeScriptRecommendedTypeChecks); -global.console.log('Remaining TypeScript Rules Requiring Type Checks:'); -print(typeScriptRequiringTypeChecks); +console.log('Remaining TypeScript Rules Requiring Type Checks:'); +print(typeScriptRequiringTypeChecks); \ No newline at end of file diff --git a/tests/javascript/eslint.config.js b/tests/javascript/eslint.config.js index 9ff51f5c..c4b7464a 100644 --- a/tests/javascript/eslint.config.js +++ b/tests/javascript/eslint.config.js @@ -1,11 +1,11 @@ import javascript from '@ni/eslint-config-javascript'; export default [ - ...javascript, - { - files: ['*.config.js'], - rules: { - 'import/no-default-export': 'off', - }, - }, + ...javascript, + { + files: ['*.config.js'], + rules: { + 'import/no-default-export': 'off', + }, + }, ]; diff --git a/tests/playwright/eslint.config.js b/tests/playwright/eslint.config.js index bbc51e6e..8ad867ec 100644 --- a/tests/playwright/eslint.config.js +++ b/tests/playwright/eslint.config.js @@ -1,18 +1,18 @@ import playwright from '@ni/eslint-config-playwright'; export default [ - ...playwright, - { - files: ['*.ts'], - rules: { - // In this example app, all files are allowed to refer to playwright packages from devDependencies - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - }, - }, - { - files: ['*.config.js'], - rules: { - 'import/no-default-export': 'off', - }, - }, + ...playwright, + { + files: ['*.ts'], + rules: { + // In this example app, all files are allowed to refer to playwright packages from devDependencies + 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], + }, + }, + { + files: ['*.config.js'], + rules: { + 'import/no-default-export': 'off', + }, + }, ]; diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js index 744b76f0..20f4fce2 100644 --- a/tests/print-evaluated-rules/eslint.config.js +++ b/tests/print-evaluated-rules/eslint.config.js @@ -1,12 +1,12 @@ import javascript from '@ni/eslint-config-javascript'; export default [ - ...javascript, - { - files: ['*.js'], - rules: { - 'import/no-default-export': 'off', - 'import/no-extraneous-dependencies': 'off', - }, - }, + ...javascript, + { + files: ['*.js'], + rules: { + 'import/no-default-export': 'off', + 'import/no-extraneous-dependencies': 'off', + }, + }, ]; \ No newline at end of file diff --git a/tests/typescript/eslint.config.js b/tests/typescript/eslint.config.js index 038801a1..0de43fe1 100644 --- a/tests/typescript/eslint.config.js +++ b/tests/typescript/eslint.config.js @@ -1,16 +1,11 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; -import typescript from '@ni/eslint-config-typescript'; -import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; - import typescript from '@ni/eslint-config-typescript'; export default [ - ...typescript, - { - files: ['*.js'], - rules: { - 'import/no-default-export': 'off', - }, - }, + ...typescript, + { + files: ['*.js'], + rules: { + 'import/no-default-export': 'off', + }, + }, ]; \ No newline at end of file From 96e9cabc655cd28066e53bc9b3a86f7c3e35c982 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 15 Sep 2025 16:01:35 +0530 Subject: [PATCH 03/53] fix: test issue Signed-off-by: gokulprasanth-ni --- tests/angular/eslint.config.js | 2 +- tests/print-evaluated-rules/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index 0f2d504f..1176b8ae 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -56,4 +56,4 @@ export default defineConfig([ '@angular-eslint/template/i18n': 'off', }, }, -]); +]); \ No newline at end of file diff --git a/tests/print-evaluated-rules/package.json b/tests/print-evaluated-rules/package.json index 5fb87860..76693341 100644 --- a/tests/print-evaluated-rules/package.json +++ b/tests/print-evaluated-rules/package.json @@ -11,7 +11,7 @@ "print-evaluated-rules:no-audit": "node index.js --no-audit" }, "peerDependencies": { - "@angular-eslint/eslint-plugin": "^18.4.3", + "angular-eslint": "19.0.0", "@ni/angular-test": "*", "@ni/eslint-config-angular": "*", "@ni/javascript-test": "*", From 37d08075935aefbc00f0640626fc09f1b8efb152 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 15 Sep 2025 16:04:34 +0530 Subject: [PATCH 04/53] update angular-eslint version Signed-off-by: gokulprasanth-ni --- package-lock.json | 201 +++++++++++++--------------------------------- 1 file changed, 54 insertions(+), 147 deletions(-) diff --git a/package-lock.json b/package-lock.json index 94899be1..2d3331bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -135,9 +135,9 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.8.1.tgz", - "integrity": "sha512-NOMkw0xgDoDVCLkL5nkkvdd3ouDYkOGqtEmabTR7N4/kQnk1R4coOTWGCqAgMXCFdxlyjuxquDwuJ+yni81pRg==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.0.0.tgz", + "integrity": "sha512-vi68ADoEKrg2SB87jwUCaVhOhWPpXyG6X8QJzg8AiYDCQY721x1l6Pdz6WZOPruWALyoIyFGFXqtuysDGqIBhw==", "license": "MIT", "peer": true, "dependencies": { @@ -150,21 +150,21 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.4.3.tgz", - "integrity": "sha512-zdrA8mR98X+U4YgHzUKmivRU+PxzwOL/j8G7eTOvBuq8GPzsP+hvak+tyxlgeGm9HsvpFj9ERHLtJ0xDUPs8fg==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.0.tgz", + "integrity": "sha512-q6IaiqKYcmBW/gw55tytDucguo5E48szVCLNLHUFdN98YDDsP+KM3MPWYPyZcXpusmFfIjLdr8d41PlKmyMUpg==", "license": "MIT", "peer": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.4.3.tgz", - "integrity": "sha512-AyJbupiwTBR81P6T59v+aULEnPpZBCBxL2S5QFWfAhNCwWhcof4GihvdK2Z87yhvzDGeAzUFSWl/beJfeFa+PA==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.0.tgz", + "integrity": "sha512-WkUnH5zmvC/cH6f8BGiRK+KebrKdGbQmhtu3IHLEyzG9U4mBiIV8XkSzhdkY3RCN8bKqhmE5C3oNBLNCtvg4QQ==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3" + "@angular-eslint/bundled-angular-compiler": "19.0.0", + "@angular-eslint/utils": "19.0.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -173,119 +173,71 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.8.1.tgz", - "integrity": "sha512-0ZVQldndLrDfB0tzFe/uIwvkUcakw8qGxvkEU0l7kSbv/ngNQ/qrkRi7P64otB15inIDUNZI2jtmVat52dqSfQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.0.tgz", + "integrity": "sha512-d2NzuAyvFo00QGBv6BLno0KZ3Ptd+UNVHpI9vwU0giaZcjVsdKbcMvMfynkvHAAwVIVw5aSLwabIjnm0rc3x3A==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1", - "@angular-eslint/utils": "19.8.1", + "@angular-eslint/bundled-angular-compiler": "19.0.0", + "@angular-eslint/utils": "19.0.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { - "@angular-eslint/template-parser": "19.8.1", "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", - "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", - "license": "MIT", - "peer": true - }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/utils": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", - "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, "node_modules/@angular-eslint/schematics": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.8.1.tgz", - "integrity": "sha512-MKzfO3puOCuQFgP8XDUkEr5eaqcCQLAdYLLMcywEO/iRs1eRHL46+rkW+SjDp1cUqlxKtu+rLiTYr0T/O4fi9Q==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.0.0.tgz", + "integrity": "sha512-fle4SMxjI+91y5eR6hVG7yhzJHAw87LudHw918hGUVn2INIAW1TTuuQNoah8kNg9I6ICIDat26IenD4nOau6Gg==", "license": "MIT", "peer": true, "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", - "@angular-eslint/eslint-plugin": "19.8.1", - "@angular-eslint/eslint-plugin-template": "19.8.1", - "ignore": "7.0.5", - "semver": "7.7.2", + "@angular-eslint/eslint-plugin": "19.0.0", + "@angular-eslint/eslint-plugin-template": "19.0.0", + "ignore": "6.0.2", + "semver": "7.6.3", "strip-json-comments": "3.1.1" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", - "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", - "license": "MIT", - "peer": true - }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz", - "integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==", + "node_modules/@angular-eslint/schematics/node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "license": "MIT", "peer": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1", - "@angular-eslint/utils": "19.8.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "engines": { + "node": ">= 4" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/utils": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", - "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", - "license": "MIT", + "node_modules/@angular-eslint/schematics/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "peer": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1" + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", - "peer": true, "engines": { - "node": ">= 4" + "node": ">=10" } }, "node_modules/@angular-eslint/template-parser": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.8.1.tgz", - "integrity": "sha512-pQiOg+se1AU/ncMlnJ9V6xYnMQ84qI1BGWuJpbU6A99VTXJg90scg0+T7DWmKssR1YjP5qmmBtrZfKsHEcLW/A==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.0.tgz", + "integrity": "sha512-bOLMNBQbrLMujGWSda0SF8ka7snQ9Uzxie1dr5LquI104p2J4Wt90DOoaWzhNaBBwedt3WXmhSHmvvR9720kHA==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1", + "@angular-eslint/bundled-angular-compiler": "19.0.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -293,21 +245,14 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", - "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", - "license": "MIT", - "peer": true - }, "node_modules/@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.0.tgz", + "integrity": "sha512-PH40BmIcIr5ldr08XYnqJ8cTzJfScJjBym4SECsilBnz5fhCdTD7UEQiW4d0P78Ie8H5PxvOJx9ZE+L4WBNrTA==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" + "@angular-eslint/bundled-angular-compiler": "19.0.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -1075,19 +1020,19 @@ } }, "node_modules/angular-eslint": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-19.8.1.tgz", - "integrity": "sha512-A6mPcVAXEDdJk7bKKBwd+1b/VA/xwpWWN2fExTGO1dkVNPz550LlgxBjEio9G7u4i+pD2aLrl6Cx6O+9o1iusQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-19.0.0.tgz", + "integrity": "sha512-8qYxqVMoRVKlpDKuGiNMG9ZPk7ke7ZOo3IxefFsB7Fpom8iRjOnH9tD9gLeYCHZWY1qYignLdeRqYmF/rRxF1A==", "license": "MIT", "peer": true, "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", - "@angular-eslint/builder": "19.8.1", - "@angular-eslint/eslint-plugin": "19.8.1", - "@angular-eslint/eslint-plugin-template": "19.8.1", - "@angular-eslint/schematics": "19.8.1", - "@angular-eslint/template-parser": "19.8.1", + "@angular-eslint/builder": "19.0.0", + "@angular-eslint/eslint-plugin": "19.0.0", + "@angular-eslint/eslint-plugin-template": "19.0.0", + "@angular-eslint/schematics": "19.0.0", + "@angular-eslint/template-parser": "19.0.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, @@ -1097,44 +1042,6 @@ "typescript-eslint": "^8.0.0" } }, - "node_modules/angular-eslint/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", - "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", - "license": "MIT", - "peer": true - }, - "node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz", - "integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1", - "@angular-eslint/utils": "19.8.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/angular-eslint/node_modules/@angular-eslint/utils": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", - "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5256,12 +5163,12 @@ "yargs": "^17.7.2" }, "peerDependencies": { - "@angular-eslint/eslint-plugin": "^18.4.3", "@ni/angular-test": "*", "@ni/eslint-config-angular": "*", "@ni/javascript-test": "*", "@ni/typescript-requiring-type-checking-test": "*", "@ni/typescript-test": "*", + "angular-eslint": "19.0.0", "eslint": "^9.0.0" } }, From dfbed78c9ecbe4006d3c9714807c50e15456658f Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 15 Sep 2025 16:05:59 +0530 Subject: [PATCH 05/53] update to type module Signed-off-by: gokulprasanth-ni --- tests/playwright/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/playwright/package.json b/tests/playwright/package.json index 5e49a7fe..ff9e599d 100644 --- a/tests/playwright/package.json +++ b/tests/playwright/package.json @@ -1,5 +1,5 @@ { - "type": "commonjs", + "type": "module", "name": "@ni/playwright-test", "version": "1.0.0", "private": true, From 0168590930d79a4635a8c7b4f3fb04fd83efc409 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 15 Sep 2025 16:08:32 +0530 Subject: [PATCH 06/53] Change files --- ...onfig-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json | 7 +++++++ ...ig-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json | 7 +++++++ ...ig-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json | 7 +++++++ ...ig-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json | 7 +++++++ 4 files changed, 28 insertions(+) create mode 100644 change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json create mode 100644 change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json create mode 100644 change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json create mode 100644 change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json diff --git a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json new file mode 100644 index 00000000..7f402354 --- /dev/null +++ b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json @@ -0,0 +1,7 @@ +{ + "type": "major", + "comment": "Update eslint-config-angular to be compatible with eslint v9", + "packageName": "@ni/eslint-config-angular", + "email": "gokulprasanth.ravi@emerson.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json b/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json new file mode 100644 index 00000000..068a914f --- /dev/null +++ b/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json @@ -0,0 +1,7 @@ +{ + "type": "major", + "comment": "Update eslint-config-javascript to be compatible with eslint v9", + "packageName": "@ni/eslint-config-javascript", + "email": "gokulprasanth.ravi@emerson.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json new file mode 100644 index 00000000..bc2adaa5 --- /dev/null +++ b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json @@ -0,0 +1,7 @@ +{ + "type": "major", + "comment": "Update eslint-config-playwright to be compatible with eslint v9", + "packageName": "@ni/eslint-config-playwright", + "email": "gokulprasanth.ravi@emerson.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json new file mode 100644 index 00000000..c49d73a0 --- /dev/null +++ b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json @@ -0,0 +1,7 @@ +{ + "type": "major", + "comment": "Update eslint-config-typescript to be compatible with eslint v9", + "packageName": "@ni/eslint-config-typescript", + "email": "gokulprasanth.ravi@emerson.com", + "dependentChangeType": "patch" +} From 382bacb6637e15791de0579660059a193604cf68 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 15 Sep 2025 17:29:52 +0530 Subject: [PATCH 07/53] update readme doc Signed-off-by: gokulprasanth-ni --- README.md | 120 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 273f8067..77836064 100644 --- a/README.md +++ b/README.md @@ -69,80 +69,102 @@ After installing the lint configuration packages, follow the configuration instr ### JavaScript configuration -Extend `@ni/eslint-config-javascript` in the [ESLint configuration](https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats). +Spread `@ni/eslint-config-javascript` configurations in your [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): ```js -{ - extends: '@ni/eslint-config-javascript' -} +import javascript from '@ni/eslint-config-javascript'; + +export default [ + ...javascript, +]; ``` ### TypeScript configuration -Extend `@ni/eslint-config-typescript` and `@ni/eslint-config-typescript/requiring-type-checking` in the [ESLint configuration](https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +Spread `@ni/eslint-config-typescript` and `@ni/eslint-config-typescript/requiring-type-checking` configurations in the [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. ```js -{ - extends: [ - '@ni/eslint-config-typescript', - '@ni/eslint-config-typescript/requiring-type-checking' - ], - parserOptions: { - project: 'tsconfig.json' +import typescript from '@ni/eslint-config-typescript'; +import typescriptTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; + +export default [ + ...typescript, + ...typescriptTypeChecking, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: './tsconfig.json' + } + } } -} +]; ``` ### Angular configuration -ESLint support for Angular is provided by [`@angular-eslint`](https://github.com/angular-eslint/angular-eslint#readme). **It's recommended to use `@angular-eslint/schematics` to -configure ESLint for Angular projects**. +ESLint support for Angular is provided by [`angular-eslint`](https://github.com/angular-eslint/angular-eslint#readme). -1. **For single and multi-project workspaces**, [add the schematic](https://github.com/angular-eslint/angular-eslint#quick-start). Remove the `@angular-eslint`, `@typescript-eslint`, and `eslint` dependencies from `package.json`. +1. **For single and multi-project workspaces**, [add the angular-eslint](https://github.com/angular-eslint/angular-eslint#quick-start). Remove the `angular-eslint` and `eslint` dependencies from `package.json`. ```bash - ng add @angular-eslint/schematics + ng add angular-eslint ``` 2. **For multi-project workspaces**, [configure each project](https://github.com/angular-eslint/angular-eslint#adding-eslint-configuration-to-an-existing-angular-cli-project-which-has-no-existing-linter), and then enable future generated projects to be configured as well. ```bash - > ng g @angular-eslint/schematics:add-eslint-to-project - > ng config cli.schematicCollections "[\"@angular-eslint/schematics\"]" + > ng g angular-eslint:add-eslint-to-project + > ng config cli.schematicCollections "[\"angular-eslint\"]" ``` -3. Extend the NI configured rules for Angular and Angular templates in the [ESLint configuration](https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +3. Spread the NI configured rules for Angular and Angular templates in the [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. ```js - overrides: [{ - files: ['*.ts'], - extends: [ - '@ni/eslint-config-angular', - '@ni/eslint-config-angular/requiring-type-checking' - ], - parserOptions: { - project: 'tsconfig.json' + import angular from '@ni/eslint-config-angular'; + import angularTypeChecking from '@ni/eslint-config-angular/requiring-type-checking'; + import angularTemplate from '@ni/eslint-config-angular/template'; + + export default [ + { + files: ['**/*.ts'], + extends: [ + ...angular, + ...angularTypeChecking + ], + languageOptions: { + parserOptions: { + project: './tsconfig.json' + } + } + }, + { + files: ['*.html'], + extends: [...angularTemplate] } - }, { - files: ['*.html'], - extends: ['@ni/eslint-config-angular/template'] - }] + ]; ``` 4. Evaluate the [project specific rule groups](#evaluate-project-specific-rule-groups) to manually add to your lint configuration. For Angular applications in particular, consider enabling the [`[application-prefix]`](#application-prefix) rule group. ### Playwright configuration -Extend `@ni/eslint-config-playwright` and `@ni/eslint-config-playwright/requiring-type-checking` in the [ESLint configuration](https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +Spread `@ni/eslint-config-playwright` and `@ni/eslint-config-playwright/requiring-type-checking` in the [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. **Note:** The Playwright configurations extend the TypeScript configurations, so it is not necessary for an application to extend them both. However, the Playwright configurations should only be applied to directories that contain Playwright tests and utilities. ```js // This is an example .eslintrc.js in a Playwright-specific directory. // If Playwright files are mixed with other code, use an "overrides" file pattern to match only Playwright code. -{ - extends: [ - '@ni/eslint-config-playwright', - '@ni/eslint-config-playwright/requiring-type-checking' - ], - parserOptions: { - project: 'tsconfig.json' +import playwright from '@ni/eslint-config-playwright'; +import playwrightTypeChecking from '@ni/eslint-config-playwright/requiring-type-checking'; + +export default [ + ...playwright, + ...playwrightTypeChecking, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: './tsconfig.json' + } + } } -} +]; ``` ## Usage @@ -257,15 +279,17 @@ To disable a rule globally, modify the `rules` section of the [ESLint configurat } ``` -To disable a rule for a specific file pattern or directory, modify the `overrides` section of the [ESLint configuration](https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats): +To disable a rule for a specific file pattern or directory, update the rules section for that file pattern in the [ESLint configuration](https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats): ```js - overrides: [{ +export default [ + // ...other configs + { files: ['*.stories.ts'], rules: { - // This rule is disabled as an example 'import/no-default-export': 'off' } - }] + } +]; ``` ### Inline disable rules that don't apply to a particular situation @@ -297,7 +321,7 @@ You can [configure a repository to prompt developers to install this extension]( } ``` -Follow the `@angular-eslint` [instructions](https://github.com/angular-eslint/angular-eslint#linting-html-files-and-inline-templates-with-the-vscode-extension-for-eslint) for linting HTML files and inline-templates with Angular. +Follow the `angular-eslint` [instructions](https://github.com/angular-eslint/angular-eslint#linting-html-files-and-inline-templates-with-the-vscode-extension-for-eslint) for linting HTML files and inline-templates with Angular. #### JetBrains WebStorm @@ -326,11 +350,11 @@ This option can be adapted for npm scripts, for example. If there are situations where the analysis time for enabling the type checked rules is an excessive burden you may consider creating a separate ESLint configuration that avoids extending the type checked rules and omits the `parserOptions.project` configuration to run in specific scenarios. -See discussion in the [performance section](https://github.com/typescript-eslint/typescript-eslint/blob/main/docs/getting-started/linting/TYPED_LINTING.md#performance) of the Getting Started - Linting with Type Information guide. +See discussion in the [performance section](https://typescript-eslint.io/troubleshooting/typed-linting/performance/) of the Getting Started - Linting with Type Information guide. ### Angular linting performance -Deviations from the `@angular-eslint schematic`, `@ni/eslint-config-angular`, and the [`parserOptions.project`](https://github.com/typescript-eslint/typescript-eslint/tree/main/packages/parser#parseroptionsproject) configurations can result in significant performance degredation. Fully manual configuration [is not recommended](https://github.com/angular-eslint/angular-eslint#going-fully-manual-not-recommended). Read `@angular-eslint`'s [section on performance](https://github.com/angular-eslint/angular-eslint#eslint-configs-and-performance) for information on addressing slow linting processes. +Deviations from the `angular-eslint`, `@ni/eslint-config-angular`, and the [`parserOptions.project`](https://github.com/typescript-eslint/typescript-eslint/tree/main/packages/parser#parseroptionsproject) configurations can result in significant performance degredation. Read `angular-eslint`'s [section on performance](https://github.com/angular-eslint/angular-eslint/blob/v19.0.0/docs/RULES_REQUIRING_TYPE_INFORMATION.md) for information on addressing slow linting processes. ## License From 4e18ae7d5cc3c45eafabd91ec533d8ace9f22e0c Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Tue, 16 Sep 2025 12:19:14 +0530 Subject: [PATCH 08/53] update change file email Signed-off-by: gokulprasanth-ni --- ...int-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json | 2 +- ...-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json | 2 +- ...-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json | 2 +- ...-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json index 7f402354..2f64bdae 100644 --- a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json +++ b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json @@ -2,6 +2,6 @@ "type": "major", "comment": "Update eslint-config-angular to be compatible with eslint v9", "packageName": "@ni/eslint-config-angular", - "email": "gokulprasanth.ravi@emerson.com", + "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" } diff --git a/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json b/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json index 068a914f..4bf0970e 100644 --- a/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json +++ b/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json @@ -2,6 +2,6 @@ "type": "major", "comment": "Update eslint-config-javascript to be compatible with eslint v9", "packageName": "@ni/eslint-config-javascript", - "email": "gokulprasanth.ravi@emerson.com", + "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" } diff --git a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json index bc2adaa5..df9815e4 100644 --- a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json +++ b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json @@ -2,6 +2,6 @@ "type": "major", "comment": "Update eslint-config-playwright to be compatible with eslint v9", "packageName": "@ni/eslint-config-playwright", - "email": "gokulprasanth.ravi@emerson.com", + "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" } diff --git a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json index c49d73a0..8a1b7a85 100644 --- a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json +++ b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json @@ -2,6 +2,6 @@ "type": "major", "comment": "Update eslint-config-typescript to be compatible with eslint v9", "packageName": "@ni/eslint-config-typescript", - "email": "gokulprasanth.ravi@emerson.com", + "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" } From 7a2a8c72ce2c5197f06ed77e26bad899fa3469d2 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Tue, 16 Sep 2025 13:14:38 +0530 Subject: [PATCH 09/53] update as per pr comments Signed-off-by: gokulprasanth-ni --- README.md | 8 ++++---- package.json | 2 +- packages/eslint-config-angular/index.js | 6 ++++++ packages/eslint-config-javascript/package.json | 2 +- tests/angular/eslint.config.js | 4 ++-- tests/playwright-requiring-type-checking/eslint.config.js | 4 ++-- tests/print-evaluated-rules/index.js | 8 ++++---- tests/print-evaluated-rules/package.json | 2 +- tests/typescript-requiring-type-checking/eslint.config.js | 4 ++-- 9 files changed, 23 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 77836064..48dc04ee 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ After installing the lint configuration packages, follow the configuration instr ### JavaScript configuration -Spread `@ni/eslint-config-javascript` configurations in your [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): +Spread `@ni/eslint-config-javascript` configurations in your [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): ```js import javascript from '@ni/eslint-config-javascript'; @@ -81,7 +81,7 @@ export default [ ### TypeScript configuration -Spread `@ni/eslint-config-typescript` and `@ni/eslint-config-typescript/requiring-type-checking` configurations in the [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. +Spread `@ni/eslint-config-typescript` and `@ni/eslint-config-typescript/requiring-type-checking` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. ```js import typescript from '@ni/eslint-config-typescript'; @@ -114,7 +114,7 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ > ng g angular-eslint:add-eslint-to-project > ng config cli.schematicCollections "[\"angular-eslint\"]" ``` -3. Spread the NI configured rules for Angular and Angular templates in the [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +3. Spread the NI configured rules for Angular and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. ```js import angular from '@ni/eslint-config-angular'; import angularTypeChecking from '@ni/eslint-config-angular/requiring-type-checking'; @@ -143,7 +143,7 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ ### Playwright configuration -Spread `@ni/eslint-config-playwright` and `@ni/eslint-config-playwright/requiring-type-checking` in the [ESLint flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +Spread `@ni/eslint-config-playwright` and `@ni/eslint-config-playwright/requiring-type-checking` in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. **Note:** The Playwright configurations extend the TypeScript configurations, so it is not necessary for an application to extend them both. However, the Playwright configurations should only be applied to directories that contain Playwright tests and utilities. diff --git a/package.json b/package.json index a32b14aa..a51d2d3e 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,6 @@ "beachball": "^2.41.0" }, "peerDependencies": { - "typescript": "^5.0.0" + "typescript": "~5.0.0" } } \ No newline at end of file diff --git a/packages/eslint-config-angular/index.js b/packages/eslint-config-angular/index.js index ed9a2c61..ad34f3ce 100644 --- a/packages/eslint-config-angular/index.js +++ b/packages/eslint-config-angular/index.js @@ -7,6 +7,12 @@ export default [ { processor: angular.processInlineTemplates, rules: { + /* + Overrides to Angular recommended rules: + https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.json + */ + + '@angular-eslint/no-host-metadata-property': 'error', /* '@angular-eslint/no-input-rename' rule notes: diff --git a/packages/eslint-config-javascript/package.json b/packages/eslint-config-javascript/package.json index c5180b09..8fc4974d 100644 --- a/packages/eslint-config-javascript/package.json +++ b/packages/eslint-config-javascript/package.json @@ -32,7 +32,7 @@ "!/.*.js" ], "peerDependencies": { - "eslint": "^9.0.0", + "eslint": "^9.35.0", "eslint-plugin-import": "^2.31.1", "@stylistic/eslint-plugin": "^5.0.0" } diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index 1176b8ae..ecbfc087 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -10,7 +10,7 @@ import typescriptPlugin from 'typescript-eslint'; import angularTemplatePlugin from 'angular-eslint'; import { defineConfig } from 'eslint/config'; -const tsconfigRootDir = path.dirname(fileURLToPath(import.meta.url)); +const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); export default defineConfig([ { ignores: ['*.js'] }, @@ -21,7 +21,7 @@ export default defineConfig([ parser: typescriptPlugin.parser, parserOptions: { project: ['./tsconfig.json'], - tsconfigRootDir, + tsConfigRootDir, }, }, }, diff --git a/tests/playwright-requiring-type-checking/eslint.config.js b/tests/playwright-requiring-type-checking/eslint.config.js index 9d63af33..c08b66d5 100644 --- a/tests/playwright-requiring-type-checking/eslint.config.js +++ b/tests/playwright-requiring-type-checking/eslint.config.js @@ -3,7 +3,7 @@ import path from 'path'; import playwright from '@ni/eslint-config-playwright'; import playwrightRequiringTypeChecking from '@ni/eslint-config-playwright/requiring-type-checking'; -const tsconfigRootDir = path.dirname(fileURLToPath(import.meta.url)); +const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); export default [ ...playwright, @@ -16,7 +16,7 @@ export default [ languageOptions: { parserOptions: { project: ['./tsconfig.json'], - tsconfigRootDir, + tsConfigRootDir, }, }, rules: { diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index f87d9392..0d0d51b8 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -99,7 +99,7 @@ const __dirname = path.dirname(__filename); .filter(key => !key.startsWith('@angular-eslint')) .filter( key => !configTypescript.rules[key] - && !configTypescriptTypechecked.rules[key] + && !configTypescriptTypechecked.rules[key] ) .reduce((config, key) => { config[key] = rules[key]; @@ -107,13 +107,13 @@ const __dirname = path.dirname(__filename); }, {}); const angularDivergedRules = getDivergedRules( - angularRules.map(cfg => cfg.rules) + angularRules.map(config => config.rules) ); const angularTemplateDivergedRules = getDivergedRules( - angularTemplateRules.map(cfg => cfg.rules) + angularTemplateRules.map(config => config.rules) ); const angularHasDivergedRules = !!Object.keys(angularDivergedRules).length - || !!Object.keys(angularTemplateDivergedRules).length; + || !!Object.keys(angularTemplateDivergedRules).length; console.log('-------- Audits:'); console.log(`Evaluated ESLint rules has warn?: ${hasWarn(configEslint)}`); diff --git a/tests/print-evaluated-rules/package.json b/tests/print-evaluated-rules/package.json index 76693341..3a7ff3d5 100644 --- a/tests/print-evaluated-rules/package.json +++ b/tests/print-evaluated-rules/package.json @@ -17,7 +17,7 @@ "@ni/javascript-test": "*", "@ni/typescript-test": "*", "@ni/typescript-requiring-type-checking-test": "*", - "eslint": "^9.0.0" + "eslint": "^9.35.0" }, "dependencies": { "yargs": "^17.7.2" diff --git a/tests/typescript-requiring-type-checking/eslint.config.js b/tests/typescript-requiring-type-checking/eslint.config.js index 774e9d92..b7bc53eb 100644 --- a/tests/typescript-requiring-type-checking/eslint.config.js +++ b/tests/typescript-requiring-type-checking/eslint.config.js @@ -3,7 +3,7 @@ import path from 'path'; import typescript from '@ni/eslint-config-typescript'; import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; -const tsconfigRootDir = path.dirname(fileURLToPath(import.meta.url)); +const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); export default [ { @@ -16,7 +16,7 @@ export default [ languageOptions: { parserOptions: { project: ['./tsconfig.json'], - tsconfigRootDir, + tsConfigRootDir, }, }, }, From d830fa34ae00295a24f1732841819353e042faa5 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Tue, 16 Sep 2025 14:38:14 +0530 Subject: [PATCH 10/53] update angular-eslint version Signed-off-by: gokulprasanth-ni --- package-lock.json | 270 ++++++++++---------- packages/eslint-config-angular/package.json | 2 +- tests/print-evaluated-rules/package.json | 2 +- 3 files changed, 137 insertions(+), 137 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2d3331bc..a90814b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,17 +25,17 @@ "beachball": "^2.41.0" }, "peerDependencies": { - "typescript": "^5.0.0" + "typescript": "~5.0.0" } }, "node_modules/@angular-devkit/architect": { - "version": "0.1902.16", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.16.tgz", - "integrity": "sha512-E5cM4D5nHmCpuQkvyYJjJ/GEfygfU5NoN1YAWRnIMLwTyC9s6ms13L/FuCfr7HqGPY8NjkOWG2517Xda03+jAw==", + "version": "0.1802.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.21.tgz", + "integrity": "sha512-+Ll+xtpKwZ3iLWN/YypvnCZV/F0MVbP+/7ZpMR+Xv/uB0OmribhBVj9WGaCd9I/bGgoYBw8wBV/NFNCKkf0k3Q==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/core": "19.2.16", + "@angular-devkit/core": "18.2.21", "rxjs": "7.8.1" }, "engines": { @@ -55,9 +55,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.2.16", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.16.tgz", - "integrity": "sha512-3MHfTTUMT/nSXLdhoilQATCY38XcnoJd7u7K0tLajTT7C+iNknvkzaV4g5qMA+E3yNzefcAkY7MZpgreNJuKEg==", + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.21.tgz", + "integrity": "sha512-Lno6GNbJME85wpc/uqn+wamBxvfZJZFYSH8+oAkkyjU/hk8r5+X8DuyqsKAa0m8t46zSTUsonHsQhVe5vgrZeQ==", "license": "MIT", "peer": true, "dependencies": { @@ -74,7 +74,7 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^4.0.0" + "chokidar": "^3.5.2" }, "peerDependenciesMeta": { "chokidar": { @@ -106,15 +106,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.2.16", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.16.tgz", - "integrity": "sha512-YO1J8H9zzb/EfKzoZFs+YU7JRYNaZVjp/H/EBSpyI8zvpSjNZzi7+P6K+/uNQyH1RQyZ9NFn8+eHygsG47qA8w==", + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.21.tgz", + "integrity": "sha512-yuC2vN4VL48JhnsaOa9J/o0Jl+cxOklRNQp5J2/ypMuRROaVCrZAPiX+ChSHh++kHYMpj8+ggNrrUwRNfMKACQ==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/core": "19.2.16", + "@angular-devkit/core": "18.2.21", "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", + "magic-string": "0.30.11", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -135,14 +135,14 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.0.0.tgz", - "integrity": "sha512-vi68ADoEKrg2SB87jwUCaVhOhWPpXyG6X8QJzg8AiYDCQY721x1l6Pdz6WZOPruWALyoIyFGFXqtuysDGqIBhw==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.4.3.tgz", + "integrity": "sha512-NzmrXlr7GFE+cjwipY/CxBscZXNqnuK0us1mO6Z2T6MeH6m+rRcdlY/rZyKoRniyNNvuzl6vpEsfMIMmnfebrA==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", - "@angular-devkit/core": ">= 19.0.0 < 20.0.0" + "@angular-devkit/architect": ">= 0.1800.0 < 0.1900.0", + "@angular-devkit/core": ">= 18.0.0 < 19.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", @@ -150,21 +150,21 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.0.tgz", - "integrity": "sha512-q6IaiqKYcmBW/gw55tytDucguo5E48szVCLNLHUFdN98YDDsP+KM3MPWYPyZcXpusmFfIjLdr8d41PlKmyMUpg==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.4.3.tgz", + "integrity": "sha512-zdrA8mR98X+U4YgHzUKmivRU+PxzwOL/j8G7eTOvBuq8GPzsP+hvak+tyxlgeGm9HsvpFj9ERHLtJ0xDUPs8fg==", "license": "MIT", "peer": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.0.tgz", - "integrity": "sha512-WkUnH5zmvC/cH6f8BGiRK+KebrKdGbQmhtu3IHLEyzG9U4mBiIV8XkSzhdkY3RCN8bKqhmE5C3oNBLNCtvg4QQ==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.4.3.tgz", + "integrity": "sha512-AyJbupiwTBR81P6T59v+aULEnPpZBCBxL2S5QFWfAhNCwWhcof4GihvdK2Z87yhvzDGeAzUFSWl/beJfeFa+PA==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.0", - "@angular-eslint/utils": "19.0.0" + "@angular-eslint/bundled-angular-compiler": "18.4.3", + "@angular-eslint/utils": "18.4.3" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -173,14 +173,14 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.0.tgz", - "integrity": "sha512-d2NzuAyvFo00QGBv6BLno0KZ3Ptd+UNVHpI9vwU0giaZcjVsdKbcMvMfynkvHAAwVIVw5aSLwabIjnm0rc3x3A==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.4.3.tgz", + "integrity": "sha512-ijGlX2N01ayMXTpeQivOA31AszO8OEbu9ZQUCxnu9AyMMhxyi2q50bujRChAvN9YXQfdQtbxuajxV6+aiWb5BQ==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.0", - "@angular-eslint/utils": "19.0.0", + "@angular-eslint/bundled-angular-compiler": "18.4.3", + "@angular-eslint/utils": "18.4.3", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, @@ -192,16 +192,16 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.0.0.tgz", - "integrity": "sha512-fle4SMxjI+91y5eR6hVG7yhzJHAw87LudHw918hGUVn2INIAW1TTuuQNoah8kNg9I6ICIDat26IenD4nOau6Gg==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.4.3.tgz", + "integrity": "sha512-D5maKn5e6n58+8n7jLFLD4g+RGPOPeDSsvPc1sqial5tEKLxAJQJS9WZ28oef3bhkob6C60D+1H0mMmEEVvyVA==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/core": ">= 19.0.0 < 20.0.0", - "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", - "@angular-eslint/eslint-plugin": "19.0.0", - "@angular-eslint/eslint-plugin-template": "19.0.0", + "@angular-devkit/core": ">= 18.0.0 < 19.0.0", + "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0", + "@angular-eslint/eslint-plugin": "18.4.3", + "@angular-eslint/eslint-plugin-template": "18.4.3", "ignore": "6.0.2", "semver": "7.6.3", "strip-json-comments": "3.1.1" @@ -231,13 +231,13 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.0.tgz", - "integrity": "sha512-bOLMNBQbrLMujGWSda0SF8ka7snQ9Uzxie1dr5LquI104p2J4Wt90DOoaWzhNaBBwedt3WXmhSHmvvR9720kHA==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.4.3.tgz", + "integrity": "sha512-JZMPtEB8yNip3kg4WDEWQyObSo2Hwf+opq2ElYuwe85GQkGhfJSJ2CQYo4FSwd+c5MUQAqESNRg9QqGYauDsiw==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.0", + "@angular-eslint/bundled-angular-compiler": "18.4.3", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -246,13 +246,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.0.tgz", - "integrity": "sha512-PH40BmIcIr5ldr08XYnqJ8cTzJfScJjBym4SECsilBnz5fhCdTD7UEQiW4d0P78Ie8H5PxvOJx9ZE+L4WBNrTA==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", + "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", "license": "MIT", "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.0" + "@angular-eslint/bundled-angular-compiler": "18.4.3" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -697,17 +697,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz", - "integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", + "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", "license": "MIT", "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/type-utils": "8.43.0", - "@typescript-eslint/utils": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/type-utils": "8.44.0", + "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -721,7 +721,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.43.0", + "@typescript-eslint/parser": "^8.44.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -737,16 +737,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.43.0.tgz", - "integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", + "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", "debug": "^4.3.4" }, "engines": { @@ -762,14 +762,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.43.0.tgz", - "integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", + "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.43.0", - "@typescript-eslint/types": "^8.43.0", + "@typescript-eslint/tsconfig-utils": "^8.44.0", + "@typescript-eslint/types": "^8.44.0", "debug": "^4.3.4" }, "engines": { @@ -784,14 +784,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz", - "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", + "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0" + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -802,9 +802,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.43.0.tgz", - "integrity": "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", + "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", "license": "MIT", "peer": true, "engines": { @@ -819,15 +819,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz", - "integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", + "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/utils": "8.43.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -844,9 +844,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", - "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", + "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", "license": "MIT", "peer": true, "engines": { @@ -858,16 +858,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz", - "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", + "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/project-service": "8.43.0", - "@typescript-eslint/tsconfig-utils": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/project-service": "8.44.0", + "@typescript-eslint/tsconfig-utils": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -913,16 +913,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz", - "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", + "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0" + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -937,13 +937,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz", - "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", + "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/types": "8.44.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1020,19 +1020,19 @@ } }, "node_modules/angular-eslint": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-19.0.0.tgz", - "integrity": "sha512-8qYxqVMoRVKlpDKuGiNMG9ZPk7ke7ZOo3IxefFsB7Fpom8iRjOnH9tD9gLeYCHZWY1qYignLdeRqYmF/rRxF1A==", + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-18.4.3.tgz", + "integrity": "sha512-0ZjLzzADGRLUhZC8ZpwSo6CE/m6QhQB/oljMJ0mEfP+lB1sy1v8PBKNsJboIcfEEgGW669Z/efVQ3df88yJLYg==", "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/core": ">= 19.0.0 < 20.0.0", - "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", - "@angular-eslint/builder": "19.0.0", - "@angular-eslint/eslint-plugin": "19.0.0", - "@angular-eslint/eslint-plugin-template": "19.0.0", - "@angular-eslint/schematics": "19.0.0", - "@angular-eslint/template-parser": "19.0.0", + "@angular-devkit/core": ">= 18.0.0 < 19.0.0", + "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0", + "@angular-eslint/builder": "18.4.3", + "@angular-eslint/eslint-plugin": "18.4.3", + "@angular-eslint/eslint-plugin-template": "18.4.3", + "@angular-eslint/schematics": "18.4.3", + "@angular-eslint/template-parser": "18.4.3", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, @@ -1740,9 +1740,9 @@ } }, "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==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2418,9 +2418,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", - "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "dev": true, "license": "MIT", "dependencies": { @@ -3499,9 +3499,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "license": "MIT", "peer": true, "dependencies": { @@ -4784,9 +4784,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "license": "Apache-2.0", "peer": true, "bin": { @@ -4794,20 +4794,20 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=12.20" } }, "node_modules/typescript-eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.43.0.tgz", - "integrity": "sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.0.tgz", + "integrity": "sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.43.0", - "@typescript-eslint/parser": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/utils": "8.43.0" + "@typescript-eslint/eslint-plugin": "8.44.0", + "@typescript-eslint/parser": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5085,7 +5085,7 @@ "license": "MIT", "peerDependencies": { "@ni/eslint-config-typescript": "^4.4.4", - "angular-eslint": "^19.0.0" + "angular-eslint": "^18.4.3" } }, "packages/eslint-config-javascript": { @@ -5094,7 +5094,7 @@ "license": "MIT", "peerDependencies": { "@stylistic/eslint-plugin": "^5.0.0", - "eslint": "^9.0.0", + "eslint": "^9.35.0", "eslint-plugin-import": "^2.31.1" } }, @@ -5168,8 +5168,8 @@ "@ni/javascript-test": "*", "@ni/typescript-requiring-type-checking-test": "*", "@ni/typescript-test": "*", - "angular-eslint": "19.0.0", - "eslint": "^9.0.0" + "angular-eslint": "18.4.3", + "eslint": "^9.35.0" } }, "tests/typescript": { diff --git a/packages/eslint-config-angular/package.json b/packages/eslint-config-angular/package.json index 08394bb7..64352d80 100644 --- a/packages/eslint-config-angular/package.json +++ b/packages/eslint-config-angular/package.json @@ -33,7 +33,7 @@ "!/tools" ], "peerDependencies": { - "angular-eslint": "^19.0.0", + "angular-eslint": "^18.4.3", "@ni/eslint-config-typescript": "^4.4.4" }, "exports": { diff --git a/tests/print-evaluated-rules/package.json b/tests/print-evaluated-rules/package.json index 3a7ff3d5..7b380c90 100644 --- a/tests/print-evaluated-rules/package.json +++ b/tests/print-evaluated-rules/package.json @@ -11,7 +11,7 @@ "print-evaluated-rules:no-audit": "node index.js --no-audit" }, "peerDependencies": { - "angular-eslint": "19.0.0", + "angular-eslint": "18.4.3", "@ni/angular-test": "*", "@ni/eslint-config-angular": "*", "@ni/javascript-test": "*", From e52cb9d48fb671977e2325c94f26b0e4275d0e9e Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Tue, 16 Sep 2025 16:03:52 +0530 Subject: [PATCH 11/53] remove no-undef eslint comment Signed-off-by: gokulprasanth-ni --- .../eslint-config-angular/tools/print-available-rules.js | 1 - packages/eslint-config-javascript/index.js | 6 +++++- .../eslint-config-playwright/tools/print-available-rules.js | 1 - .../eslint-config-typescript/tools/print-available-rules.js | 1 - tests/print-evaluated-rules/index.js | 1 - 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/eslint-config-angular/tools/print-available-rules.js b/packages/eslint-config-angular/tools/print-available-rules.js index 1ce8ceb9..895057de 100644 --- a/packages/eslint-config-angular/tools/print-available-rules.js +++ b/packages/eslint-config-angular/tools/print-available-rules.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-console */ import angularPlugin from 'angular-eslint'; diff --git a/packages/eslint-config-javascript/index.js b/packages/eslint-config-javascript/index.js index 10f95075..aecd50af 100644 --- a/packages/eslint-config-javascript/index.js +++ b/packages/eslint-config-javascript/index.js @@ -1,5 +1,6 @@ import importPlugin from 'eslint-plugin-import'; import stylisticPlugin from '@stylistic/eslint-plugin'; +import globals from 'globals'; import { bestPractices } from './rules/best-practices.js'; import { errors } from './rules/errors.js'; import { node } from './rules/node.js'; @@ -26,7 +27,10 @@ export default [ }, languageOptions: { ecmaVersion: 2022, - sourceType: 'module' + sourceType: 'module', + globals: { + ...globals.node + } } }, ]; \ No newline at end of file diff --git a/packages/eslint-config-playwright/tools/print-available-rules.js b/packages/eslint-config-playwright/tools/print-available-rules.js index 0dcedb37..6d588bb0 100644 --- a/packages/eslint-config-playwright/tools/print-available-rules.js +++ b/packages/eslint-config-playwright/tools/print-available-rules.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-console */ import plugin from 'eslint-plugin-playwright'; diff --git a/packages/eslint-config-typescript/tools/print-available-rules.js b/packages/eslint-config-typescript/tools/print-available-rules.js index f368bf88..ca235670 100644 --- a/packages/eslint-config-typescript/tools/print-available-rules.js +++ b/packages/eslint-config-typescript/tools/print-available-rules.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-console */ // eslint-plugin-import doesn't know how to resolve entry points in commonjs modules that are // declared using "export" rather than the old "main" syntax in package.json. diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index 0d0d51b8..d0b8b187 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -1,5 +1,4 @@ /* eslint-disable no-console */ -/* eslint-disable no-undef */ import { ESLint } from 'eslint'; import angularRules from '@ni/eslint-config-angular'; import angularTemplateRules from '@ni/eslint-config-angular/template'; From ca9199cbc99785a1c4406f5ce398e62b99bdc367 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Wed, 17 Sep 2025 17:08:20 +0530 Subject: [PATCH 12/53] fix: import resolver issue Signed-off-by: gokulprasanth-ni --- packages/eslint-config-typescript/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index f6a907fe..7e2c7628 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -1,5 +1,6 @@ import javascript from '@ni/eslint-config-javascript'; import typescriptPlugin from 'typescript-eslint'; +import importPlugin from 'eslint-plugin-import'; import extensions from './lib/extensions.js'; export default [ @@ -10,6 +11,7 @@ export default [ languageOptions: { parser: typescriptPlugin.parser }, + settings: importPlugin.flatConfigs.typescript.settings, rules: { /* Overrides to import rules (already handled by the TypeScript compiler): From df5b22c1b0e91c226c767b2ae4af7cee32e15e78 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Thu, 18 Sep 2025 14:46:11 +0530 Subject: [PATCH 13/53] address lvl 1 PR comments Signed-off-by: gokulprasanth-ni --- package-lock.json | 10 +++++----- package.json | 2 +- packages/eslint-config-javascript/rules/style.js | 3 +-- packages/eslint-config-typescript/index.js | 16 ++++++++-------- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index a90814b3..fceb4946 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "beachball": "^2.41.0" }, "peerDependencies": { - "typescript": "~5.0.0" + "typescript": "~5.4.5" } }, "node_modules/@angular-devkit/architect": { @@ -4784,9 +4784,9 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "license": "Apache-2.0", "peer": true, "bin": { @@ -4794,7 +4794,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/typescript-eslint": { diff --git a/package.json b/package.json index a51d2d3e..692598be 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,6 @@ "beachball": "^2.41.0" }, "peerDependencies": { - "typescript": "~5.0.0" + "typescript": "~5.4.5" } } \ No newline at end of file diff --git a/packages/eslint-config-javascript/rules/style.js b/packages/eslint-config-javascript/rules/style.js index 4c392f92..453ca737 100644 --- a/packages/eslint-config-javascript/rules/style.js +++ b/packages/eslint-config-javascript/rules/style.js @@ -455,8 +455,7 @@ export const style = { ], /* - disallow space between function identifier and application - deprecated in favor of func-call-spacing + enforce spacing between functions and their invocations https://eslint.style/rules/function-call-spacing */ '@stylistic/function-call-spacing': ['error', 'never'], diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index 7e2c7628..92006303 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -37,7 +37,7 @@ export default [ /* [strict-null-checks] - With `stickNullChecks` disabled, non-null assertions are discouraged (this rule is configured as 'error') + With `strictNullChecks` disabled, non-null assertions are discouraged (this rule is configured as 'error') as non-null assertions do not provide additional type safety and if used inconsistently add to visual noise. With `strictNullChecks` enabled, the non-null assertion operator (this rule configured as 'off') is useful for asserting that a value will no longer be null and usage of operator should be allowed. @@ -46,11 +46,6 @@ export default [ 'valid-typeof': 'off', - /* - Overrides to TypeScript stylistic rules: - https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/stylistic.ts - */ - /* Overrides to Typescript rules outside of the recommended configuration: */ @@ -92,6 +87,11 @@ export default [ { accessibility: 'explicit', overrides: { constructors: 'off' } } ], + /* + Overrides to TypeScript stylistic rules: + https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/flat/stylistic.ts + */ + /* All interface members should be terminated with a semicolon including single line definitions, consistent with classes. Object literal types should use commas @@ -118,6 +118,8 @@ export default [ } }], + '@stylistic/type-annotation-spacing': 'error', + /* Group members by fields and methods and then order them by accessibility starting with statics. Order members within these groups in a logical organization where @@ -219,8 +221,6 @@ export default [ */ '@typescript-eslint/sort-type-union-intersection-members': 'off', - '@stylistic/type-annotation-spacing': 'error', - /* This rule is better enforced with the TypeScript `noImplicitAny` and `strictPropertyInitialization` compiler options. From 56edf112728ec25571223f15ea61103c08462a1c Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Thu, 18 Sep 2025 19:53:53 +0530 Subject: [PATCH 14/53] address lvl2 pr comments Signed-off-by: gokulprasanth-ni --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 48dc04ee..a3f3e6e3 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ export default [ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/angular-eslint/angular-eslint#readme). -1. **For single and multi-project workspaces**, [add the angular-eslint](https://github.com/angular-eslint/angular-eslint#quick-start). Remove the `angular-eslint` and `eslint` dependencies from `package.json`. +1. **For single and multi-project workspaces**, [add angular-eslint](https://github.com/angular-eslint/angular-eslint#quick-start). Remove the `angular-eslint` and `eslint` dependencies from `package.json`. ```bash ng add angular-eslint ``` @@ -284,6 +284,7 @@ To disable a rule for a specific file pattern or directory, update the rules sec export default [ // ...other configs { + // This rule is disabled as an example files: ['*.stories.ts'], rules: { 'import/no-default-export': 'off' From c1a09a26cfad31ef2fff7bcb13fb54671fc72178 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Fri, 19 Sep 2025 12:05:41 +0530 Subject: [PATCH 15/53] Replace spread with export Signed-off-by: gokulprasanth-ni --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a3f3e6e3..1ae88fe6 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ After installing the lint configuration packages, follow the configuration instr ### JavaScript configuration -Spread `@ni/eslint-config-javascript` configurations in your [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): +Export `@ni/eslint-config-javascript` configurations in your [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): ```js import javascript from '@ni/eslint-config-javascript'; @@ -81,7 +81,7 @@ export default [ ### TypeScript configuration -Spread `@ni/eslint-config-typescript` and `@ni/eslint-config-typescript/requiring-type-checking` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. +Export `@ni/eslint-config-typescript` and `@ni/eslint-config-typescript/requiring-type-checking` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. ```js import typescript from '@ni/eslint-config-typescript'; @@ -114,7 +114,7 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ > ng g angular-eslint:add-eslint-to-project > ng config cli.schematicCollections "[\"angular-eslint\"]" ``` -3. Spread the NI configured rules for Angular and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +3. Export the NI configured rules for Angular and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. ```js import angular from '@ni/eslint-config-angular'; import angularTypeChecking from '@ni/eslint-config-angular/requiring-type-checking'; @@ -143,7 +143,7 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ ### Playwright configuration -Spread `@ni/eslint-config-playwright` and `@ni/eslint-config-playwright/requiring-type-checking` in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +Export `@ni/eslint-config-playwright` and `@ni/eslint-config-playwright/requiring-type-checking` in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. **Note:** The Playwright configurations extend the TypeScript configurations, so it is not necessary for an application to extend them both. However, the Playwright configurations should only be applied to directories that contain Playwright tests and utilities. From a110ff5be959e075e42a6a9e4303ecd72872ab22 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Fri, 19 Sep 2025 13:04:14 +0530 Subject: [PATCH 16/53] handle rules based on comments Signed-off-by: gokulprasanth-ni --- packages/eslint-config-typescript/index.js | 2 ++ .../eslint-config-typescript/requiring-type-checking.js | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index 92006303..cdcc7a25 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -34,6 +34,8 @@ export default [ */ '@typescript-eslint/explicit-module-boundary-types': 'error', + 'no-with': 'error', + 'no-class-assign': 'error', /* [strict-null-checks] diff --git a/packages/eslint-config-typescript/requiring-type-checking.js b/packages/eslint-config-typescript/requiring-type-checking.js index 919de051..b23ea66a 100644 --- a/packages/eslint-config-typescript/requiring-type-checking.js +++ b/packages/eslint-config-typescript/requiring-type-checking.js @@ -21,6 +21,13 @@ export default [ '@typescript-eslint/no-redundant-type-constituents': 'off', '@typescript-eslint/no-unsafe-declaration-merging': 'off', '@typescript-eslint/no-unsafe-enum-comparison': 'off', + '@typescript-eslint/prefer-find': 'off', + 'prefer-promise-reject-errors': ['error', { allowEmptyReject: true }], + '@typescript-eslint/prefer-promise-reject-errors': 'off', + '@typescript-eslint/no-unsafe-unary-minus': 'off', + '@typescript-eslint/no-array-delete': 'off', + 'no-with': 'error', + 'no-class-assign': 'error', /* This rule can be confusing if you're not familiar with JavaScript's rules for binding `this`, From e2781535ee721c97af65d3b6dfcbed002c1add89 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Fri, 19 Sep 2025 14:32:51 +0530 Subject: [PATCH 17/53] update print evaluated rules Signed-off-by: gokulprasanth-ni --- tests/print-evaluated-rules/index.js | 38 ++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index d0b8b187..07ae9fc4 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -45,11 +45,11 @@ const __dirname = path.dirname(__filename); const getRules = function () { return { - ...configEslint.rules, - ...configTypescript.rules, - ...configTypescriptTypechecked.rules, - ...configAngular.rules, - ...configAngularTemplate.rules + ...normalizeRulesSeverityToString(configEslint.rules), + ...normalizeRulesSeverityToString(configTypescript.rules), + ...normalizeRulesSeverityToString(configTypescriptTypechecked.rules), + ...normalizeRulesSeverityToString(configAngular.rules), + ...normalizeRulesSeverityToString(configAngularTemplate.rules) }; }; @@ -140,3 +140,31 @@ async function calculateConfigForFile(filePath) { return await eslint.calculateConfigForFile(filePath); } + +function normalizeSeverityToString(val) { + switch (val) { + case 0: + return 'off'; + case 1: + return 'warn'; + case 2: + return 'error'; + default: + return val; + } +} + +function normalizeRulesSeverityToString(rulesObj) { + const updatedRules = {}; + for (const ruleName in rulesObj) { + if (Object.prototype.hasOwnProperty.call(rulesObj, ruleName)) { + const ruleVal = rulesObj[ruleName]; + if (Array.isArray(ruleVal)) { + updatedRules[ruleName] = [normalizeSeverityToString(ruleVal[0]), ...ruleVal.slice(1)]; + } else { + updatedRules[ruleName] = normalizeSeverityToString(ruleVal); + } + } + } + return updatedRules; +} From 7196ed5f89de6cbb81f9089b0152b77ebe229916 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Fri, 19 Sep 2025 16:04:05 +0530 Subject: [PATCH 18/53] update print evaluated rules code Signed-off-by: gokulprasanth-ni --- tests/print-evaluated-rules/index.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index 07ae9fc4..a8d4889e 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -27,7 +27,7 @@ const __dirname = path.dirname(__filename); .wrap(null).argv; const hasWarn = function (config) { - return JSON.stringify(config).includes('"warn"'); + return JSON.stringify(normalizeRulesSeverityToString(config.rules)).indexOf('"warn"') !== -1; }; const testDir = path.resolve(__dirname, '..'); @@ -94,7 +94,7 @@ const __dirname = path.dirname(__filename); return; } - const getDivergedRules = rules => Object.keys(rules) + const getDivergedRules = rules => (Object.keys(rules) .filter(key => !key.startsWith('@angular-eslint')) .filter( key => !configTypescript.rules[key] @@ -103,14 +103,10 @@ const __dirname = path.dirname(__filename); .reduce((config, key) => { config[key] = rules[key]; return config; - }, {}); + }, {})); - const angularDivergedRules = getDivergedRules( - angularRules.map(config => config.rules) - ); - const angularTemplateDivergedRules = getDivergedRules( - angularTemplateRules.map(config => config.rules) - ); + const angularDivergedRules = getDivergedRules(Object.assign({}, ...angularRules.slice(-2).map(item => item.rules))); + const angularTemplateDivergedRules = getDivergedRules(Object.assign({}, ...angularTemplateRules.slice(-2).map(item => item.rules))); const angularHasDivergedRules = !!Object.keys(angularDivergedRules).length || !!Object.keys(angularTemplateDivergedRules).length; From 1333caff693619bb38d119d811132a6d5787ec6a Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Sun, 21 Sep 2025 14:41:54 +0530 Subject: [PATCH 19/53] refactor: update package with named exports Signed-off-by: gokulprasanth-ni --- package-lock.json | 50 +++++-------------- .../eslint-config-angular/eslint.config.js | 8 +-- packages/eslint-config-angular/index.js | 14 ++++-- .../requiring-type-checking.js | 6 +-- packages/eslint-config-angular/template.js | 2 +- .../eslint-config-javascript/eslint.config.js | 8 +-- packages/eslint-config-javascript/index.js | 2 +- .../eslint-config-javascript/rules/imports.js | 2 +- .../eslint-config-playwright/eslint.config.js | 8 +-- packages/eslint-config-playwright/index.js | 6 +-- .../requiring-type-checking.js | 4 +- .../eslint-config-typescript/eslint.config.js | 8 +-- packages/eslint-config-typescript/index.js | 14 +++--- .../lib/extensions-requiring-type-checking.js | 2 +- .../lib/extensions.js | 2 +- .../requiring-type-checking.js | 6 +-- tests/angular/eslint.config.js | 9 ++-- tests/javascript/eslint.config.js | 9 ++-- .../README.md | 5 -- .../eslint.config.js | 33 ------------ .../index.ts | 10 ---- .../package.json | 16 ------ .../tsconfig.json | 8 --- tests/playwright/eslint.config.js | 25 ++++++---- tests/playwright/tsconfig.json | 8 +++ tests/print-evaluated-rules/eslint.config.js | 8 +-- tests/print-evaluated-rules/index.js | 8 +-- tests/print-evaluated-rules/package.json | 1 - .../CHANGELOG.json | 35 ------------- .../CHANGELOG.md | 21 -------- .../README.md | 5 -- .../eslint.config.js | 23 --------- .../index.ts | 19 ------- .../package.json | 13 ----- .../tsconfig.json | 7 --- tests/typescript/eslint.config.js | 20 ++++++-- tests/typescript/tsconfig.json | 7 +++ 37 files changed, 127 insertions(+), 305 deletions(-) delete mode 100644 tests/playwright-requiring-type-checking/README.md delete mode 100644 tests/playwright-requiring-type-checking/eslint.config.js delete mode 100644 tests/playwright-requiring-type-checking/index.ts delete mode 100644 tests/playwright-requiring-type-checking/package.json delete mode 100644 tests/playwright-requiring-type-checking/tsconfig.json create mode 100644 tests/playwright/tsconfig.json delete mode 100644 tests/typescript-requiring-type-checking/CHANGELOG.json delete mode 100644 tests/typescript-requiring-type-checking/CHANGELOG.md delete mode 100644 tests/typescript-requiring-type-checking/README.md delete mode 100644 tests/typescript-requiring-type-checking/eslint.config.js delete mode 100644 tests/typescript-requiring-type-checking/index.ts delete mode 100644 tests/typescript-requiring-type-checking/package.json delete mode 100644 tests/typescript-requiring-type-checking/tsconfig.json create mode 100644 tests/typescript/tsconfig.json diff --git a/package-lock.json b/package-lock.json index fceb4946..712116a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -430,9 +430,9 @@ "peer": true }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "license": "MIT", "peer": true, "engines": { @@ -549,10 +549,6 @@ "resolved": "tests/javascript", "link": true }, - "node_modules/@ni/playwright-requiring-type-checking-test": { - "resolved": "tests/playwright-requiring-type-checking", - "link": true - }, "node_modules/@ni/playwright-test": { "resolved": "tests/playwright", "link": true @@ -561,10 +557,6 @@ "resolved": "tests/print-evaluated-rules", "link": true }, - "node_modules/@ni/typescript-requiring-type-checking-test": { - "resolved": "tests/typescript-requiring-type-checking", - "link": true - }, "node_modules/@ni/typescript-test": { "resolved": "tests/typescript", "link": true @@ -628,14 +620,14 @@ "peer": true }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==", "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/types": "^8.41.0", + "@eslint-community/eslint-utils": "^4.9.0", + "@typescript-eslint/types": "^8.44.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -1921,9 +1913,9 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "license": "MIT", "peer": true, "dependencies": { @@ -1933,7 +1925,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -5146,16 +5138,6 @@ "@ni/eslint-config-playwright": "*" } }, - "tests/playwright-requiring-type-checking": { - "name": "@ni/playwright-requiring-type-checking-test", - "version": "1.0.0", - "devDependencies": { - "@playwright/test": "^1.42.1" - }, - "peerDependencies": { - "@ni/eslint-config-playwright": "*" - } - }, "tests/print-evaluated-rules": { "name": "@ni/print-evaluated-rules-test", "version": "1.0.0", @@ -5166,7 +5148,6 @@ "@ni/angular-test": "*", "@ni/eslint-config-angular": "*", "@ni/javascript-test": "*", - "@ni/typescript-requiring-type-checking-test": "*", "@ni/typescript-test": "*", "angular-eslint": "18.4.3", "eslint": "^9.35.0" @@ -5178,13 +5159,6 @@ "peerDependencies": { "@ni/eslint-config-typescript": "*" } - }, - "tests/typescript-requiring-type-checking": { - "name": "@ni/typescript-requiring-type-checking-test", - "version": "1.0.0", - "peerDependencies": { - "@ni/eslint-config-typescript": "*" - } } } } diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index 50b45f34..770b56d1 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -1,11 +1,13 @@ -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascript, + ...javascriptConfig, + { + ignores: ['eslint.config.js'], + }, { files: ['**/*.js'], rules: { - 'import/no-default-export': 'off', 'import/no-extraneous-dependencies': 'off', 'import/no-unresolved': 'off', }, diff --git a/packages/eslint-config-angular/index.js b/packages/eslint-config-angular/index.js index ad34f3ce..1a872b56 100644 --- a/packages/eslint-config-angular/index.js +++ b/packages/eslint-config-angular/index.js @@ -1,9 +1,9 @@ -import typescript from '@ni/eslint-config-typescript'; +import { typescriptConfig } from '@ni/eslint-config-typescript'; import angular from 'angular-eslint'; -export default [ +export const angularConfig = [ ...angular.configs.tsRecommended, - ...typescript, + ...typescriptConfig, { processor: angular.processInlineTemplates, rules: { @@ -134,7 +134,13 @@ export default [ Tests often define additional classes as mocks or helper components and it improves test readability if those are in the same file as the tests. */ - 'max-classes-per-file': 'off' + 'max-classes-per-file': 'off', + + /* + Spies used by Angular application tests result in a significant number of + unbound methods so this rule is disabled for test specs in Angular projects. + */ + '@typescript-eslint/unbound-method': 'off', } } ]; diff --git a/packages/eslint-config-angular/requiring-type-checking.js b/packages/eslint-config-angular/requiring-type-checking.js index 4cc11c10..096b8518 100644 --- a/packages/eslint-config-angular/requiring-type-checking.js +++ b/packages/eslint-config-angular/requiring-type-checking.js @@ -1,8 +1,8 @@ -import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; +import { typescriptRequiringTypeCheckingConfig } from '@ni/eslint-config-typescript/requiring-type-checking'; import typescriptPlugin from 'typescript-eslint'; -export default [ - ...typescriptRequiringTypeChecking, +export const angularRequiringTypeCheckingConfig = [ + ...typescriptRequiringTypeCheckingConfig, { languageOptions: { parser: typescriptPlugin.parser, diff --git a/packages/eslint-config-angular/template.js b/packages/eslint-config-angular/template.js index 23607506..e4205991 100644 --- a/packages/eslint-config-angular/template.js +++ b/packages/eslint-config-angular/template.js @@ -1,7 +1,7 @@ import { ignoreAttributes } from '@ni/eslint-config-angular/template/options'; import angularTemplate from 'angular-eslint'; -export default [ +export const angularTemplateConfig = [ ...angularTemplate.configs.templateRecommended, { rules: { diff --git a/packages/eslint-config-javascript/eslint.config.js b/packages/eslint-config-javascript/eslint.config.js index d64a8b4d..a3bc996d 100644 --- a/packages/eslint-config-javascript/eslint.config.js +++ b/packages/eslint-config-javascript/eslint.config.js @@ -1,11 +1,13 @@ -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascript, + ...javascriptConfig, + { + ignores: ['eslint.config.js'], + }, { files: ['**/*.js'], rules: { - 'import/no-default-export': 'off', 'import/extensions': 'off', 'import/no-extraneous-dependencies': 'off', }, diff --git a/packages/eslint-config-javascript/index.js b/packages/eslint-config-javascript/index.js index aecd50af..181d5aca 100644 --- a/packages/eslint-config-javascript/index.js +++ b/packages/eslint-config-javascript/index.js @@ -10,7 +10,7 @@ import { es6 } from './rules/es6.js'; import { imports } from './rules/imports.js'; import { strict } from './rules/strict.js'; -export default [ +export const javascriptConfig = [ stylisticPlugin.configs['disable-legacy'], bestPractices, errors, diff --git a/packages/eslint-config-javascript/rules/imports.js b/packages/eslint-config-javascript/rules/imports.js index 866b5281..328e0f3b 100644 --- a/packages/eslint-config-javascript/rules/imports.js +++ b/packages/eslint-config-javascript/rules/imports.js @@ -101,7 +101,7 @@ export const imports = { '**/protractor.conf.js', // protractor config '**/protractor.conf.*.js', // protractor config '**/karma.conf.js', // karma config - '**/.eslintrc.js' // eslint config + '**/eslint.config.js' // eslint config ], optionalDependencies: false, }], diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index b9af386f..8bbb3f0c 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -1,10 +1,12 @@ -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascript, + ...javascriptConfig, + { + ignores: ['eslint.config.js'], + }, { rules: { - 'import/no-default-export': 'off', 'import/no-extraneous-dependencies': 'off', 'import/no-unresolved': 'off', }, diff --git a/packages/eslint-config-playwright/index.js b/packages/eslint-config-playwright/index.js index af347b8e..676ff2cf 100644 --- a/packages/eslint-config-playwright/index.js +++ b/packages/eslint-config-playwright/index.js @@ -1,8 +1,8 @@ -import typescript from '@ni/eslint-config-typescript'; +import { typescriptConfig } from '@ni/eslint-config-typescript'; import playwright from 'eslint-plugin-playwright'; -export default [ - ...typescript, +export const playwrightConfig = [ + ...typescriptConfig, playwright.configs['flat/recommended'], { rules: { diff --git a/packages/eslint-config-playwright/requiring-type-checking.js b/packages/eslint-config-playwright/requiring-type-checking.js index da60cb7b..c69e1e90 100644 --- a/packages/eslint-config-playwright/requiring-type-checking.js +++ b/packages/eslint-config-playwright/requiring-type-checking.js @@ -1,3 +1,3 @@ -import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; +import { typescriptRequiringTypeCheckingConfig } from '@ni/eslint-config-typescript/requiring-type-checking'; -export default [...typescriptRequiringTypeChecking]; \ No newline at end of file +export const playwrightRequiringTypeCheckingConfig = [...typescriptRequiringTypeCheckingConfig]; \ No newline at end of file diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index deaa4741..e0face42 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -1,11 +1,13 @@ -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascript, + ...javascriptConfig, + { + ignores: ['eslint.config.js'], + }, { files: ['**/*.js'], rules: { - 'import/no-default-export': 'off', 'import/extensions': 'off', 'import/no-extraneous-dependencies': 'off', 'import/no-unresolved': 'off', diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index cdcc7a25..2834715b 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -1,12 +1,14 @@ -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; import typescriptPlugin from 'typescript-eslint'; import importPlugin from 'eslint-plugin-import'; -import extensions from './lib/extensions.js'; +import { extensionsConfig } from './lib/extensions.js'; +import { typescriptRequiringTypeCheckingConfig } from './requiring-type-checking.js'; -export default [ - ...javascript, +export const typescriptConfig = [ + ...javascriptConfig, ...typescriptPlugin.configs.recommended, - ...extensions, + ...extensionsConfig, + ...typescriptRequiringTypeCheckingConfig, { languageOptions: { parser: typescriptPlugin.parser @@ -34,8 +36,6 @@ export default [ */ '@typescript-eslint/explicit-module-boundary-types': 'error', - 'no-with': 'error', - 'no-class-assign': 'error', /* [strict-null-checks] diff --git a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js index 64208561..affc2caa 100644 --- a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js +++ b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js @@ -1,4 +1,4 @@ -export default [{ +export const extensionsRequiringTypeCheckingConfig = [{ rules: { 'dot-notation': 'off', '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }], diff --git a/packages/eslint-config-typescript/lib/extensions.js b/packages/eslint-config-typescript/lib/extensions.js index bf6e6fc9..732a2e0c 100644 --- a/packages/eslint-config-typescript/lib/extensions.js +++ b/packages/eslint-config-typescript/lib/extensions.js @@ -1,4 +1,4 @@ -export default [{ +export const extensionsConfig = [{ rules: { /* The following are extension rules that replace core JavaScript rules to support diff --git a/packages/eslint-config-typescript/requiring-type-checking.js b/packages/eslint-config-typescript/requiring-type-checking.js index b23ea66a..62027170 100644 --- a/packages/eslint-config-typescript/requiring-type-checking.js +++ b/packages/eslint-config-typescript/requiring-type-checking.js @@ -1,10 +1,10 @@ import typescriptPlugin from 'typescript-eslint'; -import extensionsTypeChecked from './lib/extensions-requiring-type-checking.js'; +import { extensionsRequiringTypeCheckingConfig } from './lib/extensions-requiring-type-checking.js'; -export default [ +export const typescriptRequiringTypeCheckingConfig = [ ...typescriptPlugin.configs.recommendedTypeChecked, ...typescriptPlugin.configs.stylisticTypeChecked, - ...extensionsTypeChecked, + ...extensionsRequiringTypeCheckingConfig, { languageOptions: { parser: typescriptPlugin.parser diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index ecbfc087..a50cd2ec 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -1,9 +1,8 @@ import { fileURLToPath } from 'url'; import path from 'path'; -import angular from '@ni/eslint-config-angular'; -import angularTemplate from '@ni/eslint-config-angular/template'; -import angularRequiringTypeChecking from '@ni/eslint-config-angular/requiring-type-checking'; +import { angularConfig } from '@ni/eslint-config-angular'; +import { angularTemplateConfig } from '@ni/eslint-config-angular/template'; import { ignoreAttributes } from '@ni/eslint-config-angular/template/options'; import typescriptPlugin from 'typescript-eslint'; @@ -16,7 +15,7 @@ export default defineConfig([ { ignores: ['*.js'] }, { files: ['**/*.ts'], - extends: [...angular, ...angularRequiringTypeChecking], + extends: [...angularConfig], languageOptions: { parser: typescriptPlugin.parser, parserOptions: { @@ -27,7 +26,7 @@ export default defineConfig([ }, { files: ['*.html'], - extends: [...angularTemplate], + extends: [...angularTemplateConfig], languageOptions: { parser: angularTemplatePlugin.templateParser }, }, { diff --git a/tests/javascript/eslint.config.js b/tests/javascript/eslint.config.js index c4b7464a..1fb9c301 100644 --- a/tests/javascript/eslint.config.js +++ b/tests/javascript/eslint.config.js @@ -1,11 +1,8 @@ -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascript, + ...javascriptConfig, { - files: ['*.config.js'], - rules: { - 'import/no-default-export': 'off', - }, + ignores: ['eslint.config.js'] }, ]; diff --git a/tests/playwright-requiring-type-checking/README.md b/tests/playwright-requiring-type-checking/README.md deleted file mode 100644 index 52fd19fa..00000000 --- a/tests/playwright-requiring-type-checking/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Playwright Requiring Type Checking Smoke Test - -## Overview - -This package is an smoke test for using the Playwright requiring type checking rules in a project. See [CONTRIBUTING.md](../../CONTRIBUTING.md#smoke-tests) for more information. diff --git a/tests/playwright-requiring-type-checking/eslint.config.js b/tests/playwright-requiring-type-checking/eslint.config.js deleted file mode 100644 index c08b66d5..00000000 --- a/tests/playwright-requiring-type-checking/eslint.config.js +++ /dev/null @@ -1,33 +0,0 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; -import playwright from '@ni/eslint-config-playwright'; -import playwrightRequiringTypeChecking from '@ni/eslint-config-playwright/requiring-type-checking'; - -const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); - -export default [ - ...playwright, - ...playwrightRequiringTypeChecking, - { - ignores: ['*.js'], - }, - { - files: ['*.ts'], - languageOptions: { - parserOptions: { - project: ['./tsconfig.json'], - tsConfigRootDir, - }, - }, - rules: { - // In this example app, all files are allowed to refer to playwright packages from devDependencies - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - }, - }, - { - files: ['*.config.js'], - rules: { - 'import/no-default-export': 'off', - }, - }, -]; \ No newline at end of file diff --git a/tests/playwright-requiring-type-checking/index.ts b/tests/playwright-requiring-type-checking/index.ts deleted file mode 100644 index 944e2587..00000000 --- a/tests/playwright-requiring-type-checking/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('AssetDisplayPropertiesSidenavWrapperComponent', () => { - test('has title', async ({ page }) => { - await page.goto('https://playwright.dev/'); - - // Expect a title "to contain" a substring. - await expect(page).toHaveTitle(/Playwright/); - }); -}); \ No newline at end of file diff --git a/tests/playwright-requiring-type-checking/package.json b/tests/playwright-requiring-type-checking/package.json deleted file mode 100644 index 63f94624..00000000 --- a/tests/playwright-requiring-type-checking/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "module", - "name": "@ni/playwright-requiring-type-checking-test", - "version": "1.0.0", - "private": true, - "description": "Smoke test for Playwright requiring type checking project integration.", - "scripts": { - "test": "eslint ." - }, - "peerDependencies": { - "@ni/eslint-config-playwright": "*" - }, - "devDependencies": { - "@playwright/test": "^1.42.1" - } -} diff --git a/tests/playwright-requiring-type-checking/tsconfig.json b/tests/playwright-requiring-type-checking/tsconfig.json deleted file mode 100644 index 3f6b14e9..00000000 --- a/tests/playwright-requiring-type-checking/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "files": ["./index.ts"], - "compilerOptions": { - "strictNullChecks": false, - "moduleResolution": "node", - "target": "ES2020", - }, -} diff --git a/tests/playwright/eslint.config.js b/tests/playwright/eslint.config.js index 8ad867ec..d39aff49 100644 --- a/tests/playwright/eslint.config.js +++ b/tests/playwright/eslint.config.js @@ -1,18 +1,25 @@ -import playwright from '@ni/eslint-config-playwright'; +import { fileURLToPath } from 'url'; +import path from 'path'; +import { playwrightConfig } from '@ni/eslint-config-playwright'; + +const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); export default [ - ...playwright, + ...playwrightConfig, + { + ignores: ['*.js'] + }, { files: ['*.ts'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.json'], + tsConfigRootDir, + }, + }, rules: { // In this example app, all files are allowed to refer to playwright packages from devDependencies 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], }, - }, - { - files: ['*.config.js'], - rules: { - 'import/no-default-export': 'off', - }, - }, + } ]; diff --git a/tests/playwright/tsconfig.json b/tests/playwright/tsconfig.json new file mode 100644 index 00000000..a48a6393 --- /dev/null +++ b/tests/playwright/tsconfig.json @@ -0,0 +1,8 @@ +{ + "files": ["./index.ts"], + "compilerOptions": { + "strictNullChecks": false, + "moduleResolution": "node", + "target": "ES2020" + } +} \ No newline at end of file diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js index 20f4fce2..a78bd8e3 100644 --- a/tests/print-evaluated-rules/eslint.config.js +++ b/tests/print-evaluated-rules/eslint.config.js @@ -1,11 +1,13 @@ -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascript, + ...javascriptConfig, + { + ignores: ['eslint.config.js'] + }, { files: ['*.js'], rules: { - 'import/no-default-export': 'off', 'import/no-extraneous-dependencies': 'off', }, }, diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index a8d4889e..39113f00 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -1,7 +1,7 @@ /* eslint-disable no-console */ import { ESLint } from 'eslint'; -import angularRules from '@ni/eslint-config-angular'; -import angularTemplateRules from '@ni/eslint-config-angular/template'; +import { angularConfig } from '@ni/eslint-config-angular'; +import { angularTemplateConfig } from '@ni/eslint-config-angular/template'; import fs from 'fs'; import path from 'path'; import yargs from 'yargs/yargs'; @@ -105,8 +105,8 @@ const __dirname = path.dirname(__filename); return config; }, {})); - const angularDivergedRules = getDivergedRules(Object.assign({}, ...angularRules.slice(-2).map(item => item.rules))); - const angularTemplateDivergedRules = getDivergedRules(Object.assign({}, ...angularTemplateRules.slice(-2).map(item => item.rules))); + const angularDivergedRules = getDivergedRules(Object.assign({}, ...angularConfig.slice(-2).map(item => item.rules))); + const angularTemplateDivergedRules = getDivergedRules(Object.assign({}, ...angularTemplateConfig.slice(-2).map(item => item.rules))); const angularHasDivergedRules = !!Object.keys(angularDivergedRules).length || !!Object.keys(angularTemplateDivergedRules).length; diff --git a/tests/print-evaluated-rules/package.json b/tests/print-evaluated-rules/package.json index 7b380c90..abc427d8 100644 --- a/tests/print-evaluated-rules/package.json +++ b/tests/print-evaluated-rules/package.json @@ -16,7 +16,6 @@ "@ni/eslint-config-angular": "*", "@ni/javascript-test": "*", "@ni/typescript-test": "*", - "@ni/typescript-requiring-type-checking-test": "*", "eslint": "^9.35.0" }, "dependencies": { diff --git a/tests/typescript-requiring-type-checking/CHANGELOG.json b/tests/typescript-requiring-type-checking/CHANGELOG.json deleted file mode 100644 index 643199e4..00000000 --- a/tests/typescript-requiring-type-checking/CHANGELOG.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@ni/typescript-requiring-type-checking-test", - "entries": [ - { - "date": "Thu, 28 Oct 2021 15:59:19 GMT", - "tag": "@ni/typescript-requiring-type-checking-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/typescript-requiring-type-checking-test", - "comment": "Bump @ni/eslint-config-typescript to v3.0.2", - "commit": "772f17b65e83107fd8682087c87b9619a5c2ea38" - } - ] - } - }, - { - "date": "Wed, 29 Sep 2021 22:10:29 GMT", - "tag": "@ni/typescript-requiring-type-checking-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/typescript-requiring-type-checking-test", - "comment": "Bump @ni/eslint-config-typescript to v3.0.1", - "commit": "2eefa5b8f9bd3e68031cdb0e928cd97254a45ba6" - } - ] - } - } - ] -} diff --git a/tests/typescript-requiring-type-checking/CHANGELOG.md b/tests/typescript-requiring-type-checking/CHANGELOG.md deleted file mode 100644 index f22fbee7..00000000 --- a/tests/typescript-requiring-type-checking/CHANGELOG.md +++ /dev/null @@ -1,21 +0,0 @@ -# Change Log - @ni/typescript-requiring-type-checking-test - -This log was last generated on Thu, 28 Oct 2021 15:59:19 GMT and should not be manually modified. - - - -## 1.0.0 - -Thu, 28 Oct 2021 15:59:19 GMT - -### Patches - -- Bump @ni/eslint-config-typescript to v3.0.2 - -## 1.0.0 - -Wed, 29 Sep 2021 22:10:29 GMT - -### Patches - -- Bump @ni/eslint-config-typescript to v3.0.1 diff --git a/tests/typescript-requiring-type-checking/README.md b/tests/typescript-requiring-type-checking/README.md deleted file mode 100644 index 7083a244..00000000 --- a/tests/typescript-requiring-type-checking/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# TypeScript Requring Type Checking Smoke Test - -## Overview - -This package is an smoke test for using the TypeScript requiring type checking rules in a project. See [CONTRIBUTING.md](../../CONTRIBUTING.md#smoke-tests) for more information. diff --git a/tests/typescript-requiring-type-checking/eslint.config.js b/tests/typescript-requiring-type-checking/eslint.config.js deleted file mode 100644 index b7bc53eb..00000000 --- a/tests/typescript-requiring-type-checking/eslint.config.js +++ /dev/null @@ -1,23 +0,0 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; -import typescript from '@ni/eslint-config-typescript'; -import typescriptRequiringTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; - -const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); - -export default [ - { - ignores: ['*.js'], - }, - ...typescript, - ...typescriptRequiringTypeChecking, - { - files: ['**/*.ts'], - languageOptions: { - parserOptions: { - project: ['./tsconfig.json'], - tsConfigRootDir, - }, - }, - }, -]; diff --git a/tests/typescript-requiring-type-checking/index.ts b/tests/typescript-requiring-type-checking/index.ts deleted file mode 100644 index e8fea41e..00000000 --- a/tests/typescript-requiring-type-checking/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -// TypeScript Smoke Test - -export class NI { - private _awesomeLevel = 1; - - public get awesome(): boolean { - return this._awesomeLevel > 0; - } - - public makeAwesomer(): void { - this._awesomeLevel += 1; - } - - public async slowAdd(a: number, b: number, timeMs: number): Promise { - return await new Promise(resolve => { - setTimeout(() => resolve(a + b), timeMs); - }); - } -} diff --git a/tests/typescript-requiring-type-checking/package.json b/tests/typescript-requiring-type-checking/package.json deleted file mode 100644 index fa42018d..00000000 --- a/tests/typescript-requiring-type-checking/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "module", - "name": "@ni/typescript-requiring-type-checking-test", - "version": "1.0.0", - "private": true, - "description": "Smoke test for TypeScript projects using type checking.", - "scripts": { - "test": "eslint ." - }, - "peerDependencies": { - "@ni/eslint-config-typescript": "*" - } -} diff --git a/tests/typescript-requiring-type-checking/tsconfig.json b/tests/typescript-requiring-type-checking/tsconfig.json deleted file mode 100644 index 73a95eef..00000000 --- a/tests/typescript-requiring-type-checking/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files": ["./index.ts"], - "compilerOptions": { - "strictNullChecks": false, - "target": "ES2020" - }, -} diff --git a/tests/typescript/eslint.config.js b/tests/typescript/eslint.config.js index 0de43fe1..52b18c6e 100644 --- a/tests/typescript/eslint.config.js +++ b/tests/typescript/eslint.config.js @@ -1,11 +1,21 @@ -import typescript from '@ni/eslint-config-typescript'; +import { fileURLToPath } from 'url'; +import path from 'path'; +import { typescriptConfig } from '@ni/eslint-config-typescript'; + +const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); export default [ - ...typescript, + ...typescriptConfig, + { + ignores: ['eslint.config.js'] + }, { - files: ['*.js'], - rules: { - 'import/no-default-export': 'off', + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.json'], + tsConfigRootDir, + }, }, }, ]; \ No newline at end of file diff --git a/tests/typescript/tsconfig.json b/tests/typescript/tsconfig.json new file mode 100644 index 00000000..2996d589 --- /dev/null +++ b/tests/typescript/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": ["./index.ts"], + "compilerOptions": { + "strictNullChecks": false, + "target": "ES2020" + } +} \ No newline at end of file From b7f4d3c73833f0a5f13ed1b4c3e596e7d62bb0a6 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Sun, 21 Sep 2025 16:18:36 +0530 Subject: [PATCH 20/53] update readme info Signed-off-by: gokulprasanth-ni --- README.md | 32 ++++++++----------- package-lock.json | 2 -- package.json | 2 -- .../eslint-config-angular/eslint.config.js | 1 - .../requiring-type-checking.js | 6 ---- .../eslint-config-playwright/eslint.config.js | 1 - 6 files changed, 13 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 1ae88fe6..2b82694b 100644 --- a/README.md +++ b/README.md @@ -72,24 +72,22 @@ After installing the lint configuration packages, follow the configuration instr Export `@ni/eslint-config-javascript` configurations in your [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): ```js -import javascript from '@ni/eslint-config-javascript'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascript, + ...javascriptConfig, ]; ``` ### TypeScript configuration -Export `@ni/eslint-config-typescript` and `@ni/eslint-config-typescript/requiring-type-checking` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. +Export `@ni/eslint-config-typescript` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. ```js -import typescript from '@ni/eslint-config-typescript'; -import typescriptTypeChecking from '@ni/eslint-config-typescript/requiring-type-checking'; +import { typescriptConfig } from '@ni/eslint-config-typescript'; export default [ - ...typescript, - ...typescriptTypeChecking, + ...typescriptConfig, { files: ['**/*.ts'], languageOptions: { @@ -116,16 +114,14 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ ``` 3. Export the NI configured rules for Angular and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. ```js - import angular from '@ni/eslint-config-angular'; - import angularTypeChecking from '@ni/eslint-config-angular/requiring-type-checking'; - import angularTemplate from '@ni/eslint-config-angular/template'; + import angularConfig from '@ni/eslint-config-angular'; + import angularTemplateConfig from '@ni/eslint-config-angular/template'; export default [ { files: ['**/*.ts'], extends: [ - ...angular, - ...angularTypeChecking + ...angularConfig ], languageOptions: { parserOptions: { @@ -135,7 +131,7 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ }, { files: ['*.html'], - extends: [...angularTemplate] + extends: [...angularTemplateConfig] } ]; ``` @@ -143,19 +139,17 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ ### Playwright configuration -Export `@ni/eslint-config-playwright` and `@ni/eslint-config-playwright/requiring-type-checking` in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +Export `@ni/eslint-config-playwright` in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. **Note:** The Playwright configurations extend the TypeScript configurations, so it is not necessary for an application to extend them both. However, the Playwright configurations should only be applied to directories that contain Playwright tests and utilities. ```js // This is an example .eslintrc.js in a Playwright-specific directory. // If Playwright files are mixed with other code, use an "overrides" file pattern to match only Playwright code. -import playwright from '@ni/eslint-config-playwright'; -import playwrightTypeChecking from '@ni/eslint-config-playwright/requiring-type-checking'; +import playwrightConfig from '@ni/eslint-config-playwright'; export default [ - ...playwright, - ...playwrightTypeChecking, + ...playwrightConfig, { files: ['**/*.ts'], languageOptions: { @@ -347,7 +341,7 @@ This option can be adapted for npm scripts, for example. ### TypeScript linting performance -`@ni/eslint-config/typescript-requiring-type-checking` includes rules that require type checking that run slower as they utilize the TypeScript compiler for type information. +`@ni/eslint-config-typescript` includes rules that require type checking that run slower as they utilize the TypeScript compiler for type information. If there are situations where the analysis time for enabling the type checked rules is an excessive burden you may consider creating a separate ESLint configuration that avoids extending the type checked rules and omits the `parserOptions.project` configuration to run in specific scenarios. diff --git a/package-lock.json b/package-lock.json index 712116a6..ec765a8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,8 @@ "packages/eslint-config-playwright", "tests/javascript", "tests/typescript", - "tests/typescript-requiring-type-checking", "tests/angular", "tests/playwright", - "tests/playwright-requiring-type-checking", "tests/print-evaluated-rules" ], "devDependencies": { diff --git a/package.json b/package.json index 692598be..ab38d3b9 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,8 @@ "packages/eslint-config-playwright", "tests/javascript", "tests/typescript", - "tests/typescript-requiring-type-checking", "tests/angular", "tests/playwright", - "tests/playwright-requiring-type-checking", "tests/print-evaluated-rules" ], "devDependencies": { diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index 770b56d1..4059f78b 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -9,7 +9,6 @@ export default [ files: ['**/*.js'], rules: { 'import/no-extraneous-dependencies': 'off', - 'import/no-unresolved': 'off', }, }, ]; \ No newline at end of file diff --git a/packages/eslint-config-angular/requiring-type-checking.js b/packages/eslint-config-angular/requiring-type-checking.js index 096b8518..cb7ee047 100644 --- a/packages/eslint-config-angular/requiring-type-checking.js +++ b/packages/eslint-config-angular/requiring-type-checking.js @@ -1,13 +1,7 @@ import { typescriptRequiringTypeCheckingConfig } from '@ni/eslint-config-typescript/requiring-type-checking'; -import typescriptPlugin from 'typescript-eslint'; export const angularRequiringTypeCheckingConfig = [ ...typescriptRequiringTypeCheckingConfig, - { - languageOptions: { - parser: typescriptPlugin.parser, - }, - }, { files: ['**/*.spec.ts'], rules: { diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index 8bbb3f0c..7d5ef6a2 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -8,7 +8,6 @@ export default [ { rules: { 'import/no-extraneous-dependencies': 'off', - 'import/no-unresolved': 'off', }, }, ]; From be994ea368eceb6ba6d6345617f280779c30adf5 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Sun, 21 Sep 2025 16:51:58 +0530 Subject: [PATCH 21/53] add flat config migration section in readme Signed-off-by: gokulprasanth-ni --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/README.md b/README.md index 2b82694b..ca9bd1fe 100644 --- a/README.md +++ b/README.md @@ -295,6 +295,46 @@ The rule configuration files in this package (`index.js`, `typescript.js`, etc) ESLint offers several [ways to disable a rule for a line or file](https://eslint.org/docs/user-guide/configuring/rules#disabling-rules). Suppressions should be as targeted as possible and should include a comment explaining the suppression. +### Migrating to ESLint Flat Configuration Format + +ESLint’s [flat config format](https://eslint.org/docs/latest/use/configure/configuration-files-new) is now the recommended way to configure ESLint. If your project is still using a legacy `.eslintrc.*` file, follow these steps to migrate: + +1. **Rename your configuration file** +Replace your `.eslintrc.js` or `.eslintrc.json` with a new `eslint.config.js` file at the root of your project. + +2. **Switch to using imports** +Instead of using the `extends` property, import the configuration packages you need and export an array of configurations: + + ```js + // eslint.config.js + import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; + + export default [ + ...angularConfig, + ...angularTemplateConfig, + // Add any project-specific overrides here + ]; + ``` + + **Note:** All rules that previously required type checking are now included in the main config export for each package. You no longer need to import a separate requiring-type-checking config—just import the main config to get all rules. + +3. **Set parser options as needed** + For TypeScript and Angular projects, ensure you set `parserOptions.project` in a config block to point to your TypeScript configuration: + + ```js + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: './tsconfig.json' + } + } + } + ``` + +4. **Remove legacy config fields** + The flat config format does not use `parser`, or `plugins` at the top level. All configuration should be handled through the imported arrays and objects. + ### Recommended Development Environment Configuration Modern IDEs can be configured to provide live feedback about ESLint errors. From d6a557cc9e11f0ec625266e9971970e6c29cac36 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Sun, 21 Sep 2025 17:01:54 +0530 Subject: [PATCH 22/53] enable strict null checks by default Signed-off-by: gokulprasanth-ni --- README.md | 8 ++++---- .../requiring-type-checking.js | 20 +++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index ca9bd1fe..fb8f395e 100644 --- a/README.md +++ b/README.md @@ -299,10 +299,10 @@ ESLint offers several [ways to disable a rule for a line or file](https://eslint ESLint’s [flat config format](https://eslint.org/docs/latest/use/configure/configuration-files-new) is now the recommended way to configure ESLint. If your project is still using a legacy `.eslintrc.*` file, follow these steps to migrate: -1. **Rename your configuration file** +1. **Rename your configuration file**, Replace your `.eslintrc.js` or `.eslintrc.json` with a new `eslint.config.js` file at the root of your project. -2. **Switch to using imports** +2. **Switch to using imports**, Instead of using the `extends` property, import the configuration packages you need and export an array of configurations: ```js @@ -318,7 +318,7 @@ Instead of using the `extends` property, import the configuration packages you n **Note:** All rules that previously required type checking are now included in the main config export for each package. You no longer need to import a separate requiring-type-checking config—just import the main config to get all rules. -3. **Set parser options as needed** +3. **Set parser options as needed**, For TypeScript and Angular projects, ensure you set `parserOptions.project` in a config block to point to your TypeScript configuration: ```js @@ -332,7 +332,7 @@ Instead of using the `extends` property, import the configuration packages you n } ``` -4. **Remove legacy config fields** +4. **Remove legacy config fields**, The flat config format does not use `parser`, or `plugins` at the top level. All configuration should be handled through the imported arrays and objects. ### Recommended Development Environment Configuration diff --git a/packages/eslint-config-typescript/requiring-type-checking.js b/packages/eslint-config-typescript/requiring-type-checking.js index 62027170..12531b50 100644 --- a/packages/eslint-config-typescript/requiring-type-checking.js +++ b/packages/eslint-config-typescript/requiring-type-checking.js @@ -123,10 +123,10 @@ export const typescriptRequiringTypeCheckingConfig = [ '@typescript-eslint/no-confusing-void-expression': ['error', { ignoreArrowShorthand: true }], /* [strict-null-checks] */ - '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'off', + '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error', /* [strict-null-checks] */ - '@typescript-eslint/no-unnecessary-condition': 'off', + '@typescript-eslint/no-unnecessary-condition': 'error', '@typescript-eslint/no-unnecessary-qualifier': 'error', @@ -172,16 +172,14 @@ export const typescriptRequiringTypeCheckingConfig = [ '@typescript-eslint/require-array-sort-compare': 'error', /* - [strict-null-checks] This rule requires the TypeScript strictNullChecks compiler flag. If strictNullChecks is enabled, disallow numbers - with the following configuration: - '@typescript-eslint/strict-boolean-expressions': ['error', { - allowNumber: false, - allowNullableBoolean: true, - allowNullableString: true, - allowNullableNumber: false - }] + [strict-null-checks] */ - '@typescript-eslint/strict-boolean-expressions': 'off', + '@typescript-eslint/strict-boolean-expressions': ['error', { + allowNumber: false, + allowNullableBoolean: true, + allowNullableString: true, + allowNullableNumber: false + }], /* This rule is made redundant by `default-case` so it will never fire and is disabled. From 0d197d5ddbc2116e43f496e3ace5a222eaa7e1e6 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Sun, 21 Sep 2025 17:14:04 +0530 Subject: [PATCH 23/53] add comments to the newly added rules in the project's eslint.config.js Signed-off-by: gokulprasanth-ni --- .../eslint-config-angular/eslint.config.js | 21 +++++++++-------- .../eslint-config-javascript/eslint.config.js | 23 ++++++++++--------- .../eslint-config-playwright/eslint.config.js | 1 + .../eslint-config-typescript/eslint.config.js | 1 + tests/angular/tsconfig.json | 5 +++- tests/playwright/tsconfig.json | 2 +- tests/typescript/tsconfig.json | 2 +- 7 files changed, 31 insertions(+), 24 deletions(-) diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index 4059f78b..f07dde45 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -1,14 +1,15 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascriptConfig, - { - ignores: ['eslint.config.js'], - }, - { - files: ['**/*.js'], - rules: { - 'import/no-extraneous-dependencies': 'off', - }, - }, + ...javascriptConfig, + { + ignores: ['eslint.config.js'], + }, + { + files: ['**/*.js'], + rules: { + // Disable this rule because some packages used in the project are not listed in devDependencies or dependencies. + 'import/no-extraneous-dependencies': 'off', + }, + }, ]; \ No newline at end of file diff --git a/packages/eslint-config-javascript/eslint.config.js b/packages/eslint-config-javascript/eslint.config.js index a3bc996d..ecb740ab 100644 --- a/packages/eslint-config-javascript/eslint.config.js +++ b/packages/eslint-config-javascript/eslint.config.js @@ -1,15 +1,16 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascriptConfig, - { - ignores: ['eslint.config.js'], - }, - { - files: ['**/*.js'], - rules: { - 'import/extensions': 'off', - 'import/no-extraneous-dependencies': 'off', - }, - }, + ...javascriptConfig, + { + ignores: ['eslint.config.js'], + }, + { + files: ['**/*.js'], + rules: { + // Disable these rules because some packages used in the project are not listed in devDependencies or dependencies, and ES6 modules require explicit file extensions by default. + 'import/extensions': 'off', + 'import/no-extraneous-dependencies': 'off', + }, + }, ]; diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index 7d5ef6a2..09442394 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -7,6 +7,7 @@ export default [ }, { rules: { + // Disable this rule because some packages used in the project are not listed in devDependencies or dependencies. 'import/no-extraneous-dependencies': 'off', }, }, diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index e0face42..cb8ace70 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -8,6 +8,7 @@ export default [ { files: ['**/*.js'], rules: { + // Disable these rules because some packages used in the project are not listed in devDependencies or dependencies, and ES6 modules require explicit file extensions by default. 'import/extensions': 'off', 'import/no-extraneous-dependencies': 'off', 'import/no-unresolved': 'off', diff --git a/tests/angular/tsconfig.json b/tests/angular/tsconfig.json index 09b71a33..60831181 100644 --- a/tests/angular/tsconfig.json +++ b/tests/angular/tsconfig.json @@ -1,6 +1,9 @@ { "compilerOptions": { - "experimentalDecorators": true + "experimentalDecorators": true, + "strictNullChecks": true, + "moduleResolution": "node", + "target": "ES2020" }, "include": ["."] } \ No newline at end of file diff --git a/tests/playwright/tsconfig.json b/tests/playwright/tsconfig.json index a48a6393..2a088da2 100644 --- a/tests/playwright/tsconfig.json +++ b/tests/playwright/tsconfig.json @@ -1,7 +1,7 @@ { "files": ["./index.ts"], "compilerOptions": { - "strictNullChecks": false, + "strictNullChecks": true, "moduleResolution": "node", "target": "ES2020" } diff --git a/tests/typescript/tsconfig.json b/tests/typescript/tsconfig.json index 2996d589..48a88664 100644 --- a/tests/typescript/tsconfig.json +++ b/tests/typescript/tsconfig.json @@ -1,7 +1,7 @@ { "files": ["./index.ts"], "compilerOptions": { - "strictNullChecks": false, + "strictNullChecks": true, "target": "ES2020" } } \ No newline at end of file From 706ae3d9ddb3e5da19a41178e0e041c31632a103 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Sun, 21 Sep 2025 17:20:01 +0530 Subject: [PATCH 24/53] Fix: issue Signed-off-by: gokulprasanth-ni --- tests/print-evaluated-rules/index.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index 39113f00..98db3197 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -33,13 +33,11 @@ const __dirname = path.dirname(__filename); const testDir = path.resolve(__dirname, '..'); const jsPath = path.join(testDir, 'javascript', 'index.js'); const tsPath = path.join(testDir, 'typescript', 'index.ts'); - const tsTypePath = path.join(testDir, 'typescript-requiring-type-checking', 'index.ts'); const angularTsPath = path.join(testDir, 'angular', 'index.ts'); const angularHtmlPath = path.join(testDir, 'angular', 'index.html'); const configEslint = await calculateConfigForFile(jsPath); const configTypescript = await calculateConfigForFile(tsPath); - const configTypescriptTypechecked = await calculateConfigForFile(tsTypePath); const configAngular = await calculateConfigForFile(angularTsPath); const configAngularTemplate = await calculateConfigForFile(angularHtmlPath); @@ -47,7 +45,6 @@ const __dirname = path.dirname(__filename); return { ...normalizeRulesSeverityToString(configEslint.rules), ...normalizeRulesSeverityToString(configTypescript.rules), - ...normalizeRulesSeverityToString(configTypescriptTypechecked.rules), ...normalizeRulesSeverityToString(configAngular.rules), ...normalizeRulesSeverityToString(configAngularTemplate.rules) }; @@ -98,7 +95,6 @@ const __dirname = path.dirname(__filename); .filter(key => !key.startsWith('@angular-eslint')) .filter( key => !configTypescript.rules[key] - && !configTypescriptTypechecked.rules[key] ) .reduce((config, key) => { config[key] = rules[key]; @@ -115,11 +111,6 @@ const __dirname = path.dirname(__filename); console.log( `Evaluated TypeScript rules has warn?: ${hasWarn(configTypescript)}` ); - console.log( - `Evaluated TypeScript type checking rules has warn?: ${hasWarn( - configTypescriptTypechecked - )}` - ); console.log(`Evaluated Angular rules has warn?: ${hasWarn(configAngular)}`); console.log( `Evaluated Angular Template rules has warn?: ${hasWarn( From 8d0101324c65616d33145bb4b7d08888ef5e1c1e Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 22 Sep 2025 12:20:11 -0500 Subject: [PATCH 25/53] Fix 'import/no-extraneous-dependencies': 'off' --- package-lock.json | 4 +++- packages/eslint-config-angular/eslint.config.js | 2 -- packages/eslint-config-angular/template.js | 2 +- packages/eslint-config-javascript/eslint.config.js | 2 -- packages/eslint-config-javascript/package.json | 5 +++-- packages/eslint-config-playwright/eslint.config.js | 2 -- packages/eslint-config-typescript/eslint.config.js | 2 -- packages/eslint-config-typescript/package.json | 1 + tests/print-evaluated-rules/eslint.config.js | 1 - 9 files changed, 8 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec765a8f..a43f28af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5085,7 +5085,8 @@ "peerDependencies": { "@stylistic/eslint-plugin": "^5.0.0", "eslint": "^9.35.0", - "eslint-plugin-import": "^2.31.1" + "eslint-plugin-import": "^2.31.1", + "globals": "^14.0.0" } }, "packages/eslint-config-playwright": { @@ -5103,6 +5104,7 @@ "license": "MIT", "peerDependencies": { "@ni/eslint-config-javascript": "^4.4.0", + "eslint-plugin-import": "^2.31.1", "typescript-eslint": "^8.0.0" } }, diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index f07dde45..eb460c71 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -8,8 +8,6 @@ export default [ { files: ['**/*.js'], rules: { - // Disable this rule because some packages used in the project are not listed in devDependencies or dependencies. - 'import/no-extraneous-dependencies': 'off', }, }, ]; \ No newline at end of file diff --git a/packages/eslint-config-angular/template.js b/packages/eslint-config-angular/template.js index e4205991..e29514b8 100644 --- a/packages/eslint-config-angular/template.js +++ b/packages/eslint-config-angular/template.js @@ -1,5 +1,5 @@ -import { ignoreAttributes } from '@ni/eslint-config-angular/template/options'; import angularTemplate from 'angular-eslint'; +import { ignoreAttributes } from './template/options'; export const angularTemplateConfig = [ ...angularTemplate.configs.templateRecommended, diff --git a/packages/eslint-config-javascript/eslint.config.js b/packages/eslint-config-javascript/eslint.config.js index ecb740ab..be7ef34a 100644 --- a/packages/eslint-config-javascript/eslint.config.js +++ b/packages/eslint-config-javascript/eslint.config.js @@ -8,9 +8,7 @@ export default [ { files: ['**/*.js'], rules: { - // Disable these rules because some packages used in the project are not listed in devDependencies or dependencies, and ES6 modules require explicit file extensions by default. 'import/extensions': 'off', - 'import/no-extraneous-dependencies': 'off', }, }, ]; diff --git a/packages/eslint-config-javascript/package.json b/packages/eslint-config-javascript/package.json index 8fc4974d..6b56abc7 100644 --- a/packages/eslint-config-javascript/package.json +++ b/packages/eslint-config-javascript/package.json @@ -1,5 +1,5 @@ { - "type":"module", + "type": "module", "name": "@ni/eslint-config-javascript", "version": "4.4.0", "description": "NI's JavaScript ESLint Shareable Config", @@ -32,8 +32,9 @@ "!/.*.js" ], "peerDependencies": { + "@stylistic/eslint-plugin": "^5.0.0", "eslint": "^9.35.0", "eslint-plugin-import": "^2.31.1", - "@stylistic/eslint-plugin": "^5.0.0" + "globals": "^14.0.0" } } diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index 09442394..f8db5794 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -7,8 +7,6 @@ export default [ }, { rules: { - // Disable this rule because some packages used in the project are not listed in devDependencies or dependencies. - 'import/no-extraneous-dependencies': 'off', }, }, ]; diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index cb8ace70..4cbf598e 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -8,9 +8,7 @@ export default [ { files: ['**/*.js'], rules: { - // Disable these rules because some packages used in the project are not listed in devDependencies or dependencies, and ES6 modules require explicit file extensions by default. 'import/extensions': 'off', - 'import/no-extraneous-dependencies': 'off', 'import/no-unresolved': 'off', }, }, diff --git a/packages/eslint-config-typescript/package.json b/packages/eslint-config-typescript/package.json index 14bd487c..3e86f238 100644 --- a/packages/eslint-config-typescript/package.json +++ b/packages/eslint-config-typescript/package.json @@ -34,6 +34,7 @@ ], "peerDependencies": { "@ni/eslint-config-javascript": "^4.4.0", + "eslint-plugin-import": "^2.31.1", "typescript-eslint": "^8.0.0" }, "exports": { diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js index a78bd8e3..48375875 100644 --- a/tests/print-evaluated-rules/eslint.config.js +++ b/tests/print-evaluated-rules/eslint.config.js @@ -8,7 +8,6 @@ export default [ { files: ['*.js'], rules: { - 'import/no-extraneous-dependencies': 'off', }, }, ]; \ No newline at end of file From f22f19ffe9ff8a0c4feabeb710aa4ad913a26ad6 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 22 Sep 2025 12:31:51 -0500 Subject: [PATCH 26/53] no-unresolved --- packages/eslint-config-typescript/eslint.config.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index 4cbf598e..27c0a79b 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -9,7 +9,16 @@ export default [ files: ['**/*.js'], rules: { 'import/extensions': 'off', - 'import/no-unresolved': 'off', + // eslint-plugin-import doesn't know how to resolve entry points in packages + // that use modern export maps in package.json. + // https://github.com/typescript-eslint/typescript-eslint/issues/7565 + // https://github.com/import-js/eslint-plugin-import/issues/2703 + 'import/no-unresolved': [ + 'error', + { + ignore: ['typescript-eslint'] + } + ], }, }, ]; From 303f23f416496af9b5dc011889941af59823cc35 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 22 Sep 2025 12:38:04 -0500 Subject: [PATCH 27/53] Re-add test from typechecking --- tests/typescript/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/typescript/index.ts b/tests/typescript/index.ts index 6eafbbc9..c1e23a74 100644 --- a/tests/typescript/index.ts +++ b/tests/typescript/index.ts @@ -14,4 +14,10 @@ export class NI { public makeAwesomer(): void { this._awesomeLevel += 1; } + + public async slowAdd(a: number, b: number, timeMs: number): Promise { + return await new Promise(resolve => { + setTimeout(() => resolve(a + b), timeMs); + }); + } } From 90d243e21756a8c360310f163b8e8e92895ec616 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 22 Sep 2025 13:31:30 -0500 Subject: [PATCH 28/53] strictNullChecks --- README.md | 6 ++---- ...config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json | 2 +- ...fig-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json | 2 +- ...fig-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json | 2 +- packages/eslint-config-typescript/index.js | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index fb8f395e..cfb4b6f3 100644 --- a/README.md +++ b/README.md @@ -242,11 +242,9 @@ Tag: [`[strict-null-checks]`](https://github.com/ni/javascript-styleguide/search When `strictNullChecks` are enabled the values `null` and `undefined` are treated as distinct types by the compiler. For example, with `strictNullChecks` enabled, the value `null` could not be directly assigned to a binding of a `Cat` object, ie `const cat: Cat = null` would be a compile error. The `null` value is a distinct type and the binding would have to explicitly state that it can have a `null` value, ie `const cat: Cat | null = null;`. -`strictNullChecks` are a powerful tool for code correctness and give us a way to avoid ["The Billion Dollar Mistake"](https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/). However, it can be impractical to retrofit `strictNullChecks` configuration into an existing application and requires expanding your mental model for software development for use in new applications. +`strictNullChecks` are a powerful tool for code correctness and give us a way to avoid ["The Billion Dollar Mistake"](https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/). -As such, `strictNullChecks` are not recommended by default in order to prevent overhead of rule adoption for existing applications. - -However, we encourage new applications to leverage `strictNullChecks` for development. Enabling `strictNullChecks` is the TypeScript compiler recommendation and it is enabled by default in new Angular applications. +This style guide assumes `strictNullChecks` are enabled by default. However, it can be impractical to retrofit `strictNullChecks` configuration into an existing application and requires expanding your mental model for software development for use in new applications. To adopt this style guide in a project without `strictNullChecks`, configure every rule tagged with `[strict-null-checks]` to `off` unless specified in the rule comment. #### Accessibility diff --git a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json index 2f64bdae..b37340dc 100644 --- a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json +++ b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-angular to be compatible with eslint v9", + "comment": "Update eslint-config-angular to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled.", "packageName": "@ni/eslint-config-angular", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json index df9815e4..bc089a7d 100644 --- a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json +++ b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-playwright to be compatible with eslint v9", + "comment": "Update eslint-config-playwright to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled.", "packageName": "@ni/eslint-config-playwright", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json index 8a1b7a85..d084fdba 100644 --- a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json +++ b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-typescript to be compatible with eslint v9", + "comment": "Update eslint-config-typescript to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled.", "packageName": "@ni/eslint-config-typescript", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index 2834715b..883178e6 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -44,7 +44,7 @@ export const typescriptConfig = [ With `strictNullChecks` enabled, the non-null assertion operator (this rule configured as 'off') is useful for asserting that a value will no longer be null and usage of operator should be allowed. */ - '@typescript-eslint/no-non-null-assertion': 'error', + '@typescript-eslint/no-non-null-assertion': 'off', 'valid-typeof': 'off', From f6c67543cd6bcb035798cc12801dfad7796facc1 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 22 Sep 2025 13:36:45 -0500 Subject: [PATCH 29/53] Fix test failure --- packages/eslint-config-angular/eslint.config.js | 1 + packages/eslint-config-angular/template.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index eb460c71..4d9cd33a 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -8,6 +8,7 @@ export default [ { files: ['**/*.js'], rules: { + 'import/extensions': 'off' }, }, ]; \ No newline at end of file diff --git a/packages/eslint-config-angular/template.js b/packages/eslint-config-angular/template.js index e29514b8..c473ef7f 100644 --- a/packages/eslint-config-angular/template.js +++ b/packages/eslint-config-angular/template.js @@ -1,5 +1,5 @@ import angularTemplate from 'angular-eslint'; -import { ignoreAttributes } from './template/options'; +import { ignoreAttributes } from './template/options.js'; export const angularTemplateConfig = [ ...angularTemplate.configs.templateRecommended, From f50f6318f1db1584a3c554a691f643b885836933 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 22 Sep 2025 15:26:13 -0500 Subject: [PATCH 30/53] README formatting --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cfb4b6f3..30017ff8 100644 --- a/README.md +++ b/README.md @@ -297,10 +297,10 @@ ESLint offers several [ways to disable a rule for a line or file](https://eslint ESLint’s [flat config format](https://eslint.org/docs/latest/use/configure/configuration-files-new) is now the recommended way to configure ESLint. If your project is still using a legacy `.eslintrc.*` file, follow these steps to migrate: -1. **Rename your configuration file**, +1. **Rename your configuration file** Replace your `.eslintrc.js` or `.eslintrc.json` with a new `eslint.config.js` file at the root of your project. -2. **Switch to using imports**, +2. **Switch to using imports** Instead of using the `extends` property, import the configuration packages you need and export an array of configurations: ```js @@ -316,7 +316,7 @@ Instead of using the `extends` property, import the configuration packages you n **Note:** All rules that previously required type checking are now included in the main config export for each package. You no longer need to import a separate requiring-type-checking config—just import the main config to get all rules. -3. **Set parser options as needed**, +3. **Set parser options as needed** For TypeScript and Angular projects, ensure you set `parserOptions.project` in a config block to point to your TypeScript configuration: ```js @@ -330,7 +330,7 @@ Instead of using the `extends` property, import the configuration packages you n } ``` -4. **Remove legacy config fields**, +4. **Remove legacy config fields** The flat config format does not use `parser`, or `plugins` at the top level. All configuration should be handled through the imported arrays and objects. ### Recommended Development Environment Configuration From 1de9e262278f42822d6a55af17776692cd466147 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Tue, 23 Sep 2025 11:04:01 +0530 Subject: [PATCH 31/53] clean up Signed-off-by: gokulprasanth-ni --- packages/eslint-config-playwright/eslint.config.js | 6 +----- tests/print-evaluated-rules/eslint.config.js | 7 +------ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index f8db5794..10b2798f 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -4,9 +4,5 @@ export default [ ...javascriptConfig, { ignores: ['eslint.config.js'], - }, - { - rules: { - }, - }, + } ]; diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js index 48375875..4c8b8a05 100644 --- a/tests/print-evaluated-rules/eslint.config.js +++ b/tests/print-evaluated-rules/eslint.config.js @@ -4,10 +4,5 @@ export default [ ...javascriptConfig, { ignores: ['eslint.config.js'] - }, - { - files: ['*.js'], - rules: { - }, - }, + } ]; \ No newline at end of file From c549133c5bfc781b448bdb5d9694520105dbe8e6 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Wed, 24 Sep 2025 12:25:31 +0530 Subject: [PATCH 32/53] address PR comments Signed-off-by: gokulprasanth-ni --- .../eslint-config-angular/eslint.config.js | 23 +++++++++------- packages/eslint-config-angular/package.json | 3 ++- .../eslint-config-javascript/eslint.config.js | 26 +++++++++++-------- .../eslint-config-playwright/eslint.config.js | 5 +++- .../eslint-config-playwright/package.json | 1 + .../eslint-config-typescript/eslint.config.js | 5 +++- 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index 4d9cd33a..85145225 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -1,14 +1,17 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascriptConfig, - { - ignores: ['eslint.config.js'], - }, - { - files: ['**/*.js'], - rules: { - 'import/extensions': 'off' - }, - }, + ...javascriptConfig, + { + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off' + } + }, + { + files: ['**/*.js'], + rules: { + 'import/extensions': 'off' + }, + }, ]; \ No newline at end of file diff --git a/packages/eslint-config-angular/package.json b/packages/eslint-config-angular/package.json index 64352d80..c665aac1 100644 --- a/packages/eslint-config-angular/package.json +++ b/packages/eslint-config-angular/package.json @@ -34,7 +34,8 @@ ], "peerDependencies": { "angular-eslint": "^18.4.3", - "@ni/eslint-config-typescript": "^4.4.4" + "@ni/eslint-config-typescript": "^4.4.4", + "@ni/eslint-config-javascript": "^4.4.0" }, "exports": { ".": "./index.js", diff --git a/packages/eslint-config-javascript/eslint.config.js b/packages/eslint-config-javascript/eslint.config.js index be7ef34a..0c409f65 100644 --- a/packages/eslint-config-javascript/eslint.config.js +++ b/packages/eslint-config-javascript/eslint.config.js @@ -1,14 +1,18 @@ -import { javascriptConfig } from '@ni/eslint-config-javascript'; +// eslint-disable-next-line import/no-useless-path-segments +import { javascriptConfig } from './index.js'; export default [ - ...javascriptConfig, - { - ignores: ['eslint.config.js'], - }, - { - files: ['**/*.js'], - rules: { - 'import/extensions': 'off', - }, - }, + ...javascriptConfig, + { + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off' + } + }, + { + files: ['**/*.js'], + rules: { + 'import/extensions': 'off' + }, + }, ]; diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index 10b2798f..57702628 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -3,6 +3,9 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ ...javascriptConfig, { - ignores: ['eslint.config.js'], + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off' + } } ]; diff --git a/packages/eslint-config-playwright/package.json b/packages/eslint-config-playwright/package.json index 09cdc5ff..222dbf86 100644 --- a/packages/eslint-config-playwright/package.json +++ b/packages/eslint-config-playwright/package.json @@ -33,6 +33,7 @@ ], "peerDependencies": { "@ni/eslint-config-typescript": "^4.4.4", + "@ni/eslint-config-javascript": "^4.4.0", "eslint-plugin-playwright": "^0.18.0" }, "exports": { diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index 27c0a79b..8bad9b69 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -3,7 +3,10 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ ...javascriptConfig, { - ignores: ['eslint.config.js'], + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off' + } }, { files: ['**/*.js'], From 22c786f59161a66931e13433c6c3e80018f23aaf Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Wed, 24 Sep 2025 12:51:35 +0530 Subject: [PATCH 33/53] update moduleResolution to node16 Signed-off-by: gokulprasanth-ni --- tests/angular/tsconfig.json | 3 ++- tests/playwright/tsconfig.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/angular/tsconfig.json b/tests/angular/tsconfig.json index 60831181..4286429b 100644 --- a/tests/angular/tsconfig.json +++ b/tests/angular/tsconfig.json @@ -2,7 +2,8 @@ "compilerOptions": { "experimentalDecorators": true, "strictNullChecks": true, - "moduleResolution": "node", + "module":"node16", + "moduleResolution": "node16", "target": "ES2020" }, "include": ["."] diff --git a/tests/playwright/tsconfig.json b/tests/playwright/tsconfig.json index 2a088da2..a3b73a99 100644 --- a/tests/playwright/tsconfig.json +++ b/tests/playwright/tsconfig.json @@ -2,7 +2,8 @@ "files": ["./index.ts"], "compilerOptions": { "strictNullChecks": true, - "moduleResolution": "node", + "module":"node16", + "moduleResolution": "node16", "target": "ES2020" } } \ No newline at end of file From c79ce9c6e38647d50b58f2f844e8a194b12c0534 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Wed, 24 Sep 2025 13:01:26 +0530 Subject: [PATCH 34/53] address lvl2 PR comments Signed-off-by: gokulprasanth-ni --- tests/angular/eslint.config.js | 7 ++++++- tests/javascript/eslint.config.js | 5 ++++- tests/playwright/eslint.config.js | 12 ++++++++---- tests/print-evaluated-rules/eslint.config.js | 5 ++++- tests/print-evaluated-rules/package.json | 1 + tests/typescript/eslint.config.js | 12 ++++++++---- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index a50cd2ec..b27401a3 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -12,7 +12,12 @@ import { defineConfig } from 'eslint/config'; const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); export default defineConfig([ - { ignores: ['*.js'] }, + { + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off', + } + }, { files: ['**/*.ts'], extends: [...angularConfig], diff --git a/tests/javascript/eslint.config.js b/tests/javascript/eslint.config.js index 1fb9c301..531a899b 100644 --- a/tests/javascript/eslint.config.js +++ b/tests/javascript/eslint.config.js @@ -3,6 +3,9 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ ...javascriptConfig, { - ignores: ['eslint.config.js'] + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off' + } }, ]; diff --git a/tests/playwright/eslint.config.js b/tests/playwright/eslint.config.js index d39aff49..f3436a76 100644 --- a/tests/playwright/eslint.config.js +++ b/tests/playwright/eslint.config.js @@ -1,16 +1,20 @@ import { fileURLToPath } from 'url'; import path from 'path'; import { playwrightConfig } from '@ni/eslint-config-playwright'; +import { defineConfig } from 'eslint/config'; const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); -export default [ - ...playwrightConfig, +export default defineConfig([ { - ignores: ['*.js'] + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off', + } }, { files: ['*.ts'], + extends: [...playwrightConfig], languageOptions: { parserOptions: { project: ['./tsconfig.json'], @@ -22,4 +26,4 @@ export default [ 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], }, } -]; +]); diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js index 4c8b8a05..ada45e28 100644 --- a/tests/print-evaluated-rules/eslint.config.js +++ b/tests/print-evaluated-rules/eslint.config.js @@ -3,6 +3,9 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ ...javascriptConfig, { - ignores: ['eslint.config.js'] + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off' + } } ]; \ No newline at end of file diff --git a/tests/print-evaluated-rules/package.json b/tests/print-evaluated-rules/package.json index abc427d8..7ed3e30a 100644 --- a/tests/print-evaluated-rules/package.json +++ b/tests/print-evaluated-rules/package.json @@ -14,6 +14,7 @@ "angular-eslint": "18.4.3", "@ni/angular-test": "*", "@ni/eslint-config-angular": "*", + "@ni/eslint-config-javascript": "*", "@ni/javascript-test": "*", "@ni/typescript-test": "*", "eslint": "^9.35.0" diff --git a/tests/typescript/eslint.config.js b/tests/typescript/eslint.config.js index 52b18c6e..e9ca36ff 100644 --- a/tests/typescript/eslint.config.js +++ b/tests/typescript/eslint.config.js @@ -1,16 +1,20 @@ import { fileURLToPath } from 'url'; import path from 'path'; import { typescriptConfig } from '@ni/eslint-config-typescript'; +import { defineConfig } from 'eslint/config'; const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); -export default [ - ...typescriptConfig, +export default defineConfig([ { - ignores: ['eslint.config.js'] + files: ['eslint.config.js'], + rules: { + 'import/no-default-export': 'off', + } }, { files: ['**/*.ts'], + extends: [...typescriptConfig], languageOptions: { parserOptions: { project: ['./tsconfig.json'], @@ -18,4 +22,4 @@ export default [ }, }, }, -]; \ No newline at end of file +]); \ No newline at end of file From 5132f428f71d2a44a9d0d637a2d81d6b6fdf61d5 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Wed, 24 Sep 2025 13:13:34 +0530 Subject: [PATCH 35/53] remove unwanted rules Signed-off-by: gokulprasanth-ni --- packages/eslint-config-typescript/index.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index 883178e6..f6477e61 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -37,15 +37,6 @@ export const typescriptConfig = [ '@typescript-eslint/explicit-module-boundary-types': 'error', - /* - [strict-null-checks] - With `strictNullChecks` disabled, non-null assertions are discouraged (this rule is configured as 'error') - as non-null assertions do not provide additional type safety and if used inconsistently add to visual noise. - With `strictNullChecks` enabled, the non-null assertion operator (this rule configured as 'off') - is useful for asserting that a value will no longer be null and usage of operator should be allowed. - */ - '@typescript-eslint/no-non-null-assertion': 'off', - 'valid-typeof': 'off', /* From c48ac122ac4dbe8a36076cb93e84ca2c7624139f Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Wed, 24 Sep 2025 22:50:29 +0530 Subject: [PATCH 36/53] update README file Signed-off-by: gokulprasanth-ni --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/README.md b/README.md index 30017ff8..38d9f40d 100644 --- a/README.md +++ b/README.md @@ -333,6 +333,44 @@ Instead of using the `extends` property, import the configuration packages you n 4. **Remove legacy config fields** The flat config format does not use `parser`, or `plugins` at the top level. All configuration should be handled through the imported arrays and objects. +5. **@stylistic rules** + The following rules are moved from `@typescript-eslint` to `@stylistic`. Update any project config overrides and inline suppressions to the new names: + - `@typescript-eslint/member-delimiter-style` → `@stylistic/member-delimiter-style` + - `@typescript-eslint/type-annotation-spacing` → `@stylistic/type-annotation-spacing` + + Other deprecated rules may also now reside under `@stylistic`. Search your codebase for old suppressions (e.g. `eslint-disable @typescript-eslint/...`) and rename them as needed. + +6. **Angular CLI linkage** + When using `eslint.config.js` with Angular, explicitly point the Angular workspace at the flat config. In `angular.json` (per project): + ```json + "projects": { + "my-app": { + "architect": { + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"], + "eslintConfig": "./eslint.config.js" + } + } + } + } + } + ``` + +7. **strictNullChecks** is now enabled by default. + - If your project has `strictNullChecks` enabled, remove previously overridden strictNullChecks rules. + - If your project has `strictNullChecks` disabled, disable those strictNullChecks rules to maintain previous behavior. Example: + ```js + { + files: ['**/*.ts'], + rules: { + '@typescript-eslint/no-unnecessary-condition': 'off', + '@typescript-eslint/strict-boolean-expressions': 'off' + } + } + ``` + ### Recommended Development Environment Configuration Modern IDEs can be configured to provide live feedback about ESLint errors. From 9693626d9c7fb1b34a4a509587ccfd89ea93a655 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Wed, 24 Sep 2025 23:01:12 +0530 Subject: [PATCH 37/53] update change files Signed-off-by: gokulprasanth-ni --- ...int-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json | 2 +- ...-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json | 2 +- ...-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json index b37340dc..1775e053 100644 --- a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json +++ b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-angular to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled.", + "comment": "Update eslint-config-angular to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. Check 'https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format' for more information.", "packageName": "@ni/eslint-config-angular", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json index bc089a7d..83b0a694 100644 --- a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json +++ b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-playwright to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled.", + "comment": "Update eslint-config-playwright to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. Check 'https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format' for more information.", "packageName": "@ni/eslint-config-playwright", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json index d084fdba..688d9a7e 100644 --- a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json +++ b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-typescript to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled.", + "comment": "Update eslint-config-typescript to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. Check 'https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format' for more information.", "packageName": "@ni/eslint-config-typescript", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" From 4895a376ea6a8df2ab130864af0fc42b63a5e75d Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Fri, 26 Sep 2025 11:56:21 +0530 Subject: [PATCH 38/53] update eslint configuration in readme Signed-off-by: gokulprasanth-ni --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 38d9f40d..f5e261c7 100644 --- a/README.md +++ b/README.md @@ -341,7 +341,7 @@ Instead of using the `extends` property, import the configuration packages you n Other deprecated rules may also now reside under `@stylistic`. Search your codebase for old suppressions (e.g. `eslint-disable @typescript-eslint/...`) and rename them as needed. 6. **Angular CLI linkage** - When using `eslint.config.js` with Angular, explicitly point the Angular workspace at the flat config. In `angular.json` (per project): + Configure the linter in `angular.json` for each project in Angular workspaces to use the `eslint.config.js` ESLint configuration. Example: ```json "projects": { "my-app": { @@ -359,8 +359,8 @@ Instead of using the `extends` property, import the configuration packages you n ``` 7. **strictNullChecks** is now enabled by default. - - If your project has `strictNullChecks` enabled, remove previously overridden strictNullChecks rules. - - If your project has `strictNullChecks` disabled, disable those strictNullChecks rules to maintain previous behavior. Example: + - If your project has `strictNullChecks` enabled, remove previously overridden strict rules for null checks. + - If your project has `strictNullChecks` disabled, disable strict rules for null checks to maintain previous behavior. Example: ```js { files: ['**/*.ts'], From c4a9645467e53599e89c9a8510714dbd745303dd Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Mon, 29 Sep 2025 19:58:02 +0530 Subject: [PATCH 39/53] update rule Signed-off-by: gokulprasanth-ni --- packages/eslint-config-javascript/rules/variables.js | 2 +- packages/eslint-config-typescript/lib/extensions.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/eslint-config-javascript/rules/variables.js b/packages/eslint-config-javascript/rules/variables.js index 5e8ac4b4..370a797f 100644 --- a/packages/eslint-config-javascript/rules/variables.js +++ b/packages/eslint-config-javascript/rules/variables.js @@ -67,7 +67,7 @@ export const variables = { In situations where they are required like unused callback function arguments, indicate that the unused variable is intentional by pre-pending its name with `_`. */ - 'no-unused-vars': ['error', { vars: 'all', args: 'all', argsIgnorePattern: '^_', ignoreRestSiblings: true }], + 'no-unused-vars': ['error', { vars: 'all', args: 'all', argsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', ignoreRestSiblings: true }], /* Defining classes and variables before their use can cause errors. However, placing diff --git a/packages/eslint-config-typescript/lib/extensions.js b/packages/eslint-config-typescript/lib/extensions.js index 732a2e0c..31ab0420 100644 --- a/packages/eslint-config-typescript/lib/extensions.js +++ b/packages/eslint-config-typescript/lib/extensions.js @@ -67,7 +67,7 @@ export const extensionsConfig = [{ }], 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': ['error', { vars: 'all', args: 'all', argsIgnorePattern: '^_', ignoreRestSiblings: true }], + '@typescript-eslint/no-unused-vars': ['error', { vars: 'all', args: 'all', argsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', ignoreRestSiblings: true }], 'no-use-before-define': 'off', '@typescript-eslint/no-use-before-define': ['error', { functions: false, classes: true, variables: true }], From d54f5527bb23323ffcf04b0b85a5c191742fd8dc Mon Sep 17 00:00:00 2001 From: rajsite Date: Mon, 29 Sep 2025 11:12:31 -0500 Subject: [PATCH 40/53] Update lockfile --- package-lock.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package-lock.json b/package-lock.json index a43f28af..0f4f12c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5074,6 +5074,7 @@ "version": "9.0.7", "license": "MIT", "peerDependencies": { + "@ni/eslint-config-javascript": "^4.4.0", "@ni/eslint-config-typescript": "^4.4.4", "angular-eslint": "^18.4.3" } @@ -5094,6 +5095,7 @@ "version": "1.1.5", "license": "MIT", "peerDependencies": { + "@ni/eslint-config-javascript": "^4.4.0", "@ni/eslint-config-typescript": "^4.4.4", "eslint-plugin-playwright": "^0.18.0" } @@ -5147,6 +5149,7 @@ "peerDependencies": { "@ni/angular-test": "*", "@ni/eslint-config-angular": "*", + "@ni/eslint-config-javascript": "*", "@ni/javascript-test": "*", "@ni/typescript-test": "*", "angular-eslint": "18.4.3", From 1d30d1766e245741ccbe917b9fa2fabb674960e0 Mon Sep 17 00:00:00 2001 From: rajsite Date: Mon, 29 Sep 2025 16:43:25 -0500 Subject: [PATCH 41/53] Use defineConfig, single entrypoint, consistent config import --- README.md | 14 +- package-lock.json | 159 +++++++++--------- .../eslint-config-angular/eslint.config.js | 23 ++- packages/eslint-config-angular/index.js | 12 +- packages/eslint-config-angular/package.json | 85 +++++----- .../requiring-type-checking.js | 15 -- packages/eslint-config-angular/template.js | 7 +- .../eslint-config-angular/template/options.js | 2 +- .../tools/print-available-rules.js | 1 - .../eslint-config-javascript/eslint.config.js | 24 +-- packages/eslint-config-javascript/index.js | 21 ++- .../eslint-config-javascript/package.json | 81 ++++----- .../rules/best-practices.js | 6 +- .../eslint-config-javascript/rules/errors.js | 6 +- .../eslint-config-javascript/rules/es6.js | 6 +- .../eslint-config-javascript/rules/imports.js | 23 ++- .../eslint-config-javascript/rules/node.js | 6 +- .../eslint-config-javascript/rules/strict.js | 6 +- .../eslint-config-javascript/rules/style.js | 6 +- .../rules/variables.js | 6 +- .../eslint-config-playwright/eslint.config.js | 15 +- packages/eslint-config-playwright/index.js | 7 +- .../eslint-config-playwright/package.json | 82 ++++----- .../requiring-type-checking.js | 3 - .../tools/print-available-rules.js | 1 - .../eslint-config-typescript/eslint.config.js | 33 ++-- packages/eslint-config-typescript/index.js | 13 +- .../lib/extensions-requiring-type-checking.js | 6 +- .../lib/extensions.js | 6 +- .../eslint-config-typescript/package.json | 85 +++++----- .../requiring-type-checking.js | 11 +- .../tools/print-available-rules.js | 5 - tests/angular/CHANGELOG.json | 50 ------ tests/angular/CHANGELOG.md | 29 ---- .../custom-ignore-attributes/index.spec.ts | 4 +- tests/angular/eslint.config.js | 99 +++++------ tests/angular/index.spec.ts | 4 +- tests/angular/package.json | 5 +- tests/javascript/CHANGELOG.json | 20 --- tests/javascript/CHANGELOG.md | 13 -- tests/javascript/eslint.config.js | 13 +- tests/javascript/package.json | 2 +- tests/playwright/eslint.config.js | 6 +- tests/playwright/package.json | 3 +- tests/print-evaluated-rules/eslint.config.js | 13 +- tests/print-evaluated-rules/package.json | 2 +- tests/typescript/CHANGELOG.json | 35 ---- tests/typescript/CHANGELOG.md | 21 --- tests/typescript/eslint.config.js | 18 +- tests/typescript/package.json | 3 +- 50 files changed, 465 insertions(+), 651 deletions(-) delete mode 100644 packages/eslint-config-angular/requiring-type-checking.js delete mode 100644 packages/eslint-config-playwright/requiring-type-checking.js delete mode 100644 tests/angular/CHANGELOG.json delete mode 100644 tests/angular/CHANGELOG.md delete mode 100644 tests/javascript/CHANGELOG.json delete mode 100644 tests/javascript/CHANGELOG.md delete mode 100644 tests/typescript/CHANGELOG.json delete mode 100644 tests/typescript/CHANGELOG.md diff --git a/README.md b/README.md index f5e261c7..f1a48a0a 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ Export `@ni/eslint-config-javascript` configurations in your [ESLint flat config import { javascriptConfig } from '@ni/eslint-config-javascript'; export default [ - ...javascriptConfig, + javascriptConfig, ]; ``` @@ -87,7 +87,7 @@ Export `@ni/eslint-config-typescript` configurations in the [ESLint flat configu import { typescriptConfig } from '@ni/eslint-config-typescript'; export default [ - ...typescriptConfig, + typescriptConfig, { files: ['**/*.ts'], languageOptions: { @@ -121,7 +121,7 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ { files: ['**/*.ts'], extends: [ - ...angularConfig + angularConfig ], languageOptions: { parserOptions: { @@ -131,7 +131,7 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ }, { files: ['*.html'], - extends: [...angularTemplateConfig] + extends: angularTemplateConfig] } ]; ``` @@ -149,7 +149,7 @@ Export `@ni/eslint-config-playwright` in the [ESLint flat configuration](https:/ import playwrightConfig from '@ni/eslint-config-playwright'; export default [ - ...playwrightConfig, + playwrightConfig, { files: ['**/*.ts'], languageOptions: { @@ -308,8 +308,8 @@ Instead of using the `extends` property, import the configuration packages you n import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; export default [ - ...angularConfig, - ...angularTemplateConfig, + angularConfig, + angularTemplateConfig, // Add any project-specific overrides here ]; ``` diff --git a/package-lock.json b/package-lock.json index 0f4f12c3..8a9cf799 100644 --- a/package-lock.json +++ b/package-lock.json @@ -595,13 +595,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", - "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.1.tgz", + "integrity": "sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.0" + "playwright": "1.55.1" }, "bin": { "playwright": "cli.js" @@ -687,17 +687,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", - "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", + "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", "license": "MIT", "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/type-utils": "8.44.0", - "@typescript-eslint/utils": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/type-utils": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -711,7 +711,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.44.0", + "@typescript-eslint/parser": "^8.44.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -727,16 +727,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", - "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "engines": { @@ -752,14 +752,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", - "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.0", - "@typescript-eslint/types": "^8.44.0", + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "engines": { @@ -774,14 +774,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", - "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -792,9 +792,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", - "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "license": "MIT", "peer": true, "engines": { @@ -809,15 +809,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", - "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", + "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -834,9 +834,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", - "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "license": "MIT", "peer": true, "engines": { @@ -848,16 +848,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", - "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/project-service": "8.44.0", - "@typescript-eslint/tsconfig-utils": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -903,16 +903,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", - "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", + "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0" + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -927,13 +927,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", - "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3916,13 +3916,13 @@ } }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.1.tgz", + "integrity": "sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.55.1" }, "bin": { "playwright": "cli.js" @@ -3935,9 +3935,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz", + "integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4788,16 +4788,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.0.tgz", - "integrity": "sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.1.tgz", + "integrity": "sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.44.0", - "@typescript-eslint/parser": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/utils": "8.44.0" + "@typescript-eslint/eslint-plugin": "8.44.1", + "@typescript-eslint/parser": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5084,9 +5084,9 @@ "version": "4.4.0", "license": "MIT", "peerDependencies": { - "@stylistic/eslint-plugin": "^5.0.0", - "eslint": "^9.35.0", - "eslint-plugin-import": "^2.31.1", + "@stylistic/eslint-plugin": "^5.4.0", + "eslint": "^9.36.0", + "eslint-plugin-import": "^2.32.0", "globals": "^14.0.0" } }, @@ -5106,8 +5106,8 @@ "license": "MIT", "peerDependencies": { "@ni/eslint-config-javascript": "^4.4.0", - "eslint-plugin-import": "^2.31.1", - "typescript-eslint": "^8.0.0" + "eslint-plugin-import": "^2.32.0", + "typescript-eslint": "^8.44.1" } }, "tests/angular": { @@ -5120,7 +5120,8 @@ "@types/jasmine": "^5.1.4" }, "peerDependencies": { - "@ni/eslint-config-angular": "*" + "@ni/eslint-config-angular": "*", + "@ni/eslint-config-javascript": "*" } }, "tests/javascript": { @@ -5137,6 +5138,7 @@ "@playwright/test": "^1.42.1" }, "peerDependencies": { + "@ni/eslint-config-javascript": "*", "@ni/eslint-config-playwright": "*" } }, @@ -5160,6 +5162,7 @@ "name": "@ni/typescript-test", "version": "1.0.0", "peerDependencies": { + "@ni/eslint-config-javascript": "*", "@ni/eslint-config-typescript": "*" } } diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index 85145225..125ff7fc 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -1,17 +1,14 @@ -import { javascriptConfig } from '@ni/eslint-config-javascript'; +import { defineConfig } from 'eslint/config'; -export default [ - ...javascriptConfig, +import { javascriptConfig, nodeEsmImportConfig } from '@ni/eslint-config-javascript'; + +export default defineConfig([ + javascriptConfig, + nodeEsmImportConfig, { - files: ['eslint.config.js'], + files: ['tools/*.js'], rules: { - 'import/no-default-export': 'off' + 'no-console': 'off' } - }, - { - files: ['**/*.js'], - rules: { - 'import/extensions': 'off' - }, - }, -]; \ No newline at end of file + } +]); diff --git a/packages/eslint-config-angular/index.js b/packages/eslint-config-angular/index.js index 1a872b56..0bd672dc 100644 --- a/packages/eslint-config-angular/index.js +++ b/packages/eslint-config-angular/index.js @@ -1,9 +1,13 @@ +import { defineConfig } from 'eslint/config'; import { typescriptConfig } from '@ni/eslint-config-typescript'; import angular from 'angular-eslint'; -export const angularConfig = [ - ...angular.configs.tsRecommended, - ...typescriptConfig, +export { angularTemplateConfig } from './template.js'; +export { ignoreAttributes } from './template/options.js'; + +export const angularConfig = defineConfig([ + angular.configs.tsRecommended, + typescriptConfig, { processor: angular.processInlineTemplates, rules: { @@ -143,4 +147,4 @@ export const angularConfig = [ '@typescript-eslint/unbound-method': 'off', } } -]; +]); diff --git a/packages/eslint-config-angular/package.json b/packages/eslint-config-angular/package.json index c665aac1..b75d1960 100644 --- a/packages/eslint-config-angular/package.json +++ b/packages/eslint-config-angular/package.json @@ -1,46 +1,43 @@ { - "type": "module", - "name": "@ni/eslint-config-angular", - "version": "9.0.7", - "description": "NI's Angular ESLint Shareable Config", - "main": "index.js", - "scripts": { - "lint": "eslint .", - "pack": "npm pack", - "print-available-rules": "node tools/print-available-rules" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ni/javascript-styleguide.git" - }, - "keywords": [ - "eslint", - "eslintconfig", - "ni" - ], - "author": "National Instruments", - "license": "MIT", - "bugs": { - "url": "https://github.com/ni/javascript-styleguide/issues" - }, - "homepage": "https://github.com/ni/javascript-styleguide#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "**/*.js", - "!/.*.js", - "!/tools" - ], - "peerDependencies": { - "angular-eslint": "^18.4.3", - "@ni/eslint-config-typescript": "^4.4.4", - "@ni/eslint-config-javascript": "^4.4.0" - }, - "exports": { - ".": "./index.js", - "./template": "./template.js", - "./requiring-type-checking": "./requiring-type-checking.js", - "./template/options": "./template/options.js" - } + "name": "@ni/eslint-config-angular", + "version": "9.0.7", + "description": "NI's Angular ESLint Shareable Config", + "type": "module", + "main": "index.js", + "exports": { + ".": "./index.js" + }, + "scripts": { + "lint": "eslint .", + "pack": "npm pack", + "print-available-rules": "node tools/print-available-rules" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ni/javascript-styleguide.git" + }, + "keywords": [ + "eslint", + "eslintconfig", + "ni" + ], + "author": "National Instruments", + "license": "MIT", + "bugs": { + "url": "https://github.com/ni/javascript-styleguide/issues" + }, + "homepage": "https://github.com/ni/javascript-styleguide#readme", + "publishConfig": { + "access": "public" + }, + "files": [ + "**/*.js", + "!/tools/*", + "!/eslint.config.js" + ], + "peerDependencies": { + "angular-eslint": "^18.4.3", + "@ni/eslint-config-typescript": "^4.4.4", + "@ni/eslint-config-javascript": "^4.4.0" + } } diff --git a/packages/eslint-config-angular/requiring-type-checking.js b/packages/eslint-config-angular/requiring-type-checking.js deleted file mode 100644 index cb7ee047..00000000 --- a/packages/eslint-config-angular/requiring-type-checking.js +++ /dev/null @@ -1,15 +0,0 @@ -import { typescriptRequiringTypeCheckingConfig } from '@ni/eslint-config-typescript/requiring-type-checking'; - -export const angularRequiringTypeCheckingConfig = [ - ...typescriptRequiringTypeCheckingConfig, - { - files: ['**/*.spec.ts'], - rules: { - /* - Spies used by Angular application tests result in a significant number of - unbound methods so this rule is disabled for test specs in Angular projects. - */ - '@typescript-eslint/unbound-method': 'off', - }, - }, -]; diff --git a/packages/eslint-config-angular/template.js b/packages/eslint-config-angular/template.js index c473ef7f..f1ac5a6a 100644 --- a/packages/eslint-config-angular/template.js +++ b/packages/eslint-config-angular/template.js @@ -1,8 +1,9 @@ +import { defineConfig } from 'eslint/config'; import angularTemplate from 'angular-eslint'; import { ignoreAttributes } from './template/options.js'; -export const angularTemplateConfig = [ - ...angularTemplate.configs.templateRecommended, +export const angularTemplateConfig = defineConfig([ + angularTemplate.configs.templateRecommended, { rules: { /* @@ -107,4 +108,4 @@ export const angularTemplateConfig = [ '@angular-eslint/template/i18n': 'off' } } -]; +]); diff --git a/packages/eslint-config-angular/template/options.js b/packages/eslint-config-angular/template/options.js index f2ccb929..3db567ac 100644 --- a/packages/eslint-config-angular/template/options.js +++ b/packages/eslint-config-angular/template/options.js @@ -142,4 +142,4 @@ const ignoreAttributeSets = { export const ignoreAttributes = { ...ignoreAttributeSets, all: Object.values(ignoreAttributeSets).flat() -}; \ No newline at end of file +}; diff --git a/packages/eslint-config-angular/tools/print-available-rules.js b/packages/eslint-config-angular/tools/print-available-rules.js index 895057de..7debb278 100644 --- a/packages/eslint-config-angular/tools/print-available-rules.js +++ b/packages/eslint-config-angular/tools/print-available-rules.js @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import angularPlugin from 'angular-eslint'; const print = keys => { diff --git a/packages/eslint-config-javascript/eslint.config.js b/packages/eslint-config-javascript/eslint.config.js index 0c409f65..011b6b3b 100644 --- a/packages/eslint-config-javascript/eslint.config.js +++ b/packages/eslint-config-javascript/eslint.config.js @@ -1,18 +1,8 @@ -// eslint-disable-next-line import/no-useless-path-segments -import { javascriptConfig } from './index.js'; +import { defineConfig } from 'eslint/config'; -export default [ - ...javascriptConfig, - { - files: ['eslint.config.js'], - rules: { - 'import/no-default-export': 'off' - } - }, - { - files: ['**/*.js'], - rules: { - 'import/extensions': 'off' - }, - }, -]; +import { javascriptConfig, nodeEsmImportConfig } from './index.js'; + +export default defineConfig([ + javascriptConfig, + nodeEsmImportConfig, +]); diff --git a/packages/eslint-config-javascript/index.js b/packages/eslint-config-javascript/index.js index 181d5aca..b3c7ed79 100644 --- a/packages/eslint-config-javascript/index.js +++ b/packages/eslint-config-javascript/index.js @@ -1,3 +1,4 @@ +import { defineConfig } from 'eslint/config'; import importPlugin from 'eslint-plugin-import'; import stylisticPlugin from '@stylistic/eslint-plugin'; import globals from 'globals'; @@ -10,7 +11,7 @@ import { es6 } from './rules/es6.js'; import { imports } from './rules/imports.js'; import { strict } from './rules/strict.js'; -export const javascriptConfig = [ +export const javascriptConfig = defineConfig([ stylisticPlugin.configs['disable-legacy'], bestPractices, errors, @@ -33,4 +34,20 @@ export const javascriptConfig = [ } } }, -]; \ No newline at end of file +]); + +export const nodeEsmImportConfig = defineConfig([ + { + rules: { + // node esm resolution requires extensions + 'import/extensions': 'off', + // node esm resolution requires full path name + 'import/no-useless-path-segments': 'off', + // eslint-plugin-import doesn't know how to resolve entry points in packages + // that use modern export maps in package.json. + // https://github.com/typescript-eslint/typescript-eslint/issues/7565 + // https://github.com/import-js/eslint-plugin-import/issues/2703 + 'import/no-unresolved': 'off', + } + } +]); diff --git a/packages/eslint-config-javascript/package.json b/packages/eslint-config-javascript/package.json index 6b56abc7..8650ee47 100644 --- a/packages/eslint-config-javascript/package.json +++ b/packages/eslint-config-javascript/package.json @@ -1,40 +1,43 @@ { - "type": "module", - "name": "@ni/eslint-config-javascript", - "version": "4.4.0", - "description": "NI's JavaScript ESLint Shareable Config", - "main": "index.js", - "scripts": { - "lint": "eslint .", - "pack": "npm pack" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ni/javascript-styleguide.git" - }, - "keywords": [ - "eslint", - "eslintconfig", - "ni" - ], - "author": "National Instruments", - "license": "MIT", - "bugs": { - "url": "https://github.com/ni/javascript-styleguide/issues" - }, - "homepage": "https://github.com/ni/javascript-styleguide#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "/*.js", - "rules/*.js", - "!/.*.js" - ], - "peerDependencies": { - "@stylistic/eslint-plugin": "^5.0.0", - "eslint": "^9.35.0", - "eslint-plugin-import": "^2.31.1", - "globals": "^14.0.0" - } -} + "name": "@ni/eslint-config-javascript", + "version": "4.4.0", + "description": "NI's JavaScript ESLint Shareable Config", + "type": "module", + "main": "index.js", + "exports": { + ".": "./index.js" + }, + "scripts": { + "lint": "eslint .", + "pack": "npm pack" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ni/javascript-styleguide.git" + }, + "keywords": [ + "eslint", + "eslintconfig", + "ni" + ], + "author": "National Instruments", + "license": "MIT", + "bugs": { + "url": "https://github.com/ni/javascript-styleguide/issues" + }, + "homepage": "https://github.com/ni/javascript-styleguide#readme", + "publishConfig": { + "access": "public" + }, + "files": [ + "**/*.js", + "!/tools/*", + "!/eslint.config.js" + ], + "peerDependencies": { + "@stylistic/eslint-plugin": "^5.4.0", + "eslint": "^9.36.0", + "eslint-plugin-import": "^2.32.0", + "globals": "^14.0.0" + } +} \ No newline at end of file diff --git a/packages/eslint-config-javascript/rules/best-practices.js b/packages/eslint-config-javascript/rules/best-practices.js index 609fd042..f5c9a6ce 100644 --- a/packages/eslint-config-javascript/rules/best-practices.js +++ b/packages/eslint-config-javascript/rules/best-practices.js @@ -1,4 +1,6 @@ -export const bestPractices = { +import { defineConfig } from 'eslint/config'; + +export const bestPractices = defineConfig([{ rules: { /* enforces getter/setter pairs in objects @@ -587,4 +589,4 @@ export const bestPractices = { */ yoda: 'error' } -}; \ No newline at end of file +}]); diff --git a/packages/eslint-config-javascript/rules/errors.js b/packages/eslint-config-javascript/rules/errors.js index 9f15d5a4..c73e2c75 100644 --- a/packages/eslint-config-javascript/rules/errors.js +++ b/packages/eslint-config-javascript/rules/errors.js @@ -1,4 +1,6 @@ -export const errors = { +import { defineConfig } from 'eslint/config'; + +export const errors = defineConfig([{ rules: { /* Enforce “for” loop update clause moving the counter in the right direction @@ -283,4 +285,4 @@ export const errors = { */ 'valid-typeof': ['error', { requireStringLiterals: true }], } -}; \ No newline at end of file +}]); diff --git a/packages/eslint-config-javascript/rules/es6.js b/packages/eslint-config-javascript/rules/es6.js index d6d92cdb..e6f0a58e 100644 --- a/packages/eslint-config-javascript/rules/es6.js +++ b/packages/eslint-config-javascript/rules/es6.js @@ -1,4 +1,6 @@ -export const es6 = { +import { defineConfig } from 'eslint/config'; + +export const es6 = defineConfig([{ rules: { /* Developers should consider readability, and no braces may be preferred when unnecessary. However, this rule @@ -225,4 +227,4 @@ export const es6 = { */ '@stylistic/yield-star-spacing': ['error', 'after'] } -}; \ No newline at end of file +}]); diff --git a/packages/eslint-config-javascript/rules/imports.js b/packages/eslint-config-javascript/rules/imports.js index 328e0f3b..29595787 100644 --- a/packages/eslint-config-javascript/rules/imports.js +++ b/packages/eslint-config-javascript/rules/imports.js @@ -1,4 +1,6 @@ -export const imports = { +import { defineConfig } from 'eslint/config'; + +export const imports = defineConfig([{ settings: { 'import/resolver': { node: { @@ -101,6 +103,7 @@ export const imports = { '**/protractor.conf.js', // protractor config '**/protractor.conf.*.js', // protractor config '**/karma.conf.js', // karma config + '**/.eslintrc.js', // eslint config '**/eslint.config.js' // eslint config ], optionalDependencies: false, @@ -374,5 +377,19 @@ export const imports = { https://github.com/import-js/eslint-plugin-import/blob/d5fc8b670dc8e6903dbb7b0894452f60c03089f5/docs/rules/no-empty-named-blocks.md */ 'import/no-empty-named-blocks': 'off', - }, -}; \ No newline at end of file + } +}, { + /* + Eslint configuration file specific settings + */ + files: ['eslint.config.js', 'eslint.config.mjs'], + rules: { + // eslint config files require a top-level default export + 'import/no-default-export': 'off', + // eslint-plugin-import doesn't know how to resolve entry points in packages + // that use modern export maps in package.json. + // https://github.com/typescript-eslint/typescript-eslint/issues/7565 + // https://github.com/import-js/eslint-plugin-import/issues/2703 + 'import/no-unresolved': 'off', + } +}]); diff --git a/packages/eslint-config-javascript/rules/node.js b/packages/eslint-config-javascript/rules/node.js index 1ef0138d..e106243f 100644 --- a/packages/eslint-config-javascript/rules/node.js +++ b/packages/eslint-config-javascript/rules/node.js @@ -1,4 +1,6 @@ -export const node = { +import { defineConfig } from 'eslint/config'; + +export const node = defineConfig([{ rules: { /* enforce return after a callback @@ -58,4 +60,4 @@ export const node = { */ 'no-sync': 'off', } -}; \ No newline at end of file +}]); diff --git a/packages/eslint-config-javascript/rules/strict.js b/packages/eslint-config-javascript/rules/strict.js index 793e32ed..0277985e 100644 --- a/packages/eslint-config-javascript/rules/strict.js +++ b/packages/eslint-config-javascript/rules/strict.js @@ -1,8 +1,10 @@ -export const strict = { +import { defineConfig } from 'eslint/config'; + +export const strict = defineConfig([{ rules: { /* babel inserts `'use strict';` for us */ strict: ['error', 'never'], }, -}; \ No newline at end of file +}]); diff --git a/packages/eslint-config-javascript/rules/style.js b/packages/eslint-config-javascript/rules/style.js index 453ca737..ab7ddd7d 100644 --- a/packages/eslint-config-javascript/rules/style.js +++ b/packages/eslint-config-javascript/rules/style.js @@ -1,4 +1,6 @@ -export const style = { +import { defineConfig } from 'eslint/config'; + +export const style = defineConfig([{ rules: { /* enforce line breaks after opening and before closing array brackets @@ -715,4 +717,4 @@ export const style = { */ '@stylistic/wrap-regex': 'off' } -}; \ No newline at end of file +}]); diff --git a/packages/eslint-config-javascript/rules/variables.js b/packages/eslint-config-javascript/rules/variables.js index 370a797f..d5ba2d81 100644 --- a/packages/eslint-config-javascript/rules/variables.js +++ b/packages/eslint-config-javascript/rules/variables.js @@ -1,4 +1,6 @@ -export const variables = { +import { defineConfig } from 'eslint/config'; + +export const variables = defineConfig([{ rules: { /* enforce or disallow variable initializations at definition @@ -76,4 +78,4 @@ export const variables = { */ 'no-use-before-define': ['error', { functions: false, classes: true, variables: true }], } -}; \ No newline at end of file +}]); diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index 57702628..125ff7fc 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -1,11 +1,14 @@ -import { javascriptConfig } from '@ni/eslint-config-javascript'; +import { defineConfig } from 'eslint/config'; -export default [ - ...javascriptConfig, +import { javascriptConfig, nodeEsmImportConfig } from '@ni/eslint-config-javascript'; + +export default defineConfig([ + javascriptConfig, + nodeEsmImportConfig, { - files: ['eslint.config.js'], + files: ['tools/*.js'], rules: { - 'import/no-default-export': 'off' + 'no-console': 'off' } } -]; +]); diff --git a/packages/eslint-config-playwright/index.js b/packages/eslint-config-playwright/index.js index 676ff2cf..606cc324 100644 --- a/packages/eslint-config-playwright/index.js +++ b/packages/eslint-config-playwright/index.js @@ -1,8 +1,9 @@ +import { defineConfig } from 'eslint/config'; import { typescriptConfig } from '@ni/eslint-config-typescript'; import playwright from 'eslint-plugin-playwright'; -export const playwrightConfig = [ - ...typescriptConfig, +export const playwrightConfig = defineConfig([ + typescriptConfig, playwright.configs['flat/recommended'], { rules: { @@ -82,4 +83,4 @@ export const playwrightConfig = [ 'playwright/require-top-level-describe': 'error' } } -]; +]); diff --git a/packages/eslint-config-playwright/package.json b/packages/eslint-config-playwright/package.json index 222dbf86..ca751c8d 100644 --- a/packages/eslint-config-playwright/package.json +++ b/packages/eslint-config-playwright/package.json @@ -1,43 +1,43 @@ { - "type": "module", - "name": "@ni/eslint-config-playwright", - "version": "1.1.5", - "description": "NI's Playwright ESLint Shareable Config", - "main": "index.js", - "scripts": { - "lint": "eslint .", - "pack": "npm pack", - "print-available-rules": "node tools/print-available-rules" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ni/javascript-styleguide.git" - }, - "keywords": [ - "eslint", - "eslintconfig", - "ni" - ], - "author": "National Instruments", - "license": "MIT", - "bugs": { - "url": "https://github.com/ni/javascript-styleguide/issues" - }, - "homepage": "https://github.com/ni/javascript-styleguide#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "/*.js", - "!/.*.js" - ], - "peerDependencies": { - "@ni/eslint-config-typescript": "^4.4.4", - "@ni/eslint-config-javascript": "^4.4.0", - "eslint-plugin-playwright": "^0.18.0" - }, - "exports": { - ".": "./index.js", - "./requiring-type-checking": "./requiring-type-checking.js" - } + "name": "@ni/eslint-config-playwright", + "version": "1.1.5", + "description": "NI's Playwright ESLint Shareable Config", + "type": "module", + "main": "index.js", + "exports": { + ".": "./index.js" + }, + "scripts": { + "lint": "eslint .", + "pack": "npm pack", + "print-available-rules": "node tools/print-available-rules" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ni/javascript-styleguide.git" + }, + "keywords": [ + "eslint", + "eslintconfig", + "ni" + ], + "author": "National Instruments", + "license": "MIT", + "bugs": { + "url": "https://github.com/ni/javascript-styleguide/issues" + }, + "homepage": "https://github.com/ni/javascript-styleguide#readme", + "publishConfig": { + "access": "public" + }, + "files": [ + "**/*.js", + "!/tools/*", + "!/eslint.config.js" + ], + "peerDependencies": { + "@ni/eslint-config-typescript": "^4.4.4", + "@ni/eslint-config-javascript": "^4.4.0", + "eslint-plugin-playwright": "^0.18.0" + } } diff --git a/packages/eslint-config-playwright/requiring-type-checking.js b/packages/eslint-config-playwright/requiring-type-checking.js deleted file mode 100644 index c69e1e90..00000000 --- a/packages/eslint-config-playwright/requiring-type-checking.js +++ /dev/null @@ -1,3 +0,0 @@ -import { typescriptRequiringTypeCheckingConfig } from '@ni/eslint-config-typescript/requiring-type-checking'; - -export const playwrightRequiringTypeCheckingConfig = [...typescriptRequiringTypeCheckingConfig]; \ No newline at end of file diff --git a/packages/eslint-config-playwright/tools/print-available-rules.js b/packages/eslint-config-playwright/tools/print-available-rules.js index 6d588bb0..fa61bd1f 100644 --- a/packages/eslint-config-playwright/tools/print-available-rules.js +++ b/packages/eslint-config-playwright/tools/print-available-rules.js @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import plugin from 'eslint-plugin-playwright'; const isTrue = val => val !== undefined && val !== false; diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index 8bad9b69..125ff7fc 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -1,27 +1,14 @@ -import { javascriptConfig } from '@ni/eslint-config-javascript'; +import { defineConfig } from 'eslint/config'; -export default [ - ...javascriptConfig, +import { javascriptConfig, nodeEsmImportConfig } from '@ni/eslint-config-javascript'; + +export default defineConfig([ + javascriptConfig, + nodeEsmImportConfig, { - files: ['eslint.config.js'], + files: ['tools/*.js'], rules: { - 'import/no-default-export': 'off' + 'no-console': 'off' } - }, - { - files: ['**/*.js'], - rules: { - 'import/extensions': 'off', - // eslint-plugin-import doesn't know how to resolve entry points in packages - // that use modern export maps in package.json. - // https://github.com/typescript-eslint/typescript-eslint/issues/7565 - // https://github.com/import-js/eslint-plugin-import/issues/2703 - 'import/no-unresolved': [ - 'error', - { - ignore: ['typescript-eslint'] - } - ], - }, - }, -]; + } +]); diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index f6477e61..5600c4f9 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -1,14 +1,15 @@ +import { defineConfig } from 'eslint/config'; import { javascriptConfig } from '@ni/eslint-config-javascript'; import typescriptPlugin from 'typescript-eslint'; import importPlugin from 'eslint-plugin-import'; import { extensionsConfig } from './lib/extensions.js'; import { typescriptRequiringTypeCheckingConfig } from './requiring-type-checking.js'; -export const typescriptConfig = [ - ...javascriptConfig, - ...typescriptPlugin.configs.recommended, - ...extensionsConfig, - ...typescriptRequiringTypeCheckingConfig, +export const typescriptConfig = defineConfig([ + javascriptConfig, + typescriptPlugin.configs.recommended, + extensionsConfig, + typescriptRequiringTypeCheckingConfig, { languageOptions: { parser: typescriptPlugin.parser @@ -223,4 +224,4 @@ export const typescriptConfig = [ '@typescript-eslint/unified-signatures': 'error', } } -]; +]); diff --git a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js index affc2caa..e74de01b 100644 --- a/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js +++ b/packages/eslint-config-typescript/lib/extensions-requiring-type-checking.js @@ -1,4 +1,6 @@ -export const extensionsRequiringTypeCheckingConfig = [{ +import { defineConfig } from 'eslint/config'; + +export const extensionsRequiringTypeCheckingConfig = defineConfig([{ rules: { 'dot-notation': 'off', '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }], @@ -15,4 +17,4 @@ export const extensionsRequiringTypeCheckingConfig = [{ 'no-return-await': 'off', '@typescript-eslint/return-await': ['error', 'always'], } -}]; +}]); diff --git a/packages/eslint-config-typescript/lib/extensions.js b/packages/eslint-config-typescript/lib/extensions.js index 31ab0420..9ef8bf63 100644 --- a/packages/eslint-config-typescript/lib/extensions.js +++ b/packages/eslint-config-typescript/lib/extensions.js @@ -1,4 +1,6 @@ -export const extensionsConfig = [{ +import { defineConfig } from 'eslint/config'; + +export const extensionsConfig = defineConfig([{ rules: { /* The following are extension rules that replace core JavaScript rules to support @@ -75,4 +77,4 @@ export const extensionsConfig = [{ 'no-useless-constructor': 'off', '@typescript-eslint/no-useless-constructor': 'error', } -}]; +}]); diff --git a/packages/eslint-config-typescript/package.json b/packages/eslint-config-typescript/package.json index 3e86f238..edb72ed0 100644 --- a/packages/eslint-config-typescript/package.json +++ b/packages/eslint-config-typescript/package.json @@ -1,44 +1,43 @@ { - "type": "module", - "name": "@ni/eslint-config-typescript", - "version": "4.4.4", - "description": "NI's TypeScript ESLint Shareable Config", - "main": "index.js", - "scripts": { - "lint": "eslint .", - "pack": "npm pack", - "print-available-rules": "node tools/print-available-rules" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ni/javascript-styleguide.git" - }, - "keywords": [ - "eslint", - "eslintconfig", - "ni" - ], - "author": "National Instruments", - "license": "MIT", - "bugs": { - "url": "https://github.com/ni/javascript-styleguide/issues" - }, - "homepage": "https://github.com/ni/javascript-styleguide#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "/*.js", - "!/.*.js", - "/lib/*" - ], - "peerDependencies": { - "@ni/eslint-config-javascript": "^4.4.0", - "eslint-plugin-import": "^2.31.1", - "typescript-eslint": "^8.0.0" - }, - "exports": { - ".": "./index.js", - "./requiring-type-checking": "./requiring-type-checking.js" - } -} + "name": "@ni/eslint-config-typescript", + "version": "4.4.4", + "description": "NI's TypeScript ESLint Shareable Config", + "type": "module", + "main": "index.js", + "exports": { + ".": "./index.js" + }, + "scripts": { + "lint": "eslint .", + "pack": "npm pack", + "print-available-rules": "node tools/print-available-rules" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ni/javascript-styleguide.git" + }, + "keywords": [ + "eslint", + "eslintconfig", + "ni" + ], + "author": "National Instruments", + "license": "MIT", + "bugs": { + "url": "https://github.com/ni/javascript-styleguide/issues" + }, + "homepage": "https://github.com/ni/javascript-styleguide#readme", + "publishConfig": { + "access": "public" + }, + "files": [ + "**/*.js", + "!/tools/*", + "!/eslint.config.js" + ], + "peerDependencies": { + "@ni/eslint-config-javascript": "^4.4.0", + "eslint-plugin-import": "^2.32.0", + "typescript-eslint": "^8.44.1" + } +} \ No newline at end of file diff --git a/packages/eslint-config-typescript/requiring-type-checking.js b/packages/eslint-config-typescript/requiring-type-checking.js index 12531b50..59ef5917 100644 --- a/packages/eslint-config-typescript/requiring-type-checking.js +++ b/packages/eslint-config-typescript/requiring-type-checking.js @@ -1,10 +1,11 @@ +import { defineConfig } from 'eslint/config'; import typescriptPlugin from 'typescript-eslint'; import { extensionsRequiringTypeCheckingConfig } from './lib/extensions-requiring-type-checking.js'; -export const typescriptRequiringTypeCheckingConfig = [ - ...typescriptPlugin.configs.recommendedTypeChecked, - ...typescriptPlugin.configs.stylisticTypeChecked, - ...extensionsRequiringTypeCheckingConfig, +export const typescriptRequiringTypeCheckingConfig = defineConfig([ + typescriptPlugin.configs.recommendedTypeChecked, + typescriptPlugin.configs.stylisticTypeChecked, + extensionsRequiringTypeCheckingConfig, { languageOptions: { parser: typescriptPlugin.parser @@ -187,4 +188,4 @@ export const typescriptRequiringTypeCheckingConfig = [ '@typescript-eslint/switch-exhaustiveness-check': 'off' } } -]; +]); diff --git a/packages/eslint-config-typescript/tools/print-available-rules.js b/packages/eslint-config-typescript/tools/print-available-rules.js index ca235670..efee6f29 100644 --- a/packages/eslint-config-typescript/tools/print-available-rules.js +++ b/packages/eslint-config-typescript/tools/print-available-rules.js @@ -1,8 +1,3 @@ -/* eslint-disable no-console */ -// eslint-plugin-import doesn't know how to resolve entry points in commonjs modules that are -// declared using "export" rather than the old "main" syntax in package.json. -// See https://github.com/typescript-eslint/typescript-eslint/issues/7565 -// and https://github.com/import-js/eslint-plugin-import/issues/2703 import typescriptPlugin from 'typescript-eslint'; const isTrue = val => val !== undefined && val !== false; diff --git a/tests/angular/CHANGELOG.json b/tests/angular/CHANGELOG.json deleted file mode 100644 index 55443583..00000000 --- a/tests/angular/CHANGELOG.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "@ni/angular-test", - "entries": [ - { - "date": "Tue, 09 Nov 2021 18:23:18 GMT", - "tag": "@ni/angular-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/angular-test", - "comment": "Bump @ni/eslint-config-angular to v3.2.0", - "commit": "e4eed9978948e04ce51a4e20c7c841e688433fc5" - } - ] - } - }, - { - "date": "Thu, 28 Oct 2021 15:59:19 GMT", - "tag": "@ni/angular-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/angular-test", - "comment": "Bump @ni/eslint-config-angular to v3.1.0", - "commit": "772f17b65e83107fd8682087c87b9619a5c2ea38" - } - ] - } - }, - { - "date": "Wed, 29 Sep 2021 22:10:29 GMT", - "tag": "@ni/angular-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/angular-test", - "comment": "Bump @ni/eslint-config-angular to v3.0.1", - "commit": "2eefa5b8f9bd3e68031cdb0e928cd97254a45ba6" - } - ] - } - } - ] -} diff --git a/tests/angular/CHANGELOG.md b/tests/angular/CHANGELOG.md deleted file mode 100644 index 6511df26..00000000 --- a/tests/angular/CHANGELOG.md +++ /dev/null @@ -1,29 +0,0 @@ -# Change Log - @ni/angular-test - -This log was last generated on Tue, 09 Nov 2021 18:23:18 GMT and should not be manually modified. - - - -## 1.0.0 - -Tue, 09 Nov 2021 18:23:18 GMT - -### Patches - -- Bump @ni/eslint-config-angular to v3.2.0 - -## 1.0.0 - -Thu, 28 Oct 2021 15:59:19 GMT - -### Patches - -- Bump @ni/eslint-config-angular to v3.1.0 - -## 1.0.0 - -Wed, 29 Sep 2021 22:10:29 GMT - -### Patches - -- Bump @ni/eslint-config-angular to v3.0.1 diff --git a/tests/angular/custom-ignore-attributes/index.spec.ts b/tests/angular/custom-ignore-attributes/index.spec.ts index cde10b14..0ee29e2f 100644 --- a/tests/angular/custom-ignore-attributes/index.spec.ts +++ b/tests/angular/custom-ignore-attributes/index.spec.ts @@ -12,8 +12,8 @@ class MyComponent { } describe('MyComponent', () => { - let hostComponent: MyComponent; - let fixture: ComponentFixture; + let hostComponent!: MyComponent; + let fixture!: ComponentFixture; it('should have a div', async () => { await fixture.whenStable(); diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index b27401a3..b8c748f0 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -1,63 +1,44 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; +import { angularConfig, angularTemplateConfig, ignoreAttributes } from '@ni/eslint-config-angular'; -import { angularConfig } from '@ni/eslint-config-angular'; -import { angularTemplateConfig } from '@ni/eslint-config-angular/template'; -import { ignoreAttributes } from '@ni/eslint-config-angular/template/options'; - -import typescriptPlugin from 'typescript-eslint'; -import angularTemplatePlugin from 'angular-eslint'; import { defineConfig } from 'eslint/config'; - -const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); +import { javascriptConfig } from '@ni/eslint-config-javascript'; export default defineConfig([ - { - files: ['eslint.config.js'], - rules: { - 'import/no-default-export': 'off', - } - }, - { - files: ['**/*.ts'], - extends: [...angularConfig], - languageOptions: { - parser: typescriptPlugin.parser, - parserOptions: { - project: ['./tsconfig.json'], - tsConfigRootDir, - }, - }, - }, - { - files: ['*.html'], - extends: [...angularTemplateConfig], - languageOptions: { parser: angularTemplatePlugin.templateParser }, - }, - { - files: ['custom-ignore-attributes/**/*.html'], - languageOptions: { parser: angularTemplatePlugin.templateParser }, - plugins: { - '@angular-eslint/template': angularTemplatePlugin.templatePlugin, - }, - rules: { - '@angular-eslint/template/i18n': [ - 'error', - { - checkId: false, - ignoreAttributes: [...ignoreAttributes.all, 'custom-field'], - }, - ], - }, - }, - { - files: ['**/*.spec.ts*.html'], - languageOptions: { parser: angularTemplatePlugin.templateParser }, - plugins: { - '@angular-eslint/template': angularTemplatePlugin.templatePlugin, - }, - rules: { - '@angular-eslint/template/i18n': 'off', - }, - }, -]); \ No newline at end of file + { + files: ['**/*.js'], + extends: javascriptConfig, + }, + { + files: ['**/*.ts'], + extends: angularConfig, + languageOptions: { + parserOptions: { + project: ['./tsconfig.json'], + tsConfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.html'], + extends: angularTemplateConfig, + }, + // Use only a single top-level eslint.config.js: https://eslint.org/docs/latest/use/configure/configuration-files#experimental-configuration-file-resolution + { + files: ['custom-ignore-attributes/**/*.html', '*.html'], + rules: { + '@angular-eslint/template/i18n': [ + 'error', + { + checkId: false, + ignoreAttributes: [...ignoreAttributes.all, 'custom-field'], + }, + ], + }, + }, + { + files: ['**/*.spec.ts*.html'], + rules: { + '@angular-eslint/template/i18n': 'off', + }, + }, +]); diff --git a/tests/angular/index.spec.ts b/tests/angular/index.spec.ts index ceb1fb5d..5dece52f 100644 --- a/tests/angular/index.spec.ts +++ b/tests/angular/index.spec.ts @@ -12,8 +12,8 @@ class MyComponent { } describe('MyComponent', () => { - let hostComponent: MyComponent; - let fixture: ComponentFixture; + let hostComponent!: MyComponent; + let fixture!: ComponentFixture; it('should have a div', async () => { await fixture.whenStable(); diff --git a/tests/angular/package.json b/tests/angular/package.json index b35c1e8d..0109404d 100644 --- a/tests/angular/package.json +++ b/tests/angular/package.json @@ -1,14 +1,15 @@ { - "type": "module", "name": "@ni/angular-test", "version": "1.0.0", "private": true, "description": "Smoke test for Angular project integration.", + "type": "module", "scripts": { "test": "eslint ." }, "peerDependencies": { - "@ni/eslint-config-angular": "*" + "@ni/eslint-config-angular": "*", + "@ni/eslint-config-javascript": "*" }, "dependencies": { "@angular/core": "^18.2.13" diff --git a/tests/javascript/CHANGELOG.json b/tests/javascript/CHANGELOG.json deleted file mode 100644 index 161169ab..00000000 --- a/tests/javascript/CHANGELOG.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@ni/javascript-test", - "entries": [ - { - "date": "Wed, 29 Sep 2021 22:10:29 GMT", - "tag": "@ni/javascript-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/javascript-test", - "comment": "Bump @ni/eslint-config-javascript to v3.0.1", - "commit": "2eefa5b8f9bd3e68031cdb0e928cd97254a45ba6" - } - ] - } - } - ] -} diff --git a/tests/javascript/CHANGELOG.md b/tests/javascript/CHANGELOG.md deleted file mode 100644 index cad4d357..00000000 --- a/tests/javascript/CHANGELOG.md +++ /dev/null @@ -1,13 +0,0 @@ -# Change Log - @ni/javascript-test - -This log was last generated on Wed, 29 Sep 2021 22:10:29 GMT and should not be manually modified. - - - -## 1.0.0 - -Wed, 29 Sep 2021 22:10:29 GMT - -### Patches - -- Bump @ni/eslint-config-javascript to v3.0.1 diff --git a/tests/javascript/eslint.config.js b/tests/javascript/eslint.config.js index 531a899b..662b25b1 100644 --- a/tests/javascript/eslint.config.js +++ b/tests/javascript/eslint.config.js @@ -1,11 +1,6 @@ +import { defineConfig } from 'eslint/config'; import { javascriptConfig } from '@ni/eslint-config-javascript'; -export default [ - ...javascriptConfig, - { - files: ['eslint.config.js'], - rules: { - 'import/no-default-export': 'off' - } - }, -]; +export default defineConfig([ + javascriptConfig, +]); diff --git a/tests/javascript/package.json b/tests/javascript/package.json index db9cc8f8..6f00dbf6 100644 --- a/tests/javascript/package.json +++ b/tests/javascript/package.json @@ -1,9 +1,9 @@ { - "type": "module", "name": "@ni/javascript-test", "version": "1.0.0", "private": true, "description": "Smoke test for JavaScript project integration.", + "type": "module", "scripts": { "test": "eslint ." }, diff --git a/tests/playwright/eslint.config.js b/tests/playwright/eslint.config.js index f3436a76..45ae0808 100644 --- a/tests/playwright/eslint.config.js +++ b/tests/playwright/eslint.config.js @@ -1,20 +1,22 @@ import { fileURLToPath } from 'url'; import path from 'path'; import { playwrightConfig } from '@ni/eslint-config-playwright'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; import { defineConfig } from 'eslint/config'; const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); export default defineConfig([ { - files: ['eslint.config.js'], + files: ['**/*.js'], + extends: javascriptConfig, rules: { 'import/no-default-export': 'off', } }, { files: ['*.ts'], - extends: [...playwrightConfig], + extends: playwrightConfig, languageOptions: { parserOptions: { project: ['./tsconfig.json'], diff --git a/tests/playwright/package.json b/tests/playwright/package.json index ff9e599d..07b45856 100644 --- a/tests/playwright/package.json +++ b/tests/playwright/package.json @@ -1,13 +1,14 @@ { - "type": "module", "name": "@ni/playwright-test", "version": "1.0.0", "private": true, "description": "Smoke test for Playwright project integration.", + "type": "module", "scripts": { "test": "eslint ." }, "peerDependencies": { + "@ni/eslint-config-javascript": "*", "@ni/eslint-config-playwright": "*" }, "devDependencies": { diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js index ada45e28..662b25b1 100644 --- a/tests/print-evaluated-rules/eslint.config.js +++ b/tests/print-evaluated-rules/eslint.config.js @@ -1,11 +1,6 @@ +import { defineConfig } from 'eslint/config'; import { javascriptConfig } from '@ni/eslint-config-javascript'; -export default [ - ...javascriptConfig, - { - files: ['eslint.config.js'], - rules: { - 'import/no-default-export': 'off' - } - } -]; \ No newline at end of file +export default defineConfig([ + javascriptConfig, +]); diff --git a/tests/print-evaluated-rules/package.json b/tests/print-evaluated-rules/package.json index 7ed3e30a..7eabb104 100644 --- a/tests/print-evaluated-rules/package.json +++ b/tests/print-evaluated-rules/package.json @@ -1,9 +1,9 @@ { - "type": "module", "name": "@ni/print-evaluated-rules-test", "version": "1.0.0", "private": true, "description": "Meta project used to analyze the integration tests.", + "type": "module", "scripts": { "lint": "eslint .", "print-evaluated-rules": "node index.js", diff --git a/tests/typescript/CHANGELOG.json b/tests/typescript/CHANGELOG.json deleted file mode 100644 index 452aa9c8..00000000 --- a/tests/typescript/CHANGELOG.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@ni/typescript-test", - "entries": [ - { - "date": "Thu, 28 Oct 2021 15:59:19 GMT", - "tag": "@ni/typescript-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/typescript-test", - "comment": "Bump @ni/eslint-config-typescript to v3.0.2", - "commit": "772f17b65e83107fd8682087c87b9619a5c2ea38" - } - ] - } - }, - { - "date": "Wed, 29 Sep 2021 22:10:29 GMT", - "tag": "@ni/typescript-test_v1.0.0", - "version": "1.0.0", - "comments": { - "patch": [ - { - "author": "beachball", - "package": "@ni/typescript-test", - "comment": "Bump @ni/eslint-config-typescript to v3.0.1", - "commit": "2eefa5b8f9bd3e68031cdb0e928cd97254a45ba6" - } - ] - } - } - ] -} diff --git a/tests/typescript/CHANGELOG.md b/tests/typescript/CHANGELOG.md deleted file mode 100644 index ac358217..00000000 --- a/tests/typescript/CHANGELOG.md +++ /dev/null @@ -1,21 +0,0 @@ -# Change Log - @ni/typescript-test - -This log was last generated on Thu, 28 Oct 2021 15:59:19 GMT and should not be manually modified. - - - -## 1.0.0 - -Thu, 28 Oct 2021 15:59:19 GMT - -### Patches - -- Bump @ni/eslint-config-typescript to v3.0.2 - -## 1.0.0 - -Wed, 29 Sep 2021 22:10:29 GMT - -### Patches - -- Bump @ni/eslint-config-typescript to v3.0.1 diff --git a/tests/typescript/eslint.config.js b/tests/typescript/eslint.config.js index e9ca36ff..4e5e5b43 100644 --- a/tests/typescript/eslint.config.js +++ b/tests/typescript/eslint.config.js @@ -1,25 +1,17 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; +import { javascriptConfig } from '@ni/eslint-config-javascript'; import { typescriptConfig } from '@ni/eslint-config-typescript'; import { defineConfig } from 'eslint/config'; -const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); - export default defineConfig([ - { - files: ['eslint.config.js'], - rules: { - 'import/no-default-export': 'off', - } - }, + javascriptConfig, { files: ['**/*.ts'], - extends: [...typescriptConfig], + extends: typescriptConfig, languageOptions: { parserOptions: { project: ['./tsconfig.json'], - tsConfigRootDir, + tsConfigRootDir: import.meta.dirname, }, }, }, -]); \ No newline at end of file +]); diff --git a/tests/typescript/package.json b/tests/typescript/package.json index b389c04e..3fb0f750 100644 --- a/tests/typescript/package.json +++ b/tests/typescript/package.json @@ -1,13 +1,14 @@ { - "type": "module", "name": "@ni/typescript-test", "version": "1.0.0", "private": true, "description": "Smoke test for TypeScript project integration.", + "type": "module", "scripts": { "test": "eslint ." }, "peerDependencies": { + "@ni/eslint-config-javascript": "*", "@ni/eslint-config-typescript": "*" } } From 2f954e3d396845681a01a077489dd650a2d0dd2c Mon Sep 17 00:00:00 2001 From: rajsite Date: Mon, 29 Sep 2025 16:47:52 -0500 Subject: [PATCH 42/53] fix import --- tests/print-evaluated-rules/eslint.config.js | 6 ++++++ tests/print-evaluated-rules/index.js | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/print-evaluated-rules/eslint.config.js b/tests/print-evaluated-rules/eslint.config.js index 662b25b1..9dc3f457 100644 --- a/tests/print-evaluated-rules/eslint.config.js +++ b/tests/print-evaluated-rules/eslint.config.js @@ -3,4 +3,10 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; export default defineConfig([ javascriptConfig, + { + files: ['*.js'], + rules: { + 'no-console': 'off' + } + } ]); diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index 98db3197..9e4a7a67 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -1,7 +1,5 @@ -/* eslint-disable no-console */ import { ESLint } from 'eslint'; -import { angularConfig } from '@ni/eslint-config-angular'; -import { angularTemplateConfig } from '@ni/eslint-config-angular/template'; +import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; import fs from 'fs'; import path from 'path'; import yargs from 'yargs/yargs'; From cb62b9d3742ca99b7939e3ead8ff3caef3492283 Mon Sep 17 00:00:00 2001 From: gokulprasanth-ni Date: Tue, 30 Sep 2025 10:55:30 +0530 Subject: [PATCH 43/53] update test config Signed-off-by: gokulprasanth-ni --- packages/eslint-config-angular/template.js | 2 +- tests/angular/eslint.config.js | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/eslint-config-angular/template.js b/packages/eslint-config-angular/template.js index f1ac5a6a..6adb7fc9 100644 --- a/packages/eslint-config-angular/template.js +++ b/packages/eslint-config-angular/template.js @@ -100,7 +100,7 @@ export const angularTemplateConfig = defineConfig([ { // Ignore inline templates in tests using the inline template naming convention // See naming details: https://github.com/angular-eslint/angular-eslint/releases/tag/v14.0.0 - files: ['*.spec.ts*.html'], + files: ['**/*.spec.ts*.html'], rules: { /* Tests often define helper components that don't need to be marked for i18n. diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index b8c748f0..1a4b4115 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -24,7 +24,8 @@ export default defineConfig([ }, // Use only a single top-level eslint.config.js: https://eslint.org/docs/latest/use/configure/configuration-files#experimental-configuration-file-resolution { - files: ['custom-ignore-attributes/**/*.html', '*.html'], + files: ['custom-ignore-attributes/**/*.html'], + ignores: ['custom-ignore-attributes/**/*.spec.ts*.html'], rules: { '@angular-eslint/template/i18n': [ 'error', @@ -35,10 +36,4 @@ export default defineConfig([ ], }, }, - { - files: ['**/*.spec.ts*.html'], - rules: { - '@angular-eslint/template/i18n': 'off', - }, - }, ]); From d033cd74b5c3e729cb83a1b7facbfacd65cd86d4 Mon Sep 17 00:00:00 2001 From: rajsite Date: Tue, 30 Sep 2025 10:56:02 -0500 Subject: [PATCH 44/53] Dedupe import node esm config --- .../eslint-config-angular/eslint.config.js | 4 ++-- .../eslint-config-javascript/eslint.config.js | 4 ++-- packages/eslint-config-javascript/index.js | 17 +-------------- .../lib/import-node-esm.js | 21 +++++++++++++++++++ .../eslint-config-javascript/rules/imports.js | 11 ++++------ .../eslint-config-playwright/eslint.config.js | 4 ++-- .../eslint-config-typescript/eslint.config.js | 4 ++-- 7 files changed, 34 insertions(+), 31 deletions(-) create mode 100644 packages/eslint-config-javascript/lib/import-node-esm.js diff --git a/packages/eslint-config-angular/eslint.config.js b/packages/eslint-config-angular/eslint.config.js index 125ff7fc..47dccba6 100644 --- a/packages/eslint-config-angular/eslint.config.js +++ b/packages/eslint-config-angular/eslint.config.js @@ -1,10 +1,10 @@ import { defineConfig } from 'eslint/config'; -import { javascriptConfig, nodeEsmImportConfig } from '@ni/eslint-config-javascript'; +import { javascriptConfig, importNodeEsmConfig } from '@ni/eslint-config-javascript'; export default defineConfig([ javascriptConfig, - nodeEsmImportConfig, + importNodeEsmConfig, { files: ['tools/*.js'], rules: { diff --git a/packages/eslint-config-javascript/eslint.config.js b/packages/eslint-config-javascript/eslint.config.js index 011b6b3b..822adf55 100644 --- a/packages/eslint-config-javascript/eslint.config.js +++ b/packages/eslint-config-javascript/eslint.config.js @@ -1,8 +1,8 @@ import { defineConfig } from 'eslint/config'; -import { javascriptConfig, nodeEsmImportConfig } from './index.js'; +import { javascriptConfig, importNodeEsmConfig } from './index.js'; export default defineConfig([ javascriptConfig, - nodeEsmImportConfig, + importNodeEsmConfig, ]); diff --git a/packages/eslint-config-javascript/index.js b/packages/eslint-config-javascript/index.js index b3c7ed79..7c9cb46c 100644 --- a/packages/eslint-config-javascript/index.js +++ b/packages/eslint-config-javascript/index.js @@ -11,6 +11,7 @@ import { es6 } from './rules/es6.js'; import { imports } from './rules/imports.js'; import { strict } from './rules/strict.js'; +export { importNodeEsmConfig } from './lib/import-node-esm.js'; export const javascriptConfig = defineConfig([ stylisticPlugin.configs['disable-legacy'], bestPractices, @@ -35,19 +36,3 @@ export const javascriptConfig = defineConfig([ } }, ]); - -export const nodeEsmImportConfig = defineConfig([ - { - rules: { - // node esm resolution requires extensions - 'import/extensions': 'off', - // node esm resolution requires full path name - 'import/no-useless-path-segments': 'off', - // eslint-plugin-import doesn't know how to resolve entry points in packages - // that use modern export maps in package.json. - // https://github.com/typescript-eslint/typescript-eslint/issues/7565 - // https://github.com/import-js/eslint-plugin-import/issues/2703 - 'import/no-unresolved': 'off', - } - } -]); diff --git a/packages/eslint-config-javascript/lib/import-node-esm.js b/packages/eslint-config-javascript/lib/import-node-esm.js new file mode 100644 index 00000000..113f03b2 --- /dev/null +++ b/packages/eslint-config-javascript/lib/import-node-esm.js @@ -0,0 +1,21 @@ +import { defineConfig } from 'eslint/config'; + +/** + * Configuration overrides to support node esm resolution + * See: https://nodejs.org/api/esm.html#terminology + */ +export const importNodeEsmConfig = defineConfig([ + { + rules: { + // node esm relative resolution requires extensions + 'import/extensions': 'off', + // node esm relative resolution requires full path name + 'import/no-useless-path-segments': 'off', + // eslint-plugin-import doesn't know how to resolve entry points in packages + // that use modern export maps in package.json. + // https://github.com/typescript-eslint/typescript-eslint/issues/7565 + // https://github.com/import-js/eslint-plugin-import/issues/2703 + 'import/no-unresolved': 'off', + } + } +]); diff --git a/packages/eslint-config-javascript/rules/imports.js b/packages/eslint-config-javascript/rules/imports.js index 29595787..e205078f 100644 --- a/packages/eslint-config-javascript/rules/imports.js +++ b/packages/eslint-config-javascript/rules/imports.js @@ -1,4 +1,5 @@ import { defineConfig } from 'eslint/config'; +import { importNodeEsmConfig } from '../lib/import-node-esm.js'; export const imports = defineConfig([{ settings: { @@ -103,8 +104,8 @@ export const imports = defineConfig([{ '**/protractor.conf.js', // protractor config '**/protractor.conf.*.js', // protractor config '**/karma.conf.js', // karma config - '**/.eslintrc.js', // eslint config - '**/eslint.config.js' // eslint config + '**/.eslintrc.js', // legacy eslint config + '**/eslint.config.js', // eslint config ], optionalDependencies: false, }], @@ -383,13 +384,9 @@ export const imports = defineConfig([{ Eslint configuration file specific settings */ files: ['eslint.config.js', 'eslint.config.mjs'], + extends: [importNodeEsmConfig], rules: { // eslint config files require a top-level default export 'import/no-default-export': 'off', - // eslint-plugin-import doesn't know how to resolve entry points in packages - // that use modern export maps in package.json. - // https://github.com/typescript-eslint/typescript-eslint/issues/7565 - // https://github.com/import-js/eslint-plugin-import/issues/2703 - 'import/no-unresolved': 'off', } }]); diff --git a/packages/eslint-config-playwright/eslint.config.js b/packages/eslint-config-playwright/eslint.config.js index 125ff7fc..47dccba6 100644 --- a/packages/eslint-config-playwright/eslint.config.js +++ b/packages/eslint-config-playwright/eslint.config.js @@ -1,10 +1,10 @@ import { defineConfig } from 'eslint/config'; -import { javascriptConfig, nodeEsmImportConfig } from '@ni/eslint-config-javascript'; +import { javascriptConfig, importNodeEsmConfig } from '@ni/eslint-config-javascript'; export default defineConfig([ javascriptConfig, - nodeEsmImportConfig, + importNodeEsmConfig, { files: ['tools/*.js'], rules: { diff --git a/packages/eslint-config-typescript/eslint.config.js b/packages/eslint-config-typescript/eslint.config.js index 125ff7fc..47dccba6 100644 --- a/packages/eslint-config-typescript/eslint.config.js +++ b/packages/eslint-config-typescript/eslint.config.js @@ -1,10 +1,10 @@ import { defineConfig } from 'eslint/config'; -import { javascriptConfig, nodeEsmImportConfig } from '@ni/eslint-config-javascript'; +import { javascriptConfig, importNodeEsmConfig } from '@ni/eslint-config-javascript'; export default defineConfig([ javascriptConfig, - nodeEsmImportConfig, + importNodeEsmConfig, { files: ['tools/*.js'], rules: { From 0cf436d18462bfe24147e624380c348b686ccb1e Mon Sep 17 00:00:00 2001 From: rajsite Date: Tue, 30 Sep 2025 11:06:30 -0500 Subject: [PATCH 45/53] Consistent lib layout --- packages/eslint-config-angular/index.js | 4 ++-- .../options.js => lib/template-options.js} | 0 .../eslint-config-angular/{ => lib}/template.js | 2 +- packages/eslint-config-javascript/index.js | 16 ++++++++-------- .../{rules => lib}/best-practices.js | 0 .../{rules => lib}/errors.js | 0 .../{rules => lib}/es6.js | 0 .../{rules => lib}/imports.js | 0 .../{rules => lib}/node.js | 0 .../{rules => lib}/strict.js | 0 .../{rules => lib}/style.js | 0 .../{rules => lib}/variables.js | 0 packages/eslint-config-typescript/index.js | 2 +- .../{ => lib}/requiring-type-checking.js | 2 +- 14 files changed, 13 insertions(+), 13 deletions(-) rename packages/eslint-config-angular/{template/options.js => lib/template-options.js} (100%) rename packages/eslint-config-angular/{ => lib}/template.js (98%) rename packages/eslint-config-javascript/{rules => lib}/best-practices.js (100%) rename packages/eslint-config-javascript/{rules => lib}/errors.js (100%) rename packages/eslint-config-javascript/{rules => lib}/es6.js (100%) rename packages/eslint-config-javascript/{rules => lib}/imports.js (100%) rename packages/eslint-config-javascript/{rules => lib}/node.js (100%) rename packages/eslint-config-javascript/{rules => lib}/strict.js (100%) rename packages/eslint-config-javascript/{rules => lib}/style.js (100%) rename packages/eslint-config-javascript/{rules => lib}/variables.js (100%) rename packages/eslint-config-typescript/{ => lib}/requiring-type-checking.js (98%) diff --git a/packages/eslint-config-angular/index.js b/packages/eslint-config-angular/index.js index 0bd672dc..017cd840 100644 --- a/packages/eslint-config-angular/index.js +++ b/packages/eslint-config-angular/index.js @@ -2,8 +2,8 @@ import { defineConfig } from 'eslint/config'; import { typescriptConfig } from '@ni/eslint-config-typescript'; import angular from 'angular-eslint'; -export { angularTemplateConfig } from './template.js'; -export { ignoreAttributes } from './template/options.js'; +export { angularTemplateConfig } from './lib/template.js'; +export { ignoreAttributes } from './lib/template-options.js'; export const angularConfig = defineConfig([ angular.configs.tsRecommended, diff --git a/packages/eslint-config-angular/template/options.js b/packages/eslint-config-angular/lib/template-options.js similarity index 100% rename from packages/eslint-config-angular/template/options.js rename to packages/eslint-config-angular/lib/template-options.js diff --git a/packages/eslint-config-angular/template.js b/packages/eslint-config-angular/lib/template.js similarity index 98% rename from packages/eslint-config-angular/template.js rename to packages/eslint-config-angular/lib/template.js index 6adb7fc9..73e67f14 100644 --- a/packages/eslint-config-angular/template.js +++ b/packages/eslint-config-angular/lib/template.js @@ -1,6 +1,6 @@ import { defineConfig } from 'eslint/config'; import angularTemplate from 'angular-eslint'; -import { ignoreAttributes } from './template/options.js'; +import { ignoreAttributes } from './template-options.js'; export const angularTemplateConfig = defineConfig([ angularTemplate.configs.templateRecommended, diff --git a/packages/eslint-config-javascript/index.js b/packages/eslint-config-javascript/index.js index 7c9cb46c..6536e272 100644 --- a/packages/eslint-config-javascript/index.js +++ b/packages/eslint-config-javascript/index.js @@ -2,14 +2,14 @@ import { defineConfig } from 'eslint/config'; import importPlugin from 'eslint-plugin-import'; import stylisticPlugin from '@stylistic/eslint-plugin'; import globals from 'globals'; -import { bestPractices } from './rules/best-practices.js'; -import { errors } from './rules/errors.js'; -import { node } from './rules/node.js'; -import { style } from './rules/style.js'; -import { variables } from './rules/variables.js'; -import { es6 } from './rules/es6.js'; -import { imports } from './rules/imports.js'; -import { strict } from './rules/strict.js'; +import { bestPractices } from './lib/best-practices.js'; +import { errors } from './lib/errors.js'; +import { node } from './lib/node.js'; +import { style } from './lib/style.js'; +import { variables } from './lib/variables.js'; +import { es6 } from './lib/es6.js'; +import { imports } from './lib/imports.js'; +import { strict } from './lib/strict.js'; export { importNodeEsmConfig } from './lib/import-node-esm.js'; export const javascriptConfig = defineConfig([ diff --git a/packages/eslint-config-javascript/rules/best-practices.js b/packages/eslint-config-javascript/lib/best-practices.js similarity index 100% rename from packages/eslint-config-javascript/rules/best-practices.js rename to packages/eslint-config-javascript/lib/best-practices.js diff --git a/packages/eslint-config-javascript/rules/errors.js b/packages/eslint-config-javascript/lib/errors.js similarity index 100% rename from packages/eslint-config-javascript/rules/errors.js rename to packages/eslint-config-javascript/lib/errors.js diff --git a/packages/eslint-config-javascript/rules/es6.js b/packages/eslint-config-javascript/lib/es6.js similarity index 100% rename from packages/eslint-config-javascript/rules/es6.js rename to packages/eslint-config-javascript/lib/es6.js diff --git a/packages/eslint-config-javascript/rules/imports.js b/packages/eslint-config-javascript/lib/imports.js similarity index 100% rename from packages/eslint-config-javascript/rules/imports.js rename to packages/eslint-config-javascript/lib/imports.js diff --git a/packages/eslint-config-javascript/rules/node.js b/packages/eslint-config-javascript/lib/node.js similarity index 100% rename from packages/eslint-config-javascript/rules/node.js rename to packages/eslint-config-javascript/lib/node.js diff --git a/packages/eslint-config-javascript/rules/strict.js b/packages/eslint-config-javascript/lib/strict.js similarity index 100% rename from packages/eslint-config-javascript/rules/strict.js rename to packages/eslint-config-javascript/lib/strict.js diff --git a/packages/eslint-config-javascript/rules/style.js b/packages/eslint-config-javascript/lib/style.js similarity index 100% rename from packages/eslint-config-javascript/rules/style.js rename to packages/eslint-config-javascript/lib/style.js diff --git a/packages/eslint-config-javascript/rules/variables.js b/packages/eslint-config-javascript/lib/variables.js similarity index 100% rename from packages/eslint-config-javascript/rules/variables.js rename to packages/eslint-config-javascript/lib/variables.js diff --git a/packages/eslint-config-typescript/index.js b/packages/eslint-config-typescript/index.js index 5600c4f9..0e891cc2 100644 --- a/packages/eslint-config-typescript/index.js +++ b/packages/eslint-config-typescript/index.js @@ -3,7 +3,7 @@ import { javascriptConfig } from '@ni/eslint-config-javascript'; import typescriptPlugin from 'typescript-eslint'; import importPlugin from 'eslint-plugin-import'; import { extensionsConfig } from './lib/extensions.js'; -import { typescriptRequiringTypeCheckingConfig } from './requiring-type-checking.js'; +import { typescriptRequiringTypeCheckingConfig } from './lib/requiring-type-checking.js'; export const typescriptConfig = defineConfig([ javascriptConfig, diff --git a/packages/eslint-config-typescript/requiring-type-checking.js b/packages/eslint-config-typescript/lib/requiring-type-checking.js similarity index 98% rename from packages/eslint-config-typescript/requiring-type-checking.js rename to packages/eslint-config-typescript/lib/requiring-type-checking.js index 59ef5917..6204f6af 100644 --- a/packages/eslint-config-typescript/requiring-type-checking.js +++ b/packages/eslint-config-typescript/lib/requiring-type-checking.js @@ -1,6 +1,6 @@ import { defineConfig } from 'eslint/config'; import typescriptPlugin from 'typescript-eslint'; -import { extensionsRequiringTypeCheckingConfig } from './lib/extensions-requiring-type-checking.js'; +import { extensionsRequiringTypeCheckingConfig } from './extensions-requiring-type-checking.js'; export const typescriptRequiringTypeCheckingConfig = defineConfig([ typescriptPlugin.configs.recommendedTypeChecked, From 30d85e04d158f7d1e644600051836c49d254991d Mon Sep 17 00:00:00 2001 From: rajsite Date: Tue, 30 Sep 2025 11:07:17 -0500 Subject: [PATCH 46/53] Update copyright year --- .github/CODEOWNERS | 2 +- LICENSE | 2 +- README.md | 2 +- packages/eslint-config-angular/LICENSE | 2 +- packages/eslint-config-angular/README.md | 2 +- packages/eslint-config-javascript/LICENSE | 2 +- packages/eslint-config-javascript/README.md | 2 +- packages/eslint-config-playwright/LICENSE | 2 +- packages/eslint-config-playwright/README.md | 2 +- packages/eslint-config-typescript/LICENSE | 2 +- packages/eslint-config-typescript/README.md | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index afd51b91..39919317 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -# Copyright (c) 2023 National Instruments +# Copyright (c) 2025 National Instruments # Each line is a file pattern followed by one or more owners. # More info: https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-code-owners diff --git a/LICENSE b/LICENSE index ffe640ec..2cce61a4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 National Instruments Corporation +Copyright (c) 2025 National Instruments Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index f1a48a0a..a6e60cc0 100644 --- a/README.md +++ b/README.md @@ -429,4 +429,4 @@ Deviations from the `angular-eslint`, `@ni/eslint-config-angular`, and the [`par ## License -[MIT (c) 2021 National Instruments Corporation](./LICENSE) +[MIT (c) 2025 National Instruments Corporation](./LICENSE) diff --git a/packages/eslint-config-angular/LICENSE b/packages/eslint-config-angular/LICENSE index ffe640ec..2cce61a4 100644 --- a/packages/eslint-config-angular/LICENSE +++ b/packages/eslint-config-angular/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 National Instruments Corporation +Copyright (c) 2025 National Instruments Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/eslint-config-angular/README.md b/packages/eslint-config-angular/README.md index 9342e7c6..7b690291 100644 --- a/packages/eslint-config-angular/README.md +++ b/packages/eslint-config-angular/README.md @@ -13,4 +13,4 @@ See the [ni/javascript-styleguide](https://github.com/ni/javascript-styleguide#r ## License -[MIT (c) 2021 National Instruments Corporation](./LICENSE) +[MIT (c) 2025 National Instruments Corporation](./LICENSE) diff --git a/packages/eslint-config-javascript/LICENSE b/packages/eslint-config-javascript/LICENSE index ffe640ec..2cce61a4 100644 --- a/packages/eslint-config-javascript/LICENSE +++ b/packages/eslint-config-javascript/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 National Instruments Corporation +Copyright (c) 2025 National Instruments Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/eslint-config-javascript/README.md b/packages/eslint-config-javascript/README.md index 643d775c..04ed9f63 100644 --- a/packages/eslint-config-javascript/README.md +++ b/packages/eslint-config-javascript/README.md @@ -13,4 +13,4 @@ See the [ni/javascript-styleguide](https://github.com/ni/javascript-styleguide#r ## License -[MIT (c) 2021 National Instruments Corporation](./LICENSE) +[MIT (c) 2025 National Instruments Corporation](./LICENSE) diff --git a/packages/eslint-config-playwright/LICENSE b/packages/eslint-config-playwright/LICENSE index ffe640ec..2cce61a4 100644 --- a/packages/eslint-config-playwright/LICENSE +++ b/packages/eslint-config-playwright/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 National Instruments Corporation +Copyright (c) 2025 National Instruments Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/eslint-config-playwright/README.md b/packages/eslint-config-playwright/README.md index d5606c4f..f404144f 100644 --- a/packages/eslint-config-playwright/README.md +++ b/packages/eslint-config-playwright/README.md @@ -11,4 +11,4 @@ See the [ni/javascript-styleguide](https://github.com/ni/javascript-styleguide#r ## License -[MIT (c) 2022 National Instruments Corporation](./LICENSE) +[MIT (c) 2025 National Instruments Corporation](./LICENSE) diff --git a/packages/eslint-config-typescript/LICENSE b/packages/eslint-config-typescript/LICENSE index ffe640ec..2cce61a4 100644 --- a/packages/eslint-config-typescript/LICENSE +++ b/packages/eslint-config-typescript/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 National Instruments Corporation +Copyright (c) 2025 National Instruments Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/eslint-config-typescript/README.md b/packages/eslint-config-typescript/README.md index 95178937..161485fa 100644 --- a/packages/eslint-config-typescript/README.md +++ b/packages/eslint-config-typescript/README.md @@ -13,4 +13,4 @@ See the [ni/javascript-styleguide](https://github.com/ni/javascript-styleguide#r ## License -[MIT (c) 2021 National Instruments Corporation](./LICENSE) +[MIT (c) 2025 National Instruments Corporation](./LICENSE) From 162905b486c423384debeed7002491f13e9bdfa5 Mon Sep 17 00:00:00 2001 From: rajsite Date: Tue, 30 Sep 2025 11:17:42 -0500 Subject: [PATCH 47/53] Consistent tsconfig files --- tests/angular/custom-ignore-attributes/index.spec.ts | 2 +- tests/angular/tsconfig.json | 9 ++++++--- tests/playwright/tsconfig.json | 4 ++-- tests/typescript/tsconfig.json | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/angular/custom-ignore-attributes/index.spec.ts b/tests/angular/custom-ignore-attributes/index.spec.ts index 0ee29e2f..beaed0b3 100644 --- a/tests/angular/custom-ignore-attributes/index.spec.ts +++ b/tests/angular/custom-ignore-attributes/index.spec.ts @@ -7,7 +7,7 @@ import { ComponentFixture } from '@angular/core/testing'; }) class MyComponent { @Input() public attr = false; - @ViewChild('div') public div: HTMLDivElement; + @ViewChild('div') public div!: HTMLDivElement; public myMethod(): void {} } diff --git a/tests/angular/tsconfig.json b/tests/angular/tsconfig.json index 4286429b..4876b744 100644 --- a/tests/angular/tsconfig.json +++ b/tests/angular/tsconfig.json @@ -1,10 +1,13 @@ { "compilerOptions": { - "experimentalDecorators": true, - "strictNullChecks": true, + "strict": true, + "target": "ES2020", "module":"node16", "moduleResolution": "node16", - "target": "ES2020" + "experimentalDecorators": true, + }, + "angularCompilerOptions": { + "strictTemplates": true }, "include": ["."] } \ No newline at end of file diff --git a/tests/playwright/tsconfig.json b/tests/playwright/tsconfig.json index a3b73a99..0b570f4e 100644 --- a/tests/playwright/tsconfig.json +++ b/tests/playwright/tsconfig.json @@ -1,9 +1,9 @@ { "files": ["./index.ts"], "compilerOptions": { - "strictNullChecks": true, + "strict": true, + "target": "ES2020", "module":"node16", "moduleResolution": "node16", - "target": "ES2020" } } \ No newline at end of file diff --git a/tests/typescript/tsconfig.json b/tests/typescript/tsconfig.json index 48a88664..5a78fd93 100644 --- a/tests/typescript/tsconfig.json +++ b/tests/typescript/tsconfig.json @@ -1,7 +1,7 @@ { "files": ["./index.ts"], "compilerOptions": { - "strictNullChecks": true, + "strict": true, "target": "ES2020" } } \ No newline at end of file From 4f90a27e788762d9333290ea8cb5268459f9c382 Mon Sep 17 00:00:00 2001 From: rajsite Date: Tue, 30 Sep 2025 11:58:33 -0500 Subject: [PATCH 48/53] Consistent test eslint config --- tests/angular/eslint.config.js | 3 +-- tests/playwright/eslint.config.js | 15 ++++----------- tests/typescript/eslint.config.js | 2 +- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index 1a4b4115..5d713d02 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -1,7 +1,6 @@ -import { angularConfig, angularTemplateConfig, ignoreAttributes } from '@ni/eslint-config-angular'; - import { defineConfig } from 'eslint/config'; import { javascriptConfig } from '@ni/eslint-config-javascript'; +import { angularConfig, angularTemplateConfig, ignoreAttributes } from '@ni/eslint-config-angular'; export default defineConfig([ { diff --git a/tests/playwright/eslint.config.js b/tests/playwright/eslint.config.js index 45ae0808..1f762b44 100644 --- a/tests/playwright/eslint.config.js +++ b/tests/playwright/eslint.config.js @@ -1,26 +1,19 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; -import { playwrightConfig } from '@ni/eslint-config-playwright'; -import { javascriptConfig } from '@ni/eslint-config-javascript'; import { defineConfig } from 'eslint/config'; - -const tsConfigRootDir = path.dirname(fileURLToPath(import.meta.url)); +import { javascriptConfig } from '@ni/eslint-config-javascript'; +import { playwrightConfig } from '@ni/eslint-config-playwright'; export default defineConfig([ { files: ['**/*.js'], extends: javascriptConfig, - rules: { - 'import/no-default-export': 'off', - } }, { - files: ['*.ts'], + files: ['**/*.ts'], extends: playwrightConfig, languageOptions: { parserOptions: { project: ['./tsconfig.json'], - tsConfigRootDir, + tsConfigRootDir: import.meta.dirname, }, }, rules: { diff --git a/tests/typescript/eslint.config.js b/tests/typescript/eslint.config.js index 4e5e5b43..3d3c1e63 100644 --- a/tests/typescript/eslint.config.js +++ b/tests/typescript/eslint.config.js @@ -1,6 +1,6 @@ +import { defineConfig } from 'eslint/config'; import { javascriptConfig } from '@ni/eslint-config-javascript'; import { typescriptConfig } from '@ni/eslint-config-typescript'; -import { defineConfig } from 'eslint/config'; export default defineConfig([ javascriptConfig, From 45aa7a40f0bbc27ff0443c632425d4f61abdcaa4 Mon Sep 17 00:00:00 2001 From: rajsite Date: Tue, 30 Sep 2025 12:00:41 -0500 Subject: [PATCH 49/53] Align README and test examples --- README.md | 116 +++++++++++++++++++++++++----------------------------- 1 file changed, 53 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index a6e60cc0..d86e5b08 100644 --- a/README.md +++ b/README.md @@ -47,56 +47,43 @@ Install the package for your corresponding language as a development dependency: Then follow the [Playwright configuration](#playwright-configuration) instructions. -With npm 7 and up the required peer dependencies will be installed automatically and you can move on to [Configuration](#configuration). - -If you are using npm 6 or lower, use the following instructions to manually install the required peer dependencies: - -Use [`npm view`](https://docs.npmjs.com/cli/view.html) to list the correct versions of each peer package to install yourself. For example, with a JavaScript project run: - -```bash -npm view @ni/eslint-config-javascript peerDependencies -``` - -Alternatively, use [`npx install-peerdeps`](https://www.npmjs.com/package/install-peerdeps) as a shortcut to install the peer packages for you. For example, with a JavaScript project run: - -```bash -npx install-peerdeps --dev @ni/eslint-config-javascript -``` - ## Configuration After installing the lint configuration packages, follow the configuration instructions for your project language: ### JavaScript configuration -Export `@ni/eslint-config-javascript` configurations in your [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): +Use `@ni/eslint-config-javascript` configurations in your [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`): ```js +import { defineConfig } from 'eslint/config'; import { javascriptConfig } from '@ni/eslint-config-javascript'; -export default [ +export default defineConfig([ javascriptConfig, -]; +]); ``` ### TypeScript configuration -Export `@ni/eslint-config-typescript` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration. +Use `@ni/eslint-config-typescript` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration to correctly enable [linting with type information](https://typescript-eslint.io/getting-started/typed-linting). ```js +import { defineConfig } from 'eslint/config'; import { typescriptConfig } from '@ni/eslint-config-typescript'; -export default [ - typescriptConfig, +export default defineConfig([ { files: ['**/*.ts'], + extends: typescriptConfig, languageOptions: { parserOptions: { - project: './tsconfig.json' - } - } - } -]; + project: ['./tsconfig.json'], + tsConfigRootDir: import.meta.dirname, + }, + }, + }, +]); ``` ### Angular configuration @@ -112,53 +99,52 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ > ng g angular-eslint:add-eslint-to-project > ng config cli.schematicCollections "[\"angular-eslint\"]" ``` -3. Export the NI configured rules for Angular and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. +3. Use the NI configured rules for Angular and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration to correctly enable [linting with type information](https://typescript-eslint.io/getting-started/typed-linting).. ```js - import angularConfig from '@ni/eslint-config-angular'; - import angularTemplateConfig from '@ni/eslint-config-angular/template'; + import { defineConfig } from 'eslint/config'; + import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; - export default [ + export default defineConfig([ { files: ['**/*.ts'], - extends: [ - angularConfig - ], + extends: angularConfig, languageOptions: { parserOptions: { - project: './tsconfig.json' - } - } + project: ['./tsconfig.json'], + tsConfigRootDir: import.meta.dirname, + }, + }, }, { - files: ['*.html'], - extends: angularTemplateConfig] + files: ['**/*.html'], + extends: angularTemplateConfig, } - ]; + ]); ``` 4. Evaluate the [project specific rule groups](#evaluate-project-specific-rule-groups) to manually add to your lint configuration. For Angular applications in particular, consider enabling the [`[application-prefix]`](#application-prefix) rule group. ### Playwright configuration -Export `@ni/eslint-config-playwright` in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration. - -**Note:** The Playwright configurations extend the TypeScript configurations, so it is not necessary for an application to extend them both. However, the Playwright configurations should only be applied to directories that contain Playwright tests and utilities. +Use `@ni/eslint-config-playwright` configurations in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` to the project's TypeScript configuration to correctly enable [linting with type information](https://typescript-eslint.io/getting-started/typed-linting). ```js -// This is an example .eslintrc.js in a Playwright-specific directory. -// If Playwright files are mixed with other code, use an "overrides" file pattern to match only Playwright code. -import playwrightConfig from '@ni/eslint-config-playwright'; +import { defineConfig } from 'eslint/config'; +import { playwrightConfig } from '@ni/eslint-config-playwright'; -export default [ - playwrightConfig, +export default defineConfig([ { + // This files pattern should be updated to only match + // Playwright test files and not other TypeScript files files: ['**/*.ts'], + extends: playwrightConfig, languageOptions: { parserOptions: { - project: './tsconfig.json' - } + project: ['./tsconfig.json'], + tsConfigRootDir: import.meta.dirname, + }, } } -]; +]); ``` ## Usage @@ -273,7 +259,9 @@ To disable a rule globally, modify the `rules` section of the [ESLint configurat To disable a rule for a specific file pattern or directory, update the rules section for that file pattern in the [ESLint configuration](https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats): ```js -export default [ +import { defineConfig } from 'eslint/config'; + +export default defineConfig([ // ...other configs { // This rule is disabled as an example @@ -282,7 +270,7 @@ export default [ 'import/no-default-export': 'off' } } -]; +]); ``` ### Inline disable rules that don't apply to a particular situation @@ -305,13 +293,14 @@ Instead of using the `extends` property, import the configuration packages you n ```js // eslint.config.js + import { defineConfig } from 'eslint/config'; import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; - export default [ + export default defineConfig([ angularConfig, angularTemplateConfig, // Add any project-specific overrides here - ]; + ]); ``` **Note:** All rules that previously required type checking are now included in the main config export for each package. You no longer need to import a separate requiring-type-checking config—just import the main config to get all rules. @@ -320,14 +309,15 @@ Instead of using the `extends` property, import the configuration packages you n For TypeScript and Angular projects, ensure you set `parserOptions.project` in a config block to point to your TypeScript configuration: ```js - { - files: ['**/*.ts'], - languageOptions: { - parserOptions: { - project: './tsconfig.json' - } - } - } + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.json'], + tsConfigRootDir: import.meta.dirname, + }, + } + } ``` 4. **Remove legacy config fields** From c65ec532ba91f3d811555225b81ed699bf89a618 Mon Sep 17 00:00:00 2001 From: rajsite Date: Tue, 30 Sep 2025 12:13:03 -0500 Subject: [PATCH 50/53] Update to recent versions --- package-lock.json | 124 +++++++++--------- .../eslint-config-typescript/package.json | 2 +- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a9cf799..8b3051dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -687,17 +687,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", - "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", + "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", "license": "MIT", "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/type-utils": "8.44.1", - "@typescript-eslint/utils": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/type-utils": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -711,7 +711,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.44.1", + "@typescript-eslint/parser": "^8.45.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -727,16 +727,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", - "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", "debug": "^4.3.4" }, "engines": { @@ -752,14 +752,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", - "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.1", - "@typescript-eslint/types": "^8.44.1", + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", "debug": "^4.3.4" }, "engines": { @@ -774,14 +774,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", - "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1" + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -792,9 +792,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", - "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", "license": "MIT", "peer": true, "engines": { @@ -809,15 +809,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", - "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", + "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -834,9 +834,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", - "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", "license": "MIT", "peer": true, "engines": { @@ -848,16 +848,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", - "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/project-service": "8.44.1", - "@typescript-eslint/tsconfig-utils": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -903,16 +903,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", - "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", + "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1" + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -927,13 +927,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", - "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/types": "8.45.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4788,16 +4788,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.1.tgz", - "integrity": "sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", + "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.44.1", - "@typescript-eslint/parser": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/utils": "8.44.1" + "@typescript-eslint/eslint-plugin": "8.45.0", + "@typescript-eslint/parser": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5107,7 +5107,7 @@ "peerDependencies": { "@ni/eslint-config-javascript": "^4.4.0", "eslint-plugin-import": "^2.32.0", - "typescript-eslint": "^8.44.1" + "typescript-eslint": "^8.45.0" } }, "tests/angular": { diff --git a/packages/eslint-config-typescript/package.json b/packages/eslint-config-typescript/package.json index edb72ed0..abad0a3d 100644 --- a/packages/eslint-config-typescript/package.json +++ b/packages/eslint-config-typescript/package.json @@ -38,6 +38,6 @@ "peerDependencies": { "@ni/eslint-config-javascript": "^4.4.0", "eslint-plugin-import": "^2.32.0", - "typescript-eslint": "^8.44.1" + "typescript-eslint": "^8.45.0" } } \ No newline at end of file From 33c508dec0755719b0bcb499165a5a2e8eaaa3cc Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Tue, 30 Sep 2025 18:49:07 -0500 Subject: [PATCH 51/53] Rename angularConfig to angularTypescriptConfig --- README.md | 10 +++++----- packages/eslint-config-angular/index.js | 2 +- tests/angular/eslint.config.js | 4 ++-- tests/print-evaluated-rules/index.js | 4 ++-- tests/typescript/index.ts | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index d86e5b08..6a97d885 100644 --- a/README.md +++ b/README.md @@ -99,15 +99,15 @@ ESLint support for Angular is provided by [`angular-eslint`](https://github.com/ > ng g angular-eslint:add-eslint-to-project > ng config cli.schematicCollections "[\"angular-eslint\"]" ``` -3. Use the NI configured rules for Angular and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration to correctly enable [linting with type information](https://typescript-eslint.io/getting-started/typed-linting).. +3. Use the NI configured rules for Angular TypeScript code and Angular templates in the [ESLint flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new) (`eslint.config.js`). Set the `parserOptions.project` configuration to the project's TypeScript configuration to correctly enable [linting with type information](https://typescript-eslint.io/getting-started/typed-linting).. ```js import { defineConfig } from 'eslint/config'; - import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; + import { angularTypescriptConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; export default defineConfig([ { files: ['**/*.ts'], - extends: angularConfig, + extends: angularTypescriptConfig, languageOptions: { parserOptions: { project: ['./tsconfig.json'], @@ -294,10 +294,10 @@ Instead of using the `extends` property, import the configuration packages you n ```js // eslint.config.js import { defineConfig } from 'eslint/config'; - import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; + import { angularTypescriptConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; export default defineConfig([ - angularConfig, + angularTypescriptConfig, angularTemplateConfig, // Add any project-specific overrides here ]); diff --git a/packages/eslint-config-angular/index.js b/packages/eslint-config-angular/index.js index 017cd840..42bb8b97 100644 --- a/packages/eslint-config-angular/index.js +++ b/packages/eslint-config-angular/index.js @@ -5,7 +5,7 @@ import angular from 'angular-eslint'; export { angularTemplateConfig } from './lib/template.js'; export { ignoreAttributes } from './lib/template-options.js'; -export const angularConfig = defineConfig([ +export const angularTypescriptConfig = defineConfig([ angular.configs.tsRecommended, typescriptConfig, { diff --git a/tests/angular/eslint.config.js b/tests/angular/eslint.config.js index 5d713d02..28627bc9 100644 --- a/tests/angular/eslint.config.js +++ b/tests/angular/eslint.config.js @@ -1,6 +1,6 @@ import { defineConfig } from 'eslint/config'; import { javascriptConfig } from '@ni/eslint-config-javascript'; -import { angularConfig, angularTemplateConfig, ignoreAttributes } from '@ni/eslint-config-angular'; +import { angularTypescriptConfig, angularTemplateConfig, ignoreAttributes } from '@ni/eslint-config-angular'; export default defineConfig([ { @@ -9,7 +9,7 @@ export default defineConfig([ }, { files: ['**/*.ts'], - extends: angularConfig, + extends: angularTypescriptConfig, languageOptions: { parserOptions: { project: ['./tsconfig.json'], diff --git a/tests/print-evaluated-rules/index.js b/tests/print-evaluated-rules/index.js index 9e4a7a67..a17bb747 100644 --- a/tests/print-evaluated-rules/index.js +++ b/tests/print-evaluated-rules/index.js @@ -1,5 +1,5 @@ import { ESLint } from 'eslint'; -import { angularConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; +import { angularTypescriptConfig, angularTemplateConfig } from '@ni/eslint-config-angular'; import fs from 'fs'; import path from 'path'; import yargs from 'yargs/yargs'; @@ -99,7 +99,7 @@ const __dirname = path.dirname(__filename); return config; }, {})); - const angularDivergedRules = getDivergedRules(Object.assign({}, ...angularConfig.slice(-2).map(item => item.rules))); + const angularDivergedRules = getDivergedRules(Object.assign({}, ...angularTypescriptConfig.slice(-2).map(item => item.rules))); const angularTemplateDivergedRules = getDivergedRules(Object.assign({}, ...angularTemplateConfig.slice(-2).map(item => item.rules))); const angularHasDivergedRules = !!Object.keys(angularDivergedRules).length || !!Object.keys(angularTemplateDivergedRules).length; diff --git a/tests/typescript/index.ts b/tests/typescript/index.ts index c1e23a74..d1db40f8 100644 --- a/tests/typescript/index.ts +++ b/tests/typescript/index.ts @@ -7,8 +7,8 @@ export class NI { this._awesomeLevel = 11; } - public get awesome(): boolean { - return this._awesomeLevel > 0; + public get Awesome(): boolean { + return this._awesomeLevel > 0; } public makeAwesomer(): void { From f8e27890daee847d16402a99da20346c1de11a9a Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Tue, 30 Sep 2025 18:56:09 -0500 Subject: [PATCH 52/53] Improve changefile message --- ...int-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json | 2 +- ...-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json | 2 +- ...-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json | 2 +- ...-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json index 1775e053..ba7ff1cf 100644 --- a/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json +++ b/change/@ni-eslint-config-angular-2b894e10-2f6e-4ff2-ade2-fae0335c38d8.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-angular to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. Check 'https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format' for more information.", + "comment": "Update eslint-config-angular to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. See [Migration Guide](https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format) for more information.", "packageName": "@ni/eslint-config-angular", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json b/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json index 4bf0970e..949c67fa 100644 --- a/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json +++ b/change/@ni-eslint-config-javascript-8342b44c-c3b9-4617-ac3e-8f4c3a14962c.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-javascript to be compatible with eslint v9", + "comment": "Update eslint-config-javascript to be compatible with eslint v9. See [Migration Guide](https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format) for more information.", "packageName": "@ni/eslint-config-javascript", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json index 83b0a694..ea711a0e 100644 --- a/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json +++ b/change/@ni-eslint-config-playwright-854caf08-4e79-4f67-b93a-441aa8e94aa6.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-playwright to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. Check 'https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format' for more information.", + "comment": "Update eslint-config-playwright to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. See [Migration Guide](https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format) for more information.", "packageName": "@ni/eslint-config-playwright", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" diff --git a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json index 688d9a7e..05d2b425 100644 --- a/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json +++ b/change/@ni-eslint-config-typescript-59a461d7-a675-4c63-b3e9-5504d06ec44f.json @@ -1,6 +1,6 @@ { "type": "major", - "comment": "Update eslint-config-typescript to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. Check 'https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format' for more information.", + "comment": "Update eslint-config-typescript to be compatible with eslint v9. Change default rule configuration to assume `strictNullChecks` is enabled. See [Migration Guide](https://github.com/ni/javascript-styleguide/blob/main/README.md#migrating-to-eslint-flat-configuration-format) for more information.", "packageName": "@ni/eslint-config-typescript", "email": "131153319+gokulprasanth-ni@users.noreply.github.com", "dependentChangeType": "patch" From de23ebbf6eeb3b7519174c2647d32ee03bf08806 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Tue, 30 Sep 2025 18:56:53 -0500 Subject: [PATCH 53/53] Revert accidental test change --- tests/typescript/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/typescript/index.ts b/tests/typescript/index.ts index d1db40f8..c1e23a74 100644 --- a/tests/typescript/index.ts +++ b/tests/typescript/index.ts @@ -7,8 +7,8 @@ export class NI { this._awesomeLevel = 11; } - public get Awesome(): boolean { - return this._awesomeLevel > 0; + public get awesome(): boolean { + return this._awesomeLevel > 0; } public makeAwesomer(): void {