diff --git a/.eslintignore b/.eslintignore index 572c354a4e..112d7c2f68 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,4 @@ node_modules/ -builds/ \ No newline at end of file +builds/ +test-results/* +.vscode/* \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index faee1c51d0..0000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,699 +0,0 @@ -{ - "root": true, - "extends": [ - "eslint:recommended", - "plugin:jsonc/recommended-with-json", - "plugin:eslint-comments/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2022, - "sourceType": "module", - "ecmaFeatures": { - "globalReturn": false, - "impliedStrict": true - }, - "project": [ - "./jsconfig.json", - "./dev/jsconfig.json", - "./test/jsconfig.json", - "./benches/jsconfig.json" - ] - }, - "env": { - "browser": true, - "es2022": true, - "webextensions": true - }, - "plugins": [ - "no-unsanitized", - "header", - "jsdoc", - "jsonc", - "unused-imports", - "@typescript-eslint", - "@stylistic", - "unicorn", - "sonarjs", - "import" - ], - "ignorePatterns": [ - "/ext/lib/", - "/dev/lib/handlebars/" - ], - "rules": { - "accessor-pairs": "error", - "curly": ["error", "all"], - "default-case-last": "error", - "dot-notation": "error", - "eqeqeq": "error", - "func-names": ["error", "always"], - "guard-for-in": "error", - "grouped-accessor-pairs": "error", - "new-cap": "error", - "no-alert": "error", - "no-case-declarations": "error", - "no-caller": "error", - "no-const-assign": "error", - "no-constant-condition": ["error", {"checkLoops": false}], - "no-constructor-return": "error", - "no-duplicate-imports": "error", - "no-eval": "error", - "no-extend-native": "error", - "no-global-assign": "error", - "no-implicit-globals": "error", - "no-implied-eval": "error", - "no-new": "error", - "no-new-native-nonconstructor": "error", - "no-octal": "error", - "no-octal-escape": "error", - "no-param-reassign": "off", - "no-promise-executor-return": "error", - "no-prototype-builtins": "error", - "no-restricted-syntax": [ - "error", - { - "message": "Avoid using JSON.parse(), prefer parseJson.", - "selector": "MemberExpression[object.name=JSON][property.name=parse]" - }, - { - "message": "Avoid using Response.json(), prefer readResponseJson.", - "selector": "MemberExpression[property.name=json]" - } - ], - "no-self-compare": "error", - "no-sequences": "error", - "no-shadow": ["error", {"builtinGlobals": false}], - "no-shadow-restricted-names": "error", - "no-template-curly-in-string": "error", - "no-undef": "error", - "no-undefined": "error", - "no-underscore-dangle": ["error", {"allowAfterThis": true, "allowAfterSuper": false, "allowAfterThisConstructor": false}], - "no-unexpected-multiline": "error", - "no-unneeded-ternary": "error", - "no-unused-vars": ["error", {"vars": "local", "args": "after-used", "argsIgnorePattern": "^_", "caughtErrors": "none"}], - "no-unused-expressions": "error", - "no-var": "error", - "no-with": "error", - "prefer-const": ["error", {"destructuring": "all"}], - "radix": "error", - "require-atomic-updates": "off", - "sort-imports": "off", - "yoda": ["error", "never"], - - "@stylistic/array-bracket-newline": ["error", "consistent"], - "@stylistic/array-bracket-spacing": ["error", "never"], - "@stylistic/array-element-newline": ["error", "consistent"], - "@stylistic/arrow-parens": ["error", "always"], - "@stylistic/arrow-spacing": ["error", {"before": true, "after": true}], - "@stylistic/block-spacing": ["error", "always"], - "@stylistic/brace-style": ["error", "1tbs", {"allowSingleLine": true}], - "@stylistic/comma-dangle": ["error", "always-multiline"], - "@stylistic/comma-spacing": ["error", {"before": false, "after": true}], - "@stylistic/comma-style": ["error", "last"], - "@stylistic/computed-property-spacing": ["error", "never"], - "@stylistic/dot-location": ["error", "property"], - "@stylistic/eol-last": ["error", "always"], - "@stylistic/func-call-spacing": ["error", "never"], - "@stylistic/function-call-argument-newline": ["error", "consistent"], - "@stylistic/function-call-spacing": ["error", "never"], - "@stylistic/function-paren-newline": ["error", "multiline-arguments"], - "@stylistic/generator-star-spacing": ["error", "before"], - "@stylistic/implicit-arrow-linebreak": ["error", "beside"], - "@stylistic/indent": ["error", 4, {"SwitchCase": 1, "MemberExpression": 1, "flatTernaryExpressions": true, "ignoredNodes": ["ConditionalExpression"]}], - "@stylistic/indent-binary-ops": ["error", 0], - "@stylistic/key-spacing": ["error", {"beforeColon": false, "afterColon": true, "mode": "strict"}], - "@stylistic/keyword-spacing": ["error", {"before": true, "after": true}], - "@stylistic/linebreak-style": ["error", "unix"], - "@stylistic/lines-around-comment": "off", - "@stylistic/lines-between-class-members": ["error", "always", {"exceptAfterSingleLine": true}], - "@stylistic/max-len": "off", - "@stylistic/max-statements-per-line": ["error", {"max": 2}], - "@stylistic/member-delimiter-style": [ - "error", - { - "multiline": {"delimiter": "semi", "requireLast": true}, - "singleline": {"delimiter": "comma", "requireLast": false}, - "multilineDetection": "brackets" - } - ], - "@stylistic/multiline-ternary": ["error", "always-multiline"], - "@stylistic/new-parens": "error", - "@stylistic/newline-per-chained-call": ["error", {"ignoreChainWithDepth": 3}], - "@stylistic/no-confusing-arrow": "error", - "@stylistic/no-extra-parens": "off", - "@stylistic/no-extra-semi": "error", - "@stylistic/no-floating-decimal": "error", - "@stylistic/no-mixed-operators": ["error", {"allowSamePrecedence": true, "groups": [["&&", "||"]]}], - "@stylistic/no-mixed-spaces-and-tabs": "error", - "@stylistic/no-multi-spaces": "error", - "@stylistic/no-multiple-empty-lines": ["error", {"max": 2, "maxEOF": 0, "maxBOF": 0}], - "@stylistic/no-tabs": "error", - "@stylistic/no-trailing-spaces": "error", - "@stylistic/no-whitespace-before-property": "error", - "@stylistic/nonblock-statement-body-position": ["error", "beside"], - "@stylistic/object-curly-newline": "error", - "@stylistic/object-curly-spacing": ["error", "never"], - "@stylistic/object-property-newline": ["error", {"allowAllPropertiesOnSameLine": true}], - "@stylistic/one-var-declaration-per-line": ["error", "initializations"], - "@stylistic/operator-linebreak": ["error", "after"], - "@stylistic/padded-blocks": ["error", "never"], - "@stylistic/padding-line-between-statements": [ - "error", - {"blankLine": "always", "prev": "*", "next": "import"}, - {"blankLine": "always", "prev": "import", "next": "*"}, - {"blankLine": "always", "prev": "*", "next": "export"}, - {"blankLine": "always", "prev": "import", "next": "let"}, - {"blankLine": "always", "prev": "import", "next": "const"}, - {"blankLine": "always", "prev": "export", "next": "let"}, - {"blankLine": "always", "prev": "export", "next": "const"}, - {"blankLine": "always", "prev": "export", "next": "export"}, - {"blankLine": "always", "prev": "export", "next": "type"}, - {"blankLine": "always", "prev": "type", "next": "export"}, - {"blankLine": "always", "prev": "type", "next": "type"}, - {"blankLine": "never", "prev": "import", "next": "import"} - ], - "@stylistic/quote-props": ["error", "consistent-as-needed", {"numbers": true}], - "@stylistic/quotes": ["error", "single", "avoid-escape"], - "@stylistic/rest-spread-spacing": ["error", "never"], - "@stylistic/semi": "error", - "@stylistic/semi-spacing": ["error", {"before": false, "after": true}], - "@stylistic/semi-style": ["error", "last"], - "@stylistic/space-before-blocks": ["error", "always"], - "@stylistic/space-before-function-paren": ["error", {"anonymous": "never", "named": "never", "asyncArrow": "always"}], - "@stylistic/space-in-parens": ["error", "never"], - "@stylistic/space-infix-ops": ["error", {"int32Hint": false}], - "@stylistic/space-unary-ops": "error", - "@stylistic/spaced-comment": ["error", "always"], - "@stylistic/switch-colon-spacing": ["error", {"after": true, "before": false}], - "@stylistic/template-curly-spacing": ["error", "never"], - "@stylistic/template-tag-spacing": ["error", "never"], - "@stylistic/type-annotation-spacing": [ - "error", - { - "before": false, - "after": true, - "overrides": { - "arrow": {"before": true, "after": true} - } - } - ], - "@stylistic/type-generic-spacing": "error", - "@stylistic/type-named-tuple-spacing": "error", - "@stylistic/wrap-iife": ["error", "inside"], - "@stylistic/wrap-regex": "off", - "@stylistic/yield-star-spacing": ["error", {"before": true, "after": false}], - - "no-unsanitized/method": "error", - "no-unsanitized/property": "error", - - "jsdoc/check-access": "error", - "jsdoc/check-alignment": "error", - "jsdoc/check-line-alignment": ["error", "never", {"wrapIndent": " "}], - "jsdoc/check-param-names": "error", - "jsdoc/check-property-names": "error", - "jsdoc/check-tag-names": "error", - "jsdoc/empty-tags": "error", - "jsdoc/check-types": "error", - "jsdoc/check-values": "error", - "jsdoc/implements-on-classes": "error", - "jsdoc/multiline-blocks": "error", - "jsdoc/no-bad-blocks": "error", - "jsdoc/no-multi-asterisks": "error", - "jsdoc/no-undefined-types": "error", - "jsdoc/require-asterisk-prefix": "error", - "jsdoc/require-description": "off", - "jsdoc/require-hyphen-before-param-description": ["error", "never"], - "jsdoc/require-jsdoc": [ - "error", - { - "require": { - "ClassDeclaration": false, - "FunctionDeclaration": true, - "MethodDefinition": false - }, - "contexts": [ - "MethodDefinition[kind=constructor]>FunctionExpression>BlockStatement>ExpressionStatement>AssignmentExpression[left.object.type=ThisExpression]", - "ClassDeclaration>Classbody>PropertyDefinition", - "MethodDefinition[kind!=constructor][kind!=set]", - "MethodDefinition[kind=constructor][value.params.length>0]" - ], - "checkGetters": "no-setter", - "checkSetters": "no-getter" - } - ], - "jsdoc/require-param": "error", - "jsdoc/require-param-description": "off", - "jsdoc/require-param-name": "error", - "jsdoc/require-param-type": "error", - "jsdoc/require-property": "error", - "jsdoc/require-property-description": "off", - "jsdoc/require-property-name": "error", - "jsdoc/require-property-type": "error", - "jsdoc/require-returns": "error", - "jsdoc/require-returns-check": "error", - "jsdoc/require-returns-description": "off", - "jsdoc/require-returns-type": "error", - "jsdoc/require-throws": "error", - "jsdoc/require-yields": "error", - "jsdoc/require-yields-check": "error", - "jsdoc/tag-lines": ["error", "never", {"startLines": 0}], - "jsdoc/valid-types": "error", - - "jsonc/indent": ["error", 4], - "jsonc/array-bracket-newline": ["error", "consistent"], - "jsonc/array-bracket-spacing": ["error", "never"], - "jsonc/array-element-newline": ["error", "consistent"], - "jsonc/comma-style": ["error", "last"], - "jsonc/key-spacing": ["error", {"beforeColon": false, "afterColon": true, "mode": "strict"}], - "jsonc/no-octal-escape": "error", - "jsonc/object-curly-newline": ["error", {"consistent": true}], - "jsonc/object-curly-spacing": ["error", "never"], - "jsonc/object-property-newline": ["error", {"allowAllPropertiesOnSameLine": true}], - - "eslint-comments/no-unused-disable": "error", - - "unused-imports/no-unused-imports": "error", - - "import/extensions": ["error", "ignorePackages"], - - "unicorn/catch-error-name": ["error", {"ignore": ["^(e|error2?)$"]}], - "unicorn/custom-error-definition": "error", - "unicorn/empty-brace-spaces": "error", - "unicorn/error-message": "error", - "unicorn/expiring-todo-comments": "error", - "unicorn/explicit-length-check": "error", - "unicorn/new-for-builtins": "error", - "unicorn/no-abusive-eslint-disable": "error", - "unicorn/no-array-for-each": "error", - "unicorn/no-array-method-this-argument": "error", - "unicorn/no-array-push-push": "error", - "unicorn/no-array-reduce": "error", - "unicorn/no-console-spaces": "error", - "unicorn/no-document-cookie": "error", - "unicorn/no-empty-file": "error", - "unicorn/no-hex-escape": "error", - "unicorn/no-instanceof-array": "error", - "unicorn/no-invalid-remove-event-listener": "error", - "unicorn/no-lonely-if": "error", - "unicorn/no-nested-ternary": "error", - "unicorn/no-new-buffer": "error", - "unicorn/no-object-as-default-parameter": "error", - "unicorn/no-static-only-class": "error", - "unicorn/no-thenable": "error", - "unicorn/no-unnecessary-await": "error", - "unicorn/no-unnecessary-polyfills": "error", - "unicorn/no-unreadable-array-destructuring": "error", - "unicorn/no-unreadable-iife": "error", - "unicorn/no-useless-fallback-in-spread": "error", - "unicorn/no-useless-length-check": "error", - "unicorn/no-useless-promise-resolve-reject": "error", - "unicorn/no-useless-spread": "error", - "unicorn/no-useless-switch-case": "error", - "unicorn/no-useless-undefined": "error", - "unicorn/no-zero-fractions": "error", - "unicorn/prefer-array-find": "error", - "unicorn/prefer-array-flat": "error", - "unicorn/prefer-array-flat-map": "error", - "unicorn/prefer-array-index-of": "error", - "unicorn/prefer-array-some": "error", - "unicorn/prefer-date-now": "error", - "unicorn/prefer-default-parameters": "error", - "unicorn/prefer-dom-node-dataset": "error", - "unicorn/prefer-dom-node-text-content": "error", - "unicorn/prefer-event-target": "error", - "unicorn/prefer-export-from": "error", - "unicorn/prefer-includes": "error", - "unicorn/prefer-keyboard-event-key": "error", - "unicorn/prefer-logical-operator-over-ternary": "error", - "unicorn/prefer-modern-math-apis": "error", - "unicorn/prefer-module": "error", - "unicorn/prefer-native-coercion-functions": "error", - "unicorn/prefer-negative-index": "error", - "unicorn/prefer-number-properties": "error", - "unicorn/prefer-object-from-entries": "error", - "unicorn/prefer-prototype-methods": "error", - "unicorn/prefer-reflect-apply": "error", - "unicorn/prefer-regexp-test": "error", - "unicorn/prefer-set-has": "error", - "unicorn/prefer-set-size": "error", - "unicorn/prefer-spread": "error", - "unicorn/prefer-string-starts-ends-with": "error", - "unicorn/prefer-string-trim-start-end": "error", - "unicorn/prefer-switch": "error", - "unicorn/prefer-ternary": "error", - "unicorn/relative-url-style": "error", - "unicorn/require-array-join-separator": "error", - "unicorn/require-number-to-fixed-digits-argument": "error", - "unicorn/template-indent": "error", - "unicorn/throw-new-error": "error", - - "sonarjs/max-switch-cases": "error", - "sonarjs/no-all-duplicated-branches": "error", - "sonarjs/no-collapsible-if": "error", - "sonarjs/no-collection-size-mischeck": "error", - "sonarjs/no-duplicated-branches": "error", - "sonarjs/no-element-overwrite": "error", - "sonarjs/no-empty-collection": "error", - "sonarjs/no-extra-arguments": "error", - "sonarjs/no-gratuitous-expressions": "error", - "sonarjs/no-identical-conditions": "error", - "sonarjs/no-identical-expressions": "error", - "sonarjs/no-identical-functions": "error", - "sonarjs/no-ignored-return": "error", - "sonarjs/no-inverted-boolean-check": "error", - "sonarjs/no-one-iteration-loop": "error", - "sonarjs/no-redundant-boolean": "error", - "sonarjs/no-redundant-jump": "error", - "sonarjs/no-same-line-conditional": "error", - "sonarjs/no-unused-collection": "error", - "sonarjs/no-use-of-empty-return-value": "error", - "sonarjs/no-useless-catch": "error", - "sonarjs/non-existent-operator": "error", - "sonarjs/prefer-immediate-return": "error", - "sonarjs/prefer-object-literal": "error", - "sonarjs/prefer-single-boolean-return": "error", - "sonarjs/prefer-while": "error" - }, - "overrides": [ - { - "files": [ - "*.js", - "*.ts" - ], - "extends": [ - "plugin:@typescript-eslint/recommended-type-checked" - ], - "rules": { - "@typescript-eslint/no-floating-promises": ["error", {"ignoreIIFE": true}], - "@typescript-eslint/no-misused-promises": "off", - "@typescript-eslint/no-redundant-type-constituents": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-enum-comparison": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/require-await": "off", - "@typescript-eslint/restrict-template-expressions": "off", - - "@typescript-eslint/ban-ts-comment": ["error", {"ts-expect-error": {"descriptionFormat": "^ - .+$"}}], - "@typescript-eslint/ban-types": ["error", {"types": {"object": true}, "extendDefaults": true}], - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-shadow": ["error", {"builtinGlobals": false}], - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unused-vars": ["error", {"vars": "local", "args": "after-used", "argsIgnorePattern": "^_", "caughtErrors": "none"}] - } - }, - { - "files": [ - "*.ts" - ], - "rules": { - "@stylistic/block-spacing": "off", - "@stylistic/comma-dangle": [ - "error", - { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "always-multiline", - "enums": "always-multiline", - "generics": "always-multiline", - "tuples": "always-multiline" - } - ], - "@stylistic/indent-binary-ops": "off", - "@stylistic/no-multiple-empty-lines": ["error", {"max": 1, "maxEOF": 0, "maxBOF": 0}], - "@stylistic/no-extra-parens": ["error", "all"] - } - }, - { - "files": [ - "*.json" - ], - "parser": "jsonc-eslint-parser" - }, - { - "files": [ - "ext/data/schemas/options-schema.json" - ], - "rules": { - "@stylistic/no-multi-spaces": "off" - } - }, - { - "files": [ - "test/data/anki-note-builder-test-results.json", - "test/data/database-test-cases.json", - "test/data/translator-test-results-note-data1.json", - "test/data/translator-test-results.json" - ], - "rules": { - "jsonc/indent": ["error", 2] - } - }, - { - "files": [ - "test/data/dictionaries/valid-dictionary1/term_bank_1.json", - "test/data/dictionaries/valid-dictionary1/term_bank_2.json" - ], - "rules": { - "jsonc/array-element-newline": "off", - "jsonc/object-property-newline": "off" - } - }, - { - "files": [ - "*.js", - "*.ts" - ], - "rules": { - "header/header": [ - "error", - "block", - { - "pattern": " \\* Copyright \\(C\\) (2023-)?2024 Yomitan Authors(\n \\* Copyright \\(C\\) (20(16|17|18|19|20|21)-)?2022 Yomichan Authors)?\n \\*\n \\* This program is free software: you can redistribute it and/or modify\n \\* it under the terms of the GNU General Public License as published by\n \\* the Free Software Foundation, either version 3 of the License, or\n \\* \\(at your option\\) any later version\\.\n \\*\n \\* This program is distributed in the hope that it will be useful,\n \\* but WITHOUT ANY WARRANTY; without even the implied warranty of\n \\* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE\\. See the\n \\* GNU General Public License for more details\\.\n \\*\n \\* You should have received a copy of the GNU General Public License\n \\* along with this program\\. If not, see \\.\n " - } - ] - } - }, - { - "files": [ - "ext/**/*.js" - ], - "rules": { - "no-console": "error" - } - }, - { - "files": [ - "test/**/*.js", - "dev/**/*.js", - "integration.spec.js", - "playwright.config.js", - "playwright-util.js", - "visual.spec.js" - ], - "env": { - "browser": false, - "node": true, - "webextensions": false - } - }, - { - "files": [ - "test/data/html/**/*.js" - ], - "parserOptions": { - "sourceType": "script" - }, - "env": { - "browser": true, - "node": false, - "webextensions": false - } - }, - { - "files": [ - "test/data/html/**/*.js" - ], - "excludedFiles": [ - "test/data/html/js/html-test-utilities.js" - ], - "globals": { - "HtmlTestUtilities": "readonly" - } - }, - { - "files": [ - "test/**/*.test.js" - ], - "plugins": [ - "vitest" - ], - "extends": [ - "plugin:vitest/recommended" - ], - "rules": { - "vitest/prefer-to-be": "off" - } - }, - { - "files": [ - "dev/lib/**/*.js" - ], - "extends": [ - "plugin:@typescript-eslint/disable-type-checked" - ] - }, - { - "files": [ - "ext/js/core/api-map.js", - "ext/js/core/extension-error.js", - "ext/js/core/json.js", - "ext/js/data/anki-note-data-creator.js", - "ext/js/dictionary/dictionary-data-util.js", - "ext/js/display/pronunciation-generator.js", - "ext/js/display/structured-content-generator.js", - "ext/js/dom/css-style-applier.js", - "ext/js/language/CJK-util.js", - "ext/js/language/ja/japanese.js", - "ext/js/language/text-utilities.js", - "ext/js/templates/anki-template-renderer-content-manager.js", - "ext/js/templates/anki-template-renderer.js", - "ext/js/templates/template-renderer-frame-api.js", - "ext/js/templates/template-renderer-frame-main.js", - "ext/js/templates/template-renderer-media-provider.js", - "ext/js/templates/template-renderer.js" - ], - "env": { - "webextensions": false - } - }, - { - "files": [ - "ext/js/core/event-dispatcher.js", - "ext/js/core/extension-error.js", - "ext/js/core/json.js", - "ext/js/core/log.js", - "ext/js/core/to-error.js", - "ext/js/core/utilities.js", - "ext/js/data/database.js", - "ext/js/dictionary/dictionary-database.js", - "ext/js/dictionary/dictionary-importer.js", - "ext/js/dictionary/dictionary-worker-handler.js", - "ext/js/dictionary/dictionary-worker-main.js", - "ext/js/dictionary/dictionary-worker-media-loader.js", - "ext/js/media/media-util.js" - ], - "env": { - "browser": false, - "worker": true - } - }, - { - "files": [ - "ext/js/accessibility/accessibility-controller.js", - "ext/js/background/backend.js", - "ext/js/background/background-main.js", - "ext/js/background/offscreen-proxy.js", - "ext/js/background/profile-conditions-util.js", - "ext/js/background/request-builder.js", - "ext/js/background/script-manager.js", - "ext/js/comm/anki-connect.js", - "ext/js/comm/clipboard-monitor.js", - "ext/js/comm/clipboard-reader.js", - "ext/js/comm/mecab.js", - "ext/js/core/api-map.js", - "ext/js/core/event-dispatcher.js", - "ext/js/core/event-listener-collection.js", - "ext/js/core/extension-error.js", - "ext/js/core/fetch-utilities.js", - "ext/js/core/json.js", - "ext/js/core/log-utilities.js", - "ext/js/core/log.js", - "ext/js/core/object-utilities.js", - "ext/js/core/to-error.js", - "ext/js/core/utilities.js", - "ext/js/data/anki-util.js", - "ext/js/data/array-buffer-util.js", - "ext/js/data/database.js", - "ext/js/data/json-schema.js", - "ext/js/data/options-util.js", - "ext/js/data/permissions-util.js", - "ext/js/dictionary/dictionary-database.js", - "ext/js/dom/native-simple-dom-parser.js", - "ext/js/dom/simple-dom-parser.js", - "ext/js/extension/environment.js", - "ext/js/extension/web-extension.js", - "ext/js/general/cache-map.js", - "ext/js/general/object-property-accessor.js", - "ext/js/general/regex-util.js", - "ext/js/language/ar/arabic-text-preprocessors.js", - "ext/js/language/CJK-util.js", - "ext/js/language/de/german-text-preprocessors.js", - "ext/js/language/de/german-transforms.js", - "ext/js/language/en/english-transforms.js", - "ext/js/language/es/spanish-transforms.js", - "ext/js/language/ja/japanese-text-preprocessors.js", - "ext/js/language/ja/japanese-transforms.js", - "ext/js/language/ja/japanese-wanakana.js", - "ext/js/language/ja/japanese.js", - "ext/js/language/ko/korean-text-processors.js", - "ext/js/language/ko/korean-transforms.js", - "ext/js/language/la/latin-transforms.js", - "ext/js/language/language-descriptors.js", - "ext/js/language/language-transformer.js", - "ext/js/language/language-transforms.js", - "ext/js/language/languages.js", - "ext/js/language/multi-language-transformer.js", - "ext/js/language/ru/russian-text-preprocessors.js", - "ext/js/language/sga/old-irish-transforms.js", - "ext/js/language/sh/serbo-croatian-text-preprocessors.js", - "ext/js/language/sq/albanian-transforms.js", - "ext/js/language/vi/viet-text-preprocessors.js", - "ext/js/language/tl/tagalog-transforms.js", - "ext/js/language/text-processors.js", - "ext/js/language/translator.js", - "ext/js/language/zh/chinese.js", - "ext/js/media/audio-downloader.js", - "ext/js/media/media-util.js", - "ext/js/templates/template-patcher.js" - ], - "env": { - "browser": false, - "serviceworker": true - }, - "globals": { - "FileReader": "readonly", - "Intl": "readonly", - "crypto": "readonly", - "AbortController": "readonly" - } - }, - { - "files": [ - "ext/data/recommended-dictionaries.json" - ], - "rules": { - "jsonc/sort-keys": ["error", { - "pathPattern": ".*", - "hasProperties": ["name"], - "order": [ - "name", - "description", - "homepage", - "downloadUrl" - ] - }, { - "pathPattern": ".*", - "order": { - "type": "asc" - } - }] - } - } - ] -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..a59e36ad55 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,901 @@ +import {FlatCompat} from '@eslint/eslintrc'; +import js from '@eslint/js'; +import stylistic from '@stylistic/eslint-plugin'; +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import header from 'eslint-plugin-header'; +import * as _import from 'eslint-plugin-import'; +import jsdoc from 'eslint-plugin-jsdoc'; +import jsonc from 'eslint-plugin-jsonc'; +import noUnsanitized from 'eslint-plugin-no-unsanitized'; +import sonarjs from 'eslint-plugin-sonarjs'; +import unicorn from 'eslint-plugin-unicorn'; +import unusedImports from 'eslint-plugin-unused-imports'; +import vitest from 'eslint-plugin-vitest'; +import globals from 'globals'; +import parser from 'jsonc-eslint-parser'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; + +const filename = fileURLToPath(import.meta.url); +const dirname = path.dirname(filename); +const compat = new FlatCompat({ + baseDirectory: dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [{ + ignores: ['ext/lib/', 'dev/lib/handlebars/', '**/node_modules/', '**/builds/'], +}, ...compat.extends( + 'eslint:recommended', + 'plugin:jsonc/recommended-with-json', + 'plugin:eslint-comments/recommended', +), { + plugins: { + 'no-unsanitized': noUnsanitized, + header, + jsdoc, + jsonc, + 'unused-imports': unusedImports, + '@typescript-eslint': typescriptEslint, + '@stylistic': stylistic, + unicorn, + sonarjs, + 'import': _import, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.webextensions, + }, + + parser: tsParser, + ecmaVersion: 2022, + sourceType: 'module', + + parserOptions: { + ecmaFeatures: { + globalReturn: false, + impliedStrict: true, + }, + + project: [ + './jsconfig.json', + './dev/jsconfig.json', + './test/jsconfig.json', + './benches/jsconfig.json', + ], + }, + }, + + rules: { + 'accessor-pairs': 'error', + 'curly': ['error', 'all'], + 'default-case-last': 'error', + 'dot-notation': 'error', + 'eqeqeq': 'error', + 'func-names': ['error', 'always'], + 'guard-for-in': 'error', + 'grouped-accessor-pairs': 'error', + 'new-cap': 'error', + 'no-alert': 'error', + 'no-case-declarations': 'error', + 'no-caller': 'error', + 'no-const-assign': 'error', + + 'no-constant-condition': ['error', { + checkLoops: false, + }], + + 'no-constructor-return': 'error', + 'no-duplicate-imports': 'error', + 'no-eval': 'error', + 'no-extend-native': 'error', + 'no-global-assign': 'error', + 'no-implicit-globals': 'error', + 'no-implied-eval': 'error', + 'no-new': 'error', + 'no-new-native-nonconstructor': 'error', + 'no-octal': 'error', + 'no-octal-escape': 'error', + 'no-param-reassign': 'off', + 'no-promise-executor-return': 'error', + 'no-prototype-builtins': 'error', + + 'no-restricted-syntax': ['error', { + message: 'Avoid using JSON.parse(), prefer parseJson.', + selector: 'MemberExpression[object.name=JSON][property.name=parse]', + }, { + message: 'Avoid using Response.json(), prefer readResponseJson.', + selector: 'MemberExpression[property.name=json]', + }], + + 'no-self-compare': 'error', + 'no-sequences': 'error', + + 'no-shadow': ['error', { + builtinGlobals: false, + }], + + 'no-shadow-restricted-names': 'error', + 'no-template-curly-in-string': 'error', + 'no-undef': 'error', + 'no-undefined': 'error', + + 'no-underscore-dangle': ['error', { + allowAfterThis: true, + allowAfterSuper: false, + allowAfterThisConstructor: false, + }], + + 'no-unexpected-multiline': 'error', + 'no-unneeded-ternary': 'error', + + 'no-unused-vars': ['error', { + vars: 'local', + args: 'after-used', + argsIgnorePattern: '^_', + caughtErrors: 'none', + }], + + 'no-unused-expressions': 'error', + 'no-var': 'error', + 'no-with': 'error', + + 'prefer-const': ['error', { + destructuring: 'all', + }], + + 'radix': 'error', + 'require-atomic-updates': 'off', + 'sort-imports': 'off', + 'yoda': ['error', 'never'], + '@stylistic/array-bracket-newline': ['error', 'consistent'], + '@stylistic/array-bracket-spacing': ['error', 'never'], + '@stylistic/array-element-newline': ['error', 'consistent'], + '@stylistic/arrow-parens': ['error', 'always'], + + '@stylistic/arrow-spacing': ['error', { + before: true, + after: true, + }], + + '@stylistic/block-spacing': ['error', 'always'], + + '@stylistic/brace-style': ['error', '1tbs', { + allowSingleLine: true, + }], + + '@stylistic/comma-dangle': ['error', 'always-multiline'], + + '@stylistic/comma-spacing': ['error', { + before: false, + after: true, + }], + + '@stylistic/comma-style': ['error', 'last'], + '@stylistic/computed-property-spacing': ['error', 'never'], + '@stylistic/dot-location': ['error', 'property'], + '@stylistic/eol-last': ['error', 'always'], + '@stylistic/func-call-spacing': ['error', 'never'], + '@stylistic/function-call-argument-newline': ['error', 'consistent'], + '@stylistic/function-call-spacing': ['error', 'never'], + '@stylistic/function-paren-newline': ['error', 'multiline-arguments'], + '@stylistic/generator-star-spacing': ['error', 'before'], + '@stylistic/implicit-arrow-linebreak': ['error', 'beside'], + + '@stylistic/indent': ['error', 4, { + SwitchCase: 1, + MemberExpression: 1, + flatTernaryExpressions: true, + ignoredNodes: ['ConditionalExpression'], + }], + + '@stylistic/indent-binary-ops': ['error', 0], + + '@stylistic/key-spacing': ['error', { + beforeColon: false, + afterColon: true, + mode: 'strict', + }], + + '@stylistic/keyword-spacing': ['error', { + before: true, + after: true, + }], + + '@stylistic/linebreak-style': ['error', 'unix'], + '@stylistic/lines-around-comment': 'off', + + '@stylistic/lines-between-class-members': ['error', 'always', { + exceptAfterSingleLine: true, + }], + + '@stylistic/max-len': 'off', + + '@stylistic/max-statements-per-line': ['error', { + max: 2, + }], + + '@stylistic/member-delimiter-style': ['error', { + multiline: { + delimiter: 'semi', + requireLast: true, + }, + + singleline: { + delimiter: 'comma', + requireLast: false, + }, + + multilineDetection: 'brackets', + }], + + '@stylistic/multiline-ternary': ['error', 'always-multiline'], + '@stylistic/new-parens': 'error', + + '@stylistic/newline-per-chained-call': ['error', { + ignoreChainWithDepth: 3, + }], + + '@stylistic/no-confusing-arrow': 'error', + '@stylistic/no-extra-parens': 'off', + '@stylistic/no-extra-semi': 'error', + '@stylistic/no-floating-decimal': 'error', + + '@stylistic/no-mixed-operators': ['error', { + allowSamePrecedence: true, + groups: [['&&', '||']], + }], + + '@stylistic/no-mixed-spaces-and-tabs': 'error', + '@stylistic/no-multi-spaces': 'error', + + '@stylistic/no-multiple-empty-lines': ['error', { + max: 2, + maxEOF: 0, + maxBOF: 0, + }], + + '@stylistic/no-tabs': 'error', + '@stylistic/no-trailing-spaces': 'error', + '@stylistic/no-whitespace-before-property': 'error', + '@stylistic/nonblock-statement-body-position': ['error', 'beside'], + '@stylistic/object-curly-newline': 'error', + '@stylistic/object-curly-spacing': ['error', 'never'], + + '@stylistic/object-property-newline': ['error', { + allowAllPropertiesOnSameLine: true, + }], + + '@stylistic/one-var-declaration-per-line': ['error', 'initializations'], + '@stylistic/operator-linebreak': ['error', 'after'], + '@stylistic/padded-blocks': ['error', 'never'], + + '@stylistic/padding-line-between-statements': ['error', { + blankLine: 'always', + prev: '*', + next: 'import', + }, { + blankLine: 'always', + prev: 'import', + next: '*', + }, { + blankLine: 'always', + prev: '*', + next: 'export', + }, { + blankLine: 'always', + prev: 'import', + next: 'let', + }, { + blankLine: 'always', + prev: 'import', + next: 'const', + }, { + blankLine: 'always', + prev: 'export', + next: 'let', + }, { + blankLine: 'always', + prev: 'export', + next: 'const', + }, { + blankLine: 'always', + prev: 'export', + next: 'export', + }, { + blankLine: 'always', + prev: 'export', + next: 'type', + }, { + blankLine: 'always', + prev: 'type', + next: 'export', + }, { + blankLine: 'always', + prev: 'type', + next: 'type', + }, { + blankLine: 'never', + prev: 'import', + next: 'import', + }], + + '@stylistic/quote-props': ['error', 'consistent-as-needed', { + numbers: true, + }], + + '@stylistic/quotes': ['error', 'single', 'avoid-escape'], + '@stylistic/rest-spread-spacing': ['error', 'never'], + '@stylistic/semi': 'error', + + '@stylistic/semi-spacing': ['error', { + before: false, + after: true, + }], + + '@stylistic/semi-style': ['error', 'last'], + '@stylistic/space-before-blocks': ['error', 'always'], + + '@stylistic/space-before-function-paren': ['error', { + anonymous: 'never', + named: 'never', + asyncArrow: 'always', + }], + + '@stylistic/space-in-parens': ['error', 'never'], + + '@stylistic/space-infix-ops': ['error', { + int32Hint: false, + }], + + '@stylistic/space-unary-ops': 'error', + '@stylistic/spaced-comment': ['error', 'always'], + + '@stylistic/switch-colon-spacing': ['error', { + after: true, + before: false, + }], + + '@stylistic/template-curly-spacing': ['error', 'never'], + '@stylistic/template-tag-spacing': ['error', 'never'], + + '@stylistic/type-annotation-spacing': ['error', { + before: false, + after: true, + + overrides: { + arrow: { + before: true, + after: true, + }, + }, + }], + + '@stylistic/type-generic-spacing': 'error', + '@stylistic/type-named-tuple-spacing': 'error', + '@stylistic/wrap-iife': ['error', 'inside'], + '@stylistic/wrap-regex': 'off', + + '@stylistic/yield-star-spacing': ['error', { + before: true, + after: false, + }], + + 'no-unsanitized/method': 'error', + 'no-unsanitized/property': 'error', + 'jsdoc/check-access': 'error', + 'jsdoc/check-alignment': 'error', + + 'jsdoc/check-line-alignment': ['error', 'never', { + wrapIndent: ' ', + }], + + 'jsdoc/check-param-names': 'error', + 'jsdoc/check-property-names': 'error', + 'jsdoc/check-tag-names': 'error', + 'jsdoc/empty-tags': 'error', + 'jsdoc/check-types': 'error', + 'jsdoc/check-values': 'error', + 'jsdoc/implements-on-classes': 'error', + 'jsdoc/multiline-blocks': 'error', + 'jsdoc/no-bad-blocks': 'error', + 'jsdoc/no-multi-asterisks': 'error', + 'jsdoc/no-undefined-types': 'error', + 'jsdoc/require-asterisk-prefix': 'error', + 'jsdoc/require-description': 'off', + 'jsdoc/require-hyphen-before-param-description': ['error', 'never'], + + 'jsdoc/require-jsdoc': ['error', { + require: { + ClassDeclaration: false, + FunctionDeclaration: true, + MethodDefinition: false, + }, + + contexts: [ + 'MethodDefinition[kind=constructor]>FunctionExpression>BlockStatement>ExpressionStatement>AssignmentExpression[left.object.type=ThisExpression]', + 'ClassDeclaration>Classbody>PropertyDefinition', + 'MethodDefinition[kind!=constructor][kind!=set]', + 'MethodDefinition[kind=constructor][value.params.length>0]', + ], + + checkGetters: 'no-setter', + checkSetters: 'no-getter', + }], + + 'jsdoc/require-param': 'error', + 'jsdoc/require-param-description': 'off', + 'jsdoc/require-param-name': 'error', + 'jsdoc/require-param-type': 'error', + 'jsdoc/require-property': 'error', + 'jsdoc/require-property-description': 'off', + 'jsdoc/require-property-name': 'error', + 'jsdoc/require-property-type': 'error', + 'jsdoc/require-returns': 'error', + 'jsdoc/require-returns-check': 'error', + 'jsdoc/require-returns-description': 'off', + 'jsdoc/require-returns-type': 'error', + 'jsdoc/require-throws': 'error', + 'jsdoc/require-yields': 'error', + 'jsdoc/require-yields-check': 'error', + + 'jsdoc/tag-lines': ['error', 'never', { + startLines: 0, + }], + + 'jsdoc/valid-types': 'error', + 'jsonc/indent': ['error', 4], + 'jsonc/array-bracket-newline': ['error', 'consistent'], + 'jsonc/array-bracket-spacing': ['error', 'never'], + 'jsonc/array-element-newline': ['error', 'consistent'], + 'jsonc/comma-style': ['error', 'last'], + + 'jsonc/key-spacing': ['error', { + beforeColon: false, + afterColon: true, + mode: 'strict', + }], + + 'jsonc/no-octal-escape': 'error', + + 'jsonc/object-curly-newline': ['error', { + consistent: true, + }], + + 'jsonc/object-curly-spacing': ['error', 'never'], + + 'jsonc/object-property-newline': ['error', { + allowAllPropertiesOnSameLine: true, + }], + + 'eslint-comments/no-unused-disable': 'error', + 'unused-imports/no-unused-imports': 'error', + 'import/extensions': ['error', 'ignorePackages'], + + 'unicorn/catch-error-name': ['error', { + ignore: ['^(e|error2?)$'], + }], + + 'unicorn/custom-error-definition': 'error', + 'unicorn/empty-brace-spaces': 'error', + 'unicorn/error-message': 'error', + 'unicorn/expiring-todo-comments': 'error', + 'unicorn/explicit-length-check': 'error', + 'unicorn/new-for-builtins': 'error', + 'unicorn/no-abusive-eslint-disable': 'error', + 'unicorn/no-array-for-each': 'error', + 'unicorn/no-array-method-this-argument': 'error', + 'unicorn/no-array-push-push': 'error', + 'unicorn/no-array-reduce': 'error', + 'unicorn/no-console-spaces': 'error', + 'unicorn/no-document-cookie': 'error', + 'unicorn/no-empty-file': 'error', + 'unicorn/no-hex-escape': 'error', + 'unicorn/no-instanceof-array': 'error', + 'unicorn/no-invalid-remove-event-listener': 'error', + 'unicorn/no-lonely-if': 'error', + 'unicorn/no-nested-ternary': 'error', + 'unicorn/no-new-buffer': 'error', + 'unicorn/no-object-as-default-parameter': 'error', + 'unicorn/no-static-only-class': 'error', + 'unicorn/no-thenable': 'error', + 'unicorn/no-unnecessary-await': 'error', + 'unicorn/no-unnecessary-polyfills': 'error', + 'unicorn/no-unreadable-array-destructuring': 'error', + 'unicorn/no-unreadable-iife': 'error', + 'unicorn/no-useless-fallback-in-spread': 'error', + 'unicorn/no-useless-length-check': 'error', + 'unicorn/no-useless-promise-resolve-reject': 'error', + 'unicorn/no-useless-spread': 'error', + 'unicorn/no-useless-switch-case': 'error', + 'unicorn/no-useless-undefined': 'error', + 'unicorn/no-zero-fractions': 'error', + 'unicorn/prefer-array-find': 'error', + 'unicorn/prefer-array-flat': 'error', + 'unicorn/prefer-array-flat-map': 'error', + 'unicorn/prefer-array-index-of': 'error', + 'unicorn/prefer-array-some': 'error', + 'unicorn/prefer-date-now': 'error', + 'unicorn/prefer-default-parameters': 'error', + 'unicorn/prefer-dom-node-dataset': 'error', + 'unicorn/prefer-dom-node-text-content': 'error', + 'unicorn/prefer-event-target': 'error', + 'unicorn/prefer-export-from': 'error', + 'unicorn/prefer-includes': 'error', + 'unicorn/prefer-keyboard-event-key': 'error', + 'unicorn/prefer-logical-operator-over-ternary': 'error', + 'unicorn/prefer-modern-math-apis': 'error', + 'unicorn/prefer-module': 'error', + 'unicorn/prefer-native-coercion-functions': 'error', + 'unicorn/prefer-negative-index': 'error', + 'unicorn/prefer-number-properties': 'error', + 'unicorn/prefer-object-from-entries': 'error', + 'unicorn/prefer-prototype-methods': 'error', + 'unicorn/prefer-reflect-apply': 'error', + 'unicorn/prefer-regexp-test': 'error', + 'unicorn/prefer-set-has': 'error', + 'unicorn/prefer-set-size': 'error', + 'unicorn/prefer-spread': 'error', + 'unicorn/prefer-string-starts-ends-with': 'error', + 'unicorn/prefer-string-trim-start-end': 'error', + 'unicorn/prefer-switch': 'error', + 'unicorn/prefer-ternary': 'error', + 'unicorn/relative-url-style': 'error', + 'unicorn/require-array-join-separator': 'error', + 'unicorn/require-number-to-fixed-digits-argument': 'error', + 'unicorn/template-indent': 'error', + 'unicorn/throw-new-error': 'error', + 'sonarjs/max-switch-cases': 'error', + 'sonarjs/no-all-duplicated-branches': 'error', + 'sonarjs/no-collapsible-if': 'error', + 'sonarjs/no-collection-size-mischeck': 'error', + 'sonarjs/no-duplicated-branches': 'error', + 'sonarjs/no-element-overwrite': 'error', + 'sonarjs/no-empty-collection': 'error', + 'sonarjs/no-extra-arguments': 'error', + 'sonarjs/no-gratuitous-expressions': 'error', + 'sonarjs/no-identical-conditions': 'error', + 'sonarjs/no-identical-expressions': 'error', + 'sonarjs/no-identical-functions': 'error', + 'sonarjs/no-ignored-return': 'error', + 'sonarjs/no-inverted-boolean-check': 'error', + 'sonarjs/no-one-iteration-loop': 'error', + 'sonarjs/no-redundant-boolean': 'error', + 'sonarjs/no-redundant-jump': 'error', + 'sonarjs/no-same-line-conditional': 'error', + 'sonarjs/no-unused-collection': 'error', + 'sonarjs/no-use-of-empty-return-value': 'error', + 'sonarjs/no-useless-catch': 'error', + 'sonarjs/non-existent-operator': 'error', + 'sonarjs/prefer-immediate-return': 'error', + 'sonarjs/prefer-object-literal': 'error', + 'sonarjs/prefer-single-boolean-return': 'error', + 'sonarjs/prefer-while': 'error', + }, +}, ...compat.extends('plugin:@typescript-eslint/recommended-type-checked').map((config) => ({ + ...config, + files: ['**/*.js', '**/*.ts'], +})), { + files: ['**/*.js', '**/*.ts'], + + rules: { + '@typescript-eslint/no-floating-promises': ['error', { + ignoreIIFE: true, + }], + + '@typescript-eslint/no-misused-promises': 'off', + '@typescript-eslint/no-redundant-type-constituents': 'error', + '@typescript-eslint/no-unsafe-argument': 'error', + '@typescript-eslint/no-unsafe-assignment': 'error', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-enum-comparison': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/restrict-template-expressions': 'off', + + '@typescript-eslint/ban-ts-comment': ['error', { + 'ts-expect-error': { + descriptionFormat: '^ - .+$', + }, + }], + + '@typescript-eslint/ban-types': ['error', { + types: { + object: true, + }, + + extendDefaults: true, + }], + + '@typescript-eslint/no-explicit-any': 'error', + + '@typescript-eslint/no-shadow': ['error', { + builtinGlobals: false, + }], + + '@typescript-eslint/no-this-alias': 'error', + + '@typescript-eslint/no-unused-vars': ['error', { + vars: 'local', + args: 'after-used', + argsIgnorePattern: '^_', + caughtErrors: 'none', + }], + }, +}, { + files: ['**/*.ts'], + + rules: { + '@stylistic/block-spacing': 'off', + + '@stylistic/comma-dangle': ['error', { + arrays: 'always-multiline', + objects: 'always-multiline', + imports: 'always-multiline', + exports: 'always-multiline', + functions: 'always-multiline', + enums: 'always-multiline', + generics: 'always-multiline', + tuples: 'always-multiline', + }], + + '@stylistic/indent-binary-ops': 'off', + + '@stylistic/no-multiple-empty-lines': ['error', { + max: 1, + maxEOF: 0, + maxBOF: 0, + }], + + '@stylistic/no-extra-parens': ['error', 'all'], + }, +}, { + files: ['**/*.json'], + + languageOptions: { + parser: parser, + }, +}, { + files: ['ext/data/schemas/options-schema.json'], + + rules: { + '@stylistic/no-multi-spaces': 'off', + }, +}, { + files: [ + 'test/data/anki-note-builder-test-results.json', + 'test/data/database-test-cases.json', + 'test/data/translator-test-results-note-data1.json', + 'test/data/translator-test-results.json', + ], + + rules: { + 'jsonc/indent': ['error', 2], + }, +}, { + files: [ + 'test/data/dictionaries/valid-dictionary1/term_bank_1.json', + 'test/data/dictionaries/valid-dictionary1/term_bank_2.json', + ], + + rules: { + 'jsonc/array-element-newline': 'off', + 'jsonc/object-property-newline': 'off', + }, +}, { + files: ['**/*.js', '**/*.ts'], + + rules: { + 'header/header': ['error', 'block', { + pattern: ' \\* Copyright \\(C\\) (2023-)?2024 Yomitan Authors(\n \\* Copyright \\(C\\) (20(16|17|18|19|20|21)-)?2022 Yomichan Authors)?\n \\*\n \\* This program is free software: you can redistribute it and/or modify\n \\* it under the terms of the GNU General Public License as published by\n \\* the Free Software Foundation, either version 3 of the License, or\n \\* \\(at your option\\) any later version\\.\n \\*\n \\* This program is distributed in the hope that it will be useful,\n \\* but WITHOUT ANY WARRANTY; without even the implied warranty of\n \\* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE\\. See the\n \\* GNU General Public License for more details\\.\n \\*\n \\* You should have received a copy of the GNU General Public License\n \\* along with this program\\. If not, see \\.\n ', + }], + }, +}, { + files: ['ext/**/*.js'], + + rules: { + 'no-console': 'error', + }, +}, { + files: [ + 'test/**/*.js', + 'dev/**/*.js', + '**/integration.spec.js', + '**/playwright.config.js', + '**/playwright-util.js', + '**/visual.spec.js', + ], + + languageOptions: { + globals: { + ...Object.fromEntries(Object.entries(globals.browser).map(([key]) => [key, 'off'])), + ...globals.node, + ...Object.fromEntries(Object.entries(globals.webextensions).map(([key]) => [key, 'off'])), + }, + }, +}, { + files: ['test/data/html/**/*.js'], + + languageOptions: { + globals: { + ...globals.browser, + ...Object.fromEntries(Object.entries(globals.node).map(([key]) => [key, 'off'])), + ...Object.fromEntries(Object.entries(globals.webextensions).map(([key]) => [key, 'off'])), + }, + + ecmaVersion: 5, + sourceType: 'script', + }, +}, { + files: ['test/data/html/**/*.js'], + ignores: ['test/data/html/js/html-test-utilities.js'], + + languageOptions: { + globals: { + HtmlTestUtilities: 'readonly', + }, + }, +}, ...compat.extends('plugin:vitest/recommended').map((config) => ({ + ...config, + files: ['test/**/*.test.js'], + plugins: { + vitest, + }, + + rules: { + 'vitest/prefer-to-be': 'off', + }, +})), ...compat.extends('plugin:@typescript-eslint/disable-type-checked').map((config) => ({ + ...config, + files: ['dev/lib/**/*.js'], +})), { + files: [ + 'ext/js/core/api-map.js', + 'ext/js/core/extension-error.js', + 'ext/js/core/json.js', + 'ext/js/data/anki-note-data-creator.js', + 'ext/js/dictionary/dictionary-data-util.js', + 'ext/js/display/pronunciation-generator.js', + 'ext/js/display/structured-content-generator.js', + 'ext/js/dom/css-style-applier.js', + 'ext/js/language/CJK-util.js', + 'ext/js/language/ja/japanese.js', + 'ext/js/language/text-utilities.js', + 'ext/js/templates/anki-template-renderer-content-manager.js', + 'ext/js/templates/anki-template-renderer.js', + 'ext/js/templates/template-renderer-frame-api.js', + 'ext/js/templates/template-renderer-frame-main.js', + 'ext/js/templates/template-renderer-media-provider.js', + 'ext/js/templates/template-renderer.js', + ], + + languageOptions: { + globals: { + ...Object.fromEntries(Object.entries(globals.webextensions).map(([key]) => [key, 'off'])), + }, + }, +}, { + files: [ + 'ext/js/core/event-dispatcher.js', + 'ext/js/core/extension-error.js', + 'ext/js/core/json.js', + 'ext/js/core/log.js', + 'ext/js/core/to-error.js', + 'ext/js/core/utilities.js', + 'ext/js/data/database.js', + 'ext/js/dictionary/dictionary-database.js', + 'ext/js/dictionary/dictionary-importer.js', + 'ext/js/dictionary/dictionary-worker-handler.js', + 'ext/js/dictionary/dictionary-worker-main.js', + 'ext/js/dictionary/dictionary-worker-media-loader.js', + 'ext/js/media/media-util.js', + ], + + languageOptions: { + globals: { + ...Object.fromEntries(Object.entries(globals.browser).map(([key]) => [key, 'off'])), + ...globals.worker, + }, + }, +}, { + files: [ + 'ext/js/accessibility/accessibility-controller.js', + 'ext/js/background/backend.js', + 'ext/js/background/background-main.js', + 'ext/js/background/offscreen-proxy.js', + 'ext/js/background/profile-conditions-util.js', + 'ext/js/background/request-builder.js', + 'ext/js/background/script-manager.js', + 'ext/js/comm/anki-connect.js', + 'ext/js/comm/clipboard-monitor.js', + 'ext/js/comm/clipboard-reader.js', + 'ext/js/comm/mecab.js', + 'ext/js/core/api-map.js', + 'ext/js/core/event-dispatcher.js', + 'ext/js/core/event-listener-collection.js', + 'ext/js/core/extension-error.js', + 'ext/js/core/fetch-utilities.js', + 'ext/js/core/json.js', + 'ext/js/core/log-utilities.js', + 'ext/js/core/log.js', + 'ext/js/core/object-utilities.js', + 'ext/js/core/to-error.js', + 'ext/js/core/utilities.js', + 'ext/js/data/anki-util.js', + 'ext/js/data/array-buffer-util.js', + 'ext/js/data/database.js', + 'ext/js/data/json-schema.js', + 'ext/js/data/options-util.js', + 'ext/js/data/permissions-util.js', + 'ext/js/dictionary/dictionary-database.js', + 'ext/js/dom/native-simple-dom-parser.js', + 'ext/js/dom/simple-dom-parser.js', + 'ext/js/extension/environment.js', + 'ext/js/extension/web-extension.js', + 'ext/js/general/cache-map.js', + 'ext/js/general/object-property-accessor.js', + 'ext/js/general/regex-util.js', + 'ext/js/language/ar/arabic-text-preprocessors.js', + 'ext/js/language/CJK-util.js', + 'ext/js/language/de/german-text-preprocessors.js', + 'ext/js/language/de/german-transforms.js', + 'ext/js/language/en/english-transforms.js', + 'ext/js/language/es/spanish-transforms.js', + 'ext/js/language/ja/japanese-text-preprocessors.js', + 'ext/js/language/ja/japanese-transforms.js', + 'ext/js/language/ja/japanese-wanakana.js', + 'ext/js/language/ja/japanese.js', + 'ext/js/language/ko/korean-text-processors.js', + 'ext/js/language/ko/korean-transforms.js', + 'ext/js/language/la/latin-transforms.js', + 'ext/js/language/language-descriptors.js', + 'ext/js/language/language-transformer.js', + 'ext/js/language/language-transforms.js', + 'ext/js/language/languages.js', + 'ext/js/language/multi-language-transformer.js', + 'ext/js/language/ru/russian-text-preprocessors.js', + 'ext/js/language/sga/old-irish-transforms.js', + 'ext/js/language/sh/serbo-croatian-text-preprocessors.js', + 'ext/js/language/sq/albanian-transforms.js', + 'ext/js/language/vi/viet-text-preprocessors.js', + 'ext/js/language/tl/tagalog-transforms.js', + 'ext/js/language/text-processors.js', + 'ext/js/language/translator.js', + 'ext/js/language/zh/chinese.js', + 'ext/js/media/audio-downloader.js', + 'ext/js/media/media-util.js', + 'ext/js/templates/template-patcher.js', + ], + + languageOptions: { + globals: { + ...Object.fromEntries(Object.entries(globals.browser).map(([key]) => [key, 'off'])), + ...globals.serviceworker, + FileReader: 'readonly', + Intl: 'readonly', + crypto: 'readonly', + AbortController: 'readonly', + }, + }, +}, { + files: ['ext/data/recommended-dictionaries.json'], + + rules: { + 'jsonc/sort-keys': ['error', { + pathPattern: '.*', + hasProperties: ['name'], + order: ['name', 'description', 'homepage', 'downloadUrl'], + }, { + pathPattern: '.*', + + order: { + type: 'asc', + }, + }], + }, +}]; diff --git a/jsconfig.json b/jsconfig.json index 4ab1310628..4ae65b4c90 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -3,7 +3,7 @@ "module": "ES2022", "target": "ES2022", "checkJs": true, - "moduleResolution": "node", + "moduleResolution": "Bundler", "strict": true, "strictNullChecks": true, "noImplicitAny": true, @@ -30,7 +30,8 @@ "include": [ "ext/**/*.js", "types/ext/**/*.ts", - "types/other/globals.d.ts" + "types/other/globals.d.ts", + "eslint.config.mjs" ], "exclude": [ "node_modules", diff --git a/package-lock.json b/package-lock.json index 26aa8e8724..1b5102905e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "0.0.0", "license": "GPL-3.0-or-later", "dependencies": { - "@typescript-eslint/typescript-estree": "^8.11.0", "@zip.js/zip.js": "^2.7.45", "dexie": "^3.2.5", "dexie-export-import": "^4.1.2", @@ -937,10 +936,11 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1172,6 +1172,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1184,6 +1185,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -1192,6 +1194,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1554,6 +1557,32 @@ "eslint": "*" } }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, "node_modules/@stylistic/eslint-plugin-ts": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-1.6.3.tgz", @@ -1571,6 +1600,32 @@ "eslint": ">=8.40.0" } }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, "node_modules/@stylistic/stylelint-plugin": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-2.1.2.tgz", @@ -1760,10 +1815,11 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/tough-cookie": { "version": "4.0.5", @@ -1839,6 +1895,34 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", @@ -2088,6 +2172,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" @@ -2100,283 +2185,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.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" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", - "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", - "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", - "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", @@ -2405,7 +2228,7 @@ } } }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", @@ -2415,7 +2238,7 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", @@ -2436,6 +2259,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" @@ -2452,7 +2276,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@vitest/coverage-v8": { "version": "1.2.2", @@ -2601,10 +2426,11 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3925,6 +3751,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4625,6 +4452,32 @@ } } }, + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, "node_modules/eslint-rule-composer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", @@ -4639,6 +4492,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4654,6 +4508,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4666,6 +4521,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4681,7 +4537,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/espree": { "version": "9.6.1", @@ -4717,6 +4574,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -4817,6 +4675,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4832,6 +4691,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4871,6 +4731,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -4880,6 +4741,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -4964,6 +4826,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -5989,6 +5852,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6978,6 +6842,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -6986,6 +6851,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -7866,6 +7732,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -8256,6 +8123,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -8344,6 +8212,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -8439,6 +8308,7 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -9399,6 +9269,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, "engines": { "node": ">=16" }, @@ -9613,6 +9484,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10859,9 +10731,9 @@ } }, "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true }, "@eslint/eslintrc": { @@ -11034,6 +10906,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -11042,12 +10915,14 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -11263,6 +11138,23 @@ "requires": { "@types/eslint": "^8.56.2", "@typescript-eslint/utils": "^6.21.0" + }, + "dependencies": { + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + } + } } }, "@stylistic/eslint-plugin-ts": { @@ -11274,6 +11166,23 @@ "@stylistic/eslint-plugin-js": "1.6.3", "@types/eslint": "^8.56.2", "@typescript-eslint/utils": "^6.21.0" + }, + "dependencies": { + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + } + } } }, "@stylistic/stylelint-plugin": { @@ -11456,9 +11365,9 @@ "dev": true }, "@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "@types/tough-cookie": { @@ -11509,6 +11418,18 @@ "@typescript-eslint/visitor-keys": "7.18.0" } }, + "@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + } + }, "@typescript-eslint/types": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", @@ -11658,92 +11579,6 @@ "@typescript-eslint/visitor-keys": "6.21.0" } }, - "@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - } - }, - "@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.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" - } - }, - "@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "@typescript-eslint/types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", @@ -11751,83 +11586,21 @@ "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", - "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", - "requires": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "@typescript-eslint/types": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", - "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==" - }, - "@typescript-eslint/visitor-keys": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", - "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", - "requires": { - "@typescript-eslint/types": "8.11.0", - "eslint-visitor-keys": "^3.4.3" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/utils": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "dependencies": { - "@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -11972,9 +11745,9 @@ } }, "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true }, "acorn-jsx": { @@ -13443,6 +13216,23 @@ "dev": true, "requires": { "@typescript-eslint/utils": "^6.21.0" + }, + "dependencies": { + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + } + } } }, "eslint-rule-composer": { @@ -13464,7 +13254,8 @@ "eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true }, "espree": { "version": "9.6.1", @@ -13569,6 +13360,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -13581,6 +13373,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -13615,6 +13408,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "requires": { "reusify": "^1.0.4" } @@ -15111,12 +14905,14 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true }, "micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "requires": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -15717,7 +15513,8 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true }, "quick-lru": { "version": "5.1.1", @@ -16000,7 +15797,8 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, "rfdc": { "version": "1.3.1", @@ -16066,6 +15864,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -16130,7 +15929,8 @@ "semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==" + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true }, "sentence-case": { "version": "3.0.4", @@ -16864,6 +16664,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, "requires": {} }, "ts-json-schema-generator": { @@ -17024,7 +16825,8 @@ "typescript": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==" + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true }, "ua-parser-js": { "version": "0.7.37",