From 9c967dd3a5d7fa5519d1ca622ffe8ee8889e50de Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 22 Sep 2025 15:26:29 +0200 Subject: [PATCH] feat(eslint): add support for flat configs ESLint v8.57 has added a new loadESLint() function to load the correct ESLint class (either one reading legacy configs, either one reading flat configs). See: - https://eslint.org/docs/v8.x/integrate/nodejs-api#loadeslint - https://github.com/eslint/eslint/commit/1120b9b7b97f10f059d8b7ede19de2572f892366 Unfortunately @types/eslint is missing v8.57 and has been removed entirely from the DefinitelyType repository (since upstream now ships type definitions). As a result we need to manually declare the type of the loadESLint() function. Additionally, loadESLint() is async, so we can't call it at plugin initialization time. Instead, we call it the first time we need it. --- .eslintignore | 1 + packages/eslint/.eslintignore | 2 +- packages/eslint/package.json | 4 +- packages/eslint/src/index.ts | 14 +- .../fixtures/flat-config/eslint.config.js | 34 +++ .../test/fixtures/flat-config/undeclared.js | 1 + .../{ => legacy-config}/.eslintrc-babel | 0 .../fixtures/{ => legacy-config}/.eslintrc.js | 0 .../fixtures/{ => legacy-config}/fixable.js | 0 .../fixtures/{ => legacy-config}/fixed.js | 0 .../fixtures/{ => legacy-config}/ignored.js | 0 .../fixtures/{ => legacy-config}/modules.js | 0 .../node_modules/mod/index.js | 0 .../{ => legacy-config}/undeclared.js | 0 .../{ => legacy-config}/use-strict.js | 0 packages/eslint/test/test.mjs | 57 +++-- pnpm-lock.yaml | 200 ++++++++++++++---- 17 files changed, 246 insertions(+), 67 deletions(-) create mode 100644 packages/eslint/test/fixtures/flat-config/eslint.config.js create mode 100755 packages/eslint/test/fixtures/flat-config/undeclared.js rename packages/eslint/test/fixtures/{ => legacy-config}/.eslintrc-babel (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/.eslintrc.js (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/fixable.js (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/fixed.js (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/ignored.js (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/modules.js (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/node_modules/mod/index.js (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/undeclared.js (100%) rename packages/eslint/test/fixtures/{ => legacy-config}/use-strict.js (100%) diff --git a/.eslintignore b/.eslintignore index 957e4a275..53540c3d8 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,6 +4,7 @@ **/test/**/output packages/commonjs/test/fixtures packages/typescript/test/fixtures/syntax-error +packages/eslint/test/fixtures/flat-config # temporary workaround for eslint bug where package.json is a directory packages/node-resolve/test/fixtures/package-json-in-path diff --git a/packages/eslint/.eslintignore b/packages/eslint/.eslintignore index 4051dc28f..a61b07316 100755 --- a/packages/eslint/.eslintignore +++ b/packages/eslint/.eslintignore @@ -1 +1 @@ -test/fixtures/ignored.js +test/fixtures/legacy-config/ignored.js diff --git a/packages/eslint/package.json b/packages/eslint/package.json index 7681a688c..b77266983 100755 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -63,12 +63,12 @@ }, "dependencies": { "@rollup/pluginutils": "^5.0.1", - "eslint": "^8.24.0" + "eslint": "^8.57.1" }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.0.0", "@rollup/plugin-typescript": "^9.0.1", - "@types/eslint": "^8.4.6", + "@types/eslint": "^8.56.12", "rollup": "^4.0.0-24", "typescript": "^4.8.3" }, diff --git a/packages/eslint/src/index.ts b/packages/eslint/src/index.ts index c8b14ebe9..7653615e6 100755 --- a/packages/eslint/src/index.ts +++ b/packages/eslint/src/index.ts @@ -2,10 +2,15 @@ import { relative, resolve, sep } from 'path'; import type { Plugin } from 'rollup'; import { createFilter } from '@rollup/pluginutils'; -import { ESLint } from 'eslint'; +import { ESLint, loadESLint } from 'eslint'; import type { RollupEslintOptions } from '../types'; +// New API introduced in v8.57 missing from @types/eslint +declare module 'eslint' { + function loadESLint(): Promise; +} + function normalizePath(id: string) { return relative(process.cwd(), id).split(sep).join('/'); } @@ -29,12 +34,17 @@ export default function eslint(options = {} as RollupEslintOptions): Plugin { ...eslintOptions } = options; - const eslintInstance = new ESLint(eslintOptions); + let eslintInstance: ESLint | null = null; const filter = createFilter(include, exclude); return { name: 'eslint', async transform(_, id: string) { + if (!eslintInstance) { + const DefaultESLint = await loadESLint(); + eslintInstance = new DefaultESLint(eslintOptions); + } + const file = normalizePath(id); if (!filter(id) || (await eslintInstance.isPathIgnored(file))) { return null; diff --git a/packages/eslint/test/fixtures/flat-config/eslint.config.js b/packages/eslint/test/fixtures/flat-config/eslint.config.js new file mode 100644 index 000000000..dcb770c8e --- /dev/null +++ b/packages/eslint/test/fixtures/flat-config/eslint.config.js @@ -0,0 +1,34 @@ +export default [ + { + files: ["**/*.js"], + rules: { + "no-alert": 2, + "no-bitwise": 1, + "camelcase": 1, + "curly": 1, + "eqeqeq": 0, + "no-eq-null": 0, + "guard-for-in": 1, + "no-empty": 1, + "no-use-before-define": 0, + "object-curly-spacing": 0, + "no-obj-calls": 2, + "no-unused-vars": 0, + "new-cap": 1, + "no-shadow": 0, + "strict": 2, + "global-strict": 0, + "no-invalid-regexp": 2, + "comma-dangle": 2, + "no-undef": 1, + "no-new": 1, + "no-extra-semi": 1, + "no-debugger": 2, + "no-caller": 1, + "semi": 1, + "quotes": 0, + "no-unreachable": 2, + "eol-last": 0, + }, + }, +]; diff --git a/packages/eslint/test/fixtures/flat-config/undeclared.js b/packages/eslint/test/fixtures/flat-config/undeclared.js new file mode 100755 index 000000000..6882fe5e9 --- /dev/null +++ b/packages/eslint/test/fixtures/flat-config/undeclared.js @@ -0,0 +1 @@ +x = 0; diff --git a/packages/eslint/test/fixtures/.eslintrc-babel b/packages/eslint/test/fixtures/legacy-config/.eslintrc-babel similarity index 100% rename from packages/eslint/test/fixtures/.eslintrc-babel rename to packages/eslint/test/fixtures/legacy-config/.eslintrc-babel diff --git a/packages/eslint/test/fixtures/.eslintrc.js b/packages/eslint/test/fixtures/legacy-config/.eslintrc.js similarity index 100% rename from packages/eslint/test/fixtures/.eslintrc.js rename to packages/eslint/test/fixtures/legacy-config/.eslintrc.js diff --git a/packages/eslint/test/fixtures/fixable.js b/packages/eslint/test/fixtures/legacy-config/fixable.js similarity index 100% rename from packages/eslint/test/fixtures/fixable.js rename to packages/eslint/test/fixtures/legacy-config/fixable.js diff --git a/packages/eslint/test/fixtures/fixed.js b/packages/eslint/test/fixtures/legacy-config/fixed.js similarity index 100% rename from packages/eslint/test/fixtures/fixed.js rename to packages/eslint/test/fixtures/legacy-config/fixed.js diff --git a/packages/eslint/test/fixtures/ignored.js b/packages/eslint/test/fixtures/legacy-config/ignored.js similarity index 100% rename from packages/eslint/test/fixtures/ignored.js rename to packages/eslint/test/fixtures/legacy-config/ignored.js diff --git a/packages/eslint/test/fixtures/modules.js b/packages/eslint/test/fixtures/legacy-config/modules.js similarity index 100% rename from packages/eslint/test/fixtures/modules.js rename to packages/eslint/test/fixtures/legacy-config/modules.js diff --git a/packages/eslint/test/fixtures/node_modules/mod/index.js b/packages/eslint/test/fixtures/legacy-config/node_modules/mod/index.js similarity index 100% rename from packages/eslint/test/fixtures/node_modules/mod/index.js rename to packages/eslint/test/fixtures/legacy-config/node_modules/mod/index.js diff --git a/packages/eslint/test/fixtures/undeclared.js b/packages/eslint/test/fixtures/legacy-config/undeclared.js similarity index 100% rename from packages/eslint/test/fixtures/undeclared.js rename to packages/eslint/test/fixtures/legacy-config/undeclared.js diff --git a/packages/eslint/test/fixtures/use-strict.js b/packages/eslint/test/fixtures/legacy-config/use-strict.js similarity index 100% rename from packages/eslint/test/fixtures/use-strict.js rename to packages/eslint/test/fixtures/legacy-config/use-strict.js diff --git a/packages/eslint/test/test.mjs b/packages/eslint/test/test.mjs index 51aaf13cd..99ff377de 100755 --- a/packages/eslint/test/test.mjs +++ b/packages/eslint/test/test.mjs @@ -11,7 +11,7 @@ import eslint from 'current-package'; test('should lint files', async (t) => { let count = 0; await rollup({ - input: './test/fixtures/undeclared.js', + input: './test/fixtures/legacy-config/undeclared.js', plugins: [ eslint({ formatter: (results) => { @@ -29,7 +29,7 @@ test('should lint files', async (t) => { test('should not fail with default options', async (t) => { await rollup({ - input: './test/fixtures/undeclared.js', + input: './test/fixtures/legacy-config/undeclared.js', plugins: [eslint()] }); @@ -39,11 +39,11 @@ test('should not fail with default options', async (t) => { test('should ignore node_modules with exclude option', async (t) => { let count = 0; await rollup({ - input: './test/fixtures/modules.js', + input: './test/fixtures/legacy-config/modules.js', plugins: [ nodeResolve({ jsnext: true }), eslint({ - overrideConfigFile: './test/fixtures/.eslintrc-babel', + overrideConfigFile: './test/fixtures/legacy-config/.eslintrc-babel', formatter: () => { count += 1; } @@ -57,7 +57,7 @@ test('should ignore node_modules with exclude option', async (t) => { test('should ignore files according .eslintignore', async (t) => { let count = 0; await rollup({ - input: './test/fixtures/ignored.js', + input: './test/fixtures/legacy-config/ignored.js', plugins: [ eslint({ formatter: () => { @@ -74,7 +74,7 @@ test('should fail with enabled throwOnWarning and throwOnError options', async ( await t.throwsAsync( async () => { await rollup({ - input: './test/fixtures/use-strict.js', + input: './test/fixtures/legacy-config/use-strict.js', plugins: [ eslint({ throwOnWarning: true, @@ -92,7 +92,7 @@ test('should fail with enabled throwOnError option', async (t) => { await t.throwsAsync( async () => { await rollup({ - input: './test/fixtures/use-strict.js', + input: './test/fixtures/legacy-config/use-strict.js', plugins: [ eslint({ throwOnError: true, @@ -109,7 +109,7 @@ test('should fail with enabled throwOnWarning option', async (t) => { await t.throwsAsync( async () => { await rollup({ - input: './test/fixtures/use-strict.js', + input: './test/fixtures/legacy-config/use-strict.js', plugins: [ eslint({ throwOnWarning: true, @@ -124,7 +124,7 @@ test('should fail with enabled throwOnWarning option', async (t) => { test('should not fail with throwOnError and throwOnWarning disabled', async (t) => { await rollup({ - input: './test/fixtures/use-strict.js', + input: './test/fixtures/legacy-config/use-strict.js', plugins: [ eslint({ throwOnError: false, @@ -141,7 +141,7 @@ test('should fail with not found formatter', async (t) => { await t.throwsAsync( async () => { await rollup({ - input: './test/fixtures/use-strict.js', + input: './test/fixtures/legacy-config/use-strict.js', plugins: [ eslint({ formatter: 'not-found-formatter' @@ -155,7 +155,7 @@ test('should fail with not found formatter', async (t) => { test('should not fail with found formatter', async (t) => { rollup({ - input: './test/fixtures/use-strict.js', + input: './test/fixtures/legacy-config/use-strict.js', plugins: [ eslint({ formatter: 'stylish' @@ -168,7 +168,7 @@ test('should not fail with found formatter', async (t) => { test('should not fail with asynchronous formatter function', async (t) => { await rollup({ - input: './test/fixtures/use-strict.js', + input: './test/fixtures/legacy-config/use-strict.js', plugins: [ eslint({ formatter: async () => 'json' @@ -181,12 +181,12 @@ test('should not fail with asynchronous formatter function', async (t) => { test('should fix source code', async (t) => { fs.writeFileSync( - './test/fixtures/fixable-clone.js', - fs.readFileSync('./test/fixtures/fixable.js') + './test/fixtures/legacy-config/fixable-clone.js', + fs.readFileSync('./test/fixtures/legacy-config/fixable.js') ); await rollup({ - input: './test/fixtures/fixable-clone.js', + input: './test/fixtures/legacy-config/fixable-clone.js', plugins: [ eslint({ fix: true @@ -195,11 +195,11 @@ test('should fix source code', async (t) => { }); t.is( - fs.readFileSync('./test/fixtures/fixable-clone.js').toString(), - fs.readFileSync('./test/fixtures/fixed.js').toString() + fs.readFileSync('./test/fixtures/legacy-config/fixable-clone.js').toString(), + fs.readFileSync('./test/fixtures/legacy-config/fixed.js').toString() ); - fs.unlinkSync('./test/fixtures/fixable-clone.js'); + fs.unlinkSync('./test/fixtures/legacy-config/fixable-clone.js'); }); test('works with cjs plugin', async (t) => { @@ -207,7 +207,7 @@ test('works with cjs plugin', async (t) => { const eslintPluginCjs = require('current-package'); let count = 0; await rollup({ - input: './test/fixtures/undeclared.js', + input: './test/fixtures/legacy-config/undeclared.js', plugins: [ eslintPluginCjs({ formatter: (results) => { @@ -222,3 +222,22 @@ test('works with cjs plugin', async (t) => { t.is(count, 1); }); + +test('works with flat config', async (t) => { + let count = 0; + await rollup({ + input: './test/fixtures/flat-config/undeclared.js', + plugins: [ + eslint({ + formatter: (results) => { + count += results[0].messages.length; + // eslint-disable-next-line prefer-destructuring + const { message } = results[0].messages[0]; + t.is(message, "'x' is not defined."); + } + }) + ] + }); + + t.is(count, 1); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab26baa04..0692e1247 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -316,10 +316,10 @@ importers: dependencies: '@rollup/pluginutils': specifier: ^5.0.1 - version: 5.0.1(rollup@4.0.0-24) + version: 5.1.0(rollup@4.0.0-24) eslint: - specifier: ^8.24.0 - version: 8.25.0 + specifier: ^8.57.1 + version: 8.57.1 devDependencies: '@rollup/plugin-node-resolve': specifier: ^15.0.0 @@ -328,8 +328,8 @@ importers: specifier: ^9.0.1 version: 9.0.1(rollup@4.0.0-24)(tslib@2.4.0)(typescript@4.8.4) '@types/eslint': - specifier: ^8.4.6 - version: 8.4.6 + specifier: ^8.56.12 + version: 8.56.12 rollup: specifier: ^4.0.0-24 version: 4.0.0-24 @@ -1404,20 +1404,38 @@ packages: engines: {node: '>=18'} hasBin: true + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/eslintrc@1.3.3': resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@humanwhocodes/config-array@0.10.7': - resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@humanwhocodes/config-array@0.11.7': resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -1426,6 +1444,10 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1769,8 +1791,8 @@ packages: '@types/d3-dsv@3.0.0': resolution: {integrity: sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==} - '@types/eslint@8.4.6': - resolution: {integrity: sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==} + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} '@types/estree@1.0.0': resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} @@ -1942,6 +1964,9 @@ packages: resolution: {integrity: sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -2642,6 +2667,10 @@ packages: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-utils@3.0.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -2656,14 +2685,20 @@ packages: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.25.0: - resolution: {integrity: sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true eslint@8.28.0: resolution: {integrity: sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true esm@3.2.25: @@ -2674,6 +2709,10 @@ packages: resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -2683,6 +2722,10 @@ packages: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -2864,6 +2907,10 @@ packages: resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} engines: {node: '>=8'} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -2882,6 +2929,9 @@ packages: grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql-tag@2.12.6: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -3562,6 +3612,10 @@ packages: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -4612,6 +4666,10 @@ packages: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -5469,6 +5527,13 @@ snapshots: write-pkg: 4.0.0 yargs-parser: 21.1.1 + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + '@eslint/eslintrc@1.3.3': dependencies: ajv: 6.12.6 @@ -5483,14 +5548,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@humanwhocodes/config-array@0.10.7': + '@eslint/eslintrc@2.1.4': dependencies: - '@humanwhocodes/object-schema': 1.2.1 + ajv: 6.12.6 debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 minimatch: 3.1.2 + strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + '@eslint/js@8.57.1': {} + '@humanwhocodes/config-array@0.11.7': dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -5499,10 +5572,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/object-schema@1.2.1': {} + '@humanwhocodes/object-schema@2.0.3': {} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -5794,7 +5877,7 @@ snapshots: '@types/d3-dsv@3.0.0': {} - '@types/eslint@8.4.6': + '@types/eslint@8.56.12': dependencies: '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 @@ -6008,6 +6091,8 @@ snapshots: '@typescript-eslint/types': 5.44.0 eslint-visitor-keys: 3.3.0 + '@ungap/structured-clone@1.3.0': {} + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -6021,9 +6106,9 @@ snapshots: dependencies: acorn: 6.4.2 - acorn-jsx@5.3.2(acorn@8.8.0): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.8.0 + acorn: 8.14.0 acorn-walk@8.2.0: {} @@ -6823,10 +6908,10 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@8.25.0): + eslint-scope@7.2.2: dependencies: - eslint: 8.25.0 - eslint-visitor-keys: 2.1.0 + esrecurse: 4.3.0 + estraverse: 5.3.0 eslint-utils@3.0.0(eslint@8.28.0): dependencies: @@ -6837,11 +6922,14 @@ snapshots: eslint-visitor-keys@3.3.0: {} - eslint@8.25.0: + eslint-visitor-keys@3.4.3: {} + + eslint@8.28.0: dependencies: '@eslint/eslintrc': 1.3.3 - '@humanwhocodes/config-array': 0.10.7 + '@humanwhocodes/config-array': 0.11.7 '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -6849,7 +6937,7 @@ snapshots: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0(eslint@8.25.0) + eslint-utils: 3.0.0(eslint@8.28.0) eslint-visitor-keys: 3.3.0 espree: 9.4.0 esquery: 1.4.0 @@ -6859,12 +6947,12 @@ snapshots: find-up: 5.0.0 glob-parent: 6.0.2 globals: 13.17.0 - globby: 11.1.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 + is-path-inside: 3.0.3 js-sdsl: 4.1.5 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 @@ -6880,46 +6968,45 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@8.28.0: + eslint@8.57.1: dependencies: - '@eslint/eslintrc': 1.3.3 - '@humanwhocodes/config-array': 0.11.7 + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-utils: 3.0.0(eslint@8.28.0) - eslint-visitor-keys: 3.3.0 - espree: 9.4.0 - esquery: 1.4.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.17.0 - grapheme-splitter: 1.0.4 + globals: 13.24.0 + graphemer: 1.4.0 ignore: 5.2.0 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.1.5 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.1 - regexpp: 3.2.0 + optionator: 0.9.4 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color @@ -6928,16 +7015,26 @@ snapshots: espree@9.4.0: dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2(acorn@8.8.0) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.3.0 + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} esquery@1.4.0: dependencies: estraverse: 5.3.0 + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -7127,6 +7224,10 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -7162,6 +7263,8 @@ snapshots: grapheme-splitter@1.0.4: {} + graphemer@1.4.0: {} + graphql-tag@2.12.6(graphql@16.6.0): dependencies: graphql: 16.6.0 @@ -7817,6 +7920,15 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.3 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + p-cancelable@2.1.1: {} p-defer@1.0.0: {} @@ -8820,6 +8932,8 @@ snapshots: word-wrap@1.2.3: {} + word-wrap@1.2.5: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0