diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 49195331..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - root: true, - - parserOptions: { - ecmaVersion: 2018, - }, - - extends: [ - '@metamask/eslint-config', - '@metamask/eslint-config-nodejs', - '@metamask/eslint-config-jest', - ], - - rules: { - 'import-x/no-dynamic-require': 'off', - 'import-x/no-nodejs-modules': 'off', - 'n/global-require': 'off', - 'n/no-process-exit': 'off', - 'n/no-sync': 'off', - 'n/no-unpublished-require': 'off', - }, - - overrides: [ - { - files: ['**/*.test.js'], - parserOptions: { - sourceType: 'module', - ecmaVersion: 2022, - }, - - rules: { - 'no-shadow': 'off', - }, - }, - ], - - ignorePatterns: ['!.eslintrc.js'], -}; diff --git a/.prettierrc.js b/.prettierrc.mjs similarity index 58% rename from .prettierrc.js rename to .prettierrc.mjs index fa85e10c..56ce65ea 100644 --- a/.prettierrc.js +++ b/.prettierrc.mjs @@ -1,9 +1,12 @@ -// All of these are defaults except singleQuote and endOfLine, but we specify them -// for explicitness -module.exports = { +// All of these are defaults except singleQuote and endOfLine, but we specify +// them for explicitness +const config = { endOfLine: 'auto', quoteProps: 'as-needed', singleQuote: true, tabWidth: 2, trailingComma: 'all', + plugins: ['prettier-plugin-packagejson'], }; + +export default config; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..8dae7749 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,64 @@ +// @ts-check + +import base from '@metamask/eslint-config'; +import jest from '@metamask/eslint-config-jest'; +import nodejs from '@metamask/eslint-config-nodejs'; +import typescript from '@metamask/eslint-config-typescript'; +// eslint-disable-next-line import-x/no-unresolved +import tseslint from 'typescript-eslint'; + +const config = tseslint.config( + { + ignores: ['.yarn/'], + }, + + ...base, + ...nodejs, + + { + files: [ + '**/*.ts', + '**/*.tsx', + '**/*.mts', + '**/*.cts', + '**/*.mtsx', + '**/*.ctsx', + ], + extends: typescript, + }, + + { + files: ['**/*.test.mjs'], + extends: jest, + rules: { + 'no-shadow': [ + 'error', + { + allow: ['describe', 'it', 'expect'], + }, + ], + }, + }, + + { + name: 'main', + files: ['**/*.js', '**/*.mjs'], + + languageOptions: { + sourceType: 'module', + }, + + rules: { + 'import-x/no-dynamic-require': 'off', + 'import-x/no-nodejs-modules': 'off', + 'jsdoc/check-tag-names': 'off', + 'jsdoc/no-types': 'off', + 'n/global-require': 'off', + 'n/no-process-exit': 'off', + 'n/no-sync': 'off', + 'n/no-unpublished-require': 'off', + }, + }, +); + +export default config; diff --git a/package.json b/package.json index 938b5cf5..e9cbdb83 100644 --- a/package.json +++ b/package.json @@ -6,38 +6,45 @@ "type": "git", "url": "https://github.com/MetaMask/eslint-config.git" }, + "type": "module", "workspaces": [ "packages/*" ], "scripts": { - "generate": "node ./scripts/generate-configs.js", + "generate": "node scripts/generate-configs.mjs", "lint": "yarn lint:eslint && yarn lint:misc --check && yarn lint:config-validation", "lint:changelogs": "yarn workspaces foreach --parallel --verbose run lint:changelog", - "lint:config-validation": "node ./scripts/validate-configs.js", - "lint:eslint": "yarn eslint . --ext ts,js", + "lint:config-validation": "node scripts/validate-configs.mjs", + "lint:eslint": "eslint", "lint:fix": "yarn lint:eslint --fix && yarn lint:misc --write && yarn lint:config-validation --write", "lint:misc": "prettier '**/*.json' '!**/rules-snapshot.json' '**/*.md' '!**/CHANGELOG.md' '**/*.yml' '!.yarnrc.yml' --ignore-path .gitignore", "test": "vitest" }, "devDependencies": { - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "^8.57.0", + "@eslint/config-array": "^0.18.0", + "@eslint/js": "^9.11.0", "@lavamoat/allow-scripts": "^3.0.4", "@metamask/auto-changelog": "^3.4.4", "@metamask/eslint-config": "^13.0.0", + "@metamask/eslint-config-jest": "workspace:^", "@metamask/eslint-config-nodejs": "^13.0.0", + "@metamask/eslint-config-typescript": "workspace:^", "@metamask/utils": "^9.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-prettier": "^4.2.1", + "@types/eslint__js": "^8.42.3", + "@types/node": "^22.5.5", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jest": "^28.8.3", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-n": "^17.10.3", + "eslint-plugin-prettier": "^5.2.1", "fast-deep-equal": "^3.1.3", - "globals": "^15.0.0", - "prettier": "^2.7.1", - "prettier-plugin-packagejson": "^2.2.18", + "globals": "^15.9.0", + "prettier": "^3.3.3", + "prettier-plugin-packagejson": "^2.5.2", + "typescript": "~5.5.4", + "typescript-eslint": "^8.6.0", "vite": "^5.4.7", "vitest": "^2.1.1" }, diff --git a/packages/base/README.md b/packages/base/README.md index bbc76cc5..3731d97e 100644 --- a/packages/base/README.md +++ b/packages/base/README.md @@ -8,26 +8,33 @@ Our default export contains a base set of ESLint rules for ES6+: ```bash yarn add --dev \ - @metamask/eslint-config@^12.2.0 \ - eslint@^8.57.0 \ - eslint-config-prettier@^8.5.0 \ - eslint-plugin-import-x@^0.5.1 \ - eslint-plugin-jsdoc@^47.0.2 \ - eslint-plugin-prettier@^4.2.1 \ - eslint-plugin-promise@^6.1.1 \ - prettier@^2.7.1 + @metamask/eslint-config@^13.0.0 \ + eslint@^9.11.0 \ + eslint-config-prettier@^9.1.0 \ + eslint-plugin-import-x@^4.3.0 \ + eslint-plugin-jsdoc@^50.2.4 \ + eslint-plugin-prettier@^5.2.1 \ + eslint-plugin-promise@^7.1.0 \ + prettier@^3.3.3 ``` The order in which you extend ESLint rules matters. -The `@metamask/*` eslint configs should be added to the `extends` array _last_, +The `@metamask/*` eslint configs should be added to the config array _last_, with `@metamask/eslint-config` first, and `@metamask/eslint-config-*` in any order thereafter. ```js -module.exports = { - extends: [ - // This should be added last unless you know what you're doing. - '@metamask/eslint-config', - ], +import base from '@metamask/eslint-config'; + +const config = { + // Any custom shared config should be added here. + // ... + + // This should be added last unless you know what you're doing. + ...base, + + { + // Your overrides here. + } }; ``` diff --git a/packages/base/package.json b/packages/base/package.json index 9e3e4f74..ce98e1b6 100644 --- a/packages/base/package.json +++ b/packages/base/package.json @@ -11,35 +11,50 @@ "url": "https://github.com/MetaMask/eslint-config.git" }, "license": "MIT", - "main": "src/index.js", + "type": "module", + "exports": { + ".": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + } + } + }, + "main": "./src/index.mjs", + "types": "./src/index.d.mts", "files": [ "src/", - "!src/**/*.test.js" + "!src/**/*.test.mjs" ], "scripts": { "lint:changelog": "auto-changelog validate", "publish": "npm publish", "test": "eslint ." }, + "dependencies": { + "@eslint/js": "^9.11.0", + "globals": "^15.9.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", "@metamask/auto-changelog": "^3.4.4", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.1.1", - "prettier": "^2.7.1", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-promise": "^7.1.0", + "prettier": "^3.3.3", "vitest": "^2.1.1" }, "peerDependencies": { - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jsdoc": ">=43.0.7 <48", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.1.1", - "prettier": "^2.7.1" + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-promise": "^7.1.0", + "prettier": "^3.3.3" }, "engines": { "node": "^18.18 || >=20" diff --git a/packages/base/rules-snapshot.json b/packages/base/rules-snapshot.json index cad9ae06..5a71cbbb 100644 --- a/packages/base/rules-snapshot.json +++ b/packages/base/rules-snapshot.json @@ -34,13 +34,7 @@ "block-scoped-var": "error", "block-spacing": "off", "brace-style": "off", - "camelcase": [ - "error", - { - "properties": "never", - "allow": ["^UNSAFE_"] - } - ], + "camelcase": ["error", { "properties": "never", "allow": ["^UNSAFE_"] }], "comma-dangle": "off", "comma-spacing": "off", "comma-style": "off", @@ -101,13 +95,7 @@ "implicit-arrow-linebreak": "off", "import-x/default": "error", "import-x/export": "error", - "import-x/extensions": [ - "error", - "never", - { - "json": "always" - } - ], + "import-x/extensions": ["error", "never", { "json": "always" }], "import-x/first": "error", "import-x/named": "error", "import-x/namespace": "error", @@ -125,18 +113,10 @@ "import-x/no-nodejs-modules": "error", "import-x/no-self-import": "error", "import-x/no-unassigned-import": "error", - "import-x/no-unresolved": [ - "error", - { - "commonjs": true - } - ], + "import-x/no-unresolved": ["error", { "commonjs": true }], "import-x/no-useless-path-segments": [ "error", - { - "commonjs": true, - "noUselessIndex": true - } + { "commonjs": true, "noUselessIndex": true } ], "import-x/no-webpack-loader-syntax": "error", "import-x/order": [ @@ -147,10 +127,7 @@ ["builtin", "external"], ["internal", "parent", "sibling", "index"] ], - "alphabetize": { - "order": "asc", - "caseInsensitive": true - } + "alphabetize": { "order": "asc", "caseInsensitive": true } } ], "import-x/unambiguous": "error", @@ -158,47 +135,49 @@ "indent-legacy": "off", "jsdoc/check-access": "error", "jsdoc/check-alignment": "error", + "jsdoc/check-examples": "off", + "jsdoc/check-indentation": "off", "jsdoc/check-line-alignment": "error", "jsdoc/check-param-names": "error", "jsdoc/check-property-names": "error", + "jsdoc/check-syntax": "off", "jsdoc/check-tag-names": "error", + "jsdoc/check-template-names": "off", "jsdoc/check-types": "error", "jsdoc/check-values": "error", + "jsdoc/convert-to-jsdoc-comments": "off", "jsdoc/empty-tags": "error", "jsdoc/implements-on-classes": "error", + "jsdoc/imports-as-dependencies": "off", + "jsdoc/informative-docs": "off", + "jsdoc/lines-before-block": "off", "jsdoc/match-description": [ "error", - { - "tags": { - "param": true, - "returns": true - } - } + { "tags": { "param": true, "returns": true } } ], + "jsdoc/match-name": "off", "jsdoc/multiline-blocks": "error", "jsdoc/no-bad-blocks": "error", + "jsdoc/no-blank-block-descriptions": "off", + "jsdoc/no-blank-blocks": "off", "jsdoc/no-defaults": "error", + "jsdoc/no-missing-syntax": "off", "jsdoc/no-multi-asterisks": "error", + "jsdoc/no-restricted-syntax": "off", + "jsdoc/no-types": "off", + "jsdoc/no-undefined-types": "error", "jsdoc/require-asterisk-prefix": "error", "jsdoc/require-description": "error", + "jsdoc/require-description-complete-sentence": "off", + "jsdoc/require-example": "off", + "jsdoc/require-file-overview": "off", "jsdoc/require-hyphen-before-param-description": [ "error", "always", - { - "tags": { - "returns": "never", - "template": "always", - "throws": "never" - } - } + { "tags": { "returns": "never", "template": "always", "throws": "never" } } ], "jsdoc/require-jsdoc": "error", - "jsdoc/require-param": [ - "error", - { - "unnamedRootBase": ["options"] - } - ], + "jsdoc/require-param": ["error", { "unnamedRootBase": ["options"] }], "jsdoc/require-param-description": "error", "jsdoc/require-param-name": "error", "jsdoc/require-param-type": "error", @@ -210,15 +189,13 @@ "jsdoc/require-returns-check": "error", "jsdoc/require-returns-description": "error", "jsdoc/require-returns-type": "error", + "jsdoc/require-template": "off", + "jsdoc/require-throws": "off", "jsdoc/require-yields": "error", "jsdoc/require-yields-check": "error", - "jsdoc/tag-lines": [ - "error", - "any", - { - "startLines": 1 - } - ], + "jsdoc/sort-tags": "off", + "jsdoc/tag-lines": ["error", "any", { "startLines": 1 }], + "jsdoc/text-escaping": "off", "jsdoc/valid-types": "error", "jsx-quotes": "off", "key-spacing": "off", @@ -229,13 +206,7 @@ "max-len": "off", "max-statements-per-line": "off", "multiline-ternary": "off", - "new-cap": [ - "error", - { - "newIsCap": true, - "capIsNew": false - } - ], + "new-cap": ["error", { "newIsCap": true, "capIsNew": false }], "new-parens": "off", "newline-per-chained-call": "off", "no-alert": "error", @@ -252,6 +223,7 @@ "no-cond-assign": "error", "no-confusing-arrow": "off", "no-const-assign": "error", + "no-constant-binary-expression": "error", "no-constant-condition": "error", "no-constructor-return": "error", "no-control-regex": "error", @@ -268,6 +240,7 @@ "no-empty-character-class": "error", "no-empty-function": "error", "no-empty-pattern": "error", + "no-empty-static-block": "error", "no-eq-null": "error", "no-eval": "error", "no-ex-assign": "error", @@ -282,7 +255,7 @@ "no-func-assign": "error", "no-global-assign": "error", "no-implicit-coercion": "error", - "no-implicit-globals": "error", + "no-implicit-globals": "off", "no-implied-eval": "error", "no-import-assign": "error", "no-inner-declarations": ["error", "functions"], @@ -291,13 +264,7 @@ "no-irregular-whitespace": "error", "no-iterator": "error", "no-label-var": "error", - "no-labels": [ - "error", - { - "allowLoop": false, - "allowSwitch": false - } - ], + "no-labels": ["error", { "allowLoop": false, "allowSwitch": false }], "no-lone-blocks": "error", "no-lonely-if": "error", "no-loop-func": "error", @@ -315,20 +282,15 @@ "no-nested-ternary": "error", "no-new": "error", "no-new-func": "error", + "no-new-native-nonconstructor": "error", "no-new-object": "error", - "no-new-symbol": "error", "no-new-wrappers": "error", "no-nonoctal-decimal-escape": "error", "no-obj-calls": "error", "no-octal": "error", "no-octal-escape": "error", "no-param-reassign": "error", - "no-plusplus": [ - "error", - { - "allowForLoopAfterthoughts": true - } - ], + "no-plusplus": ["error", { "allowForLoopAfterthoughts": true }], "no-proto": "error", "no-prototype-builtins": "error", "no-redeclare": "error", @@ -3193,12 +3155,7 @@ "no-self-assign": "error", "no-self-compare": "error", "no-setter-return": "error", - "no-shadow": [ - "error", - { - "builtinGlobals": true - } - ], + "no-shadow": ["error", { "builtinGlobals": true }], "no-shadow-restricted-names": "error", "no-space-before-semi": "off", "no-spaced-func": "off", @@ -3212,24 +3169,17 @@ "no-undef-init": "error", "no-unexpected-multiline": "off", "no-unmodified-loop-condition": "error", - "no-unneeded-ternary": [ - "error", - { - "defaultAssignment": false - } - ], + "no-unneeded-ternary": ["error", { "defaultAssignment": false }], "no-unreachable": "error", "no-unsafe-finally": "error", "no-unsafe-negation": "error", "no-unsafe-optional-chaining": "error", "no-unused-expressions": [ "error", - { - "allowShortCircuit": true, - "allowTernary": true - } + { "allowShortCircuit": true, "allowTernary": true } ], "no-unused-labels": "error", + "no-unused-private-class-members": "error", "no-unused-vars": [ "error", { @@ -3239,12 +3189,7 @@ "ignoreRestSiblings": true } ], - "no-use-before-define": [ - "error", - { - "functions": false - } - ], + "no-use-before-define": ["error", { "functions": false }], "no-useless-backreference": "error", "no-useless-call": "error", "no-useless-catch": "error", @@ -3264,46 +3209,25 @@ "object-curly-spacing": "off", "object-property-newline": "off", "object-shorthand": "error", - "one-var": [ - "error", - { - "initialized": "never" - } - ], + "one-var": ["error", { "initialized": "never" }], "one-var-declaration-per-line": "off", "operator-assignment": "error", "operator-linebreak": "off", "padded-blocks": "off", "padding-line-between-statements": [ "error", - { - "blankLine": "always", - "prev": "directive", - "next": "*" - }, - { - "blankLine": "any", - "prev": "directive", - "next": "directive" - } + { "blankLine": "always", "prev": "directive", "next": "*" }, + { "blankLine": "any", "prev": "directive", "next": "directive" } ], "prefer-arrow-callback": "off", "prefer-const": "error", "prefer-destructuring": [ "error", { - "VariableDeclarator": { - "array": false, - "object": true - }, - "AssignmentExpression": { - "array": false, - "object": false - } + "VariableDeclarator": { "array": false, "object": true }, + "AssignmentExpression": { "array": false, "object": false } }, - { - "enforceForRenamedProperties": false - } + { "enforceForRenamedProperties": false } ], "prefer-numeric-literals": "error", "prefer-promise-reject-errors": "error", @@ -3320,11 +3244,20 @@ "tabWidth": 2, "trailingComma": "all" }, - { - "usePrettierrc": true - } + { "usePrettierrc": true } ], - "promise/no-multiple-resolved": "error", + "promise/always-return": "error", + "promise/avoid-new": "off", + "promise/catch-or-return": "error", + "promise/no-callback-in-promise": "warn", + "promise/no-native": "off", + "promise/no-nesting": "warn", + "promise/no-new-statics": "error", + "promise/no-promise-in-callback": "warn", + "promise/no-return-in-finally": "warn", + "promise/no-return-wrap": "error", + "promise/param-names": "error", + "promise/valid-params": "warn", "quote-props": "off", "quotes": "off", "radix": "error", @@ -3386,10 +3319,10 @@ "symbol-description": "error", "template-curly-spacing": "off", "template-tag-spacing": "off", - "unicode-bom": "off", "unicorn/empty-brace-spaces": "off", "unicorn/no-nested-ternary": "off", "unicorn/number-literal-case": "off", + "unicorn/template-indent": "off", "use-isnan": "error", "valid-typeof": "error", "vue/array-bracket-newline": "off", diff --git a/packages/base/src/index.d.mts b/packages/base/src/index.d.mts new file mode 100644 index 00000000..3f913173 --- /dev/null +++ b/packages/base/src/index.d.mts @@ -0,0 +1,6 @@ +declare module '@metamask/eslint-config' { + import type { Linter } from 'eslint'; + + const config: Linter.Config[]; + export default config; +} diff --git a/packages/base/src/index.js b/packages/base/src/index.js deleted file mode 100644 index 51b202f3..00000000 --- a/packages/base/src/index.js +++ /dev/null @@ -1,400 +0,0 @@ -const environmentRules = require('./environment.json'); - -module.exports = { - env: { - // See comment under `parserOptions` below. - es2017: true, - 'shared-node-browser': true, - }, - - parserOptions: { - // The `esXXXX` option under `env` is supposed to set the correct - // `ecmaVersion` option here, but we've had issues with it being - // overridden in the past and therefore set it explicitly. - // - // For JavaScript, ES2017 is our effective minimum version due to the use - // of Esprima by transitive dependencies. - // It doesn't handle object rest spread, which is a 2018 feature. - ecmaVersion: 2017, - // We want to default to 'script' and only use 'module' explicitly. - sourceType: 'script', - }, - - plugins: ['jsdoc', 'prettier', 'promise'], - - extends: [ - 'eslint:recommended', - 'plugin:prettier/recommended', - 'plugin:import-x/recommended', - ], - - rules: { - ...environmentRules, - - /* Prettier rules */ - 'prettier/prettier': [ - 'error', - { - // All of these are defaults except singleQuote and endOfLine, but we specify them - // for explicitness - endOfLine: 'auto', - quoteProps: 'as-needed', - singleQuote: true, - tabWidth: 2, - trailingComma: 'all', - }, - { - // Allow consumers to override this prettier config. - // This is the default, but we specify it for the sake of clarity. - usePrettierrc: true, - }, - ], - - curly: ['error', 'all'], - 'no-tabs': 'error', - - /* Core rules */ - 'accessor-pairs': 'error', - 'array-callback-return': 'error', - 'block-scoped-var': 'error', - camelcase: [ - 'error', - { - properties: 'never', - allow: ['^UNSAFE_'], - }, - ], - 'consistent-return': 'error', - 'consistent-this': ['error', 'self'], - 'default-case': 'error', - 'default-param-last': 'error', - 'dot-notation': 'error', - eqeqeq: ['error', 'allow-null'], - 'func-name-matching': 'error', - 'grouped-accessor-pairs': 'error', - 'guard-for-in': 'error', - 'id-denylist': [ - // This sets this rule to 'error', the rest are the forbidden IDs. - 'error', - // These are basically all useless contractions. - 'buf', - 'cat', - 'err', - 'cb', - 'cfg', - 'hex', - 'int', - 'msg', - 'num', - 'opt', - 'sig', - ], - 'id-length': [ - 'error', - { - min: 2, - properties: 'never', - exceptionPatterns: ['_', 'a', 'b', 'i', 'j', 'k'], - }, - ], - 'lines-between-class-members': 'error', - 'new-cap': [ - 'error', - { - newIsCap: true, - capIsNew: false, - }, - ], - 'no-alert': 'error', - 'no-array-constructor': 'error', - 'no-bitwise': 'error', - 'no-buffer-constructor': 'error', - 'no-caller': 'error', - 'no-constructor-return': 'error', - 'no-div-regex': 'error', - 'no-else-return': 'error', - 'no-empty-function': 'error', - 'no-eq-null': 'error', - 'no-eval': 'error', - 'no-extend-native': 'error', - 'no-extra-bind': 'error', - 'no-extra-label': 'error', - 'no-implicit-coercion': 'error', - 'no-implicit-globals': 'error', - 'no-implied-eval': 'error', - 'no-inner-declarations': ['error', 'functions'], - 'no-invalid-this': 'error', - 'no-iterator': 'error', - 'no-label-var': 'error', - 'no-labels': [ - 'error', - { - allowLoop: false, - allowSwitch: false, - }, - ], - 'no-lone-blocks': 'error', - 'no-lonely-if': 'error', - 'no-loop-func': 'error', - 'no-multi-assign': 'error', - 'no-multi-str': 'error', - 'no-native-reassign': 'error', - 'no-negated-condition': 'error', - 'no-negated-in-lhs': 'error', - 'no-nested-ternary': 'error', - 'no-new': 'error', - 'no-new-func': 'error', - 'no-new-object': 'error', - 'no-new-wrappers': 'error', - 'no-octal-escape': 'error', - 'no-param-reassign': 'error', - 'no-plusplus': [ - 'error', - { - allowForLoopAfterthoughts: true, - }, - ], - 'no-proto': 'error', - 'no-restricted-syntax': [ - 'error', - { - selector: 'WithStatement', - message: 'With statements are not allowed', - }, - { - selector: `BinaryExpression[operator='in']`, - message: 'The "in" operator is not allowed', - }, - // Sequence expressions have potential gotchas with Prettier, and are also - // weird! - { - selector: 'SequenceExpression', - message: 'Sequence expressions are not allowed', - }, - ], - 'no-return-assign': ['error', 'except-parens'], - 'no-script-url': 'error', - 'no-self-compare': 'error', - 'no-shadow': ['error', { builtinGlobals: true }], - 'no-template-curly-in-string': 'error', - 'no-throw-literal': 'error', - 'no-undef-init': 'error', - 'no-unmodified-loop-condition': 'error', - 'no-unneeded-ternary': [ - 'error', - { - defaultAssignment: false, - }, - ], - 'no-unused-expressions': [ - 'error', - { - allowShortCircuit: true, - allowTernary: true, - }, - ], - 'no-unused-vars': [ - 'error', - { - vars: 'all', - args: 'all', - argsIgnorePattern: '[_]+', - ignoreRestSiblings: true, - }, - ], - 'no-use-before-define': [ - 'error', - { - functions: false, - }, - ], - 'no-useless-call': 'error', - 'no-useless-computed-key': 'error', - 'no-useless-concat': 'error', - 'no-useless-constructor': 'error', - 'no-useless-rename': 'error', - 'no-useless-return': 'error', - 'no-var': 'error', - 'no-void': 'error', - 'object-shorthand': 'error', - 'one-var': [ - 'error', - { - initialized: 'never', - }, - ], - 'operator-assignment': 'error', - 'padding-line-between-statements': [ - 'error', - { - blankLine: 'always', - prev: 'directive', - next: '*', - }, - { - blankLine: 'any', - prev: 'directive', - next: 'directive', - }, - ], - 'prefer-const': 'error', - 'prefer-destructuring': [ - 'error', - { - VariableDeclarator: { - array: false, - object: true, - }, - AssignmentExpression: { - array: false, - object: false, - }, - }, - { - enforceForRenamedProperties: false, - }, - ], - 'prefer-numeric-literals': 'error', - 'prefer-promise-reject-errors': 'error', - 'prefer-regex-literals': 'error', - 'prefer-rest-params': 'error', - 'prefer-spread': 'error', - 'prefer-template': 'error', - radix: 'error', - 'require-atomic-updates': 'error', - 'require-unicode-regexp': 'error', - 'spaced-comment': [ - 'error', - 'always', - { - markers: [ - 'global', - 'globals', - 'eslint', - 'eslint-disable', - '*package', - '!', - ',', - ], - exceptions: ['=', '-'], - }, - ], - 'symbol-description': 'error', - yoda: ['error', 'never'], - - /* import plugin rules */ - 'import-x/extensions': [ - 'error', - 'never', - { - json: 'always', - }, - ], - 'import-x/first': 'error', - 'import-x/newline-after-import': 'error', - 'import-x/no-absolute-path': 'error', - 'import-x/no-amd': 'error', - 'import-x/no-anonymous-default-export': 'error', - 'import-x/no-duplicates': 'error', - 'import-x/no-dynamic-require': 'error', - 'import-x/no-extraneous-dependencies': 'error', - 'import-x/no-mutable-exports': 'error', - 'import-x/no-named-as-default': 'error', - 'import-x/no-named-as-default-member': 'error', - 'import-x/no-named-default': 'error', - 'import-x/no-nodejs-modules': 'error', - 'import-x/no-self-import': 'error', - 'import-x/no-unassigned-import': 'error', - 'import-x/no-unresolved': [ - 'error', - { - commonjs: true, - }, - ], - 'import-x/no-useless-path-segments': [ - 'error', - { - commonjs: true, - noUselessIndex: true, - }, - ], - 'import-x/no-webpack-loader-syntax': 'error', - 'import-x/order': [ - 'error', - { - // This means that there will always be a newline between the import - // groups as defined below. - 'newlines-between': 'always', - - groups: [ - // "builtin" is Node.js modules that are built into the runtime, and - // "external" is everything else from node_modules. - ['builtin', 'external'], - - // "internal" is unused, but could be used for absolute imports from - // the project root. - ['internal', 'parent', 'sibling', 'index'], - ], - - // Alphabetically sort the imports within each group. - alphabetize: { - order: 'asc', - caseInsensitive: true, - }, - }, - ], - 'import-x/unambiguous': 'error', - - /* jsdoc plugin rules */ - 'jsdoc/check-access': 'error', - 'jsdoc/check-alignment': 'error', - 'jsdoc/check-line-alignment': 'error', - 'jsdoc/check-param-names': 'error', - 'jsdoc/check-property-names': 'error', - 'jsdoc/check-tag-names': 'error', - 'jsdoc/check-types': 'error', - 'jsdoc/check-values': 'error', - 'jsdoc/empty-tags': 'error', - 'jsdoc/implements-on-classes': 'error', - 'jsdoc/match-description': [ - 'error', - { tags: { param: true, returns: true } }, - ], - 'jsdoc/multiline-blocks': 'error', - 'jsdoc/no-bad-blocks': 'error', - 'jsdoc/no-defaults': 'error', - 'jsdoc/no-multi-asterisks': 'error', - 'jsdoc/require-asterisk-prefix': 'error', - 'jsdoc/require-description': 'error', - 'jsdoc/require-hyphen-before-param-description': [ - 'error', - 'always', - { tags: { returns: 'never', template: 'always', throws: 'never' } }, - ], - 'jsdoc/require-jsdoc': 'error', - 'jsdoc/require-param-name': 'error', - 'jsdoc/require-param': ['error', { unnamedRootBase: ['options'] }], - 'jsdoc/require-param-description': 'error', - 'jsdoc/require-param-type': 'error', - 'jsdoc/require-property': 'error', - 'jsdoc/require-property-description': 'error', - 'jsdoc/require-property-name': 'error', - 'jsdoc/require-property-type': 'error', - 'jsdoc/require-returns': 'error', - 'jsdoc/require-returns-check': 'error', - 'jsdoc/require-returns-description': 'error', - 'jsdoc/require-returns-type': 'error', - 'jsdoc/require-yields': 'error', - 'jsdoc/require-yields-check': 'error', - 'jsdoc/tag-lines': [ - 'error', - 'any', - { - startLines: 1, - }, - ], - 'jsdoc/valid-types': 'error', - - 'promise/no-multiple-resolved': 'error', - }, -}; diff --git a/packages/base/src/index.mjs b/packages/base/src/index.mjs new file mode 100644 index 00000000..98480cf9 --- /dev/null +++ b/packages/base/src/index.mjs @@ -0,0 +1,421 @@ +// @ts-check + +import js from '@eslint/js'; +import importX from 'eslint-plugin-import-x'; +import jsdoc from 'eslint-plugin-jsdoc'; +import prettier from 'eslint-plugin-prettier/recommended'; +// @ts-expect-error - `eslint-plugin-promise` doesn't have TypeScript types. +import promise from 'eslint-plugin-promise'; +import globals from 'globals'; +import { createRequire } from 'module'; + +// TODO: Use import attributes when ESLint supports them. +const customRequire = createRequire(import.meta.url); +const environmentRules = customRequire('./environment.json'); + +/** + * @type {import('eslint').Linter.Config[]} + */ +const rules = [ + // Recommended ESLint configuration. + js.configs.recommended, + + importX.flatConfigs.recommended, + jsdoc.configs['flat/recommended-error'], + prettier, + promise.configs['flat/recommended'], + + { + name: '@metamask/eslint-config', + + languageOptions: { + // The `esXXXX` option under `env` is supposed to set the correct + // `ecmaVersion` option here, but we've had issues with it being + // overridden in the past and therefore set it explicitly. + ecmaVersion: 2022, + parserOptions: { + ecmaVersion: 2022, + }, + + // We want to default to 'script' and only use 'module' explicitly. + sourceType: 'script', + + globals: { + ...globals.es2022, + ...globals['shared-node-browser'], + }, + }, + + rules: { + ...environmentRules, + + /* Prettier rules */ + 'prettier/prettier': [ + 'error', + { + // All of these are defaults except singleQuote and endOfLine, but we specify them + // for explicitness + endOfLine: 'auto', + quoteProps: 'as-needed', + singleQuote: true, + tabWidth: 2, + trailingComma: 'all', + }, + { + // Allow consumers to override this Prettier config. + // This is the default, but we specify it for the sake of clarity. + usePrettierrc: true, + }, + ], + + curly: ['error', 'all'], + 'no-tabs': 'error', + + /* Core rules */ + 'accessor-pairs': 'error', + 'array-callback-return': 'error', + 'block-scoped-var': 'error', + camelcase: [ + 'error', + { + properties: 'never', + allow: ['^UNSAFE_'], + }, + ], + 'consistent-return': 'error', + 'consistent-this': ['error', 'self'], + 'default-case': 'error', + 'default-param-last': 'error', + 'dot-notation': 'error', + eqeqeq: ['error', 'allow-null'], + 'func-name-matching': 'error', + 'grouped-accessor-pairs': 'error', + 'guard-for-in': 'error', + 'id-denylist': [ + // This sets this rule to 'error', the rest are the forbidden IDs. + 'error', + // These are basically all useless contractions. + 'buf', + 'cat', + 'err', + 'cb', + 'cfg', + 'hex', + 'int', + 'msg', + 'num', + 'opt', + 'sig', + ], + 'id-length': [ + 'error', + { + min: 2, + properties: 'never', + exceptionPatterns: ['_', 'a', 'b', 'i', 'j', 'k'], + }, + ], + 'lines-between-class-members': 'error', + 'new-cap': [ + 'error', + { + newIsCap: true, + capIsNew: false, + }, + ], + 'no-alert': 'error', + 'no-array-constructor': 'error', + 'no-bitwise': 'error', + 'no-buffer-constructor': 'error', + 'no-caller': 'error', + 'no-constructor-return': 'error', + 'no-div-regex': 'error', + 'no-else-return': 'error', + 'no-empty-function': 'error', + 'no-eq-null': 'error', + 'no-eval': 'error', + 'no-extend-native': 'error', + 'no-extra-bind': 'error', + 'no-extra-label': 'error', + 'no-implicit-coercion': 'error', + 'no-implicit-globals': 'off', + 'no-implied-eval': 'error', + 'no-inner-declarations': ['error', 'functions'], + 'no-invalid-this': 'error', + 'no-iterator': 'error', + 'no-label-var': 'error', + 'no-labels': [ + 'error', + { + allowLoop: false, + allowSwitch: false, + }, + ], + 'no-lone-blocks': 'error', + 'no-lonely-if': 'error', + 'no-loop-func': 'error', + 'no-multi-assign': 'error', + 'no-multi-str': 'error', + 'no-native-reassign': 'error', + 'no-negated-condition': 'error', + 'no-negated-in-lhs': 'error', + 'no-nested-ternary': 'error', + 'no-new': 'error', + 'no-new-func': 'error', + 'no-new-object': 'error', + 'no-new-wrappers': 'error', + 'no-octal-escape': 'error', + 'no-param-reassign': 'error', + 'no-plusplus': [ + 'error', + { + allowForLoopAfterthoughts: true, + }, + ], + 'no-proto': 'error', + 'no-restricted-syntax': [ + 'error', + { + selector: 'WithStatement', + message: 'With statements are not allowed', + }, + { + selector: `BinaryExpression[operator='in']`, + message: 'The "in" operator is not allowed', + }, + // Sequence expressions have potential gotchas with Prettier, and are also + // weird! + { + selector: 'SequenceExpression', + message: 'Sequence expressions are not allowed', + }, + ], + 'no-return-assign': ['error', 'except-parens'], + 'no-script-url': 'error', + 'no-self-compare': 'error', + 'no-shadow': ['error', { builtinGlobals: true }], + 'no-template-curly-in-string': 'error', + 'no-throw-literal': 'error', + 'no-undef-init': 'error', + 'no-unmodified-loop-condition': 'error', + 'no-unneeded-ternary': [ + 'error', + { + defaultAssignment: false, + }, + ], + 'no-unused-expressions': [ + 'error', + { + allowShortCircuit: true, + allowTernary: true, + }, + ], + 'no-unused-vars': [ + 'error', + { + vars: 'all', + args: 'all', + argsIgnorePattern: '[_]+', + ignoreRestSiblings: true, + }, + ], + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], + 'no-useless-call': 'error', + 'no-useless-computed-key': 'error', + 'no-useless-concat': 'error', + 'no-useless-constructor': 'error', + 'no-useless-rename': 'error', + 'no-useless-return': 'error', + 'no-var': 'error', + 'no-void': 'error', + 'object-shorthand': 'error', + 'one-var': [ + 'error', + { + initialized: 'never', + }, + ], + 'operator-assignment': 'error', + 'padding-line-between-statements': [ + 'error', + { + blankLine: 'always', + prev: 'directive', + next: '*', + }, + { + blankLine: 'any', + prev: 'directive', + next: 'directive', + }, + ], + 'prefer-const': 'error', + 'prefer-destructuring': [ + 'error', + { + VariableDeclarator: { + array: false, + object: true, + }, + AssignmentExpression: { + array: false, + object: false, + }, + }, + { + enforceForRenamedProperties: false, + }, + ], + 'prefer-numeric-literals': 'error', + 'prefer-promise-reject-errors': 'error', + 'prefer-regex-literals': 'error', + 'prefer-rest-params': 'error', + 'prefer-spread': 'error', + 'prefer-template': 'error', + radix: 'error', + 'require-atomic-updates': 'error', + 'require-unicode-regexp': 'error', + 'spaced-comment': [ + 'error', + 'always', + { + markers: [ + 'global', + 'globals', + 'eslint', + 'eslint-disable', + '*package', + '!', + ',', + ], + exceptions: ['=', '-'], + }, + ], + 'symbol-description': 'error', + yoda: ['error', 'never'], + + /* import plugin rules */ + 'import-x/extensions': [ + 'error', + 'never', + { + json: 'always', + }, + ], + 'import-x/first': 'error', + 'import-x/newline-after-import': 'error', + 'import-x/no-absolute-path': 'error', + 'import-x/no-amd': 'error', + 'import-x/no-anonymous-default-export': 'error', + 'import-x/no-duplicates': 'error', + 'import-x/no-dynamic-require': 'error', + 'import-x/no-extraneous-dependencies': 'error', + 'import-x/no-mutable-exports': 'error', + 'import-x/no-named-as-default': 'error', + 'import-x/no-named-as-default-member': 'error', + 'import-x/no-named-default': 'error', + 'import-x/no-nodejs-modules': 'error', + 'import-x/no-self-import': 'error', + 'import-x/no-unassigned-import': 'error', + 'import-x/no-unresolved': [ + 'error', + { + commonjs: true, + }, + ], + 'import-x/no-useless-path-segments': [ + 'error', + { + commonjs: true, + noUselessIndex: true, + }, + ], + 'import-x/no-webpack-loader-syntax': 'error', + 'import-x/order': [ + 'error', + { + // This means that there will always be a newline between the import + // groups as defined below. + 'newlines-between': 'always', + + groups: [ + // "builtin" is Node.js modules that are built into the runtime, and + // "external" is everything else from node_modules. + ['builtin', 'external'], + + // "internal" is unused, but could be used for absolute imports from + // the project root. + ['internal', 'parent', 'sibling', 'index'], + ], + + // Alphabetically sort the imports within each group. + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + }, + ], + 'import-x/unambiguous': 'error', + + /* jsdoc plugin rules */ + 'jsdoc/check-access': 'error', + 'jsdoc/check-alignment': 'error', + 'jsdoc/check-line-alignment': 'error', + 'jsdoc/check-param-names': 'error', + 'jsdoc/check-property-names': 'error', + 'jsdoc/check-tag-names': 'error', + 'jsdoc/check-types': 'error', + 'jsdoc/check-values': 'error', + 'jsdoc/empty-tags': 'error', + 'jsdoc/implements-on-classes': 'error', + 'jsdoc/match-description': [ + 'error', + { tags: { param: true, returns: true } }, + ], + 'jsdoc/multiline-blocks': 'error', + 'jsdoc/no-bad-blocks': 'error', + 'jsdoc/no-defaults': 'error', + 'jsdoc/no-multi-asterisks': 'error', + 'jsdoc/require-asterisk-prefix': 'error', + 'jsdoc/require-description': 'error', + 'jsdoc/require-hyphen-before-param-description': [ + 'error', + 'always', + { tags: { returns: 'never', template: 'always', throws: 'never' } }, + ], + 'jsdoc/require-jsdoc': 'error', + 'jsdoc/require-param-name': 'error', + 'jsdoc/require-param': ['error', { unnamedRootBase: ['options'] }], + 'jsdoc/require-param-description': 'error', + 'jsdoc/require-param-type': 'error', + 'jsdoc/require-property': 'error', + 'jsdoc/require-property-description': 'error', + 'jsdoc/require-property-name': 'error', + 'jsdoc/require-property-type': 'error', + 'jsdoc/require-returns': 'error', + 'jsdoc/require-returns-check': 'error', + 'jsdoc/require-returns-description': 'error', + 'jsdoc/require-returns-type': 'error', + 'jsdoc/require-yields': 'error', + 'jsdoc/require-yields-check': 'error', + 'jsdoc/tag-lines': [ + 'error', + 'any', + { + startLines: 1, + }, + ], + 'jsdoc/valid-types': 'error', + + // 'promise/no-multiple-resolved': 'error', + }, + }, +]; + +export default rules; diff --git a/packages/jest/src/index.test.js b/packages/base/src/index.test.mjs similarity index 79% rename from packages/jest/src/index.test.js rename to packages/base/src/index.test.mjs index 00a84d8c..908ffbef 100644 --- a/packages/jest/src/index.test.js +++ b/packages/base/src/index.test.mjs @@ -7,10 +7,9 @@ describe('index', () => { it('is a valid ESLint config', async () => { const api = new ESLint({ baseConfig: config, - useEslintrc: false, }); - const result = await api.lintText(`console.log('Hello, world!');\n`); + const result = await api.lintText(`export {};\n`); expect(result[0].messages).toStrictEqual([]); expect(result[0].warningCount).toBe(0); diff --git a/packages/browser/README.md b/packages/browser/README.md index 0dfc7f8f..593fbcd9 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -8,30 +8,35 @@ Our default export contains a base set of ESLint rules for ES6+: ```bash yarn add --dev \ - @metamask/eslint-config@^12.2.0 \ - @metamask/eslint-config-browser@^12.1.0 \ - eslint@^8.57.0 \ - eslint-config-prettier@^8.5.0 \ - eslint-plugin-import-x@^0.5.1 \ - eslint-plugin-jsdoc@^47.0.2 \ - eslint-plugin-prettier@^4.2.1 \ - eslint-plugin-promise@^6.1.1 \ - prettier@^2.7.1 + @metamask/eslint-config@^13.0.0 \ + @metamask/eslint-config-browser@^13.0.0 \ + eslint@^9.11.0 \ + eslint-config-prettier@^9.1.0 \ + eslint-plugin-import-x@^4.3.0 \ + eslint-plugin-jsdoc@^50.2.4 \ + eslint-plugin-prettier@^5.2.1 \ + eslint-plugin-promise@^7.1.0 \ + prettier@^3.3.3 ``` The order in which you extend ESLint rules matters. -The `@metamask/*` eslint configs should be added to the `extends` array _last_, +The `@metamask/*` eslint configs should be added to the config array _last_, with `@metamask/eslint-config` first, and `@metamask/eslint-config-*` in any order thereafter. ```js -module.exports = { - root: true, - - extends: [ - // These should be added last unless you know what you're doing. - '@metamask/eslint-config', - '@metamask/eslint-config-browser', - ], +import base from '@metamask/eslint-config'; +import browser from '@metamask/eslint-config-browser'; + +const config = { + // Any custom shared config should be added here. + // ... + + // This should be added last unless you know what you're doing. + ...base, + ...browser, + { + // Your overrides here. + } }; ``` diff --git a/packages/browser/package.json b/packages/browser/package.json index cb9a395d..9d569038 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -11,29 +11,44 @@ "url": "https://github.com/MetaMask/eslint-config.git" }, "license": "MIT", - "main": "src/index.js", + "type": "module", + "exports": { + ".": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + } + } + }, + "main": "./src/index.mjs", + "types": "./src/index.d.mts", "files": [ "src/", - "!src/**/*.test.js" + "!src/**/*.test.mjs" ], "scripts": { "lint:changelog": "auto-changelog validate", "publish": "npm publish", "test": "eslint ." }, + "dependencies": { + "@eslint/js": "^9.11.0", + "globals": "^15.9.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", "@metamask/auto-changelog": "^3.4.4", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "^3.3.3", "vitest": "^2.1.1" }, "peerDependencies": { "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0" + "eslint": "^9.11.0" }, "engines": { "node": "^18.18 || >=20" diff --git a/packages/browser/src/index.d.mts b/packages/browser/src/index.d.mts new file mode 100644 index 00000000..cbc219dd --- /dev/null +++ b/packages/browser/src/index.d.mts @@ -0,0 +1,6 @@ +declare module '@metamask/eslint-config-browser' { + import type { Linter } from 'eslint'; + + const config: Linter.Config[]; + export default config; +} diff --git a/packages/browser/src/index.js b/packages/browser/src/index.js deleted file mode 100644 index 7451b7f3..00000000 --- a/packages/browser/src/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const environmentRules = require('./environment.json'); - -module.exports = { - env: { - browser: true, - }, - - rules: { - ...environmentRules, - }, -}; diff --git a/packages/browser/src/index.mjs b/packages/browser/src/index.mjs new file mode 100644 index 00000000..7a86d5b5 --- /dev/null +++ b/packages/browser/src/index.mjs @@ -0,0 +1,40 @@ +import globals from 'globals'; +import { createRequire } from 'module'; + +// TODO: Use import attributes when ESLint supports them. +const customRequire = createRequire(import.meta.url); +const environmentRules = customRequire('./environment.json'); + +/** + * @type {import('eslint').Linter.Config[]} + */ +const config = [ + { + name: '@metamask/eslint-config-browser', + + files: [ + '**/*.js', + '**/*.jsx', + '**/*.mjs', + '**/*.cjs', + '**/*.ts', + '**/*.tsx', + '**/*.mts', + '**/*.cts', + '**/*.mtsx', + '**/*.ctsx', + ], + + languageOptions: { + globals: { + ...globals.browser, + }, + }, + + rules: { + ...environmentRules, + }, + }, +]; + +export default config; diff --git a/packages/browser/src/index.test.js b/packages/browser/src/index.test.mjs similarity index 79% rename from packages/browser/src/index.test.js rename to packages/browser/src/index.test.mjs index 00a84d8c..908ffbef 100644 --- a/packages/browser/src/index.test.js +++ b/packages/browser/src/index.test.mjs @@ -7,10 +7,9 @@ describe('index', () => { it('is a valid ESLint config', async () => { const api = new ESLint({ baseConfig: config, - useEslintrc: false, }); - const result = await api.lintText(`console.log('Hello, world!');\n`); + const result = await api.lintText(`export {};\n`); expect(result[0].messages).toStrictEqual([]); expect(result[0].warningCount).toBe(0); diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index f2fd32a7..b7a9309d 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -6,28 +6,36 @@ MetaMask's ESLint configuration for projects using CommonJS. ```bash yarn add --dev \ - @metamask/eslint-config@^12.0.0 \ - @metamask/eslint-config-commonjs@^12.1.0 \ - eslint@^8.57.0 \ - eslint-config-prettier@^8.5.0 \ - eslint-plugin-import-x@^0.5.1 \ - eslint-plugin-jsdoc@^47.0.2 \ - eslint-plugin-prettier@^4.2.1 \ - eslint-plugin-promise@^6.1.1 \ - prettier@^2.7.1 + @metamask/eslint-config@^13.0.0 \ + @metamask/eslint-config-commonjs@^13.0.0 \ + eslint@^9.11.0 \ + eslint-config-prettier@^9.1.0 \ + eslint-plugin-import-x@^4.3.0 \ + eslint-plugin-jsdoc@^50.2.4 \ + eslint-plugin-prettier@^5.2.1 \ + eslint-plugin-promise@^7.1.0 \ + prettier@^3.3.3 ``` The order in which you extend ESLint rules matters. -The `@metamask/*` eslint configs should be added to the `extends` array _last_, +The `@metamask/*` eslint configs should be added to the config array _last_, with `@metamask/eslint-config` first, and `@metamask/eslint-config-*` in any order thereafter. ```js -module.exports = { - extends: [ - // This should be added last unless you know what you're doing. - '@metamask/eslint-config', - '@metamask/eslint-config-commonjs', - ], +import base from '@metamask/eslint-config'; +import commonjs from '@metamask/eslint-config-commonjs'; + +const config = { + // Any custom shared config should be added here. + // ... + + // This should be added last unless you know what you're doing. + ...base, + ...commonjs, + + { + // Your overrides here. + } }; ``` diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index 3734dc01..5fb57e6f 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -11,29 +11,44 @@ "url": "https://github.com/MetaMask/eslint-config.git" }, "license": "MIT", - "main": "src/index.js", + "type": "module", + "exports": { + ".": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + } + } + }, + "main": "./src/index.mjs", + "types": "./src/index.d.mts", "files": [ "src/", - "!src/**/*.test.js" + "!src/**/*.test.mjs" ], "scripts": { "lint:changelog": "auto-changelog validate", "publish": "npm publish", "test": "eslint ." }, + "dependencies": { + "@eslint/js": "^9.11.0", + "globals": "^15.9.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", "@metamask/auto-changelog": "^3.4.4", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "^3.3.3", "vitest": "^2.1.1" }, "peerDependencies": { "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0" + "eslint": "^9.11.0" }, "engines": { "node": "^18.18 || >=20" diff --git a/packages/commonjs/src/index.d.mts b/packages/commonjs/src/index.d.mts new file mode 100644 index 00000000..c4e7cdec --- /dev/null +++ b/packages/commonjs/src/index.d.mts @@ -0,0 +1,6 @@ +declare module '@metamask/eslint-config-commonjs' { + import type { Linter } from 'eslint'; + + const config: Linter.Config[]; + export default config; +} diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js deleted file mode 100644 index 60f6f342..00000000 --- a/packages/commonjs/src/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const environmentRules = require('./environment.json'); - -module.exports = { - env: { - commonjs: true, - }, - - rules: { - ...environmentRules, - }, -}; diff --git a/packages/commonjs/src/index.mjs b/packages/commonjs/src/index.mjs new file mode 100644 index 00000000..9011983e --- /dev/null +++ b/packages/commonjs/src/index.mjs @@ -0,0 +1,40 @@ +import globals from 'globals'; +import { createRequire } from 'module'; + +// TODO: Use import attributes when ESLint supports them. +const customRequire = createRequire(import.meta.url); +const environmentRules = customRequire('./environment.json'); + +/** + * @type {import('eslint').Linter.Config[]} + */ +const config = [ + { + name: '@metamask/eslint-config-commonjs', + + files: [ + '**/*.js', + '**/*.jsx', + '**/*.mjs', + '**/*.cjs', + '**/*.ts', + '**/*.tsx', + '**/*.mts', + '**/*.cts', + '**/*.mtsx', + '**/*.ctsx', + ], + + languageOptions: { + globals: { + ...globals.commonjs, + }, + }, + + rules: { + ...environmentRules, + }, + }, +]; + +export default config; diff --git a/packages/commonjs/src/index.test.js b/packages/commonjs/src/index.test.mjs similarity index 79% rename from packages/commonjs/src/index.test.js rename to packages/commonjs/src/index.test.mjs index 00a84d8c..908ffbef 100644 --- a/packages/commonjs/src/index.test.js +++ b/packages/commonjs/src/index.test.mjs @@ -7,10 +7,9 @@ describe('index', () => { it('is a valid ESLint config', async () => { const api = new ESLint({ baseConfig: config, - useEslintrc: false, }); - const result = await api.lintText(`console.log('Hello, world!');\n`); + const result = await api.lintText(`export {};\n`); expect(result[0].messages).toStrictEqual([]); expect(result[0].warningCount).toBe(0); diff --git a/packages/jest/README.md b/packages/jest/README.md index ced3cee7..e845de7c 100644 --- a/packages/jest/README.md +++ b/packages/jest/README.md @@ -6,31 +6,37 @@ MetaMask's [Jest](https://jestjs.io/) ESLint configuration. ```bash yarn add --dev \ - @metamask/eslint-config@^12.2.0 \ - @metamask/eslint-config-jest@^12.1.0 \ - eslint@^8.57.0 \ - eslint-config-prettier@^8.5.0 \ - eslint-plugin-import-x@^0.5.1 \ - eslint-plugin-jsdoc@^47.0.2 \ - eslint-plugin-jest@^27.9.0 \ - eslint-plugin-prettier@^4.2.1 \ - eslint-plugin-promise@^6.1.1 \ - prettier@^2.7.1 + @metamask/eslint-config@^13.0.0 \ + @metamask/eslint-config-jest@^13.0.0 \ + eslint@^9.11.0 \ + eslint-config-prettier@^9.1.0 \ + eslint-plugin-import-x@^4.3.0 \ + eslint-plugin-jsdoc@^50.2.4 \ + eslint-plugin-jest@^28.8.3 \ + eslint-plugin-prettier@^5.2.1 \ + eslint-plugin-promise@^7.1.0 \ + prettier@^3.3.3 ``` The order in which you extend ESLint rules matters. -The `@metamask/*` eslint configs should be added to the `extends` array _last_, +The `@metamask/*` eslint configs should be added to the config array _last_, with `@metamask/eslint-config` first, and `@metamask/eslint-config-*` in any order thereafter. ```js -module.exports = { - root: true, - - extends: [ - // These should be added last unless you know what you're doing. - '@metamask/eslint-config', - '@metamask/eslint-config-jest', - ], +import base from '@metamask/eslint-config'; +import commonjs from '@metamask/eslint-config-commonjs'; + +const config = { + // Any custom shared config should be added here. + // ... + + // This should be added last unless you know what you're doing. + ...base, + ...commonjs, + + { + // Your overrides here. + } }; ``` diff --git a/packages/jest/package.json b/packages/jest/package.json index 552c7dba..7c514c4f 100644 --- a/packages/jest/package.json +++ b/packages/jest/package.json @@ -11,33 +11,48 @@ "url": "https://github.com/MetaMask/eslint-config.git" }, "license": "MIT", - "main": "src/index.js", + "type": "module", + "exports": { + ".": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + } + } + }, + "main": "./src/index.mjs", + "types": "./src/index.d.mts", "files": [ "src/", - "!src/**/*.test.js" + "!src/**/*.test.mjs" ], "scripts": { "lint:changelog": "auto-changelog validate", "publish": "npm publish", "test": "eslint ." }, + "dependencies": { + "@eslint/js": "^9.11.0", + "globals": "^15.9.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", "@metamask/auto-changelog": "^3.4.4", "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jest": "^28.8.3", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-prettier": "^5.2.1", "jest": "^29.7.0", - "prettier": "^2.7.1", + "prettier": "^3.3.3", "vitest": "^2.1.1" }, "peerDependencies": { "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0", - "eslint-plugin-jest": "^27.9.0" + "eslint": "^9.11.0", + "eslint-plugin-jest": "^28.8.3" }, "engines": { "node": "^18.18 || >=20" diff --git a/packages/jest/rules-snapshot.json b/packages/jest/rules-snapshot.json index d886af41..bd793dfb 100644 --- a/packages/jest/rules-snapshot.json +++ b/packages/jest/rules-snapshot.json @@ -1,14 +1,10 @@ { - "jest/consistent-test-it": [ - "error", - { - "fn": "it" - } - ], + "jest/consistent-test-it": ["error", { "fn": "it" }], "jest/expect-expect": "warn", "jest/no-alias-methods": "warn", "jest/no-commented-out-tests": "warn", "jest/no-conditional-expect": "error", + "jest/no-conditional-in-test": "error", "jest/no-deprecated-functions": "error", "jest/no-disabled-tests": "warn", "jest/no-done-callback": "error", @@ -16,7 +12,6 @@ "jest/no-export": "error", "jest/no-focused-tests": "error", "jest/no-identical-title": "error", - "jest/no-if": "error", "jest/no-interpolation-in-snapshots": "error", "jest/no-jasmine-globals": "error", "jest/no-mocks-import": "error", @@ -34,12 +29,7 @@ "jest/no-test-prefixes": "error", "jest/no-test-return-statement": "error", "jest/prefer-hooks-on-top": "error", - "jest/prefer-lowercase-title": [ - "error", - { - "ignore": ["describe"] - } - ], + "jest/prefer-lowercase-title": ["error", { "ignore": ["describe"] }], "jest/prefer-spy-on": "error", "jest/prefer-strict-equal": "error", "jest/prefer-to-be": "error", @@ -49,12 +39,7 @@ "jest/require-to-throw-message": "error", "jest/require-top-level-describe": "error", "jest/valid-describe-callback": "error", - "jest/valid-expect": [ - "error", - { - "alwaysAwait": true - } - ], + "jest/valid-expect": ["error", { "alwaysAwait": true }], "jest/valid-expect-in-promise": "error", "jest/valid-title": "error" } diff --git a/packages/jest/src/index.d.mts b/packages/jest/src/index.d.mts new file mode 100644 index 00000000..8bfa0f5c --- /dev/null +++ b/packages/jest/src/index.d.mts @@ -0,0 +1,6 @@ +declare module '@metamask/eslint-config-jest' { + import type { Linter } from 'eslint'; + + const config: Linter.Config[]; + export default config; +} diff --git a/packages/jest/src/index.js b/packages/jest/src/index.js deleted file mode 100644 index aadd6475..00000000 --- a/packages/jest/src/index.js +++ /dev/null @@ -1,35 +0,0 @@ -module.exports = { - plugins: ['jest'], - - env: { - 'jest/globals': true, - }, - - extends: ['plugin:jest/recommended', 'plugin:jest/style'], - - rules: { - 'jest/consistent-test-it': ['error', { fn: 'it' }], - 'jest/no-duplicate-hooks': 'error', - 'jest/no-if': 'error', - 'jest/no-test-return-statement': 'error', - 'jest/prefer-hooks-on-top': 'error', - 'jest/prefer-lowercase-title': ['error', { ignore: ['describe'] }], - 'jest/prefer-spy-on': 'error', - 'jest/prefer-strict-equal': 'error', - 'jest/prefer-todo': 'error', - 'jest/require-top-level-describe': 'error', - 'jest/require-to-throw-message': 'error', - 'jest/valid-expect': ['error', { alwaysAwait: true }], - 'jest/no-restricted-matchers': [ - 'error', - { - resolves: 'Use `expect(await promise)` instead.', - toBeFalsy: 'Avoid `toBeFalsy`', - toBeTruthy: 'Avoid `toBeTruthy`', - toMatchSnapshot: 'Use `toMatchInlineSnapshot()` instead', - toThrowErrorMatchingSnapshot: - 'Use `toThrowErrorMatchingInlineSnapshot()` instead', - }, - ], - }, -}; diff --git a/packages/jest/src/index.mjs b/packages/jest/src/index.mjs new file mode 100644 index 00000000..3ca690ed --- /dev/null +++ b/packages/jest/src/index.mjs @@ -0,0 +1,69 @@ +import jest from 'eslint-plugin-jest'; +import globals from 'globals'; + +/** + * @type {import('eslint').Linter.Config[]} + */ +const config = [ + jest.configs['flat/recommended'], + jest.configs['flat/style'], + + { + name: '@metamask/eslint-config-jest', + + files: [ + '**/*.test.js', + '**/*.spec.js', + '**/*.test.mjs', + '**/*.spec.mjs', + '**/*.test.cjs', + '**/*.spec.cjs', + '**/*.test.ts', + '**/*.spec.ts', + '**/*.test.tsx', + '**/*.spec.tsx', + '**/*.test.mts', + '**/*.spec.mts', + '**/*.test.cts', + '**/*.spec.cts', + '**/*.test.mtsx', + '**/*.spec.mtsx', + '**/*.test.ctsx', + '**/*.spec.ctsx', + ], + + languageOptions: { + globals: { + ...globals.jest, + }, + }, + + rules: { + 'jest/consistent-test-it': ['error', { fn: 'it' }], + 'jest/no-duplicate-hooks': 'error', + 'jest/no-conditional-in-test': 'error', + 'jest/no-test-return-statement': 'error', + 'jest/prefer-hooks-on-top': 'error', + 'jest/prefer-lowercase-title': ['error', { ignore: ['describe'] }], + 'jest/prefer-spy-on': 'error', + 'jest/prefer-strict-equal': 'error', + 'jest/prefer-todo': 'error', + 'jest/require-top-level-describe': 'error', + 'jest/require-to-throw-message': 'error', + 'jest/valid-expect': ['error', { alwaysAwait: true }], + 'jest/no-restricted-matchers': [ + 'error', + { + resolves: 'Use `expect(await promise)` instead.', + toBeFalsy: 'Avoid `toBeFalsy`', + toBeTruthy: 'Avoid `toBeTruthy`', + toMatchSnapshot: 'Use `toMatchInlineSnapshot()` instead', + toThrowErrorMatchingSnapshot: + 'Use `toThrowErrorMatchingInlineSnapshot()` instead', + }, + ], + }, + }, +]; + +export default config; diff --git a/packages/base/src/index.test.js b/packages/jest/src/index.test.mjs similarity index 79% rename from packages/base/src/index.test.js rename to packages/jest/src/index.test.mjs index 00a84d8c..908ffbef 100644 --- a/packages/base/src/index.test.js +++ b/packages/jest/src/index.test.mjs @@ -7,10 +7,9 @@ describe('index', () => { it('is a valid ESLint config', async () => { const api = new ESLint({ baseConfig: config, - useEslintrc: false, }); - const result = await api.lintText(`console.log('Hello, world!');\n`); + const result = await api.lintText(`export {};\n`); expect(result[0].messages).toStrictEqual([]); expect(result[0].warningCount).toBe(0); diff --git a/packages/mocha/README.md b/packages/mocha/README.md index 1ef7e635..d8065bff 100644 --- a/packages/mocha/README.md +++ b/packages/mocha/README.md @@ -6,33 +6,40 @@ MetaMask's [Mocha](https://mochajs.org/) ESLint configuration. ```bash yarn add --dev \ - @metamask/eslint-config@^12.2.0 \ - @metamask/eslint-config-mocha@^12.1.0 \ - eslint@^8.57.0 \ - eslint-config-prettier@^8.5.0 \ - eslint-plugin-import-x@^0.5.1 \ - eslint-plugin-jsdoc@^47.0.2 \ - eslint-plugin-mocha@^10.4.1 \ - eslint-plugin-prettier@^4.2.1 \ - eslint-plugin-promise@^6.1.1 \ - prettier@^2.7.1 + @metamask/eslint-config@^13.0.0 \ + @metamask/eslint-config-mocha@^13.0.0 \ + eslint@^9.11.0 \ + eslint-config-prettier@^9.1.0 \ + eslint-plugin-import-x@^4.3.0 \ + eslint-plugin-jsdoc@^50.2.4 \ + eslint-plugin-mocha@^10.5.0 \ + eslint-plugin-prettier@^5.2.1 \ + eslint-plugin-promise@^7.1.0 \ + prettier@^3.3.3 ``` The order in which you extend ESLint rules matters. -The `@metamask/*` eslint configs should be added to the `extends` array _last_, +The `@metamask/*` eslint configs should be added to the config array _last_, with `@metamask/eslint-config` first, and `@metamask/eslint-config-*` in any order thereafter. ```js -module.exports = { - root: true, - - extends: [ - // These should be added last unless you know what you're doing. - '@metamask/eslint-config', - '@metamask/eslint-config-mocha', - ], +import base from '@metamask/eslint-config'; +import mocha from '@metamask/eslint-config-mocha'; + +const config = { + // Any custom shared config should be added here. + // ... + + // This should be added last unless you know what you're doing. + ...base, + ...mocha, + + { + // Your overrides here. + } }; ``` -If your project has `prefer-arrow-callback` you will need to disable that and replace it with `mocha/prefer-arrow-callback`. +If your project has `prefer-arrow-callback` you will need to disable that and +replace it with `mocha/prefer-arrow-callback`. diff --git a/packages/mocha/package.json b/packages/mocha/package.json index 84c72013..a31471ce 100644 --- a/packages/mocha/package.json +++ b/packages/mocha/package.json @@ -11,32 +11,47 @@ "url": "https://github.com/MetaMask/eslint-config.git" }, "license": "MIT", - "main": "src/index.js", + "type": "module", + "exports": { + ".": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + } + } + }, + "main": "./src/index.mjs", + "types": "./src/index.d.mts", "files": [ "src/", - "!src/**/*.test.js" + "!src/**/*.test.mjs" ], "scripts": { "lint:changelog": "auto-changelog validate", "publish": "npm publish", "test": "eslint ." }, + "dependencies": { + "@eslint/js": "^9.11.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", "@metamask/auto-changelog": "^3.4.4", "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-mocha": "^10.4.1", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-mocha": "^10.5.0", + "eslint-plugin-prettier": "^5.2.1", + "globals": "^15.9.0", + "prettier": "^3.3.3", "vitest": "^2.1.1" }, "peerDependencies": { "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0", - "eslint-plugin-mocha": "^10.4.1" + "eslint": "^9.11.0", + "eslint-plugin-mocha": "^10.5.0" }, "engines": { "node": "^18.18 || >=20" diff --git a/packages/mocha/rules-snapshot.json b/packages/mocha/rules-snapshot.json index 8466cbf2..5054ef7f 100644 --- a/packages/mocha/rules-snapshot.json +++ b/packages/mocha/rules-snapshot.json @@ -1,12 +1,7 @@ { "mocha/consistent-spacing-between-blocks": "error", "mocha/handle-done-callback": "error", - "mocha/max-top-level-suites": [ - "error", - { - "limit": 1 - } - ], + "mocha/max-top-level-suites": ["error", { "limit": 1 }], "mocha/no-async-describe": "error", "mocha/no-empty-description": "error", "mocha/no-exclusive-tests": "error", diff --git a/packages/mocha/src/index.d.mts b/packages/mocha/src/index.d.mts new file mode 100644 index 00000000..3f4c136d --- /dev/null +++ b/packages/mocha/src/index.d.mts @@ -0,0 +1,6 @@ +declare module '@metamask/eslint-config-mocha' { + import type { Linter } from 'eslint'; + + const config: Linter.Config[]; + export default config; +} diff --git a/packages/mocha/src/index.js b/packages/mocha/src/index.js deleted file mode 100644 index aa485f94..00000000 --- a/packages/mocha/src/index.js +++ /dev/null @@ -1,36 +0,0 @@ -const simpleTestNameRegex = '^[#_]{0,2}[A-Za-z0-9]'; - -module.exports = { - plugins: ['mocha'], - - env: { - mocha: true, - }, - - extends: ['plugin:mocha/recommended'], - - parserOptions: { - ecmaVersion: '2020', - }, - - rules: { - 'mocha/no-exclusive-tests': 'error', - 'mocha/no-hooks-for-single-case': 'error', - 'mocha/no-pending-tests': 'error', - 'mocha/no-return-from-async': 'error', - 'mocha/no-skipped-tests': 'error', - 'mocha/no-top-level-hooks': 'error', - 'mocha/valid-suite-description': [ - 'error', - simpleTestNameRegex, - ['describe', 'context', 'suite'], - 'Invalid test suite description found', - ], - 'mocha/valid-test-description': [ - 'error', - simpleTestNameRegex, - ['it', 'test', 'specify'], - 'Invalid test description found', - ], - }, -}; diff --git a/packages/mocha/src/index.mjs b/packages/mocha/src/index.mjs new file mode 100644 index 00000000..f5ef7984 --- /dev/null +++ b/packages/mocha/src/index.mjs @@ -0,0 +1,57 @@ +import mocha from 'eslint-plugin-mocha'; + +const SIMPLE_TEST_NAME_REGEX = '^[#_]{0,2}[A-Za-z0-9]'; + +/** + * @type {import('eslint').Linter.Config[]} + */ +const config = [ + mocha.configs.flat.recommended, + { + name: '@metamask/eslint-config-mocha', + + files: [ + '**/*.test.js', + '**/*.spec.js', + '**/*.test.mjs', + '**/*.spec.mjs', + '**/*.test.cjs', + '**/*.spec.cjs', + '**/*.test.ts', + '**/*.spec.ts', + '**/*.test.tsx', + '**/*.spec.tsx', + '**/*.test.mts', + '**/*.spec.mts', + '**/*.test.cts', + '**/*.spec.cts', + '**/*.test.mtsx', + '**/*.spec.mtsx', + '**/*.test.ctsx', + '**/*.spec.ctsx', + ], + + rules: { + 'mocha/no-exclusive-tests': 'error', + 'mocha/no-hooks-for-single-case': 'error', + 'mocha/no-pending-tests': 'error', + 'mocha/no-return-from-async': 'error', + 'mocha/no-skipped-tests': 'error', + 'mocha/no-top-level-hooks': 'error', + 'mocha/valid-suite-description': [ + 'error', + SIMPLE_TEST_NAME_REGEX, + ['describe', 'context', 'suite'], + 'Invalid test suite description found', + ], + 'mocha/valid-test-description': [ + 'error', + SIMPLE_TEST_NAME_REGEX, + ['it', 'test', 'specify'], + 'Invalid test description found', + ], + }, + }, +]; + +export default config; diff --git a/packages/mocha/src/index.test.js b/packages/mocha/src/index.test.js deleted file mode 100644 index 00a84d8c..00000000 --- a/packages/mocha/src/index.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import { ESLint } from 'eslint'; -import { describe, it, expect } from 'vitest'; - -import config from '.'; - -describe('index', () => { - it('is a valid ESLint config', async () => { - const api = new ESLint({ - baseConfig: config, - useEslintrc: false, - }); - - const result = await api.lintText(`console.log('Hello, world!');\n`); - - expect(result[0].messages).toStrictEqual([]); - expect(result[0].warningCount).toBe(0); - expect(result[0].errorCount).toBe(0); - }); -}); diff --git a/packages/mocha/src/index.test.mjs b/packages/mocha/src/index.test.mjs new file mode 100644 index 00000000..908ffbef --- /dev/null +++ b/packages/mocha/src/index.test.mjs @@ -0,0 +1,18 @@ +import { ESLint } from 'eslint'; +import { describe, it, expect } from 'vitest'; + +import config from '.'; + +describe('index', () => { + it('is a valid ESLint config', async () => { + const api = new ESLint({ + baseConfig: config, + }); + + const result = await api.lintText(`export {};\n`); + + expect(result[0].messages).toStrictEqual([]); + expect(result[0].warningCount).toBe(0); + expect(result[0].errorCount).toBe(0); + }); +}); diff --git a/packages/nodejs/README.md b/packages/nodejs/README.md index 16febc57..c2cdf567 100644 --- a/packages/nodejs/README.md +++ b/packages/nodejs/README.md @@ -6,30 +6,38 @@ MetaMask's [Node.js](https://nodejs.org) ESLint configuration. ```bash yarn add --dev \ - @metamask/eslint-config@^12.2.0 \ + @metamask/eslint-config@^13.0.0 \ @metamask/eslint-config-nodejs@^12.1.0 \ - eslint@^8.57.0 \ - eslint-config-prettier@^8.5.0 \ - eslint-plugin-import-x@^0.5.1 \ - eslint-plugin-jsdoc@^47.0.2 \ - eslint-plugin-n@^16.6.2 \ - eslint-plugin-prettier@^4.2.1 \ - eslint-plugin-promise@^6.1.1 \ - prettier@^2.7.1 + eslint@^9.11.0 \ + eslint-config-prettier@^9.1.0 \ + eslint-plugin-import-x@^4.3.0 \ + eslint-plugin-jsdoc@^50.2.4 \ + eslint-plugin-n@^17.10.3 \ + eslint-plugin-prettier@^5.2.1 \ + eslint-plugin-promise@^7.1.0 \ + prettier@^3.3.3 ``` The order in which you extend ESLint rules matters. -The `@metamask/*` eslint configs should be added to the `extends` array _last_, +The `@metamask/*` eslint configs should be added to the config array _last_, with `@metamask/eslint-config` first, and `@metamask/eslint-config-*` in any order thereafter. ```js -module.exports = { - extends: [ - // These should be added last unless you know what you're doing. - '@metamask/eslint-config', - '@metamask/eslint-config-nodejs', - ], +import base from '@metamask/eslint-config'; +import mocha from '@metamask/eslint-config-mocha'; + +const config = { + // Any custom shared config should be added here. + // ... + + // This should be added last unless you know what you're doing. + ...base, + ...mocha, + + { + // Your overrides here. + } }; ``` diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index d3252ad3..4506b209 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -11,32 +11,47 @@ "url": "https://github.com/MetaMask/eslint-config.git" }, "license": "MIT", - "main": "src/index.js", + "type": "module", + "exports": { + ".": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + } + } + }, + "main": "./src/index.mjs", + "types": "./src/index.d.mts", "files": [ "src/", - "!src/**/*.test.js" + "!src/**/*.test.mjs" ], "scripts": { "lint:changelog": "auto-changelog validate", "publish": "npm publish", "test": "eslint ." }, + "dependencies": { + "@eslint/js": "^9.11.0", + "globals": "^15.9.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", "@metamask/auto-changelog": "^3.4.4", "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-n": "^17.10.3", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "^3.3.3", "vitest": "^2.1.1" }, "peerDependencies": { "@metamask/eslint-config": "^13.0.0", - "eslint": "^8.57.0", - "eslint-plugin-n": "^16.6.2" + "eslint": "^9.11.0", + "eslint-plugin-n": "^17.10.3" }, "engines": { "node": "^18.18 || >=20" diff --git a/packages/nodejs/rules-snapshot.json b/packages/nodejs/rules-snapshot.json index 98ddf69c..bc2de421 100644 --- a/packages/nodejs/rules-snapshot.json +++ b/packages/nodejs/rules-snapshot.json @@ -4,6 +4,7 @@ "n/exports-style": "error", "n/global-require": "error", "n/handle-callback-err": ["error", "^(err|error)$"], + "n/hashbang": "error", "n/no-callback-literal": "error", "n/no-deprecated-api": "error", "n/no-exports-assign": "error", @@ -35,7 +36,6 @@ "n/prefer-promises/dns": "error", "n/prefer-promises/fs": "error", "n/process-exit-as-throw": "error", - "n/shebang": "error", "no-restricted-globals": [ "error", { diff --git a/packages/nodejs/src/index.d.mts b/packages/nodejs/src/index.d.mts new file mode 100644 index 00000000..aaddc196 --- /dev/null +++ b/packages/nodejs/src/index.d.mts @@ -0,0 +1,6 @@ +declare module '@metamask/eslint-config-nodejs' { + import type { Linter } from 'eslint'; + + const config: Linter.Config[]; + export default config; +} diff --git a/packages/nodejs/src/index.js b/packages/nodejs/src/index.js deleted file mode 100644 index ec5c612a..00000000 --- a/packages/nodejs/src/index.js +++ /dev/null @@ -1,58 +0,0 @@ -const environmentRules = require('./environment.json'); - -module.exports = { - plugins: ['n'], - - env: { - // See comment under `parserOptions` below. - es2017: true, - node: true, - }, - - // The recommended Node.js plugin config sets the correct `sourceType` per the - // `type` field of the local package.json file, so we don't set that here. - parserOptions: { - // The EcmaScript version option here and for `env` above need to be set to - // the same values as in the base config, or they will be overwritten by the - // recommended Node.js plugin rules. - ecmaVersion: 2017, - }, - - extends: ['plugin:n/recommended'], - - rules: { - ...environmentRules, - - // Possible Errors - 'n/handle-callback-err': ['error', '^(err|error)$'], - 'n/no-callback-literal': 'error', - 'n/no-missing-import': 'off', // Duplicates `import-x/no-unresolved` - 'n/no-missing-require': 'off', // Duplicates `import-x/no-unresolved` - 'n/no-new-require': 'error', - 'n/no-path-concat': 'error', - 'n/no-unsupported-features/es-syntax': 'off', - - // Stylistic rules - 'n/callback-return': 'error', - 'n/exports-style': 'error', - 'n/global-require': 'error', - 'n/no-mixed-requires': 'error', - 'n/no-process-env': 'error', - 'n/no-restricted-import': 'error', - 'n/no-restricted-require': 'error', - 'n/no-sync': 'error', - 'n/prefer-global/buffer': 'error', - 'n/prefer-global/console': 'error', - 'n/prefer-global/process': 'error', - 'n/prefer-global/text-decoder': 'error', - 'n/prefer-global/text-encoder': 'error', - 'n/prefer-global/url-search-params': 'error', - 'n/prefer-global/url': 'error', - 'n/prefer-promises/dns': 'error', - 'n/prefer-promises/fs': 'error', - - // Enabled in the base config, but this should be allowed in Node.js - // projects. - 'import-x/no-nodejs-modules': 'off', - }, -}; diff --git a/packages/nodejs/src/index.mjs b/packages/nodejs/src/index.mjs new file mode 100644 index 00000000..b6741aae --- /dev/null +++ b/packages/nodejs/src/index.mjs @@ -0,0 +1,81 @@ +import node from 'eslint-plugin-n'; +import globals from 'globals'; +import { createRequire } from 'module'; + +// TODO: Use import attributes when ESLint supports them. +const customRequire = createRequire(import.meta.url); +const environmentRules = customRequire('./environment.json'); + +/** + * @type {import('eslint').Linter.Config[]} + */ +const config = [ + node.configs['flat/recommended'], + { + name: '@metamask/eslint-config-nodejs', + + files: [ + '**/*.js', + '**/*.jsx', + '**/*.mjs', + '**/*.cjs', + '**/*.ts', + '**/*.tsx', + '**/*.mts', + '**/*.cts', + '**/*.mtsx', + '**/*.ctsx', + ], + + languageOptions: { + globals: { + // See comment below. + ...globals.es2022, + ...globals.node, + }, + + // The EcmaScript version option here and for `env` above need to be set + // to the same values as in the base config, or they will be overwritten + // by the recommended Node.js plugin rules. + ecmaVersion: 2022, + }, + + rules: { + ...environmentRules, + + // Possible Errors + 'n/handle-callback-err': ['error', '^(err|error)$'], + 'n/no-callback-literal': 'error', + 'n/no-missing-import': 'off', // Duplicates `import-x/no-unresolved` + 'n/no-missing-require': 'off', // Duplicates `import-x/no-unresolved` + 'n/no-new-require': 'error', + 'n/no-path-concat': 'error', + 'n/no-unsupported-features/es-syntax': 'off', + + // Stylistic rules + 'n/callback-return': 'error', + 'n/exports-style': 'error', + 'n/global-require': 'error', + 'n/no-mixed-requires': 'error', + 'n/no-process-env': 'error', + 'n/no-restricted-import': 'error', + 'n/no-restricted-require': 'error', + 'n/no-sync': 'error', + 'n/prefer-global/buffer': 'error', + 'n/prefer-global/console': 'error', + 'n/prefer-global/process': 'error', + 'n/prefer-global/text-decoder': 'error', + 'n/prefer-global/text-encoder': 'error', + 'n/prefer-global/url-search-params': 'error', + 'n/prefer-global/url': 'error', + 'n/prefer-promises/dns': 'error', + 'n/prefer-promises/fs': 'error', + + // Enabled in the base config, but this should be allowed in Node.js + // projects. + 'import-x/no-nodejs-modules': 'off', + }, + }, +]; + +export default config; diff --git a/packages/nodejs/src/index.test.js b/packages/nodejs/src/index.test.js deleted file mode 100644 index 00a84d8c..00000000 --- a/packages/nodejs/src/index.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import { ESLint } from 'eslint'; -import { describe, it, expect } from 'vitest'; - -import config from '.'; - -describe('index', () => { - it('is a valid ESLint config', async () => { - const api = new ESLint({ - baseConfig: config, - useEslintrc: false, - }); - - const result = await api.lintText(`console.log('Hello, world!');\n`); - - expect(result[0].messages).toStrictEqual([]); - expect(result[0].warningCount).toBe(0); - expect(result[0].errorCount).toBe(0); - }); -}); diff --git a/packages/nodejs/src/index.test.mjs b/packages/nodejs/src/index.test.mjs new file mode 100644 index 00000000..908ffbef --- /dev/null +++ b/packages/nodejs/src/index.test.mjs @@ -0,0 +1,18 @@ +import { ESLint } from 'eslint'; +import { describe, it, expect } from 'vitest'; + +import config from '.'; + +describe('index', () => { + it('is a valid ESLint config', async () => { + const api = new ESLint({ + baseConfig: config, + }); + + const result = await api.lintText(`export {};\n`); + + expect(result[0].messages).toStrictEqual([]); + expect(result[0].warningCount).toBe(0); + expect(result[0].errorCount).toBe(0); + }); +}); diff --git a/packages/typescript/README.md b/packages/typescript/README.md index 9c2cda0e..665d2b6e 100644 --- a/packages/typescript/README.md +++ b/packages/typescript/README.md @@ -6,46 +6,50 @@ MetaMask's [TypeScript](https://www.typescriptlang.org) ESLint configuration. ```bash yarn add --dev \ - @metamask/eslint-config@^12.2.0 \ - @metamask/eslint-config-typescript@^12.1.0 \ - @typescript-eslint/eslint-plugin@^6.21.0 \ - @typescript-eslint/parser@^6.21.0 \ - eslint@^8.57.0 \ - eslint-config-prettier@^8.5.0 \ - eslint-plugin-import-x@^0.5.1 \ - eslint-plugin-jsdoc@^47.0.2 \ - eslint-plugin-prettier@^4.2.1 \ - eslint-plugin-promise@^6.1.1 \ - prettier@^2.7.1 + @metamask/eslint-config@^13.0.0 \ + @metamask/eslint-config-typescript@^13.0.0 \ + eslint@^9.11.0 \ + eslint-config-prettier@^9.1.0 \ + eslint-plugin-import-x@^4.3.0 \ + eslint-plugin-jsdoc@^50.2.4 \ + eslint-plugin-prettier@^5.2.1 \ + eslint-plugin-promise@^7.1.0 \ + prettier@^3.3.3 + typescript-eslint@^8.6.0 ``` The order in which you extend ESLint rules matters. -The `@metamask/*` eslint configs should be added to the `extends` array _last_, +The `@metamask/*` eslint configs should be added to the config array _last_, with `@metamask/eslint-config` first, and `@metamask/eslint-config-*` in any order thereafter. ```js -module.exports = { - root: true, +import base from '@metamask/eslint-config'; +import typescript from '@metamask/eslint-config-typescript'; +import tseslint from 'typescript-eslint'; + +const config = tseslint.config({ + // The TypeScript config disables certain rules that you want to keep for + // non-TypeScript files, so it should be added in an override. + files: ['**/*.ts', '**/*.mts', '**/*.cts'], extends: [ + // Any custom shared config should be added here. + // ... + // This should be added last unless you know what you're doing. - '@metamask/eslint-config', + ...base, + ...typescript, ], - overrides: [ - // The TypeScript config disables certain rules that you want to keep for - // non-TypeScript files, so it should be added in an override. - { - files: ['*.ts'], - extends: ['@metamask/eslint-config-typescript'], + languageOptions: { + parserOptions: { + // This is required for rules that use type information. + // See here for more information: https://typescript-eslint.io/getting-started/typed-linting + tsconfigRootDir: import.meta.dirname, }, - ], - - // This is required for rules that use type information. - // See here for more information: https://github.com/typescript-eslint/typescript-eslint/blob/master/docs/getting-started/linting/TYPED_LINTING.md - parserOptions: { - tsconfigRootDir: __dirname, }, -}; + + // Your overrides here. +}); ``` diff --git a/packages/typescript/package.json b/packages/typescript/package.json index d1c9bf8c..993e24a6 100644 --- a/packages/typescript/package.json +++ b/packages/typescript/package.json @@ -11,10 +11,20 @@ "url": "https://github.com/MetaMask/eslint-config.git" }, "license": "MIT", - "main": "src/index.js", + "type": "module", + "exports": { + ".": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + } + } + }, + "main": "./src/index.mjs", + "types": "./src/index.d.mts", "files": [ "src/", - "!src/**/*.test.js", + "!src/**/*.test.mjs", "!src/**/__test__" ], "scripts": { @@ -22,26 +32,33 @@ "publish": "npm publish", "test": "eslint ." }, + "dependencies": { + "@eslint/js": "^9.11.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", "@metamask/auto-changelog": "^3.4.4", "@metamask/eslint-config": "^13.0.0", - "@typescript-eslint/eslint-plugin": "^8.1.0", - "@typescript-eslint/parser": "^8.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import-x": "^0.5.1", - "eslint-plugin-jsdoc": "^47.0.2", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", + "eslint": "^9.11.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "eslint-plugin-prettier": "^5.2.1", + "globals": "^15.9.0", + "prettier": "^3.3.3", "typescript": "~5.5.4", + "typescript-eslint": "^8.6.0", "vitest": "^2.1.1" }, "peerDependencies": { "@metamask/eslint-config": "^13.0.0", - "@typescript-eslint/eslint-plugin": "^8.1.0", - "@typescript-eslint/parser": "^8.1.0", - "eslint": "^8.57.0", - "typescript": ">=4.8.4 <5.6" + "eslint": "^9.11.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import-x": "^4.3.0", + "eslint-plugin-jsdoc": "^50.2.4", + "typescript": ">=4.8.4 <5.6", + "typescript-eslint": "^8.6.0" }, "engines": { "node": "^18.18 || >=20" diff --git a/packages/typescript/rules-snapshot.json b/packages/typescript/rules-snapshot.json index a0252cd5..957fdce7 100644 --- a/packages/typescript/rules-snapshot.json +++ b/packages/typescript/rules-snapshot.json @@ -16,17 +16,11 @@ "leadingUnderscore": "allow", "trailingUnderscore": "forbid" }, - { - "selector": "enumMember", - "format": ["PascalCase"] - }, + { "selector": "enumMember", "format": ["PascalCase"] }, { "selector": "interface", "format": ["PascalCase"], - "custom": { - "regex": "^I[A-Z]", - "match": false - } + "custom": { "regex": "^I[A-Z]", "match": false } }, { "selector": "objectLiteralMethod", @@ -36,17 +30,11 @@ "selector": "objectLiteralProperty", "format": ["camelCase", "PascalCase", "UPPER_CASE"] }, - { - "selector": "typeLike", - "format": ["PascalCase"] - }, + { "selector": "typeLike", "format": ["PascalCase"] }, { "selector": "typeParameter", "format": ["PascalCase"], - "custom": { - "regex": "^.{3,}", - "match": true - } + "custom": { "regex": "^.{3,}", "match": true } }, { "selector": "variable", @@ -78,7 +66,7 @@ "@typescript-eslint/no-base-to-string": "error", "@typescript-eslint/no-dupe-class-members": "error", "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-duplicate-type-constituents": "off", "@typescript-eslint/no-empty-object-type": "error", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-extra-non-null-assertion": "error", @@ -90,20 +78,13 @@ "@typescript-eslint/no-misused-promises": "error", "@typescript-eslint/no-namespace": [ "error", - { - "allowDefinitionFiles": true - } + { "allowDefinitionFiles": true } ], "@typescript-eslint/no-non-null-asserted-optional-chain": "error", "@typescript-eslint/no-non-null-assertion": "error", - "@typescript-eslint/no-redundant-type-constituents": "error", + "@typescript-eslint/no-redundant-type-constituents": "off", "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-shadow": [ - "error", - { - "builtinGlobals": true - } - ], + "@typescript-eslint/no-shadow": ["error", { "builtinGlobals": true }], "@typescript-eslint/no-this-alias": "error", "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", "@typescript-eslint/no-unnecessary-qualifier": "error", @@ -121,10 +102,7 @@ "@typescript-eslint/no-unsafe-unary-minus": "error", "@typescript-eslint/no-unused-expressions": [ "error", - { - "allowShortCircuit": true, - "allowTernary": true - } + { "allowShortCircuit": true, "allowTernary": true } ], "@typescript-eslint/no-unused-vars": [ "error", @@ -135,12 +113,7 @@ "ignoreRestSiblings": true } ], - "@typescript-eslint/no-use-before-define": [ - "error", - { - "functions": false - } - ], + "@typescript-eslint/no-use-before-define": ["error", { "functions": false }], "@typescript-eslint/no-useless-constructor": "error", "@typescript-eslint/no-wrapper-object-types": "error", "@typescript-eslint/only-throw-error": "error", @@ -162,10 +135,7 @@ "@typescript-eslint/restrict-plus-operands": "error", "@typescript-eslint/restrict-template-expressions": [ "error", - { - "allowBoolean": true, - "allowNumber": true - } + { "allowBoolean": true, "allowNumber": true } ], "@typescript-eslint/switch-exhaustiveness-check": "error", "@typescript-eslint/triple-slash-reference": "error", @@ -176,12 +146,62 @@ "getter-return": "off", "import-x/named": "off", "import-x/no-unresolved": "off", + "jsdoc/check-access": "error", + "jsdoc/check-alignment": "error", + "jsdoc/check-examples": "off", "jsdoc/check-indentation": "error", + "jsdoc/check-line-alignment": "off", + "jsdoc/check-param-names": "error", + "jsdoc/check-property-names": "error", "jsdoc/check-syntax": "error", + "jsdoc/check-tag-names": ["error", { "typed": true }], + "jsdoc/check-template-names": "off", + "jsdoc/check-types": "error", + "jsdoc/check-values": "error", + "jsdoc/convert-to-jsdoc-comments": "off", + "jsdoc/empty-tags": "error", + "jsdoc/implements-on-classes": "error", + "jsdoc/imports-as-dependencies": "off", + "jsdoc/informative-docs": "off", + "jsdoc/lines-before-block": "off", + "jsdoc/match-description": "off", + "jsdoc/match-name": "off", + "jsdoc/multiline-blocks": "error", + "jsdoc/no-bad-blocks": "off", + "jsdoc/no-blank-block-descriptions": "off", + "jsdoc/no-blank-blocks": "off", + "jsdoc/no-defaults": "error", + "jsdoc/no-missing-syntax": "off", + "jsdoc/no-multi-asterisks": "error", + "jsdoc/no-restricted-syntax": "off", "jsdoc/no-types": "error", + "jsdoc/no-undefined-types": "off", + "jsdoc/require-asterisk-prefix": "off", + "jsdoc/require-description": "off", + "jsdoc/require-description-complete-sentence": "off", + "jsdoc/require-example": "off", + "jsdoc/require-file-overview": "off", + "jsdoc/require-hyphen-before-param-description": "off", + "jsdoc/require-jsdoc": "error", + "jsdoc/require-param": "error", + "jsdoc/require-param-description": "error", + "jsdoc/require-param-name": "error", "jsdoc/require-param-type": "off", + "jsdoc/require-property": "error", + "jsdoc/require-property-description": "error", + "jsdoc/require-property-name": "error", "jsdoc/require-property-type": "off", + "jsdoc/require-returns": "error", + "jsdoc/require-returns-check": "error", + "jsdoc/require-returns-description": "error", "jsdoc/require-returns-type": "off", + "jsdoc/require-template": "off", + "jsdoc/require-throws": "off", + "jsdoc/require-yields": "error", + "jsdoc/require-yields-check": "error", + "jsdoc/sort-tags": "off", + "jsdoc/tag-lines": "error", + "jsdoc/text-escaping": "off", "jsdoc/valid-types": "off", "no-array-constructor": "off", "no-const-assign": "off", diff --git a/packages/typescript/src/index.d.mts b/packages/typescript/src/index.d.mts new file mode 100644 index 00000000..db16262b --- /dev/null +++ b/packages/typescript/src/index.d.mts @@ -0,0 +1,6 @@ +declare module '@metamask/eslint-config-typescript' { + import type { Linter } from 'eslint'; + + const config: Linter.Config[]; + export default config; +} diff --git a/packages/typescript/src/index.js b/packages/typescript/src/index.mjs similarity index 82% rename from packages/typescript/src/index.js rename to packages/typescript/src/index.mjs index 0984674b..3f395c33 100644 --- a/packages/typescript/src/index.js +++ b/packages/typescript/src/index.mjs @@ -1,35 +1,49 @@ -module.exports = { - parser: '@typescript-eslint/parser', - - env: { - // See comment under `parserOptions` below. - es2020: true, +import * as resolver from 'eslint-import-resolver-typescript'; +import importX from 'eslint-plugin-import-x'; +import jsdoc from 'eslint-plugin-jsdoc'; +// TODO: Look into why this doesn't resolve. +// eslint-disable-next-line import-x/no-unresolved +import typescript from 'typescript-eslint'; + +const config = typescript.config({ + name: '@metamask/eslint-config-typescript', + + plugins: { + '@typescript-eslint': typescript.plugin, }, - parserOptions: { - // The `esXXXX` option under `env` is supposed to set the correct - // `ecmaVersion` option here, but we've had issues with it being - // overridden in the past and therefore set it explicitly. - // - // For TypeScript, the EcmaScript version always be the latest release - // (not pre-release) here: https://github.com/tc39/ecma262/releases - ecmaVersion: 2020, - sourceType: 'module', + extends: [ + ...typescript.configs.recommended, + ...typescript.configs.recommendedTypeChecked, + importX.flatConfigs.typescript, + jsdoc.configs['flat/recommended-typescript-error'], + ], - // This enables support for linting rules that require type information. We - // assume that the project has a `tsconfig.json` file in the directory where - // ESLint is being run. - tsconfigRootDir: process.cwd(), - project: ['./tsconfig.json'], - }, + files: [ + '**/*.ts', + '**/*.tsx', + '**/*.mts', + '**/*.cts', + '**/*.mtsx', + '**/*.ctsx', + ], - plugins: ['@typescript-eslint', 'jsdoc'], + languageOptions: { + sourceType: 'module', + parserOptions: { + // This option requires `tsconfigRootDir` to be set, but this needs to + // be set on a per-project basis. + projectService: true, + ecmaVersion: 2022, + }, + }, - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-type-checked', - 'plugin:import-x/typescript', - ], + settings: { + 'import-x/resolver': { + name: 'typescript', + resolver, + }, + }, rules: { // Handled by TypeScript @@ -71,6 +85,8 @@ module.exports = { '@typescript-eslint/no-unsafe-return': 'off', // Recommended rules that we do not want to use + '@typescript-eslint/no-duplicate-type-constituents': 'off', + '@typescript-eslint/no-redundant-type-constituents': 'off', '@typescript-eslint/require-await': 'off', // Our rules that require type information @@ -204,4 +220,6 @@ module.exports = { }, ], }, -}; +}); + +export default config; diff --git a/packages/typescript/src/index.test.js b/packages/typescript/src/index.test.mjs similarity index 65% rename from packages/typescript/src/index.test.js rename to packages/typescript/src/index.test.mjs index 2ec94d33..df0bfdb0 100644 --- a/packages/typescript/src/index.test.js +++ b/packages/typescript/src/index.test.mjs @@ -1,4 +1,5 @@ import { ESLint } from 'eslint'; +import globals from 'globals'; import { resolve } from 'path'; import { describe, it, expect } from 'vitest'; @@ -8,14 +9,15 @@ describe('index', () => { it('is a valid ESLint config', async () => { const api = new ESLint({ baseConfig: config, - useEslintrc: false, overrideConfig: { - env: { - node: true, - }, - parserOptions: { - tsconfigRootDir: resolve(import.meta.dirname, '..'), - project: 'tsconfig.json', + languageOptions: { + globals: { + ...globals.node, + }, + parserOptions: { + tsconfigRootDir: resolve(import.meta.dirname, '..'), + project: 'tsconfig.json', + }, }, }, }); @@ -23,7 +25,9 @@ describe('index', () => { // In order to test rules that require type information, we need to actually // compile the file with TypeScript, so rather than using `api.lintText()`, // we use `api.lintFiles()` and pass in a file that we know will pass. - const result = await api.lintFiles(resolve(__dirname, '__test__/dummy.ts')); + const result = await api.lintFiles( + resolve(import.meta.dirname, '__test__/dummy.ts'), + ); expect(result[0].messages).toStrictEqual([]); expect(result[0].warningCount).toBe(0); diff --git a/scripts/generate-configs.js b/scripts/generate-configs.mjs similarity index 78% rename from scripts/generate-configs.js rename to scripts/generate-configs.mjs index 5391b093..f79e4063 100644 --- a/scripts/generate-configs.js +++ b/scripts/generate-configs.mjs @@ -1,9 +1,15 @@ -const { promises: fs } = require('fs'); -const globals = require('globals'); -const { resolve } = require('path'); +// @ts-check + +import fs from 'fs/promises'; +import globals from 'globals'; +import { resolve } from 'path'; /** - * @type {Record} + * @typedef {keyof import('globals')} Globals + */ + +/** + * @type {Record} */ const RULES_CONFIG = { 'shared-node-browser': { @@ -45,12 +51,18 @@ const ALL_RULES = [ * Generate rules for a specific ESLint configuration package. * * @param {object} options - Options. - * @param {string} options.environments - The environments to generate rules for. + * @param {Globals[]} options.environments - The environments to + * generate rules for. * @param {string} options.name - The name of the ESLint configuration. - * @returns {Record} The generated rules. + * @returns {Record} The generated + * rules. */ const generateRules = ({ environments, name }) => { + /** + * @type {string[]} + */ const environmentGlobals = []; + for (const environment of environments) { environmentGlobals.push(...Object.keys(globals[environment])); } @@ -76,13 +88,10 @@ const writeRules = async () => { const rules = generateRules({ environments, name }); await fs.writeFile( - resolve(__dirname, location), + resolve(import.meta.dirname, location), `${JSON.stringify(rules, null, 2)}\n`, ); } }; -writeRules().catch((error) => { - console.error(error); - process.exitCode = 1; -}); +await writeRules(); diff --git a/scripts/validate-configs.js b/scripts/validate-configs.js deleted file mode 100644 index 0cc37ece..00000000 --- a/scripts/validate-configs.js +++ /dev/null @@ -1,577 +0,0 @@ -const { FlatCompat } = require('@eslint/eslintrc'); -const eslintRecommendedConfig = require('@eslint/js').configs.recommended; -const { hasProperty } = require('@metamask/utils'); -const { - configs: { recommended: prettierConfig }, -} = require('eslint-plugin-prettier'); -const deepEqual = require('fast-deep-equal'); -const { readdirSync, readFileSync, promises: fs } = require('fs'); -const pathUtils = require('path'); -const prettier = require('prettier'); - -// For config parsing, validation, and rule flattening -const BASE_CONFIG_NAME = '@metamask/eslint-config'; -const ESLINT_RECOMMENDED = 'eslint:recommended'; -const RULES = 'rules'; -const OFF = 'off'; - -// For logging -const TAB = ' '; - -// The path to the monorepo packages directory -const PACKAGES_DIR_PATH = pathUtils.join(__dirname, '../packages'); - -// The path to the rules snapshot file, relative to a package root. -const RULES_SNAPSHOT_PATH = 'rules-snapshot.json'; - -// Whether this program was configured to be in write mode. -const WRITE_MODE = ['--write', '-w'].includes(process.argv[2]); - -//---------------- -// Main -//---------------- - -main(); - -/** - * This script accomplishes 3 things: - * - * 1. Ensures that neither we nor any config that we extend enables any Prettier - * rules that should be disabled. - * 2. Ensures that we only usefully configure rules, meaning our configs only - * contain rules that are configured differently from or do not exist in - * any config that we extend, or our base config, which should always be - * extended by the consumer in practice. - * 3. Creates rule snapshots to make it easy to understand the impact of any - * changes we make to our configs, such as changing our specified rules or - * the configs that we extend. - * - * If the script is in write mode (by being given the argument --write or -w), - * it will overwrite any existing rule snapshots. Otherwise, it will compare the - * computed snapshot to the snapshot stored on disk, and exit with an error if - * they aren't equal. - */ -async function main() { - const metamaskConfigs = getMetamaskConfigs(); - const requiredPrettierRules = getRequiredPrettierRules(); - - // Violated rules are appended to these objects inside their respective - // validation functions. - const prettierViolations = getViolationsMap(metamaskConfigs); - const minimalismViolations = getViolationsMap(metamaskConfigs); - const snapshotViolations = []; - - // Iterate over this monorepo's config packages and validate their rules, - // appending any violations to the violation objects. - await Promise.all( - Object.entries(metamaskConfigs).map( - async ([packageName, { config, flatRules, packagePath }]) => { - validatePrettierRules( - packageName, - flatRules.own, - requiredPrettierRules, - prettierViolations, - ); - - validateConfigMinimalism( - packageName, - config, - flatRules.extended, - minimalismViolations, - ); - - await validateOrWriteRulesSnapshot( - packageName, - packagePath, - flatRules.own, - snapshotViolations, - ); - }, - ), - ); - - // Log any rule violations, and exit with an appropriate code. - let failures = 0; - if (hasViolations(prettierViolations)) { - failures += 1; - logPrettierViolations(prettierViolations); - } - - if (hasViolations(minimalismViolations)) { - failures += 1; - logMinimalismViolations(minimalismViolations); - } - - if (snapshotViolations.length > 0) { - failures += 1; - logSnapshotViolations(snapshotViolations); - } - - if (failures === 0) { - console.log( - `Successfully validated rules${ - WRITE_MODE ? ' and wrote snapshots' : '' - }!`, - ); - } - process.exit(failures); -} - -//---------------- -// Validation -//---------------- - -/** - * Checks whether the given package violates any of the given Prettier rules, - * and stores those violations in the given violations map. - * - * Mutates the violations map in place. - * - * @param {string} packageName - The name of the config package. - * @param {Record} flatRules - The package's flattened rules. - * @param {Record} prettierRules - The required Prettier rules. - * @param {Record} violations - A map to store violations in. - */ -function validatePrettierRules( - packageName, - flatRules, - prettierRules, - violations, -) { - prettierRules.forEach((ruleName) => { - if (hasProperty(flatRules, ruleName) && flatRules[ruleName] !== OFF) { - violations[packageName].push(ruleName); - } - }); -} - -/** - * Records whether the given config has any uselessly specified rules relative - * to the config's flat extended rules. "Uselessly" means either that the rule - * is explicitly disabled without ever being enabled, or that its configured - * identically in the flat extended rules. - * - * @param {string} packageName - The name of the config package. - * @param {Record} config - The package's eslint config object - * (i.e. its .eslintrc.js export). - * @param {Record} flatExtendedRules - The flattened rules of - * every config extended by the package config. - * @param {Record} violations - A map to store violations in. - */ -function validateConfigMinimalism( - packageName, - config, - flatExtendedRules, - violations, -) { - Object.entries(config.rules || {}).forEach(([ruleName, ruleValue]) => { - if ( - deepEqual(flatExtendedRules[ruleName], ruleValue) || - (!hasProperty(flatExtendedRules, ruleName) && ruleValue === OFF) - ) { - violations[packageName].push(ruleName); - } - }); -} - -/** - * Checks whether a config violations map contains any violations. - * - * @param {Record} violationsMap - A map of package names to arrays with - * violated rules, if any. - * @returns {boolean} Whether the given map contains any violations. - */ -function hasViolations(violationsMap) { - return Object.values(violationsMap).some( - (violations) => violations.length > 0, - ); -} - -/** - * Takes a { [packageName]: any } map and returns a map with with the same keys - * and empty array values, for storing rule violations that can be logged to the - * console and fixed manually. - * - * @param {Record} configs - An object with package name keys and arbitrary - * values. - * @returns {Record} An object with the same keys and empty - * array values. - */ -function getViolationsMap(configs) { - return Object.keys(configs).reduce((map, packageName) => { - map[packageName] = []; - return map; - }, {}); -} - -/** - * If the program is in write mode, writes a rule snapshot to the given path. - * Otherwise, checks whether the computed rules snapshot differs from the - * snapshot on disk, and stores an error in the violations map if so. - * - * Mutates the violations map in place. - * - * @param {string} packageName - The name of the config package. - * @param {string} packagePath - The path to the config package. - * @param {Record} flatRules - The package's flattened rules. - * @param {Record} violations - A map to store violations in. - */ -async function validateOrWriteRulesSnapshot( - packageName, - packagePath, - flatRules, - violations, -) { - const snapshotFilePath = pathUtils.join(packagePath, RULES_SNAPSHOT_PATH); - - if (WRITE_MODE) { - await writeRulesSnapshot(snapshotFilePath, flatRules); - } else { - try { - const existingSnapshot = JSON.parse( - await fs.readFile(snapshotFilePath, 'utf8'), - ); - - if (!deepEqual(existingSnapshot, flatRules)) { - violations.push(packageName); - } - } catch (error) { - console.error( - `Encountered error while reading file "${snapshotFilePath}".`, - error, - ); - process.exit(1); - } - } -} - -/** - * Writes a rules snapshot to the given path. - * - * Calls process.exit(1) if the write call fails. - * - * @param {string} snapshotFilePath - The path of the file to write. - * @param {Record} flatRules - The rules to write. - */ -async function writeRulesSnapshot(snapshotFilePath, flatRules) { - const stringifiedRules = JSON.stringify(flatRules, null, 2); - const formattedRules = await prettier.format(stringifiedRules, { - filepath: snapshotFilePath, - }); - - try { - await fs.writeFile(snapshotFilePath, formattedRules); - } catch (error) { - console.error( - `Encountered error while writing file "${snapshotFilePath}".`, - error, - ); - process.exit(1); - } -} - -//---------------- -// Specific config getters -//---------------- - -/** - * Iterates over the packages in this monorepo and returns an object of package - * name keys with object values containing: - * - The raw config. - * - Its flattened, complete rule set. - * - The path to the package. - * - * @returns {Record>} The config map. - */ -function getMetamaskConfigs() { - return readdirSync(PACKAGES_DIR_PATH).reduce((allConfigs, dirName) => { - const packagePath = pathUtils.join(PACKAGES_DIR_PATH, dirName); - const manifestPath = pathUtils.join(packagePath, 'package.json'); - const { name: packageName } = JSON.parse( - readFileSync(manifestPath, 'utf-8'), - ); - const config = require(packagePath); - - allConfigs[packageName] = { - config, - flatRules: getOwnAndExtendedFlatRules(packageName, config), - packagePath, - }; - return allConfigs; - }, {}); -} - -/** - * Gets the "own" and "extended" flat rules for the given config. - * The own flat rules are the combined flat rules for every config extended by - * the given config, and the config's own rules. - * The extended flat rules are config's own flat rules combined with the flat - * rules of the MetaMask base config. - * - * The extended flat rules are computed in this way because we assume that - * consumers will extend our base config first, and then others. We want to - * disable some rules in e.g. our TypeScript config that are enabled in our - * base config. If we did not compute the extended flat rules in this way, our - * rule minimization script would erroneously flag certain rules as useless. - * - * @param {string} packageName - The name of the config package. - * @param {Record} config - An eslint config object (e.g. .eslintrc.js). - * @returns {{ extended: Record, own: Record}} An - * object containing the config's own and extended flat rules. - */ -function getOwnAndExtendedFlatRules(packageName, config) { - let flatConfig, ownFlatRules; - if (packageName === BASE_CONFIG_NAME) { - flatConfig = getFlatConfig(config); - ownFlatRules = getFlatRules(flatConfig); - } else { - flatConfig = getFlatConfigWithBaseConfig(config); - ownFlatRules = getFlatRules(getFlatConfig(config)); - } - - // The below call returns the flat rules for everything except the last item - // in the flat config array. - // The last item in the flat config is our config, and the preceding items are - // its extended configs. - const extendedFlatRules = getFlatRules(flatConfig.slice(0, -1)); - - return { - extended: extendedFlatRules, - own: ownFlatRules, - }; -} - -/** - * Prepends the base config to the "extends" array of the given config and - * computes its flat config array. - * - * @param {Record} configObject - An eslint config object (e.g. .eslintrc.js). - * @returns {Record[]} An array of parsed eslint config objects. - */ -function getFlatConfigWithBaseConfig(configObject) { - const configCopy = { ...configObject }; - configCopy.extends = Array.isArray(configObject.extends) - ? [BASE_CONFIG_NAME, ...configCopy.extends] - : [BASE_CONFIG_NAME]; - return getFlatConfig(configCopy); -} - -/** - * Gets the rules that are always recommended to be disabled per Prettier's - * ESLint config. - * - * @returns {string[]} The names of the rules that should always be - * disabled when using Prettier. - */ -function getRequiredPrettierRules() { - return Object.entries( - getFlatRules(getFlatConfig(prettierConfig), false), - ).reduce((allRules, [ruleName, ruleValue]) => { - // Rules set to 'off' should never be enabled. - // Rules set to 0 (number) may sometimes be included. We don't attend to those. - // https://github.com/Prettier/eslint-config-Prettier/blob/abf3ba1/index.js#L7-L9 - if (ruleValue === OFF) { - allRules.push(ruleName); - } - return allRules; - }, []); -} - -//---------------- -// ESLint config parsing utilities -//---------------- - -/** - * Takes an eslint flat config array and returns its own rules and the rules - * of its extended configs (if any) in a single, flat object. - * - * @param {Record[]} flatConfig - A flat eslint config array. - * @param {boolean} [normalizeRules] - Whether to normalize rule config values - * to use string notation (off, warn, error) instead of numerical notation - * (0, 1, 2). Non-numerical values are passed through. - * @returns {Record} An object of eslint rule names and their - * configuration. - */ -function getFlatRules(flatConfig, normalizeRules = true) { - // Flatten the config array into a single object - const rawFlatRules = flatConfig.reduce((flatRules, config) => { - if (hasProperty(config, RULES)) { - return { - ...flatRules, - ...config[RULES], - }; - } - return flatRules; - }, {}); - - // Sort the flat rules alphabetically and return them - return normalizeRules - ? normalizeObject(rawFlatRules, normalizeRuleConfigValue) - : normalizeObject(rawFlatRules); -} - -/** - * Sorts the keys of the given object, inserts them in that order in a new - * object, and returns that object. Optionally normalizes the values of the - * object during sorting. - * - * @param {Record} obj - The object to sort. - * @param {Function} [valueNormalizer] - A function that takes a value and - * returns a "normalized" version of it. The value of every key on the sorted - * object will be passed through this function, if present. - * @returns {Record} The sorted object. - */ -function normalizeObject(obj, valueNormalizer) { - return Object.keys(obj) - .sort() - .reduce((sortedObj, key) => { - sortedObj[key] = valueNormalizer ? valueNormalizer(obj[key]) : obj[key]; - return sortedObj; - }, {}); -} - -/** - * Given an ESLint rule config value, converts it from numerical (0, 1, 2) to - * string (off, warn, error) notation, or just returns the given value. - * - * @param {unknown} configValue - The rule config value to normalize. - * @returns {string | unknown} The normalized rule config value. - */ -function normalizeRuleConfigValue(configValue) { - if (typeof configValue !== 'number' && typeof configValue !== 'string') { - return configValue; - } - - switch (String(configValue)) { - case '0': - return 'off'; - case '1': - return 'warn'; - case '2': - return 'error'; - default: - return configValue; - } -} - -/** - * Takes an eslint config object and flattens it and the configs it - * extends into a single array, ordered by their dependency relationships. - * - * @param {Record} configObject - An eslint config object (e.g. .eslintrc.js). - * @returns {Record[]} An array of parsed eslint config objects. - */ -function getFlatConfig(configObject) { - // FlatCompat does a lot of stuff under the hood, including resolving the - // modules exporting the configs extended by the given config. - // Luckily for us, that's kind of the hardest part. - const flatConfig = new FlatCompat({ - recommendedConfig: eslintRecommendedConfig, - }).config(configObject); - - populateRecommendedRules(flatConfig); - return flatConfig; -} - -/** - * A helper for the `getFlatConfig` function. - * Looks for the string 'eslint:recommended' in the given config array and - * replaces it with its corresponding rules object. - * Mutates the given array in place. - * - * Throws an error if the config array contains an invalid config object. - * - * @param {Record[]} configArray - A flat eslint config array. - */ -function populateRecommendedRules(configArray) { - let index = null; - while (index !== -1) { - index = configArray.indexOf(ESLINT_RECOMMENDED); - if (index !== -1) { - configArray[index] = eslintRecommendedConfig; - } - } - - for (const config of configArray) { - if (!config || typeof config !== 'object' || Array.isArray(config)) { - throw new Error(`Unrecognized ruleset: ${config}`); - } - } -} - -//---------------- -// Logging -//---------------- - -/** - * Prints Prettier violations to console.error in a readable format. - * Assumes that the given violations map contains violations. - * - * @param {Record} prettierViolations - A map containing - * Prettier violations. - */ -function logPrettierViolations(prettierViolations) { - let str = `\nError: Detected Prettier rule violations. Disable the specified rule(s) in the following package(s):\n`; - str += getViolationsString(prettierViolations); - console.error(str); -} - -/** - * Prints minimalism violations to console.error in a readable format. - * Assumes that the given violations map contains violations. - * - * @param {Record} minimalismViolations - A map containing - * minimalism violations. - */ -function logMinimalismViolations(minimalismViolations) { - let str = `\nError: Detected redundantly configured rules. Remove the specified rule(s) in the following package(s):\n`; - str += getViolationsString(minimalismViolations); - console.error(str); -} - -/** - * Assuming the given violations map contains violations, returns a formatted - * string describing them. - * - * @param {Record} violationsMap - A map of config package - * names to rules flagged as violations. - * @returns {string} A formatted string listing the violations. - */ -function getViolationsString(violationsMap) { - let str = ''; - Object.entries(violationsMap).forEach(([packageName, violatedRules]) => { - if (violatedRules.length > 0) { - str += `\n${tabs(1)}${packageName}\n${tabs(2)}${violatedRules - .sort() - .join(`\n${tabs(2)}`)}\n`; - } - }); - return str; -} - -/** - * Assuming the given array contains offending packages, prints them to the - * console in a readable format. - * - * @param {string[]} snapshotViolations - A map containing snapshot violations. - */ -function logSnapshotViolations(snapshotViolations) { - console.error( - `\nError: Computed snapshot differs from the existing snapshot for the following package(s). Take a new snapshot and try again.\n\n${tabs( - 1, - )}${snapshotViolations.join(`\n${tabs(1)}`)}\n`, - ); -} - -/** - * Returns the requested number of tabs. - * - * @param {number} numTabs - The number of tabs to return. - * @returns {string} A string consisting of numTabs 4-space "tabs". - */ -function tabs(numTabs) { - if (numTabs < 1 || !Number.isInteger(numTabs)) { - throw new Error('Expected positive integer.'); - } - return numTabs === 1 ? TAB : TAB + new Array(numTabs).join(TAB); -} diff --git a/scripts/validate-configs.mjs b/scripts/validate-configs.mjs new file mode 100644 index 00000000..bcb2bb82 --- /dev/null +++ b/scripts/validate-configs.mjs @@ -0,0 +1,186 @@ +// @ts-check + +import { ConfigArray } from '@eslint/config-array'; +import { hasProperty } from '@metamask/utils'; +import fs from 'fs/promises'; +import { fileURLToPath } from 'node:url'; +import pathUtils, { dirname, join } from 'path'; +import { format } from 'prettier'; + +/** + * @typedef {import('eslint').Linter.Config[]} Config + * @typedef {Record>} Rules + */ + +// `import.meta.dirname` but with support for Node.js 18. +const DIRNAME = dirname(fileURLToPath(import.meta.url)); + +// The path to the monorepo packages directory +const PACKAGES_DIR_PATH = pathUtils.join(DIRNAME, '../packages'); + +// The path to the rules snapshot file, relative to a package root. +const RULES_SNAPSHOT_PATH = 'rules-snapshot.json'; + +// Whether this program was configured to be in write mode. +const WRITE_MODE = + process.argv[2] && ['--write', '-w'].includes(process.argv[2]); + +// For logging +const TAB = ' '; + +/** + * Given an ESLint rule config value, convert it from numerical (0, 1, 2) to + * string (off, warn, error) notation, or just returns the given value. + * + * @param {unknown} configValue - The rule config value to normalize. + * @returns {string | unknown} The normalized rule config value. + */ +function normalizeRuleConfigValue(configValue) { + if (typeof configValue !== 'number' && typeof configValue !== 'string') { + return configValue; + } + + switch (String(configValue)) { + case '0': + return 'off'; + case '1': + return 'warn'; + case '2': + return 'error'; + default: + return configValue; + } +} + +/** + * Normalize a rules object, converting numerical rule values to string rule + * values. + * + * @param {Rules} rules - The rules object to normalize. + * @returns {Rules} The normalized rules object. + */ +function normalizeRules(rules) { + // @ts-expect-error - `Object.fromEntries` doesn't infer the return type. + return Object.fromEntries( + Object.entries(rules).map(([ruleName, ruleConfig]) => [ + ruleName, + Array.isArray(ruleConfig) + ? [normalizeRuleConfigValue(ruleConfig[0]), ...ruleConfig.slice(1)] + : normalizeRuleConfigValue(ruleConfig), + ]), + ); +} + +/** + * Flatten a {@link ConfigArray} into a record of rule names to rule values. + * + * @param {ConfigArray} configArray - The config array to flatten. + * @returns {Rules} The flattened rule set. + */ +function flattenConfigArray(configArray) { + /** + * @type {Rules} + */ + const ruleSet = configArray.reduce((flatConfig, rule) => { + if (hasProperty(rule, 'rules')) { + Object.assign(flatConfig, normalizeRules(rule.rules)); + } + + return flatConfig; + }, {}); + + return Object.fromEntries( + Object.entries(ruleSet).sort(([a], [b]) => a.localeCompare(b)), + ); +} + +/** + * Iterates over the packages in this monorepo and returns an object of package + * name keys with object values containing: + * - The raw config. + * - Its flattened, complete rule set. + * - The path to the package. + * + * @returns {Promise>} The + * config map. + */ +async function getMetaMaskConfigs() { + const packages = await fs.readdir(PACKAGES_DIR_PATH); + + /** + * @type {Map} + */ + const allConfigs = new Map(); + + for (const packageName of packages) { + const packagePath = pathUtils.join(PACKAGES_DIR_PATH, packageName); + const manifestPath = pathUtils.join(packagePath, 'package.json'); + const { name } = JSON.parse(await fs.readFile(manifestPath, 'utf-8')); + + const { default: config } = await import(name); + const normalizedConfig = await new ConfigArray(config).normalize(); + + allConfigs.set(name, { + ruleSet: flattenConfigArray(normalizedConfig), + packagePath, + }); + } + + return allConfigs; +} + +/** + * Return the requested number of tabs. + * + * @param {number} numTabs - The number of tabs to return. + * @returns {string} A string consisting of numTabs 4-space "tabs". + */ +function tabs(numTabs) { + if (numTabs < 1 || !Number.isInteger(numTabs)) { + throw new Error('Expected positive integer.'); + } + return numTabs === 1 ? TAB : TAB + new Array(numTabs).join(TAB); +} + +/** + * Assuming the given array contains offending packages, print them to the + * console in a readable format. + * + * @param {string[]} snapshotViolations - A map containing snapshot violations. + */ +function logSnapshotViolations(snapshotViolations) { + console.error( + `\nError: Computed snapshot differs from the existing snapshot for the following package(s). Take a new snapshot and try again.\n\n${tabs( + 1, + )}${snapshotViolations.join(`\n${tabs(1)}`)}\n`, + ); +} + +const configs = await getMetaMaskConfigs(); +const snapshotViolations = []; + +for (const [name, { packagePath, ruleSet }] of configs.entries()) { + const snapshotPath = join(packagePath, RULES_SNAPSHOT_PATH); + const formattedRules = await format(JSON.stringify(ruleSet), { + parser: 'json', + }); + + if (WRITE_MODE) { + await fs.writeFile(snapshotPath, formattedRules); + continue; + } + + const snapshot = await fs.readFile( + join(packagePath, RULES_SNAPSHOT_PATH), + 'utf-8', + ); + + if (snapshot !== formattedRules) { + snapshotViolations.push(name); + process.exitCode = 1; + } +} + +if (snapshotViolations.length > 0) { + logSnapshotViolations(snapshotViolations); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..02ff7a3b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "allowJs": true, + "esModuleInterop": true, + "exactOptionalPropertyTypes": true, + "forceConsistentCasingInFileNames": true, + "lib": ["ES2023"], + "module": "Node16", + "moduleResolution": "Node16", + "noEmit": true, + "noErrorTruncation": true, + "noUncheckedIndexedAccess": true, + "resolveJsonModule": true, + "strict": true, + "target": "ES2022" + }, + "include": ["**/*.mjs", "**/*.mts"], + "exclude": ["./dist", "**/node_modules"] +} diff --git a/yarn.lock b/yarn.lock index e24d0695..f838965a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13,12 +13,12 @@ __metadata: linkType: hard "@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" + version: 2.2.1 + resolution: "@ampproject/remapping@npm:2.2.1" dependencies: - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.24 - checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 languageName: node linkType: hard @@ -111,7 +111,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.24.8 resolution: "@babel/helper-plugin-utils@npm:7.24.8" checksum: 73b1a83ba8bcee21dc94de2eb7323207391715e4369fd55844bb15cf13e3df6f3d13a40786d990e6370bf0f571d94fc31f70dec96c1d1002058258c35ca3767a @@ -260,13 +260,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" + version: 7.22.5 + resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7a5ca629d8ca1e1ee78705a78e58c12920d07ed8006d7e7232b31296a384ff5e41d7b649bde5561196041037bbb9f9715be1d1c20975df87ca204f34ad15b965 + checksum: 8829d30c2617ab31393d99cec2978e41f014f4ac6f01a1cecf4c4dd8320c3ec12fdc3ce121126b2d8d32f6887e99ca1a0bad53dedb1e6ad165640b92b24980ce languageName: node linkType: hard @@ -359,13 +359,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.25.4 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" + version: 7.22.5 + resolution: "@babel/plugin-syntax-typescript@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.24.8 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9b89b8930cd5983f64251d75c9fcdc17a8dc73837d6de12220ff972888ecff4054a6467cf0c423cad242aa96c0f0564a39a0823073728cc02239b80d13f02230 + checksum: 8ab7718fbb026d64da93681a57797d60326097fd7cb930380c8bffd9eb101689e90142c760a14b51e8e69c88a73ba3da956cb4520a3b0c65743aee5c71ef360a languageName: node linkType: hard @@ -413,14 +413,14 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.41.0": - version: 0.41.0 - resolution: "@es-joy/jsdoccomment@npm:0.41.0" +"@es-joy/jsdoccomment@npm:~0.48.0": + version: 0.48.0 + resolution: "@es-joy/jsdoccomment@npm:0.48.0" dependencies: comment-parser: 1.4.1 - esquery: ^1.5.0 - jsdoc-type-pratt-parser: ~4.0.0 - checksum: cfe0714027ff8fa82dad8c84f75af3f6df9d6797d60c289b8d3c259c5375c134bd5ca630beba0daed3adceef01a74f19e05052018f6b66ad6a4f483adf599c39 + esquery: ^1.6.0 + jsdoc-type-pratt-parser: ~4.1.0 + checksum: dc9aa1b30b43e06d94053287c2062ebff1147ed1627497c1f20f15a534744784b5adf9189e437ee62595585576112c99cff7833e84c2373614447672a4cc294f languageName: node linkType: hard @@ -596,40 +596,27 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 97d2fe46690b69417a551bd19a3dc53b6d9590d2295c43cc4c4e44e64131af541e2f4a44d5c12e87de990403654d3dae9d33600081f3a2f0386b368abc9111ec +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.6.0": + version: 4.11.1 + resolution: "@eslint-community/regexpp@npm:4.11.1" + checksum: 6986685529d30e33c2640973c3d8e7ddd31bef3cc8cb10ad54ddc1dea12680779a2c23a45562aa1462c488137a3570e672d122fac7da22d82294382d915cec70 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.6.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/config-array@npm:^0.18.0": + version: 0.18.0 + resolution: "@eslint/config-array@npm:0.18.0" dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 + "@eslint/object-schema": ^2.1.4 + debug: ^4.3.1 minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 + checksum: 5ff748e1788745bfb3160c3b3151d62a7c054e336e9fe8069e86cfa6106f3abbd59b24f1253122268295f98c66803e9a7b23d7f947a8c00f62d2060cc44bc7fc languageName: node linkType: hard -"@eslint/eslintrc@npm:^3.0.2": - version: 3.0.2 - resolution: "@eslint/eslintrc@npm:3.0.2" +"@eslint/eslintrc@npm:^3.1.0": + version: 3.1.0 + resolution: "@eslint/eslintrc@npm:3.1.0" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -640,14 +627,30 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: 05bf516b60fbb1c1bdc264e081118b2172c5feb071cd665976482c5614b8e7950991175fea3ca6b1f482ced7cb0d0aa34ceab3a508d6bf1ff17b4efc0911e293 + checksum: b0a9bbd98c8b9e0f4d975b042ff9b874dde722b20834ea2ff46551c3de740d4f10f56c449b790ef34d7f82147cbddfc22b004a43cc885dbc2664bb134766b5e4 + languageName: node + linkType: hard + +"@eslint/js@npm:9.11.0, @eslint/js@npm:^9.11.0": + version: 9.11.0 + resolution: "@eslint/js@npm:9.11.0" + checksum: 3e3a8945c7f97b29187f3a6b05c9bb1e3e373d75f94c16b7499565df7c343d5e5e0a14e177bb75c368c6022bb33aa3d17775386a5f39d9085f9f522862d4bd4a + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 5a03094115bcdab7991dbbc5d17a9713f394cebb4b44d3eaf990d7487b9b8e1877b817997334ab40be52e299a0384595c6f6ba91b389901e5e1d21efda779271 languageName: node linkType: hard -"@eslint/js@npm:8.57.0, @eslint/js@npm:^8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb +"@eslint/plugin-kit@npm:^0.2.0": + version: 0.2.0 + resolution: "@eslint/plugin-kit@npm:0.2.0" + dependencies: + levn: ^0.4.1 + checksum: 2c358c816575b8338e017cff59bf8b7a186510bc0e6c1b234e889156bfea9e00ce588ce424a0aa5d322e316f1ad08e8fdc7450a7fd966c64cbb911e64eaffbb9 languageName: node linkType: hard @@ -693,14 +696,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" - dependencies: - "@humanwhocodes/object-schema": ^2.0.2 - debug: ^4.3.1 - minimatch: ^3.0.5 - checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 languageName: node linkType: hard @@ -711,10 +710,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 2fc11503361b5fb4f14714c700c02a3f4c7c93e9acd6b87a29f62c522d90470f364d6161b03d1cc618b979f2ae02aed1106fd29d302695d8927e2fc8165ba8ee +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.0 + resolution: "@humanwhocodes/retry@npm:0.3.0" + checksum: 4349cb8b60466a000e945fde8f8551cefb01ebba22ead4a92ac7b145f67f5da6b52e5a1e0c53185d732d0a49958ac29327934a4a5ac1d0bc20efb4429a4f7bf7 languageName: node linkType: hard @@ -982,7 +981,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.5 resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: @@ -1014,7 +1013,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -1069,17 +1068,20 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eslint-config-browser@workspace:packages/browser" dependencies: + "@eslint/js": ^9.11.0 + "@jest/globals": ^29.7.0 "@metamask/auto-changelog": ^3.4.4 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-prettier: ^4.2.1 - prettier: ^2.7.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-prettier: ^5.2.1 + globals: ^15.9.0 + prettier: ^3.3.3 vitest: ^2.1.1 peerDependencies: "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 + eslint: ^9.11.0 languageName: unknown linkType: soft @@ -1087,39 +1089,45 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eslint-config-commonjs@workspace:packages/commonjs" dependencies: + "@eslint/js": ^9.11.0 + "@jest/globals": ^29.7.0 "@metamask/auto-changelog": ^3.4.4 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-prettier: ^4.2.1 - prettier: ^2.7.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-prettier: ^5.2.1 + globals: ^15.9.0 + prettier: ^3.3.3 vitest: ^2.1.1 peerDependencies: "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 + eslint: ^9.11.0 languageName: unknown linkType: soft -"@metamask/eslint-config-jest@workspace:packages/jest": +"@metamask/eslint-config-jest@workspace:^, @metamask/eslint-config-jest@workspace:packages/jest": version: 0.0.0-use.local resolution: "@metamask/eslint-config-jest@workspace:packages/jest" dependencies: + "@eslint/js": ^9.11.0 + "@jest/globals": ^29.7.0 "@metamask/auto-changelog": ^3.4.4 "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jest: ^27.9.0 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-prettier: ^4.2.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jest: ^28.8.3 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-prettier: ^5.2.1 + globals: ^15.9.0 jest: ^29.7.0 - prettier: ^2.7.1 + prettier: ^3.3.3 vitest: ^2.1.1 peerDependencies: "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 - eslint-plugin-jest: ^27.9.0 + eslint: ^9.11.0 + eslint-plugin-jest: ^28.8.3 languageName: unknown linkType: soft @@ -1127,20 +1135,23 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eslint-config-mocha@workspace:packages/mocha" dependencies: + "@eslint/js": ^9.11.0 + "@jest/globals": ^29.7.0 "@metamask/auto-changelog": ^3.4.4 "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-mocha: ^10.4.1 - eslint-plugin-prettier: ^4.2.1 - prettier: ^2.7.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-mocha: ^10.5.0 + eslint-plugin-prettier: ^5.2.1 + globals: ^15.9.0 + prettier: ^3.3.3 vitest: ^2.1.1 peerDependencies: "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 - eslint-plugin-mocha: ^10.4.1 + eslint: ^9.11.0 + eslint-plugin-mocha: ^10.5.0 languageName: unknown linkType: soft @@ -1148,45 +1159,53 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eslint-config-nodejs@workspace:packages/nodejs" dependencies: + "@eslint/js": ^9.11.0 + "@jest/globals": ^29.7.0 "@metamask/auto-changelog": ^3.4.4 "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-n: ^16.6.2 - eslint-plugin-prettier: ^4.2.1 - prettier: ^2.7.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-n: ^17.10.3 + eslint-plugin-prettier: ^5.2.1 + globals: ^15.9.0 + prettier: ^3.3.3 vitest: ^2.1.1 peerDependencies: "@metamask/eslint-config": ^13.0.0 - eslint: ^8.57.0 - eslint-plugin-n: ^16.6.2 + eslint: ^9.11.0 + eslint-plugin-n: ^17.10.3 languageName: unknown linkType: soft -"@metamask/eslint-config-typescript@workspace:packages/typescript": +"@metamask/eslint-config-typescript@workspace:^, @metamask/eslint-config-typescript@workspace:packages/typescript": version: 0.0.0-use.local resolution: "@metamask/eslint-config-typescript@workspace:packages/typescript" dependencies: + "@eslint/js": ^9.11.0 + "@jest/globals": ^29.7.0 "@metamask/auto-changelog": ^3.4.4 "@metamask/eslint-config": ^13.0.0 - "@typescript-eslint/eslint-plugin": ^8.1.0 - "@typescript-eslint/parser": ^8.1.0 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-prettier: ^4.2.1 - prettier: ^2.7.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-import-resolver-typescript: ^3.6.3 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-prettier: ^5.2.1 + globals: ^15.9.0 + prettier: ^3.3.3 typescript: ~5.5.4 + typescript-eslint: ^8.6.0 vitest: ^2.1.1 peerDependencies: "@metamask/eslint-config": ^13.0.0 - "@typescript-eslint/eslint-plugin": ^8.1.0 - "@typescript-eslint/parser": ^8.1.0 - eslint: ^8.57.0 + eslint: ^9.11.0 + eslint-import-resolver-typescript: ^3.6.3 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 typescript: ">=4.8.4 <5.6" + typescript-eslint: ^8.6.0 languageName: unknown linkType: soft @@ -1194,23 +1213,26 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eslint-config@workspace:packages/base" dependencies: + "@eslint/js": ^9.11.0 + "@jest/globals": ^29.7.0 "@metamask/auto-changelog": ^3.4.4 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-promise: ^6.1.1 - prettier: ^2.7.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-prettier: ^5.2.1 + eslint-plugin-promise: ^7.1.0 + globals: ^15.9.0 + prettier: ^3.3.3 vitest: ^2.1.1 peerDependencies: - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jsdoc: ">=43.0.7 <48" - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-promise: ^6.1.1 - prettier: ^2.7.1 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-prettier: ^5.2.1 + eslint-plugin-promise: ^7.1.0 + prettier: ^3.3.3 languageName: unknown linkType: soft @@ -1281,6 +1303,13 @@ __metadata: languageName: node linkType: hard +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 + languageName: node + linkType: hard + "@npmcli/agent@npm:^2.0.0": version: 2.2.1 resolution: "@npmcli/agent@npm:2.2.1" @@ -1294,6 +1323,16 @@ __metadata: languageName: node linkType: hard +"@npmcli/fs@npm:^2.1.0": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" + dependencies: + "@gar/promisify": ^1.1.3 + semver: ^7.3.5 + checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": version: 3.1.0 resolution: "@npmcli/fs@npm:3.1.0" @@ -1319,6 +1358,16 @@ __metadata: languageName: node linkType: hard +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" + dependencies: + mkdirp: ^1.0.4 + rimraf: ^3.0.2 + checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + languageName: node + linkType: hard + "@npmcli/node-gyp@npm:^3.0.0": version: 3.0.0 resolution: "@npmcli/node-gyp@npm:3.0.0" @@ -1542,6 +1591,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -1592,20 +1648,39 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "*" + "@types/json-schema": "*" + checksum: c286e79707ab604b577cf8ce51d9bbb9780e3d6a68b38a83febe13fa05b8012c92de17c28532fac2b03d3c460123f5055d603a579685325246ca1c86828223e0 languageName: node linkType: hard -"@types/estree@npm:^1.0.0": +"@types/eslint__js@npm:^8.42.3": + version: 8.42.3 + resolution: "@types/eslint__js@npm:8.42.3" + dependencies: + "@types/eslint": "*" + checksum: e31f19de642d35a664695d0cab873ce6de19b8a3506755835b91f8a49a8c41099dcace449df49f1a486de6fa6565d21ceb1fa33be6004fc7adef9226e5d256a1 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 languageName: node linkType: hard +"@types/estree@npm:1.0.5": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.3": version: 4.1.9 resolution: "@types/graceful-fs@npm:4.1.9" @@ -1640,7 +1715,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -1654,7 +1729,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": +"@types/node@npm:*, @types/node@npm:^22.5.5": version: 22.5.5 resolution: "@types/node@npm:22.5.5" dependencies: @@ -1663,13 +1738,6 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 - languageName: node - linkType: hard - "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -1693,15 +1761,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.1.0" +"@typescript-eslint/eslint-plugin@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.6.0" dependencies: "@eslint-community/regexpp": ^4.10.0 - "@typescript-eslint/scope-manager": 8.1.0 - "@typescript-eslint/type-utils": 8.1.0 - "@typescript-eslint/utils": 8.1.0 - "@typescript-eslint/visitor-keys": 8.1.0 + "@typescript-eslint/scope-manager": 8.6.0 + "@typescript-eslint/type-utils": 8.6.0 + "@typescript-eslint/utils": 8.6.0 + "@typescript-eslint/visitor-keys": 8.6.0 graphemer: ^1.4.0 ignore: ^5.3.1 natural-compare: ^1.4.0 @@ -1712,139 +1780,68 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: e50e552ca531a4587e7976199320614758fe80c6c83c7f6780d8fe121856e99462cbee319136475be4b9ccec2ea13af347cf5a8e97c234f7c0afd28cb9867aca + checksum: 6acab71c3066b86ba19b081c44b7060df4468d932813a94ad3b60f0f88b78b97f3555a0605814e32f8399737c0789e72cb509a6cf6d70e4823a7cc8769d06fa4 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/parser@npm:8.1.0" +"@typescript-eslint/parser@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/parser@npm:8.6.0" dependencies: - "@typescript-eslint/scope-manager": 8.1.0 - "@typescript-eslint/types": 8.1.0 - "@typescript-eslint/typescript-estree": 8.1.0 - "@typescript-eslint/visitor-keys": 8.1.0 + "@typescript-eslint/scope-manager": 8.6.0 + "@typescript-eslint/types": 8.6.0 + "@typescript-eslint/typescript-estree": 8.6.0 + "@typescript-eslint/visitor-keys": 8.6.0 debug: ^4.3.4 peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 17337b6b70f9b1f95bd161bf4e7a358714b2eca1e377857e0de0ba23be576fcb939cac74c497e447935cb771705f41e2dc7771b5e74308d73d9f29f05e6f1b3f + checksum: d2e1c1ef4b908d2c028b6e1c72b42c0ae0d9f4dab0dea4ea8e0a36a194ec2171833e7bed36e55e0feadad3e06eef1c6da16168a3687d0e2182b80229dc994e2d languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.42.1": - version: 5.42.1 - resolution: "@typescript-eslint/scope-manager@npm:5.42.1" +"@typescript-eslint/scope-manager@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/scope-manager@npm:8.6.0" dependencies: - "@typescript-eslint/types": 5.42.1 - "@typescript-eslint/visitor-keys": 5.42.1 - checksum: cfad5f04328fae4bb6d965a94c980ac2f6fa0eee6183e9bed6d7ebdb067f01a0a9a3b5500fc3638d5e287f46f4412aa462e238c610c1fb96b794b83c575c7fb4 + "@typescript-eslint/types": 8.6.0 + "@typescript-eslint/visitor-keys": 8.6.0 + checksum: d0a305c659eab02ad36265e77a1e30574a72a3e251b24c503537abd5b1dbe45a1db7d63dc73bdcc7fb4951f671cb5cbaedca1130490c764dd05f91e90c5cbbf9 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.12.0": - version: 7.12.0 - resolution: "@typescript-eslint/scope-manager@npm:7.12.0" +"@typescript-eslint/type-utils@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/type-utils@npm:8.6.0" dependencies: - "@typescript-eslint/types": 7.12.0 - "@typescript-eslint/visitor-keys": 7.12.0 - checksum: 563de8a96b1c879e2cc84ea8e24a2a0f01aeafdc3ac477712f6e195f9f3639b978a8f86fd9841bd84d80e6d305b1c32cc5079baadd8fe24cd2603eba6ee792da - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/scope-manager@npm:8.1.0" - dependencies: - "@typescript-eslint/types": 8.1.0 - "@typescript-eslint/visitor-keys": 8.1.0 - checksum: 7febb23f480802ecce3c99988392ce77187f14b06e384de0d246880493e58de878d3c4eac465899fe2dcd55617e71c6b978547844402f05d2f152c25dcbc8b19 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/type-utils@npm:8.1.0" - dependencies: - "@typescript-eslint/typescript-estree": 8.1.0 - "@typescript-eslint/utils": 8.1.0 + "@typescript-eslint/typescript-estree": 8.6.0 + "@typescript-eslint/utils": 8.6.0 debug: ^4.3.4 ts-api-utils: ^1.3.0 peerDependenciesMeta: typescript: optional: true - checksum: 226938167fb43c39df98d7fd875404fab862783113e9fac381725b4b45bdbbc6e8bc618057ecfd9a0a5ce724c9bf673ccdf10c9832eae22852d5576bcf119a47 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.42.1": - version: 5.42.1 - resolution: "@typescript-eslint/types@npm:5.42.1" - checksum: b0eb3df3792dd0e447abcf2b4fd79b2eaa6f944242d00afa8ef2d9f892ea63e52f200e7cb1758ddbc46154aa6764cec8bc796ed96f7554457a20db976f9f2089 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:7.12.0": - version: 7.12.0 - resolution: "@typescript-eslint/types@npm:7.12.0" - checksum: 56068abd1bf563fceb6ddea3d6b72893ae51fb527e5821e03aecc679f5dd6ff378f2adf445ccc404655163152f586bf04856a09b020635f57af4ce2fd9b5d40a - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/types@npm:8.1.0" - checksum: 90c5177e2afe8be97fbeda49702cc37a17dd0c3537f9b43d72ae22fcdf76f505676579ced13e2cd2708e4cc4f7347872c76a0c8751f354de6874417f0fadbb76 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.42.1": - version: 5.42.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.42.1" - dependencies: - "@typescript-eslint/types": 5.42.1 - "@typescript-eslint/visitor-keys": 5.42.1 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: dfd3e20d41ba4b574a52d82cc40b38708b8c2c4277d6304a8d914fe2a4a9ce8779f4d79fdac140e77a3afd3c6a2a7e3f31620dc427cabd04e4e906bb0ca3a468 + checksum: d395745176cc13d96759e4ad7b698058f4fc24b62d0bd3fe603f49546f369cbf3e46fefbcc6069c33b1b0d825e033e0a5a972fd0b1a05f7ce9e8588154a02b93 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.12.0": - version: 7.12.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.12.0" - dependencies: - "@typescript-eslint/types": 7.12.0 - "@typescript-eslint/visitor-keys": 7.12.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - minimatch: ^9.0.4 - semver: ^7.6.0 - ts-api-utils: ^1.3.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 16c75e117920432bc782da9efa0a2051ffa95c4b31b1f5cd613799aeeffd6de0f5ca5ff736ee2da5a8d3034d2ebb9c5240736d0737f118ed7c774b8b2ac87845 +"@typescript-eslint/types@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/types@npm:8.6.0" + checksum: 5bf0078735b5d2804e1019ff17e9f221af3735fe7b9f4a77a41cba0998e77eebb2c152575bd45a264cb35d7a9db899799c1a10faa29f536c28a804420fb9f870 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.1.0" +"@typescript-eslint/typescript-estree@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.6.0" dependencies: - "@typescript-eslint/types": 8.1.0 - "@typescript-eslint/visitor-keys": 8.1.0 + "@typescript-eslint/types": 8.6.0 + "@typescript-eslint/visitor-keys": 8.6.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 @@ -1852,90 +1849,31 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5174ac942436d251037a2b3f8935337234ca538674ccfbe755b429ea4f7589c2eb6cd2dbcae5a5a9aee4f7a58fc47ec38b644d3838fbf0510634a4e60bc8f38b + checksum: 7a0e817b5c381f8937a8e4bf17df5ce43e1269ee150ee635cc8bb8867cb899fcca630eb8f6f1dfdd74ddd296741ac7e1e26ef6c9dc4f99cdcf49311956fbb385 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/utils@npm:8.1.0" +"@typescript-eslint/utils@npm:8.6.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.1.0": + version: 8.6.0 + resolution: "@typescript-eslint/utils@npm:8.6.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 - "@typescript-eslint/scope-manager": 8.1.0 - "@typescript-eslint/types": 8.1.0 - "@typescript-eslint/typescript-estree": 8.1.0 + "@typescript-eslint/scope-manager": 8.6.0 + "@typescript-eslint/types": 8.6.0 + "@typescript-eslint/typescript-estree": 8.6.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: b4532aaf76a1314a08f95be7682066c20cd6ff9baa078975f5c4e379c113befd69ace697aead692717a6c5396385bcb7886fec8454c7dd811f875fe08d67b8dd - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^5.10.0": - version: 5.42.1 - resolution: "@typescript-eslint/utils@npm:5.42.1" - dependencies: - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.42.1 - "@typescript-eslint/types": 5.42.1 - "@typescript-eslint/typescript-estree": 5.42.1 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - semver: ^7.3.7 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 9f1c429a602dad4ba7a52df00924aab6033854234a1e1bf699a3e5b48455b5fdc1a41de459a7f11a3ccfed1528831ecb95fc7e54d30be7d8cccbb689f885fdac + checksum: dbb2efe47c291d36d5ec147f8c8fe62d27e9db2a3368aefd9019fd1e118bd1a54c8b13b990bb0941c9510bc4e2049b336e9a26d6414a6239c020e36baa8797e2 languageName: node linkType: hard -"@typescript-eslint/utils@npm:^7.4.0": - version: 7.12.0 - resolution: "@typescript-eslint/utils@npm:7.12.0" +"@typescript-eslint/visitor-keys@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.6.0" dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@typescript-eslint/scope-manager": 7.12.0 - "@typescript-eslint/types": 7.12.0 - "@typescript-eslint/typescript-estree": 7.12.0 - peerDependencies: - eslint: ^8.56.0 - checksum: f9b5afe9e70ff908f348de54d130b2157df8af0f9815cf7df0830bd85df249d3b34da8b03ad3bea84ed0c2ea1743caeae68355fbcca9a7da8df30bc76bc1506c - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.42.1": - version: 5.42.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.42.1" - dependencies: - "@typescript-eslint/types": 5.42.1 - eslint-visitor-keys: ^3.3.0 - checksum: d36c59da7bf3b3c150c12cbe4b0331edc15253f59599ec3d8b873b2a3d9fc7a4fea11490c1b20d972afcdc9c842deb5ada527ea9c538aa7e87555699d9a59f24 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:7.12.0": - version: 7.12.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.12.0" - dependencies: - "@typescript-eslint/types": 7.12.0 + "@typescript-eslint/types": 8.6.0 eslint-visitor-keys: ^3.4.3 - checksum: 4352d910d87435457bb3fe2a6766fe702c31c0706789b4c478bd16c99bed7aa16654856e61ff14ecea2802030f96fa40d478bd57c205ac53f1f130577b7423b2 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.1.0" - dependencies: - "@typescript-eslint/types": 8.1.0 - eslint-visitor-keys: ^3.4.3 - checksum: 4dedea4009ee6e782ca14d0a1bfd2d6e763c0834fde976a99a8c32befba7dffbaa694c27a3d5dae8aea628278f96e06199eb6a7fb0bf19511815825f76eb04b4 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + checksum: de60bb42674818af46b85a94f668e93dc0432e8d7d94f0508dadab41181192fad2c2701ec3533d404e9bd40c8e92384fd7bcdc82fc45584b7323195ceaf32caf languageName: node linkType: hard @@ -2021,6 +1959,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -2037,12 +1982,21 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.9.0": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" +"acorn@npm:^8.12.0": + version: 8.12.1 + resolution: "acorn@npm:8.12.1" bin: acorn: bin/acorn - checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c + checksum: 677880034aee5bdf7434cc2d25b641d7bedb0b5ef47868a78dadabedccf58e1c5457526d9d8249cd253f2df087e081c3fe7d903b448d8e19e5131a3065b83c07 + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d languageName: node linkType: hard @@ -2055,6 +2009,15 @@ __metadata: languageName: node linkType: hard +"agentkeepalive@npm:^4.2.1": + version: 4.5.0 + resolution: "agentkeepalive@npm:4.5.0" + dependencies: + humanize-ms: ^1.2.1 + checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -2100,15 +2063,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -2142,6 +2096,13 @@ __metadata: languageName: node linkType: hard +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + "are-docs-informative@npm:^0.0.2": version: 0.0.2 resolution: "are-docs-informative@npm:0.0.2" @@ -2149,6 +2110,16 @@ __metadata: languageName: node linkType: hard +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -2165,13 +2136,6 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - "assertion-error@npm:^2.0.1": version: 2.0.1 resolution: "assertion-error@npm:2.0.1" @@ -2335,14 +2299,7 @@ __metadata: languageName: node linkType: hard -"builtin-modules@npm:^3.3.0": - version: 3.3.0 - resolution: "builtin-modules@npm:3.3.0" - checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d - languageName: node - linkType: hard - -"builtins@npm:^5.0.0, builtins@npm:^5.0.1": +"builtins@npm:^5.0.0": version: 5.0.1 resolution: "builtins@npm:5.0.1" dependencies: @@ -2358,6 +2315,32 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^16.1.0": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": ^2.1.0 + "@npmcli/move-file": ^2.0.0 + chownr: ^2.0.0 + fs-minipass: ^2.1.0 + glob: ^8.0.1 + infer-owner: ^1.0.4 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + mkdirp: ^1.0.4 + p-map: ^4.0.0 + promise-inflight: ^1.0.1 + rimraf: ^3.0.2 + ssri: ^9.0.0 + tar: ^6.1.11 + unique-filename: ^2.0.0 + checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.2 resolution: "cacache@npm:18.0.2" @@ -2400,9 +2383,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001663 - resolution: "caniuse-lite@npm:1.0.30001663" - checksum: 489a642feb6826a0fc7cfd7dbc35a3341cc1439eafdf0dae79338cf9033c5d9eddaedacbef7935acaddbb3c226a51097ed53d66dc6d8128cd6938c6763e1bbc4 + version: 1.0.30001662 + resolution: "caniuse-lite@npm:1.0.30001662" + checksum: 7a6a0c0d9f7c4a1c51de02838eb47f41f36fff57a77b846c8faed35ba9afba17b9399bc00bd637e5c1663cbc132534085d91151de48edca2ad8932a5d87e23af languageName: node linkType: hard @@ -2423,9 +2406,11 @@ __metadata: version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 + assertion-error: ^2.0.1 + check-error: ^2.1.1 + deep-eql: ^5.0.1 + loupe: ^3.1.0 + pathval: ^2.0.0 checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 languageName: node linkType: hard @@ -2514,15 +2499,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -2532,13 +2508,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -2546,6 +2515,15 @@ __metadata: languageName: node linkType: hard +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + "comment-parser@npm:1.4.1": version: 1.4.1 resolution: "comment-parser@npm:1.4.1" @@ -2560,6 +2538,13 @@ __metadata: languageName: node linkType: hard +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -2604,15 +2589,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6": + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - ms: 2.1.2 + ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 languageName: node linkType: hard @@ -2625,18 +2610,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.6": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 - languageName: node - linkType: hard - "dedent@npm:^1.0.0": version: 1.5.3 resolution: "dedent@npm:1.5.3" @@ -2670,6 +2643,13 @@ __metadata: languageName: node linkType: hard +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + "detect-indent@npm:^7.0.1": version: 7.0.1 resolution: "detect-indent@npm:7.0.1" @@ -2767,6 +2747,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.17.0": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: 4bc38cf1cea96456f97503db7280394177d1bc46f8f87c267297d04f795ac5efa81e48115a2f5b6273c781027b5b6bfc5f62b54df629e4d25fa7001a86624f59 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -2790,6 +2780,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.5.3": + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: a0cf04fb92d052647ac7d818d1913b98d3d3d0f5b9d88f0eafb993436e4c3e2c958599db68839d57f2dfa281fdf0f60e18d448eb78fc292c33c0f25635b6854f + languageName: node + linkType: hard + "esbuild@npm:^0.21.3": version: 0.21.5 resolution: "esbuild@npm:0.21.5" @@ -2870,27 +2867,13 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"escalade@npm:^3.1.2": +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - "escape-string-regexp@npm:^2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" @@ -2916,14 +2899,14 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^8.5.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + checksum: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907 languageName: node linkType: hard @@ -2938,6 +2921,43 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-typescript@npm:^3.6.3": + version: 3.6.3 + resolution: "eslint-import-resolver-typescript@npm:3.6.3" + dependencies: + "@nolyfill/is-core-module": 1.0.39 + debug: ^4.3.5 + enhanced-resolve: ^5.15.0 + eslint-module-utils: ^2.8.1 + fast-glob: ^3.3.2 + get-tsconfig: ^4.7.5 + is-bun-module: ^1.0.2 + is-glob: ^4.0.3 + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 1ed0cab4f3852de1b14ea6978e76c27694b253a289c2030a35847ba8ab6ac4258d513877f83ea7bc265f746d570240a6348b11d77cc9cd77589749ad86a32234 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.8.1": + version: 2.11.0 + resolution: "eslint-module-utils@npm:2.11.0" + dependencies: + debug: ^3.2.7 + peerDependenciesMeta: + eslint: + optional: true + checksum: 8c2ecff3484835e031c8f1aa44119be65a058d195cce7b3ac827ad7ccc8bb5f9bcdd85230e2e3398981d07789bf4d90f3b81d106e67faf3cd26e0b34d73093af + languageName: node + linkType: hard + "eslint-plugin-es-x@npm:^7.5.0": version: 7.6.0 resolution: "eslint-plugin-es-x@npm:7.6.0" @@ -2951,137 +2971,132 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import-x@npm:^0.5.1": - version: 0.5.1 - resolution: "eslint-plugin-import-x@npm:0.5.1" +"eslint-plugin-import-x@npm:^4.3.0": + version: 4.3.0 + resolution: "eslint-plugin-import-x@npm:4.3.0" dependencies: - "@typescript-eslint/utils": ^7.4.0 + "@typescript-eslint/utils": ^8.1.0 debug: ^4.3.4 doctrine: ^3.0.0 eslint-import-resolver-node: ^0.3.9 get-tsconfig: ^4.7.3 is-glob: ^4.0.3 minimatch: ^9.0.3 - semver: ^7.6.0 - tslib: ^2.6.2 + semver: ^7.6.3 + stable-hash: ^0.0.4 + tslib: ^2.6.3 peerDependencies: - eslint: ^8.56.0 || ^9.0.0-0 - checksum: 680cdccafe21491bb257e820b09975242309c507bd464afc53f61f237743c5c4989334ed272646916f4e6a41625866afc6fcdebccf47ff1d650b8a189b9ea6cb + eslint: ^8.57.0 || ^9.0.0 + checksum: f3b813ca4627cc5984a499c7cea5196e7597a8742eeafa5fa8512d452e92e06a9a48635d451c35bf44ef1472dde74a43c7f0cdb672fb3c55dfd9b1dbc46f373e languageName: node linkType: hard -"eslint-plugin-jest@npm:^27.9.0": - version: 27.9.0 - resolution: "eslint-plugin-jest@npm:27.9.0" +"eslint-plugin-jest@npm:^28.8.3": + version: 28.8.3 + resolution: "eslint-plugin-jest@npm:28.8.3" dependencies: - "@typescript-eslint/utils": ^5.10.0 + "@typescript-eslint/utils": ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 + "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 jest: "*" peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true jest: optional: true - checksum: e2a4b415105408de28ad146818fcc6f4e122f6a39c6b2216ec5c24a80393f1390298b20231b0467bc5fd730f6e24b05b89e1a6a3ce651fc159aa4174ecc233d0 + checksum: e371fcbe2127a403824b6c23b66f6b2e2cc54074c3c70a9965d48bdcdfb461670965a7d7cdddab68f09e703d3a09a281d05591b1cb4315f5246d27fd8baa84ac languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^47.0.2": - version: 47.0.2 - resolution: "eslint-plugin-jsdoc@npm:47.0.2" +"eslint-plugin-jsdoc@npm:^50.2.4": + version: 50.2.4 + resolution: "eslint-plugin-jsdoc@npm:50.2.4" dependencies: - "@es-joy/jsdoccomment": ~0.41.0 + "@es-joy/jsdoccomment": ~0.48.0 are-docs-informative: ^0.0.2 comment-parser: 1.4.1 - debug: ^4.3.4 + debug: ^4.3.6 escape-string-regexp: ^4.0.0 - esquery: ^1.5.0 - is-builtin-module: ^3.2.1 - semver: ^7.5.4 + espree: ^10.1.0 + esquery: ^1.6.0 + parse-imports: ^2.1.1 + semver: ^7.6.3 spdx-expression-parse: ^4.0.0 + synckit: ^0.9.1 peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 39ad7b746add79b0140d23b6c15c58df7f8e0912cbe10678f3acd76f0da38e2de9db39f741866dfa2ea698cc2f09c7f2e020f6136b52a22cd0b937e44722f1d4 + checksum: 41fba3564ecea3ae47a003faf6acbc848cbad18e5cb1930943804db8ed6b5ae133088fcdaf2a0c6dfb2344a545813090e6ab91b3561543213ab10558893adba6 languageName: node linkType: hard -"eslint-plugin-mocha@npm:^10.4.1": - version: 10.4.1 - resolution: "eslint-plugin-mocha@npm:10.4.1" +"eslint-plugin-mocha@npm:^10.5.0": + version: 10.5.0 + resolution: "eslint-plugin-mocha@npm:10.5.0" dependencies: eslint-utils: ^3.0.0 globals: ^13.24.0 rambda: ^7.4.0 peerDependencies: eslint: ">=7.0.0" - checksum: 26076c832899608de1f960325c4cfb4520cc644280e58879cec83596e699196c43568d67bf71880a1bd22fd1a59879645cf1690ba422ee40cbc24b77c3bfdda3 + checksum: 07fc975c7768b19de4d2883307177f10e94b6318a4971dbc3c52edcea01977a59a54b85fe564974e43b29b12b821b06afd48d95b631e84d203c44676778aa019 languageName: node linkType: hard -"eslint-plugin-n@npm:^16.6.2": - version: 16.6.2 - resolution: "eslint-plugin-n@npm:16.6.2" +"eslint-plugin-n@npm:^17.10.3": + version: 17.10.3 + resolution: "eslint-plugin-n@npm:17.10.3" dependencies: "@eslint-community/eslint-utils": ^4.4.0 - builtins: ^5.0.1 + enhanced-resolve: ^5.17.0 eslint-plugin-es-x: ^7.5.0 get-tsconfig: ^4.7.0 - globals: ^13.24.0 + globals: ^15.8.0 ignore: ^5.2.4 - is-builtin-module: ^3.2.1 - is-core-module: ^2.12.1 - minimatch: ^3.1.2 - resolve: ^1.22.2 + minimatch: ^9.0.5 semver: ^7.5.3 peerDependencies: - eslint: ">=7.0.0" - checksum: 3b468da0038cf25af582608983491b33ac2d481b6a94a0ff2e715d3b85e1ff8cb93df4cd67b689d520bea1bfb8f2b717f01606bf6b2ea19fe8f9c0999ea7057d + eslint: ">=8.23.0" + checksum: bf81911c588773b4f77d1acf3c5b2514818423d14f11320078f1c4362c78400dfc6fdfa8fc0523a24f1d04b93849656033383dc666f2c8ef3e1c5ec9bcd4e926 languageName: node linkType: hard -"eslint-plugin-prettier@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" +"eslint-plugin-prettier@npm:^5.2.1": + version: 5.2.1 + resolution: "eslint-plugin-prettier@npm:5.2.1" dependencies: prettier-linter-helpers: ^1.0.0 + synckit: ^0.9.1 peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" peerDependenciesMeta: + "@types/eslint": + optional: true eslint-config-prettier: optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + checksum: 812f4d1596dcd3a55963212dfbd818a4b38f880741aac75f6869aa740dc5d934060674d3b85d10ff9fec424defa61967dbdef26b8a893a92c9b51880264ed0d9 languageName: node linkType: hard -"eslint-plugin-promise@npm:^6.1.1": - version: 6.1.1 - resolution: "eslint-plugin-promise@npm:6.1.1" +"eslint-plugin-promise@npm:^7.1.0": + version: 7.1.0 + resolution: "eslint-plugin-promise@npm:7.1.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 46b9a4f79dae5539987922afc27cc17cbccdecf4f0ba19c0ccbf911b0e31853e9f39d9959eefb9637461b52772afa1a482f1f87ff16c1ba38bdb6fcf21897e9a - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 6b4d28cbb33847c732262aee8a1784cdfc37754e91611ac0c86bfd8dd07fbba966a953a212ae49f91de1f4a31b28d65153935b0f183ce14647b31451706f722b languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.0.2": + version: 8.0.2 + resolution: "eslint-scope@npm:8.0.2" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + checksum: bd1e7a0597ec605cf3bc9b35c9e13d7ea6c11fee031b0cada9e8993b0ecf16d81d6f40f1dcd463424af439abf53cd62302ea25707c1599689eb2750d6aa29688 languageName: node linkType: hard @@ -3103,7 +3118,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 @@ -3117,73 +3132,63 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint@npm:^9.11.0": + version: 9.11.0 + resolution: "eslint@npm:9.11.0" 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/regexpp": ^4.11.0 + "@eslint/config-array": ^0.18.0 + "@eslint/eslintrc": ^3.1.0 + "@eslint/js": 9.11.0 + "@eslint/plugin-kit": ^0.2.0 "@humanwhocodes/module-importer": ^1.0.1 + "@humanwhocodes/retry": ^0.3.0 "@nodelib/fs.walk": ^1.2.8 - "@ungap/structured-clone": ^1.2.0 ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 debug: ^4.3.2 - doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 - esquery: ^1.4.2 + eslint-scope: ^8.0.2 + eslint-visitor-keys: ^4.0.0 + espree: ^10.1.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 + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 + checksum: d652c30645df59bbbcbce4eb92f69ddb112a28243253826e53485cae760df1c900c2ba3c80a86bd48ad648c9f3c781c173c2b03f750759cfdb3365f44d6c7d01 languageName: node linkType: hard -"espree@npm:^10.0.1": - version: 10.0.1 - resolution: "espree@npm:10.0.1" +"espree@npm:^10.0.1, espree@npm:^10.1.0": + version: 10.1.0 + resolution: "espree@npm:10.1.0" dependencies: - acorn: ^8.11.3 + acorn: ^8.12.0 acorn-jsx: ^5.3.2 eslint-visitor-keys: ^4.0.0 - checksum: 62c9242a84c6741cebd35ede6574131d0419be7e5559566403e384087d99c4ddb2ced44e32acd44a4c3d8a8a84997cf8d78810c4e46b3fe25a804f1a92dc6b9d - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + checksum: a4708ab987f6c03734b8738b1588e9f31b2e305e869ca4677c60d82294eb05f7099b6687eb39eeb0913bb2d49bdf0bd0f31c511599ea7ee171281f871a9c897e languageName: node linkType: hard @@ -3197,12 +3202,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2, esquery@npm:^1.5.0": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.5.0, esquery@npm:^1.6.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 languageName: node linkType: hard @@ -3215,13 +3220,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -3315,7 +3313,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": +"fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -3360,12 +3358,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + flat-cache: ^4.0.0 + checksum: f67802d3334809048c69b3d458f672e1b6d26daefda701761c81f203b80149c35dea04d78ea4238969dd617678e530876722a0634c43031a0957f10cc3ed190f languageName: node linkType: hard @@ -3398,20 +3396,20 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + flatted: ^3.2.9 + keyv: ^4.5.4 + checksum: 899fc86bf6df093547d76e7bfaeb900824b869d7d457d02e9b8aae24836f0a99fbad79328cfd6415ee8908f180699bf259dc7614f793447cb14f707caf5996f6 languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.6 - resolution: "flatted@npm:3.2.6" - checksum: 33b87aa88dfa40ca6ee31d7df61712bbbad3d3c05c132c23e59b9b61d34631b337a18ff2b8dc5553acdc871ec72b741e485f78969cf006124a3f57174de29a0e +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 languageName: node linkType: hard @@ -3425,7 +3423,7 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0": +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: @@ -3476,6 +3474,22 @@ __metadata: languageName: node linkType: hard +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -3518,21 +3532,12 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.0": - version: 4.7.3 - resolution: "get-tsconfig@npm:4.7.3" - dependencies: - resolve-pkg-maps: ^1.0.0 - checksum: d124e6900f8beb3b71f215941096075223158d0abb09fb5daa8d83299f6c17d5e95a97d12847b387e9e716bb9bd256a473f918fb8020f3b1acc0b1e5c2830bbf - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.7.3": - version: 4.7.5 - resolution: "get-tsconfig@npm:4.7.5" +"get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.3, get-tsconfig@npm:^4.7.5": + version: 4.8.1 + resolution: "get-tsconfig@npm:4.8.1" dependencies: resolve-pkg-maps: ^1.0.0 - checksum: e5b271fae2b4cd1869bbfc58db56983026cc4a08fdba988725a6edd55d04101507de154722503a22ee35920898ff9bdcba71f99d93b17df35dddb8e8a2ad91be + checksum: 12df01672e691d2ff6db8cf7fed1ddfef90ed94a5f3d822c63c147a26742026d582acd86afcd6f65db67d809625d17dd7f9d34f4d3f38f69bc2f48e19b2bdd5b languageName: node linkType: hard @@ -3590,6 +3595,19 @@ __metadata: languageName: node linkType: hard +"glob@npm:^8.0.1": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -3597,7 +3615,7 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0, globals@npm:^13.24.0": +"globals@npm:^13.24.0": version: 13.24.0 resolution: "globals@npm:13.24.0" dependencies: @@ -3613,24 +3631,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^15.0.0": - version: 15.0.0 - resolution: "globals@npm:15.0.0" - checksum: c2f409354415a6d24125e6d80089bd9d72b0c7a7cfba83fd555d217560743a1022a9d6e937dc2ab866f3c4e665c81ad4efde91c5a8e3f31d05b60a4831271068 - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 +"globals@npm:^15.8.0, globals@npm:^15.9.0": + version: 15.9.0 + resolution: "globals@npm:15.9.0" + checksum: 32c4470ffcc26db3ddbc579ddf968b74c26462d1a268039980c2fa2e107090fd442a7a7445d953dc4ee874f68846e713066c5a8e63d146fd9349cd1fc5a6f63d languageName: node linkType: hard @@ -3647,14 +3651,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -3668,13 +3665,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -3682,6 +3672,13 @@ __metadata: languageName: node linkType: hard +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + "hasown@npm:^2.0.0": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -3707,13 +3704,24 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 languageName: node linkType: hard +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -3724,6 +3732,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + "https-proxy-agent@npm:^7.0.1": version: 7.0.4 resolution: "https-proxy-agent@npm:7.0.4" @@ -3741,6 +3759,15 @@ __metadata: languageName: node linkType: hard +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + "iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -3750,14 +3777,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 71d7bb4c1dbe020f915fd881108cbe85a0db3d636a0ea3ba911393c53946711d13a9b1143c7e70db06d571a5822c0a324a6bcde5c9904e7ca5047f01f1bf8cd3 - languageName: node - linkType: hard - -"ignore@npm:^5.3.1": +"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be @@ -3800,6 +3820,13 @@ __metadata: languageName: node linkType: hard +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -3810,7 +3837,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2": +"inherits@npm:2, inherits@npm:^2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -3834,16 +3861,16 @@ __metadata: languageName: node linkType: hard -"is-builtin-module@npm:^3.2.1": - version: 3.2.1 - resolution: "is-builtin-module@npm:3.2.1" +"is-bun-module@npm:^1.0.2": + version: 1.2.1 + resolution: "is-bun-module@npm:1.2.1" dependencies: - builtin-modules: ^3.3.0 - checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 + semver: ^7.6.3 + checksum: 1c2cbcf1a76991add1b640d2d7fe09848e8697a76f96e1289dff44133a48c97f5dc601d4a66d3f3a86217a77178d72d33d10d0c9e14194e58e70ec8df3eae41a languageName: node linkType: hard -"is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -4485,10 +4512,10 @@ __metadata: languageName: node linkType: hard -"jsdoc-type-pratt-parser@npm:~4.0.0": - version: 4.0.0 - resolution: "jsdoc-type-pratt-parser@npm:4.0.0" - checksum: af0629c9517e484be778d8564440fec8de5b7610e0c9c88a3ba4554321364faf72b46689c8d8845faa12c0718437a9ed97e231977efc0f2d50e8a2dbad807eb3 +"jsdoc-type-pratt-parser@npm:~4.1.0": + version: 4.1.0 + resolution: "jsdoc-type-pratt-parser@npm:4.1.0" + checksum: e7642a508b090b1bdf17775383000ed71013c38e1231c1e576e5374636e8baf7c3fae8bf0252f5e1d3397d95efd56e8c8a5dd1a0de76d05d1499cbcb3c325bc3 languageName: node linkType: hard @@ -4501,6 +4528,13 @@ __metadata: languageName: node linkType: hard +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -4538,6 +4572,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -4619,6 +4662,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + "magic-string@npm:^0.30.11": version: 0.30.11 resolution: "magic-string@npm:0.30.11" @@ -4637,6 +4687,30 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^10.0.3": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^16.1.0 + http-cache-semantics: ^4.1.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-fetch: ^2.0.3 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^9.0.0 + checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + languageName: node + linkType: hard + "make-fetch-happen@npm:^13.0.0": version: 13.0.0 resolution: "make-fetch-happen@npm:13.0.0" @@ -4703,7 +4777,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -4712,30 +4786,30 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 languageName: node linkType: hard -"minimatch@npm:^9.0.3": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: ^2.0.1 - checksum: cf717f597ec3eed7dabc33153482a2e8d49f4fd3c26e58fd9c71a94c5029a0838728841b93f46bf1263b65a8010e2ee800d0dc9b004ab8ba8b6d1ec07cc115b5 + checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 languageName: node linkType: hard -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" dependencies: - brace-expansion: ^2.0.1 - checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 languageName: node linkType: hard @@ -4748,6 +4822,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^2.0.3": + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" + dependencies: + encoding: ^0.1.13 + minipass: ^3.1.6 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + languageName: node + linkType: hard + "minipass-fetch@npm:^3.0.0": version: 3.0.4 resolution: "minipass-fetch@npm:3.0.4" @@ -4790,12 +4879,12 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0": - version: 3.3.5 - resolution: "minipass@npm:3.3.5" +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" dependencies: yallist: ^4.0.0 - checksum: f89f02bcaa0e0e4bb4c44ec796008e69fbca62db0aba6ead1bc57d25bdaefdf42102130f4f9ecb7d9c6b6cd35ff7b0c7b97d001d3435da8e629fb68af3aea57e + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 languageName: node linkType: hard @@ -4823,7 +4912,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -4832,14 +4921,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -4870,8 +4952,8 @@ __metadata: linkType: hard "node-gyp@npm:^10.0.0": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" + version: 10.2.0 + resolution: "node-gyp@npm:10.2.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -4879,33 +4961,33 @@ __metadata: graceful-fs: ^4.2.6 make-fetch-happen: ^13.0.0 nopt: ^7.0.0 - proc-log: ^3.0.0 + proc-log: ^4.1.0 semver: ^7.3.5 - tar: ^6.1.2 + tar: ^6.2.1 which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 72e2ab4b23fc32007a763da94018f58069fc0694bf36115d49a2b195c8831e12cf5dd1e7a3718fa85c06969aedf8fc126722d3b672ec1cb27e06ed33caee3c60 + checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f languageName: node linkType: hard "node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" + version: 9.3.0 + resolution: "node-gyp@npm:9.3.0" dependencies: env-paths: ^2.2.0 - exponential-backoff: ^3.1.1 - glob: ^10.3.10 + glob: ^7.1.4 graceful-fs: ^4.2.6 - make-fetch-happen: ^13.0.0 - nopt: ^7.0.0 - proc-log: ^4.1.0 + make-fetch-happen: ^10.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 semver: ^7.3.5 - tar: ^6.2.1 - which: ^4.0.0 + tar: ^6.1.2 + which: ^2.0.2 bin: node-gyp: bin/node-gyp.js - checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f + checksum: 589ddd3ed967724ef425f9624bfa47cf73022640ab3eba6d556e92cdc4ddef33b63fce3a467c93b995a3f61df92eafd3c3d1e8dbe4a2c00c383334487dea99c3 languageName: node linkType: hard @@ -4923,6 +5005,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + "nopt@npm:^7.0.0": version: 7.2.0 resolution: "nopt@npm:7.2.0" @@ -5002,6 +5095,18 @@ __metadata: languageName: node linkType: hard +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + "once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -5095,6 +5200,16 @@ __metadata: languageName: node linkType: hard +"parse-imports@npm:^2.1.1": + version: 2.2.1 + resolution: "parse-imports@npm:2.2.1" + dependencies: + es-module-lexer: ^1.5.3 + slashes: ^3.0.12 + checksum: 0b5cedd10b6b45eea4f365bf047074a874d90e952597f83d4a8a00f1edece180b5870e42401b5531088916836f98c20eecbddc608d8717eb4a6be99a41f2b6fd + languageName: node + linkType: hard + "parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -5230,22 +5345,22 @@ __metadata: languageName: node linkType: hard -"prettier-plugin-packagejson@npm:^2.2.18": - version: 2.5.0 - resolution: "prettier-plugin-packagejson@npm:2.5.0" +"prettier-plugin-packagejson@npm:^2.5.2": + version: 2.5.2 + resolution: "prettier-plugin-packagejson@npm:2.5.2" dependencies: - sort-package-json: 2.10.0 - synckit: 0.9.0 + sort-package-json: 2.10.1 + synckit: 0.9.1 peerDependencies: prettier: ">= 1.16.0" peerDependenciesMeta: prettier: optional: true - checksum: 0b05b02e96173abc1220d11a5ae6fbdefd45823ad86e5aba70bd52377f555db82fbe41c67bdfb186fa3f4c2ef5d12d4803b7215cb301533829a8389b411bb99a + checksum: f280d69327a468cd104c72a81134258d3573e56d697a88a5c4498c8d02cecda9a27d9eb3f1d29cc726491782eb3f279c9d41ecf8364a197e20b239c5ccfd0269 languageName: node linkType: hard -"prettier@npm:^2.7.1, prettier@npm:^2.8.8": +"prettier@npm:^2.8.8": version: 2.8.8 resolution: "prettier@npm:2.8.8" bin: @@ -5254,6 +5369,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.3.3": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" + bin: + prettier: bin/prettier.cjs + checksum: bc8604354805acfdde6106852d14b045bb20827ad76a5ffc2455b71a8257f94de93f17f14e463fe844808d2ccc87248364a5691488a3304f1031326e62d9276e + languageName: node + linkType: hard + "pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" @@ -5341,6 +5465,17 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -5385,7 +5520,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.20.0, resolve@npm:^1.22.2, resolve@npm:^1.22.4": +"resolve@npm:1.22.8, resolve@npm:^1.20.0, resolve@npm:^1.22.4": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -5398,7 +5533,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.2#~builtin, resolve@patch:resolve@^1.22.4#~builtin": +"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.4#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" dependencies: @@ -5503,24 +5638,30 @@ __metadata: version: 0.0.0-use.local resolution: "root@workspace:." dependencies: - "@eslint/eslintrc": ^3.0.2 - "@eslint/js": ^8.57.0 + "@eslint/config-array": ^0.18.0 + "@eslint/js": ^9.11.0 "@lavamoat/allow-scripts": ^3.0.4 "@metamask/auto-changelog": ^3.4.4 "@metamask/eslint-config": ^13.0.0 + "@metamask/eslint-config-jest": "workspace:^" "@metamask/eslint-config-nodejs": ^13.0.0 + "@metamask/eslint-config-typescript": "workspace:^" "@metamask/utils": ^9.1.0 - eslint: ^8.57.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import-x: ^0.5.1 - eslint-plugin-jest: ^27.9.0 - eslint-plugin-jsdoc: ^47.0.2 - eslint-plugin-n: ^16.6.2 - eslint-plugin-prettier: ^4.2.1 + "@types/eslint__js": ^8.42.3 + "@types/node": ^22.5.5 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jest: ^28.8.3 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-n: ^17.10.3 + eslint-plugin-prettier: ^5.2.1 fast-deep-equal: ^3.1.3 - globals: ^15.0.0 - prettier: ^2.7.1 - prettier-plugin-packagejson: ^2.2.18 + globals: ^15.9.0 + prettier: ^3.3.3 + prettier-plugin-packagejson: ^2.5.2 + typescript: ~5.5.4 + typescript-eslint: ^8.6.0 vite: ^5.4.7 vitest: ^2.1.1 languageName: unknown @@ -5533,6 +5674,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -5549,12 +5697,19 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": - version: 7.6.2 - resolution: "semver@npm:7.6.2" +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 40f6a95101e8d854357a644da1b8dd9d93ce786d5c6a77227bc69dbb17bea83d0d1d1d7c4cd5920a6df909f48e8bd8a5909869535007f90278289f2451d0292d + checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 languageName: node linkType: hard @@ -5616,6 +5771,13 @@ __metadata: languageName: node linkType: hard +"slashes@npm:^3.0.12": + version: 3.0.12 + resolution: "slashes@npm:3.0.12" + checksum: 6b68feb5a56d53d76acd4729b0e457f47a0b687877161ca2c05486ec0bc750e0694b37094b2f5f00a339dfe490269292c4197a70da7eba2be47bc56e35f10a60 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -5623,6 +5785,17 @@ __metadata: languageName: node linkType: hard +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^8.0.1": version: 8.0.2 resolution: "socks-proxy-agent@npm:8.0.2" @@ -5634,13 +5807,13 @@ __metadata: languageName: node linkType: hard -"socks@npm:^2.7.1": - version: 2.8.1 - resolution: "socks@npm:2.8.1" +"socks@npm:^2.6.2, socks@npm:^2.7.1": + version: 2.8.3 + resolution: "socks@npm:2.8.3" dependencies: ip-address: ^9.0.5 smart-buffer: ^4.2.0 - checksum: 29586d42e9c36c5016632b2bcb6595e3adfbcb694b3a652c51bc8741b079c5ec37bdd5675a1a89a1620078c8137208294991fabb50786f92d47759a725b2b62e + checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd languageName: node linkType: hard @@ -5651,9 +5824,9 @@ __metadata: languageName: node linkType: hard -"sort-package-json@npm:2.10.0": - version: 2.10.0 - resolution: "sort-package-json@npm:2.10.0" +"sort-package-json@npm:2.10.1": + version: 2.10.1 + resolution: "sort-package-json@npm:2.10.1" dependencies: detect-indent: ^7.0.1 detect-newline: ^4.0.0 @@ -5665,7 +5838,7 @@ __metadata: sort-object-keys: ^1.1.3 bin: sort-package-json: cli.js - checksum: 095e5c5075c9799d3d6174f82e963fa3be0a1d193af0be656b651d2e5b563dfc794f46c7aa74e3fc761de3fba76951ad2d3de716cf50b3aca4e938f63edbfcae + checksum: 861d8161565fba322414d70b6be10fb331680549b73399778965be628783833c85c4e02929bcea5a2d96994884b0327dfe2f7c7a79409c901d2582b703f5333d languageName: node linkType: hard @@ -5760,6 +5933,22 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^9.0.0": + version: 9.0.1 + resolution: "ssri@npm:9.0.1" + dependencies: + minipass: ^3.1.1 + checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb + languageName: node + linkType: hard + +"stable-hash@npm:^0.0.4": + version: 0.0.4 + resolution: "stable-hash@npm:0.0.4" + checksum: 21c039d21c1cb739cf8342561753a5e007cb95ea682ccd452e76310bbb9c6987a89de8eda023e320b019f3e4691aabda75079cdbb7dadf7ab9013e931f2f23cd + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -5793,7 +5982,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -5815,6 +6004,15 @@ __metadata: languageName: node linkType: hard +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -5854,15 +6052,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -5888,13 +6077,20 @@ __metadata: languageName: node linkType: hard -"synckit@npm:0.9.0": - version: 0.9.0 - resolution: "synckit@npm:0.9.0" +"synckit@npm:0.9.1, synckit@npm:^0.9.1": + version: 0.9.1 + resolution: "synckit@npm:0.9.1" dependencies: "@pkgr/core": ^0.1.0 tslib: ^2.6.2 - checksum: c38bc3df0306c3242ddc5628d766ef0b4ca85a8a861b0a26b03483f09eca31a7fbdbcefb1b9fdee9e49db7739df25ce728cb2c6aef02ddc58bf46ee71924a36b + checksum: 4042941a4d939675f1d7b01124b8405b6ac616f3e3f396d00e46c67f38d0d5b7f9a1de05bc7ceea4ce80d967b450cfa2460e5f6aca81f7cea8f1a28be9392985 + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 languageName: node linkType: hard @@ -5997,28 +6193,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": - version: 1.10.0 - resolution: "tslib@npm:1.10.0" - checksum: 1d0450dc6f64b918b14acaf3b956ebe1c72d7401c632adce932a60e3cd8d2a70f6040ceef6a7c3561146c3f29bcf584c41c2e09a5d20a27d6c3057f0d5f2a836 - languageName: node - linkType: hard - -"tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad - languageName: node - linkType: hard - -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 +"tslib@npm:^2.6.2, tslib@npm:^2.6.3": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 languageName: node linkType: hard @@ -6052,6 +6230,20 @@ __metadata: languageName: node linkType: hard +"typescript-eslint@npm:^8.6.0": + version: 8.6.0 + resolution: "typescript-eslint@npm:8.6.0" + dependencies: + "@typescript-eslint/eslint-plugin": 8.6.0 + "@typescript-eslint/parser": 8.6.0 + "@typescript-eslint/utils": 8.6.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: cc773dae0fd7ad568e58d7001ee1adb7d880e9dadd3953ff762d3a1d38bb3a8d0da2e2fdade804a90f23d9f426e5b94c7262b2747eb471ce342ed2cc3878bdaa + languageName: node + linkType: hard + "typescript@npm:~5.5.4": version: 5.5.4 resolution: "typescript@npm:5.5.4" @@ -6079,6 +6271,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" + dependencies: + unique-slug: ^3.0.0 + checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -6088,6 +6289,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + languageName: node + linkType: hard + "unique-slug@npm:^4.0.0": version: 4.0.0 resolution: "unique-slug@npm:4.0.0" @@ -6120,6 +6330,13 @@ __metadata: languageName: node linkType: hard +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + "uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" @@ -6274,7 +6491,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^2.0.1": +"which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: @@ -6308,6 +6525,15 @@ __metadata: languageName: node linkType: hard +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0"