From 421af92bf89c5bfd62ce20717c2a6b9d313e5b4b Mon Sep 17 00:00:00 2001 From: Olga Bulat Date: Fri, 18 Oct 2024 17:14:31 +0300 Subject: [PATCH 1/4] Migrate the plugin to ESLint v9 Signed-off-by: Olga Bulat --- .eslintignore | 17 - .eslintrc.js | 5 - eslint.config.mjs | 49 + justfile | 7 +- package.json | 4 + packages/js/eslint-plugin/package.json | 43 +- .../js/eslint-plugin/src/configs/custom.ts | 18 - .../js/eslint-plugin/src/configs/import.ts | 246 ++-- .../js/eslint-plugin/src/configs/index.ts | 161 --- .../eslint-plugin/src/configs/typescript.ts | 50 +- packages/js/eslint-plugin/src/configs/vue.ts | 284 ++-- packages/js/eslint-plugin/src/index.ts | 192 ++- .../src/rules/analytics-configuration.ts | 2 +- packages/js/eslint-plugin/src/rules/index.ts | 2 +- .../src/rules/no-unexplained-disabled-test.ts | 4 +- .../src/rules/translation-strings.ts | 4 +- packages/js/eslint-plugin/src/typings.d.ts | 22 + .../eslint-plugin/src/utils/rule-creator.ts | 8 +- .../rules/analytics-configuration.spec.ts | 183 ++- .../no-unexplained-disabled-test.spec.ts | 21 +- .../test/rules/translation-strings.spec.ts | 84 +- pnpm-lock.yaml | 1249 ++++++++++------- 22 files changed, 1494 insertions(+), 1161 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 eslint.config.mjs delete mode 100644 packages/js/eslint-plugin/src/configs/custom.ts delete mode 100644 packages/js/eslint-plugin/src/configs/index.ts create mode 100644 packages/js/eslint-plugin/src/typings.d.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 043e8c52369..00000000000 --- a/.eslintignore +++ /dev/null @@ -1,17 +0,0 @@ -coverage - -# Vendored module. See explanation in file -frontend/test/unit/test-utils/render-suspended.ts - -frontend/test/tapes -frontend/nuxt-template-overrides -frontend/storybook-static -# ESLint ignores hidden by default, so this must be explicity un-ignored -!frontend/.storybook - -!.pnpmfile.cjs - -frontend/src/locales/*.json - -# Packages generate a `dist` output when built that should be linted -**/*/dist diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index b19e2e40b4c..00000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - root: true, - extends: ["plugin:@openverse/project"], - plugins: ["@openverse"], -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000000..5f2e5787a04 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,49 @@ +import { fileURLToPath } from "node:url" + +import path from "node:path" + +// eslint-disable-next-line import/no-unresolved +import { config as defineConfig } from "typescript-eslint" +import { includeIgnoreFile } from "@eslint/compat" +import openverse from "@openverse/eslint-plugin" + +// @ts-ignore +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +const gitignoreFiles = [ + path.resolve(__dirname, ".gitignore"), + path.resolve(__dirname, "frontend", ".gitignore"), + path.resolve(__dirname, "automations", "js", ".gitignore"), + path.resolve(__dirname, "packages", "js", "api-client", ".gitignore"), +] + +// List of files from old .eslintignore +const eslintIgnores = [ + "**/dist/**", + "frontend/.pnpm-store/**", + "frontend/.nuxt/**", + "frontend/.output/**", + "frontend/.remake/**", + "frontend/src/locales/*.json", + // Vendored module. See explanation in file + "frontend/test/unit/test-utils/render-suspended.ts", + "**/coverage/**", + "frontend/test/tapes/**", + "frontend/storybook-static/**", + "packages/**/dist/**", +] + +let ignoreConfigs = gitignoreFiles + .map((gitignoreFile) => includeIgnoreFile(gitignoreFile)) + .reduce( + (acc, gitignoreFile, index) => { + return { ...acc, ignores: acc.ignores.concat(gitignoreFile.ignores) } + }, + { name: "openverse:ignore-files", ignores: eslintIgnores } + ) + +export default defineConfig( + ignoreConfigs, + { files: [".pnpmfile.cjs"] }, + ...openverse.default.configs.project +) diff --git a/justfile b/justfile index 22a44214172..dd75344f03c 100644 --- a/justfile +++ b/justfile @@ -362,15 +362,12 @@ eslint *args: files=("$@") else # default files - files=(frontend automations/js packages/js .pnpmfile.cjs .eslintrc.js prettier.config.js tsconfig.base.json) + files=(frontend automations/js packages/js .pnpmfile.cjs eslint.config.mjs prettier.config.js tsconfig.base.json) fi pnpm exec eslint \ - --ext .js,.ts,.vue,.json,.json5 \ - --ignore-path .gitignore \ - --ignore-path .eslintignore \ --max-warnings=0 \ - --fix \ + --no-warn-ignored \ "${files[@]}" # Alias for `just packages/js/k6/run` or `just p k6 run` diff --git a/package.json b/package.json index 47879fdef08..2dfa8b3ac68 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,11 @@ "engines": { "node": ">= 20.0.0 <21" }, + "dependencies": { + "typescript-eslint": "^8.8.1" + }, "devDependencies": { + "@eslint/compat": "^1.2.0", "@types/node": "22.5.1", "@openverse/eslint-plugin": "workspace:*", "bindings": "1.5.0", diff --git a/packages/js/eslint-plugin/package.json b/packages/js/eslint-plugin/package.json index 986631f1f9c..e6ccd2a72d8 100644 --- a/packages/js/eslint-plugin/package.json +++ b/packages/js/eslint-plugin/package.json @@ -10,32 +10,37 @@ "types": "tsc -p ." }, "dependencies": { - "@intlify/eslint-plugin-vue-i18n": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "@typescript-eslint/utils": "^7.8.0", - "eslint": "^8.57.0", + "@eslint-community/eslint-plugin-eslint-comments": "^4.4.0", + "@eslint/js": "^9.12.0", + "@intlify/eslint-plugin-vue-i18n": "^3.0.0", + "@types/eslint-config-prettier": "^6.11.3", + "@types/eslint__js": "^8.42.3", + "@typescript-eslint/eslint-plugin": "^8.8.1", + "@typescript-eslint/parser": "^8.8.1", + "@typescript-eslint/utils": "^8.8.1", + "@vitest/eslint-plugin": "^1.1.7", + "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.6.1", + "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsonc": "^2.15.1", - "eslint-plugin-playwright": "^1.6.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsonc": "^2.16.0", + "eslint-plugin-playwright": "^1.7.0", "eslint-plugin-tsdoc": "^0.3.0", - "eslint-plugin-unicorn": "^52.0.0", - "eslint-plugin-vitest": "^0.3.18", - "eslint-plugin-vue": "^9.25.0", - "eslint-plugin-vuejs-accessibility": "^2.3.0", + "eslint-plugin-unicorn": "^56.0.0", + "eslint-plugin-vue": "^9.29.0", + "eslint-plugin-vuejs-accessibility": "^2.4.1", "jsonc-eslint-parser": "^2.4.0", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.4.2" + "typescript": "5.6.3", + "typescript-eslint": "^8.8.1", + "vue-eslint-parser": "^9.4.3" }, "devDependencies": { - "@eslint/eslintrc": "^3.0.2", + "@eslint/eslintrc": "^3.1.0", "@swc/cli": "^0.4.0", - "@swc/core": "^1.3.82", - "@typescript-eslint/rule-tester": "^7.8.0", + "@swc/core": "^1.7.35", + "@typescript-eslint/rule-tester": "^8.8.1", "babel-plugin-add-module-exports": "^1.0.4", - "vitest": "^2.0.5" + "vitest": "^2.1.2" } } diff --git a/packages/js/eslint-plugin/src/configs/custom.ts b/packages/js/eslint-plugin/src/configs/custom.ts deleted file mode 100644 index daa71233573..00000000000 --- a/packages/js/eslint-plugin/src/configs/custom.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { TSESLint } from "@typescript-eslint/utils" - -/** - * ESLint rules created by and for the Openverse project. - */ -export = { - plugins: ["@openverse"], - rules: { - "@openverse/analytics-configuration": [ - "error", - { - reservedPropNames: ["width", "height"], - }, - ], - "@openverse/no-unexplained-disabled-test": ["error"], - "@openverse/translation-strings": ["error"], - }, -} satisfies TSESLint.Linter.Config diff --git a/packages/js/eslint-plugin/src/configs/import.ts b/packages/js/eslint-plugin/src/configs/import.ts index 9cf5abb8e02..c352cfb15e1 100644 --- a/packages/js/eslint-plugin/src/configs/import.ts +++ b/packages/js/eslint-plugin/src/configs/import.ts @@ -1,133 +1,139 @@ -import type { TSESLint } from "@typescript-eslint/utils" +import tseslint from "typescript-eslint" +import * as importPlugin from "eslint-plugin-import" /** * ESLint `import` plugin configuration. */ -export = { - extends: ["plugin:import/recommended", "plugin:import/typescript"], - plugins: ["import"], - rules: { - // `namespace` and `default` are handled by TypeScript - // There's no need to rely on ESLint for this - // https://github.com/import-js/eslint-plugin-import/issues/2878 - "import/namespace": "off", - "import/default": "off", - "import/newline-after-import": ["error"], - "import/order": [ - "error", - { - "newlines-between": "always-and-inside-groups", - groups: [ - "builtin", - "external", - "internal", - "parent", - "sibling", - "index", - "object", - "type", - ], - pathGroups: [ - // Treat #imports as "builtin" - { - pattern: "#imports", - group: "builtin", - position: "before", - }, - { - // Treat k6, vue and composition-api as "builtin" - pattern: "(k6|vue|@nuxtjs/composition-api)", - group: "builtin", - position: "before", - }, - { - // Move assets to the very end of the imports list - pattern: "~/assets/**", - group: "type", - position: "after", - }, - { - // Treat components as their own group and move to the end of the internal imports list - pattern: "~/components/**", - group: "internal", - position: "after", - }, - /** - * These next two must come after any more specific matchers - * as the plugin uses the patterns in order and does not sort - * multiple-matches by specificity, it just takes the _first_ - * pattern that matches and applies that group to the import. - */ - { - // Document webpack alias - pattern: "~/**", - group: "internal", - position: "before", - }, - { - // Document webpack alias - pattern: "~~/**", - group: "external", - position: "after", - }, - ], - pathGroupsExcludedImportTypes: ["builtin"], - }, - ], - "import/extensions": [ - "error", - "always", - { js: "never", mjs: "never", ts: "never" }, +export default tseslint.config( + { + name: "import-config", + extends: [ + importPlugin.flatConfigs.recommended, + importPlugin.flatConfigs.typescript, ], + rules: { + // `namespace` and `default` are handled by TypeScript + // There's no need to rely on ESLint for this + // https://github.com/import-js/eslint-plugin-import/issues/2878 + "import/namespace": "off", + "import/default": "off", + "import/newline-after-import": ["error"], + "import/order": [ + "error", + { + "newlines-between": "always-and-inside-groups", + groups: [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index", + "object", + "type", + ], + pathGroups: [ + // Treat #imports as "builtin" + { + pattern: "#imports", + group: "builtin", + position: "before", + }, + { + // Treat k6, vue and composition-api as "builtin" + pattern: "(k6|vue|@nuxtjs/composition-api)", + group: "builtin", + position: "before", + }, + { + // Move assets to the very end of the imports list + pattern: "~/assets/**", + group: "type", + position: "after", + }, + { + // Treat components as their own group and move to the end of the internal imports list + pattern: "~/components/**", + group: "internal", + position: "after", + }, + /** + * These next two must come after any more specific matchers + * as the plugin uses the patterns in order and does not sort + * multiple-matches by specificity, it just takes the _first_ + * pattern that matches and applies that group to the import. + */ + { + // Document webpack alias + pattern: "~/**", + group: "internal", + position: "before", + }, + { + // Document webpack alias + pattern: "~~/**", + group: "external", + position: "after", + }, + ], + pathGroupsExcludedImportTypes: ["builtin"], + }, + ], + "import/extensions": [ + "error", + "always", + { js: "never", mjs: "never", ts: "never" }, + ], + }, }, - overrides: [ - { - files: ["frontend/**"], - settings: { - "import/resolver": { - typescript: { - project: "frontend/.nuxt/tsconfig.json", - extensions: [".js", ".ts", ".vue", ".png"], - }, + { + name: "import-config-frontend-tsconfig", + files: ["frontend/**"], + settings: { + "import/resolver": { + typescript: { + project: "frontend/.nuxt/tsconfig.json", + extensions: [".js", ".ts", ".vue", ".png"], }, }, }, - { - files: ["packages/js/**"], - settings: { - "import/resolver": { - typescript: { - project: "packages/js/*/tsconfig.json", - }, + }, + { + name: "import-config-packages-js-tsconfig", + files: ["packages/js/**"], + settings: { + "import/resolver": { + typescript: { + project: "packages/js/*/tsconfig.json", }, }, }, - { - files: ["frontend/.storybook/**"], - rules: { - /** - * `.nuxt-storybook` doesn't exist in the CI when it - * lints files unless we ran the storybook build before linting, - * meaning that the imports used in the modules in this directory - * are mostly unavailable. - * - * To avoid turning these rules off we'd have to run the storybook - * build in CI before linting (or even instruct people to run - * storybook build locally before trying to lint) and that's just too - * heavy a lift when we can instead disable the rules for just this - * directory. - * - * Note: This means that if you disable these changes and have not - * deleted the `.nuxt-storybook` directory locally, you will not see - * any ESLint errors. That does not mean these rules are unnecessary. - * Delete the `frontend/.nuxt-storybook` directory and re-run ESLint - * with these rule changes commented out: now you will see the errors - * present in CI. - */ - "import/extensions": "off", - "import/export": "off", - "import/no-unresolved": "off", - }, + }, + { + files: ["frontend/.storybook/**"], + rules: { + /** + * `.nuxt-storybook` doesn't exist in the CI when it + * lints files unless we ran the storybook build before linting, + * meaning that the imports used in the modules in this directory + * are mostly unavailable. + * + * To avoid turning these rules off we'd have to run the storybook + * build in CI before linting (or even instruct people to run + * storybook build locally before trying to lint) and that's just too + * heavy a lift when we can instead disable the rules for just this + * directory. + * + * Note: This means that if you disable these changes and have not + * deleted the `.nuxt-storybook` directory locally, you will not see + * any ESLint errors. That does not mean these rules are unnecessary. + * Delete the `frontend/.nuxt-storybook` directory and re-run ESLint + * with these rule changes commented out: now you will see the errors + * present in CI. + */ + "import/extensions": "off", + "import/export": "off", + "import/no-unresolved": "off", }, - ], -} satisfies TSESLint.Linter.Config + } +) diff --git a/packages/js/eslint-plugin/src/configs/index.ts b/packages/js/eslint-plugin/src/configs/index.ts deleted file mode 100644 index c67c76c8d09..00000000000 --- a/packages/js/eslint-plugin/src/configs/index.ts +++ /dev/null @@ -1,161 +0,0 @@ -import type { TSESLint } from "@typescript-eslint/utils" - -/** - * The Openverse project's ESLint configuration. - * - * This configuration is split into sub-modules in this directory - * that are included using `require.resolve`. - */ -export const project: TSESLint.Linter.ConfigType = { - env: { - browser: true, - node: true, - }, - parser: "vue-eslint-parser", - extends: [ - "eslint:recommended", - "plugin:eslint-comments/recommended", - "plugin:jsonc/recommended-with-jsonc", - require.resolve("./custom"), - require.resolve("./vue"), - require.resolve("./import"), - require.resolve("./typescript"), - "prettier", - ], - plugins: ["unicorn"], - settings: { - "vue-i18n": { - localeDir: "./frontend/src/locales/*.{json}", - messageSyntaxVersion: "^9.0.0", - }, - }, - rules: { - semi: ["error", "never"], - "no-console": "off", - "unicorn/filename-case": ["error", { case: "kebabCase" }], - "unicorn/switch-case-braces": ["error"], - curly: ["error", "all"], - }, - overrides: [ - { - files: ["*.json", "*.json5", "*.jsonc"], - parser: "jsonc-eslint-parser", - }, - { - env: { "vitest/env": true }, - files: ["packages/js/**/*/test"], - plugins: ["vitest"], - extends: ["plugin:vitest/recommended"], - rules: { - // Superseded by `@openverse/no-unexplained-disabled-test` - "vitest/no-disabled-test": "off", - }, - }, - { - env: { - "vitest/env": true, - }, - files: ["frontend/test/unit/**"], - plugins: ["vitest"], - extends: ["plugin:vitest/recommended"], - rules: { - "import/no-named-as-default-member": ["off"], - "@intlify/vue-i18n/no-raw-text": ["off"], - // Superseded by `@openverse/no-unexplained-disabled-test` - "vitest/no-disabled-test": "off", - "no-restricted-imports": [ - "error", - { - name: "pinia", - message: - "Please import pinia test utils from `~~/test/unit/test-utils/pinia`. The test-utils version ensures proper setup of universally necessary Nuxt context mocks.", - }, - ], - "no-restricted-syntax": [ - "error", - { - selector: - "ImportDeclaration[source.value='@vue/test-utils']:has(ImportSpecifier[local.name='shallowMount'])", - message: - "Do not use @vue/test-utils' `shallowMount`. Use `~~/test/unit/test-utils/render` instead which includes helpful context setup or @testing-library/vue's `render` directly.", - }, - ], - }, - }, - { - files: ["frontend/test/{playwright,storybook}/**"], - plugins: ["playwright"], - extends: ["plugin:playwright/recommended"], - rules: { - // Superseded by `@openverse/no-unexplained-disabled-test` - "playwright/no-skipped-test": "off", - - // The following duplicate TypeScript functionality. All our Playwright tests are in TypeScript and type checks will already catch non-string titles. - "playwright/valid-title": "off", - "playwright/valid-describe-callback": "off", - - "playwright/expect-expect": [ - "error", - { - assertFunctionNames: [ - // Shared assertion for confirming sent events - "expectEventPayloadToMatch", - // Shared assertion for visual regression tests - "expectSnapshot", - "expectScreenshotAreaSnapshot", - // Shared assertion for checkbox state - "expectCheckboxState", - ], - }, - ], - }, - }, - { - files: [ - "automations/js/src/**", - "frontend/test/**", - "frontend/src/**/**.json", - ], - rules: { - "unicorn/filename-case": "off", - }, - }, - { - files: ["frontend/src/components/**"], - rules: { - "unicorn/filename-case": [ - "error", - // Allow things like `Component.stories.js` and `Component.types.js` - { - case: "pascalCase", - ignore: [".eslintrc.js", ".*\\..*\\.js", ".*\\.json"], - }, - ], - }, - }, - { - files: [ - "frontend/src/locales/scripts/en.json5", - "frontend/test/locales/*.json", - ], - rules: { - "jsonc/key-name-casing": [ - "error", - { - camelCase: true, - "kebab-case": false, - snake_case: true, // for err_* keys - ignores: ["ncSampling+", "sampling+"], - }, - ], - }, - }, - { - files: ["frontend/src/locales/scripts/en.json5"], - rules: { - "jsonc/quote-props": "off", - "jsonc/quotes": "off", - }, - }, - ], -} diff --git a/packages/js/eslint-plugin/src/configs/typescript.ts b/packages/js/eslint-plugin/src/configs/typescript.ts index 85b6be75cce..53efa270ffe 100644 --- a/packages/js/eslint-plugin/src/configs/typescript.ts +++ b/packages/js/eslint-plugin/src/configs/typescript.ts @@ -1,24 +1,34 @@ -import type { TSESLint } from "@typescript-eslint/utils" +import tseslint, { plugin, configs as tsConfigs } from "typescript-eslint" +import tsdocPlugin from "eslint-plugin-tsdoc" +import eslint from "@eslint/js" -export = { - parserOptions: { - parser: "@typescript-eslint/parser", +export default tseslint.config( + { + name: "vue-typescript", + plugins: { + "@typescript-eslint": plugin, + tsdoc: tsdocPlugin, + }, + files: ["**/*.ts", "**/*.js", "**/*.mjs", "**/*.vue"], + rules: { + "@typescript-eslint/no-require-imports": ["off"], + }, }, - plugins: ["@typescript-eslint", "tsdoc"], - extends: ["plugin:@typescript-eslint/recommended"], - rules: { - "@typescript-eslint/no-var-requires": ["off"], + { + name: "openverse:js-files", + files: ["**/*.js", "**/*.mjs", "*.mjs", "*.js"], + extends: [eslint.configs.recommended], }, - overrides: [ - { - files: ["*.ts"], - rules: { - "tsdoc/syntax": "error", - // This rule is disabled above to avoid forcing ESM syntax on regular JS files - // that aren't ready for it yet. We do want to enforce this for TypeScript, - // however, so we re-enable it here. - "@typescript-eslint/no-var-requires": ["error"], - }, + { + name: "tsdoc-syntax-no-require-imports", + files: ["**/*.ts"], + extends: [...tsConfigs.recommended], + rules: { + "tsdoc/syntax": "error", + // This rule is disabled above to avoid forcing ESM syntax on regular JS files + // that aren't ready for it yet. We do want to enforce this for TypeScript, + // however, so we re-enable it here. + "@typescript-eslint/no-require-imports": ["error"], }, - ], -} satisfies TSESLint.Linter.Config + } +) diff --git a/packages/js/eslint-plugin/src/configs/vue.ts b/packages/js/eslint-plugin/src/configs/vue.ts index 47d96a2f1d4..dbd7277ac94 100644 --- a/packages/js/eslint-plugin/src/configs/vue.ts +++ b/packages/js/eslint-plugin/src/configs/vue.ts @@ -1,116 +1,190 @@ -import type { TSESLint } from "@typescript-eslint/utils" +import tseslint, { configs as tsConfigs } from "typescript-eslint" +import eslintPluginVue from "eslint-plugin-vue" +import eslintPluginVueI18n from "@intlify/eslint-plugin-vue-i18n" +import pluginVueA11y from "eslint-plugin-vuejs-accessibility" +import eslint from "@eslint/js" +import { FlatConfig } from "@typescript-eslint/utils/ts-eslint" -export = { - extends: [ - "plugin:vue/vue3-recommended", - "plugin:vuejs-accessibility/recommended", - "plugin:@intlify/vue-i18n/recommended", - ], - plugins: ["vue", "vuejs-accessibility", "@intlify/vue-i18n"], - rules: { - // Vue i18n rules - "@intlify/vue-i18n/no-deprecated-i18n-component": "error", - "@intlify/vue-i18n/no-i18n-t-path-prop": "error", - "@intlify/vue-i18n/key-format-style": [ - "error", - "camelCase", - { - allowArray: false, - splitByDots: false, - }, - ], - // Vue rules - "vue/block-order": [ - "error", - { - order: ["script[setup]", "script:not([setup])", "template", "style"], +// Filter out yaml files from vue-i18n configs +const vueI18nConfigs = eslintPluginVueI18n.configs["flat/recommended"].filter( + (config: FlatConfig.Config) => { + return !config.files || !config.files.includes("*.yaml") + } +) + +export default tseslint.config( + { + name: "openverse:vue-config", + files: ["*.vue", "**/*.vue"], + settings: { + "vue-i18n": { + localeDir: "./frontend/src/locales/*.{json}", + messageSyntaxVersion: "^9.0.0", }, - ], - "vue/padding-line-between-blocks": ["error", "always"], - "vue/max-attributes-per-line": "off", - "vue/require-prop-types": "off", - "vue/require-default-prop": "off", - "vue/html-closing-bracket-newline": "off", - "vue/html-indent": "off", - "vue/singleline-html-element-content-newline": "off", - "vue/block-lang": [ - "error", - { - // This confusing naming prevents the use of 'lang' directives - // entirely on Vue SFC style blocks. - style: { allowNoLang: true }, + }, + languageOptions: { + parserOptions: { + parser: "@typescript-eslint/parser", }, + }, + extends: [ + eslint.configs.recommended, + ...tsConfigs.recommended, + ...eslintPluginVue.configs["flat/recommended"], + ...pluginVueA11y.configs["flat/recommended"], + ...vueI18nConfigs, ], - "vue/component-name-in-template-casing": [ - "error", - "PascalCase", - { registeredComponentsOnly: false, ignores: ["i18n", "i18n-t"] }, - ], - "vue/html-self-closing": [ - "error", - { - html: { - void: "always", - normal: "always", - component: "always", + rules: { + // Vue rules + /** + * Custom rule to disallow raw `` tag usage. + * Learn more about vue-eslint-parser's AST syntax: + * https://github.com/vuejs/vue-eslint-parser/blob/master/docs/ast.md + */ + "vue/no-restricted-syntax": [ + "error", + { + selector: 'VElement[name="a"]', + message: "Use the component instead of a raw tag.", }, - svg: "always", - math: "always", - }, - ], - "vuejs-accessibility/aria-role": "error", - "vuejs-accessibility/label-has-for": [ - "error", - { required: { some: ["nesting", "id"] } }, - ], - /** - * Custom rule to disallow raw `` tag usage. - * Learn more about vue-eslint-parser's AST syntax: - * https://github.com/vuejs/vue-eslint-parser/blob/master/docs/ast.md - */ - "vue/no-restricted-syntax": [ - "error", - { - selector: 'VElement[name="a"]', - message: "Use the component instead of a raw tag.", - }, - { - selector: 'VElement[name="nuxtlink"]', - message: "Use the component instead of .", - }, - { - selector: 'VElement[name="routerlink"]', - message: "Use the component instead of .", - }, - ], + { + selector: 'VElement[name="nuxtlink"]', + message: "Use the component instead of .", + }, + { + selector: 'VElement[name="routerlink"]', + message: "Use the component instead of .", + }, + ], + "vue/block-order": [ + "error", + { + order: ["script[setup]", "script:not([setup])", "template", "style"], + }, + ], + "vue/padding-line-between-blocks": ["error", "always"], + "vue/max-attributes-per-line": "off", + "vue/require-prop-types": "off", + "vue/require-default-prop": "off", + "vue/html-closing-bracket-newline": "off", + "vue/html-indent": "off", + "vue/singleline-html-element-content-newline": "off", + "vue/block-lang": [ + "error", + { + // This confusing naming prevents the use of 'lang' directives + // entirely on Vue SFC style blocks. + style: { allowNoLang: true }, + }, + ], + "vue/component-name-in-template-casing": [ + "error", + "PascalCase", + { registeredComponentsOnly: false, ignores: ["i18n", "i18n-t"] }, + ], + "vue/html-self-closing": [ + "error", + { + html: { + void: "always", + normal: "always", + component: "always", + }, + svg: "always", + math: "always", + }, + ], + + // Vue a11y rules + "vuejs-accessibility/aria-role": "error", + "vuejs-accessibility/label-has-for": [ + "error", + { required: { some: ["nesting", "id"] } }, + ], - "@intlify/vue-i18n/no-raw-text": [ - "error", - { - ignoreText: [ - // Brand names that should not be translated - "Common Crawl", - "Creative Commons", - "Europeana", - "Europeana API", - "Smithsonian Institute", - "Flickr", - "Openverse", - "WordPress", - "GitHub", + // Vue i18n rules + "@intlify/vue-i18n/no-deprecated-i18n-component": "error", + "@intlify/vue-i18n/no-i18n-t-path-prop": "error", + "@intlify/vue-i18n/key-format-style": [ + "error", + "camelCase", + { + allowArray: false, + splitByDots: false, + }, + ], + "@intlify/vue-i18n/no-raw-text": [ + "error", + { + ignoreText: [ + // Brand names that should not be translated + "Common Crawl", + "Creative Commons", + "Europeana", + "Europeana API", + "Smithsonian Institute", + "Flickr", + "Openverse", + "WordPress", + "GitHub", - // Domains and emails - "openverse@wordpress.org", - "oldsearch.creativecommons.org", - "Openverse.org", - ], + // Domains and emails + "openverse@wordpress.org", + "oldsearch.creativecommons.org", + "Openverse.org", + ], + }, + ], + }, + }, + { + name: "openverse:vue:multi-word-component-names", + files: ["frontend/src/pages/**/*.vue", "frontend/src/error.vue"], + rules: { "vue/multi-word-component-names": "off" }, + }, + { + name: "openverse:vue:json-i18n-settings", + settings: { + "vue-i18n": { + localeDir: "./frontend/src/locales/*.{json}", + messageSyntaxVersion: "^9.0.0", }, + }, + files: ["**/*.json", "**/*.json5", "**/*.ts"], + }, + { + name: "openverse:vue:i18n-translation-strings", + files: ["frontend/src/locales/en.json5", "frontend/test/locales/*.json"], + + extends: [...eslintPluginVueI18n.configs["flat/recommended"]], + rules: { + "@openverse/translation-strings": ["error"], + }, + }, + { + name: "openverse:case:locales-exceptions", + files: [ + "frontend/src/locales/scripts/en.json5", + "frontend/test/locales/*.json", ], + rules: { + "jsonc/key-name-casing": [ + "error", + { + camelCase: true, + "kebab-case": false, + snake_case: true, // for err_* keys + ignores: ["ncSampling+", "sampling+"], + }, + ], + }, }, - overrides: [ - { - files: ["frontend/src/pages/**/*.vue", "frontend/src/error.vue"], - rules: { "vue/multi-word-component-names": "off" }, + { + name: "openverse:locales-quotes", + files: ["frontend/src/locales/scripts/en.json5"], + rules: { + "jsonc/quote-props": "off", + "jsonc/quotes": "off", }, - ], -} satisfies TSESLint.Linter.Config + } +) diff --git a/packages/js/eslint-plugin/src/index.ts b/packages/js/eslint-plugin/src/index.ts index 9d1de434ffa..7f1edf72aeb 100644 --- a/packages/js/eslint-plugin/src/index.ts +++ b/packages/js/eslint-plugin/src/index.ts @@ -1,10 +1,190 @@ +import * as tseslint from "typescript-eslint" + +import unicornPlugin from "eslint-plugin-unicorn" +import playwrightPlugin from "eslint-plugin-playwright" +// @ts-ignore +import vitestPlugin from "@vitest/eslint-plugin" +import jsoncPlugin from "eslint-plugin-jsonc" +import eslintCommentsConfigs from "@eslint-community/eslint-plugin-eslint-comments/configs" + +import prettierConfig from "eslint-config-prettier" + +import globals from "globals" + +import typescriptConfig from "./configs/typescript" +import importConfig from "./configs/import" + +import vueConfig from "./configs/vue" import rules from "./rules" -import * as configs from "./configs" -export = { - meta: { - name: "@openverse/eslint-plugin", +const plugin = { + configs: {}, + meta: { name: "@openverse", version: "0.0.0" }, + rules: { + "analytics-configuration": rules["analytics-configuration"], + "no-unexplained-disabled-test": rules["no-unexplained-disabled-test"], + "translation-strings": rules["translation-strings"], }, - rules, - configs, } + +Object.assign(plugin.configs, { + project: tseslint.config( + { + name: "@openverse/eslint-plugin", + plugins: { + "@openverse": plugin, + }, + rules: { + "@openverse/analytics-configuration": [ + "error", + { + reservedPropNames: ["width", "height"], + }, + ], + "@openverse/no-unexplained-disabled-test": ["error"], + "@openverse/translation-strings": ["error"], + }, + }, + { + name: "openverse:common-config", + plugins: { + unicorn: unicornPlugin, + playwright: playwrightPlugin, + }, + extends: [ + eslintCommentsConfigs.recommended, + ...typescriptConfig, + ...importConfig, + ...jsoncPlugin.configs["flat/recommended-with-jsonc"], + vitestPlugin.configs.recommended, + ], + languageOptions: { + ecmaVersion: 2022, + globals: { + ...globals.node, + ...globals.browser, + }, + }, + rules: { + "no-console": "off", + "unicorn/filename-case": ["error", { case: "kebabCase" }], + "unicorn/switch-case-braces": ["error"], + curly: ["error", "all"], + }, + }, + + { + name: "openverse:vue-config", + extends: [...vueConfig], + }, + prettierConfig, + + { + name: "openverse:test:packages-unit-tests", + settings: { + vitest: { + typecheck: true, + }, + }, + languageOptions: { + globals: { + ...vitestPlugin.environments.env.globals, + }, + }, + files: ["packages/js/**/*/test"], + rules: { + // Superseded by `@openverse/no-unexplained-disabled-test` + "vitest/no-disabled-test": "off", + }, + }, + { + name: "openverse:test:frontend-unit-tests", + languageOptions: { + globals: { + ...globals.browser, + ...vitestPlugin.environments.env.globals, + }, + }, + files: ["frontend/test/unit/**"], + rules: { + "import/no-named-as-default-member": ["off"], + "@intlify/vue-i18n/no-raw-text": ["off"], + // Superseded by `@openverse/no-unexplained-disabled-test` + "vitest/no-disabled-test": "off", + "no-restricted-imports": [ + "error", + { + name: "pinia", + message: + "Please import pinia test utils from `~~/test/unit/test-utils/pinia`. The test-utils version ensures proper setup of universally necessary Nuxt context mocks.", + }, + ], + "no-restricted-syntax": [ + "error", + { + selector: + "ImportDeclaration[source.value='@vue/test-utils']:has(ImportSpecifier[local.name='shallowMount'])", + message: + "Do not use @vue/test-utils' `shallowMount`. Use `~~/test/unit/test-utils/render` instead which includes helpful context setup or @testing-library/vue's `render` directly.", + }, + ], + }, + }, + + { + name: "openverse:test:playwright", + files: ["frontend/test/{playwright,storybook}/**"], + rules: { + ...playwrightPlugin.configs["flat/recommended"].rules, + // Superseded by `@openverse/no-unexplained-disabled-test` + "playwright/no-skipped-test": "off", + + // The following duplicate TypeScript functionality. All our Playwright tests are in TypeScript and type checks will already catch non-string titles. + "playwright/valid-title": "off", + "playwright/valid-describe-callback": "off", + + "playwright/expect-expect": [ + "error", + { + assertFunctionNames: [ + // Shared assertion for confirming sent events + "expectEventPayloadToMatch", + // Shared assertion for visual regression tests + "expectSnapshot", + "expectScreenshotAreaSnapshot", + // Shared assertion for checkbox state + "expectCheckboxState", + ], + }, + ], + }, + }, + { + name: "openverse:case:filenames", + files: [ + "automations/js/src/**", + "frontend/test/**", + "frontend/src/**/**.json", + ], + rules: { + "unicorn/filename-case": "off", + }, + }, + { + name: "openverse:case:components-filenames", + files: ["frontend/src/components/**"], + rules: { + "unicorn/filename-case": [ + "error", + // Allow things like `Component.stories.js` and `Component.types.js` + { + case: "pascalCase", + ignore: [".eslintrc.js", ".*\\..*\\.js", ".*\\.json"], + }, + ], + }, + } + ), +}) + +export default plugin diff --git a/packages/js/eslint-plugin/src/rules/analytics-configuration.ts b/packages/js/eslint-plugin/src/rules/analytics-configuration.ts index 829127db07f..1bd13b30dd8 100644 --- a/packages/js/eslint-plugin/src/rules/analytics-configuration.ts +++ b/packages/js/eslint-plugin/src/rules/analytics-configuration.ts @@ -69,7 +69,7 @@ export const analyticsConfiguration = OpenverseRule({ meta: { docs: { description: "Ensure correct Openverse analytics event configuration", - recommended: "recommended", + recommended: true, }, type: "problem", messages, diff --git a/packages/js/eslint-plugin/src/rules/index.ts b/packages/js/eslint-plugin/src/rules/index.ts index 48bb0d4aa91..49499d9e8a0 100644 --- a/packages/js/eslint-plugin/src/rules/index.ts +++ b/packages/js/eslint-plugin/src/rules/index.ts @@ -6,4 +6,4 @@ export default { "analytics-configuration": analyticsConfiguration, "no-unexplained-disabled-test": noUnexplainedDisabledTest, "translation-strings": translationStrings, -} +} as const diff --git a/packages/js/eslint-plugin/src/rules/no-unexplained-disabled-test.ts b/packages/js/eslint-plugin/src/rules/no-unexplained-disabled-test.ts index bb76f56d84a..47d1462d783 100644 --- a/packages/js/eslint-plugin/src/rules/no-unexplained-disabled-test.ts +++ b/packages/js/eslint-plugin/src/rules/no-unexplained-disabled-test.ts @@ -16,14 +16,14 @@ export const noUnexplainedDisabledTest = OpenverseRule<[], MessageIds>({ docs: { description: "Disabled tests must have an issue comment with a GitHub link preceding them.", - recommended: "recommended", + recommended: true, }, schema: [], messages, }, defaultOptions: [], create(context) { - const sourceCode = context.getSourceCode() + const sourceCode = context.sourceCode const hasIssueCommentWithLink = (node: TSESTree.Node) => { const commentsBeforeNode = sourceCode.getCommentsBefore(node) diff --git a/packages/js/eslint-plugin/src/rules/translation-strings.ts b/packages/js/eslint-plugin/src/rules/translation-strings.ts index c8b6abeed1e..0b7b0230a2c 100644 --- a/packages/js/eslint-plugin/src/rules/translation-strings.ts +++ b/packages/js/eslint-plugin/src/rules/translation-strings.ts @@ -22,7 +22,7 @@ export const translationStrings = OpenverseRule({ docs: { description: "Prevent translation strings difficult for translators to handle", - recommended: "recommended", + recommended: true, }, type: "problem", messages, @@ -42,7 +42,7 @@ export const translationStrings = OpenverseRule({ create(context, [options]) { return { "JSONProperty[value.type='JSONLiteral']"(node: AST.JSONProperty): void { - const isEnJson5 = context.getFilename().endsWith("en.json5") + const isEnJson5 = context.filename.endsWith("en.json5") if (!isEnJson5) { return } diff --git a/packages/js/eslint-plugin/src/typings.d.ts b/packages/js/eslint-plugin/src/typings.d.ts new file mode 100644 index 00000000000..f1616db8cfe --- /dev/null +++ b/packages/js/eslint-plugin/src/typings.d.ts @@ -0,0 +1,22 @@ +declare module "@intlify/eslint-plugin-vue-i18n" { + import { FlatConfig } from "@typescript-eslint/utils/ts-eslint" + + export const configs: { + "flat/recommended": FlatConfig.Config[] + } +} + +declare module "eslint-plugin-import" { + import { FlatConfig } from "@typescript-eslint/utils/ts-eslint" + + export const flatConfigs: { + recommended: FlatConfig.Config + typescript: FlatConfig.Config + } +} + +declare module "@eslint-community/eslint-plugin-eslint-comments/configs" { + import { FlatConfig } from "@typescript-eslint/utils/ts-eslint" + + export const recommended: FlatConfig.Config +} diff --git a/packages/js/eslint-plugin/src/utils/rule-creator.ts b/packages/js/eslint-plugin/src/utils/rule-creator.ts index ee9b55357be..9a18659e27b 100644 --- a/packages/js/eslint-plugin/src/utils/rule-creator.ts +++ b/packages/js/eslint-plugin/src/utils/rule-creator.ts @@ -1,6 +1,12 @@ import { ESLintUtils } from "@typescript-eslint/utils" -export const OpenverseRule = ESLintUtils.RuleCreator( +export interface OpenverseDocs { + description: string + recommended?: boolean + requiresTypeChecking?: boolean +} + +export const OpenverseRule = ESLintUtils.RuleCreator( (ruleName) => `https://docs.openverse.org/packages/js/eslint_plugin/${ruleName.replaceAll( "-", diff --git a/packages/js/eslint-plugin/test/rules/analytics-configuration.spec.ts b/packages/js/eslint-plugin/test/rules/analytics-configuration.spec.ts index bec99fefbb9..7fb0876a80c 100644 --- a/packages/js/eslint-plugin/test/rules/analytics-configuration.spec.ts +++ b/packages/js/eslint-plugin/test/rules/analytics-configuration.spec.ts @@ -1,13 +1,8 @@ import { RuleTester } from "@typescript-eslint/rule-tester" -import openverseEslintPlugin from "@openverse/eslint-plugin" +import { analyticsConfiguration } from "../../src/rules/analytics-configuration" -const tester = new RuleTester({ - parser: "@typescript-eslint/parser", - rules: { - "@openverse/analytics-configuration": ["error"], - }, -}) +const tester = new RuleTester() const baseTestCase = { filename: "types/analytics.ts", @@ -44,111 +39,108 @@ const validPayloadValueTypes = ["string", "number", "boolean"] const mockReservedPropNames = ["timestamp", "ua"] -tester.run( - "@openverse/analytics-configuration", - openverseEslintPlugin.rules["analytics-configuration"], - { - invalid: [ - ...invalidEventNames.map( - (eventName) => - ({ - ...baseTestCase, - name: `Disallow event names not in screaming snake case: ${eventName}`, - code: ` +tester.run("analytics-configuration", analyticsConfiguration, { + invalid: [ + ...invalidEventNames.map( + (eventName) => + ({ + ...baseTestCase, + name: `Disallow event names not in screaming snake case: ${eventName}`, + code: ` export type Events = { ${eventName}: never } `, - errors: [ - { - messageId: "eventNameFormat", - data: { eventName: eventName.replace(/'/g, "") }, - }, - ], - }) as const - ), - ...invalidPayloadTypes.map( - (payloadType) => - ({ - ...baseTestCase, - name: `Disallow ${payloadType} as payload types.`, - code: ` + errors: [ + { + messageId: "eventNameFormat", + data: { eventName: eventName.replace(/'/g, "") }, + }, + ], + }) as const + ), + ...invalidPayloadTypes.map( + (payloadType) => + ({ + ...baseTestCase, + name: `Disallow ${payloadType} as payload types.`, + code: ` export type Events = { EVENT_NAME: ${payloadType} } `, - errors: [{ messageId: "emptyPayloadType" }], - }) as const - ), - ...mockReservedPropNames.map( - (propName) => - ({ - ...baseTestCase, - options: [ - { - reservedPropNames: mockReservedPropNames, - }, - ], - name: `Disallow reserved prop name ${propName} (configured via rule test options)`, - code: ` + errors: [{ messageId: "emptyPayloadType" }], + }) as const + ), + ...mockReservedPropNames.map( + (propName) => + ({ + ...baseTestCase, + options: [ + { + reservedPropNames: mockReservedPropNames, + }, + ], + name: `Disallow reserved prop name ${propName} (configured via rule test options)`, + code: ` export type Events = { EVENT_NAME: { ${propName}: number } } `, - errors: [ - { messageId: "reservedPayloadPropNames", data: { propName } }, - ], - }) as const - ), - ...invalidPayloadValueTypes.map( - (payloadPropType) => - ({ - ...baseTestCase, - name: `Disallow ${payloadPropType} payload prop type`, - code: ` + errors: [ + { messageId: "reservedPayloadPropNames", data: { propName } }, + ], + }) as const + ), + ...invalidPayloadValueTypes.map( + (payloadPropType) => + ({ + ...baseTestCase, + name: `Disallow ${payloadPropType} payload prop type`, + code: ` export type Events = { EVENT_NAME: { payloadProp: ${payloadPropType} } } `, - errors: [{ messageId: "invalidPayloadFormat" }], - }) as const - ), - ], - valid: [ - ...validEventNames.map( - (eventName) => - ({ - ...baseTestCase, - name: `Allow screaming snake case variations: ${eventName}`, - code: ` + errors: [{ messageId: "invalidPayloadFormat" }], + }) as const + ), + ], + valid: [ + ...validEventNames.map( + (eventName) => + ({ + ...baseTestCase, + name: `Allow screaming snake case variations: ${eventName}`, + code: ` export type Events = { ${eventName}: never } `, - }) as const - ), - { - ...baseTestCase, - name: "Use `never` for empty payloads.", - code: ` + }) as const + ), + { + ...baseTestCase, + name: "Use `never` for empty payloads.", + code: ` export type Events = { EVENT_NAME: never } `, - }, - { - ...baseTestCase, - options: [ - { - reservedPropNames: mockReservedPropNames, - }, - ], - name: "Allow other prop names even if some are reserved", - code: ` + }, + { + ...baseTestCase, + options: [ + { + reservedPropNames: mockReservedPropNames, + }, + ], + name: "Allow other prop names even if some are reserved", + code: ` export type Events = { EVENT_NAME: { not_reserved: string @@ -156,21 +148,20 @@ tester.run( } } `, - }, - ...validPayloadValueTypes.map( - (payloadPropType) => - ({ - ...baseTestCase, - name: `Allow payload prop type ${payloadPropType}`, - code: ` + }, + ...validPayloadValueTypes.map( + (payloadPropType) => + ({ + ...baseTestCase, + name: `Allow payload prop type ${payloadPropType}`, + code: ` export type Events = { EVENT_NAME: { prop: ${payloadPropType} } } `, - }) as const - ), - ], - } -) + }) as const + ), + ], +}) diff --git a/packages/js/eslint-plugin/test/rules/no-unexplained-disabled-test.spec.ts b/packages/js/eslint-plugin/test/rules/no-unexplained-disabled-test.spec.ts index 9eb484d17ca..f6c30608e84 100644 --- a/packages/js/eslint-plugin/test/rules/no-unexplained-disabled-test.spec.ts +++ b/packages/js/eslint-plugin/test/rules/no-unexplained-disabled-test.spec.ts @@ -1,13 +1,8 @@ import { RuleTester } from "@typescript-eslint/rule-tester" -import openverseEslintPlugin from "@openverse/eslint-plugin" +import { noUnexplainedDisabledTest } from "../../src/rules/no-unexplained-disabled-test" -const tester = new RuleTester({ - parser: "@typescript-eslint/parser", - rules: { - "@openverse/no-unexplained-disabled-test": ["error"], - }, -}) +const tester = new RuleTester() const invalidTestCases = [ { @@ -174,11 +169,7 @@ const validTestCases = [ ] // Run the tests -tester.run( - "@openverse/no-unexplained-disabled-test", - openverseEslintPlugin.rules["no-unexplained-disabled-test"], - { - valid: validTestCases, - invalid: invalidTestCases, - } -) +tester.run("no-unexplained-disabled-test", noUnexplainedDisabledTest, { + valid: validTestCases, + invalid: invalidTestCases, +}) diff --git a/packages/js/eslint-plugin/test/rules/translation-strings.spec.ts b/packages/js/eslint-plugin/test/rules/translation-strings.spec.ts index 3a09c81a230..4d7de9e5f6d 100644 --- a/packages/js/eslint-plugin/test/rules/translation-strings.spec.ts +++ b/packages/js/eslint-plugin/test/rules/translation-strings.spec.ts @@ -1,18 +1,14 @@ import { RuleTester } from "@typescript-eslint/rule-tester" -import openverseEslintPlugin from "@openverse/eslint-plugin" +import jsoncParser from "jsonc-eslint-parser" -const maxLength = 20 +import { translationStrings } from "../../src/rules/translation-strings" -const tester = new RuleTester({ - parser: "jsonc-eslint-parser", - rules: { - "@openverse/translation-strings": ["error"], - }, -}) +const maxLength = 20 const baseTestCase = { filename: "en.json5", + languageOptions: { parser: jsoncParser }, options: [ { maxLength, @@ -20,15 +16,13 @@ const baseTestCase = { ] as const, } -tester.run( - "@openverse/translation-strings", - openverseEslintPlugin.rules["translation-strings"], - { - invalid: [ - { - ...baseTestCase, - name: "Disallow strings longer than configured max length", - code: ` +const tester = new RuleTester() +tester.run("translation-strings", translationStrings, { + invalid: [ + { + ...baseTestCase, + name: "Disallow strings longer than configured max length", + code: ` { hello: { world: { @@ -43,28 +37,28 @@ tester.run( } } `, - errors: [{ messageId: "maxLengthExceeded", data: { maxLength } }], - }, - { - ...baseTestCase, - name: "Disallow strings longer than configured max length, less property nesting", - code: ` + errors: [{ messageId: "maxLengthExceeded", data: { maxLength } }], + }, + { + ...baseTestCase, + name: "Disallow strings longer than configured max length, less property nesting", + code: ` { tooLong: "${new Array(maxLength + 1).fill("word").join(" ")}" }`, - errors: [ - { - messageId: "maxLengthExceeded", - data: { maxLength }, - }, - ], - }, - ], - valid: [ - { - ...baseTestCase, - name: "Does not exceed configured max length", - code: ` + errors: [ + { + messageId: "maxLengthExceeded", + data: { maxLength }, + }, + ], + }, + ], + valid: [ + { + ...baseTestCase, + name: "Does not exceed configured max length", + code: ` { hello: { world: { @@ -79,11 +73,12 @@ tester.run( } } `, - }, - { - filename: "notEnjson5.json5", - name: "Ignores files that are not en.json5", - code: ` + }, + { + filename: "notEnjson5.json5", + name: "Ignores files that are not en.json5", + languageOptions: { parser: jsoncParser }, + code: ` { hello: { world: { @@ -93,7 +88,6 @@ tester.run( } } }`, - }, - ], - } -) + }, + ], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e420ba104b0..c5d7745c758 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,14 @@ pnpmfileChecksum: ugk6vame5phdvj3z7an37uzqxm importers: .: + dependencies: + typescript-eslint: + specifier: ^8.8.1 + version: 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) devDependencies: + '@eslint/compat': + specifier: ^1.2.0 + version: 1.2.0(eslint@9.12.0(jiti@1.21.6)) '@openverse/eslint-plugin': specifier: workspace:* version: link:packages/js/eslint-plugin @@ -140,13 +147,13 @@ importers: version: 8.5.5(magicast@0.3.4)(rollup@4.22.4)(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) '@nuxtjs/storybook': specifier: npm:@nuxtjs/storybook@nightly - version: 8.3.0-28764731.a9bf66d(@babel/preset-env@7.25.4(@babel/core@7.24.7))(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) + version: 8.3.0-28764731.a9bf66d(@babel/preset-env@7.25.4(@babel/core@7.24.7))(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) '@playwright/test': specifier: 1.48.1 version: 1.48.1 '@storybook-vue/nuxt': specifier: npm:@storybook-vue/nuxt@nightly - version: 8.3.0-28764731.a9bf66d(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) + version: 8.3.0-28764731.a9bf66d(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) '@storybook/addon-essentials': specifier: 8.2.9 version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(webpack-sources@3.2.3) @@ -194,7 +201,7 @@ importers: version: 3.37.1 eslint-plugin-jsonc: specifier: ^2.16.0 - version: 2.16.0(eslint@8.57.0) + version: 2.16.0(eslint@9.12.0(jiti@1.21.6)) jsdom: specifier: ^24.1.0 version: 24.1.0 @@ -206,7 +213,7 @@ importers: version: 6.2.2 nuxt: specifier: 3.13.1 - version: 3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3) + version: 3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -265,82 +272,97 @@ importers: packages/js/eslint-plugin: dependencies: + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.4.0 + version: 4.4.0(eslint@9.12.0(jiti@1.21.6)) + '@eslint/js': + specifier: ^9.12.0 + version: 9.12.0 '@intlify/eslint-plugin-vue-i18n': - specifier: ^2.0.0 - version: 2.0.0(eslint@8.57.0) + specifier: ^3.0.0 + version: 3.0.0(eslint@9.12.0(jiti@1.21.6)) + '@types/eslint-config-prettier': + specifier: ^6.11.3 + version: 6.11.3 + '@types/eslint__js': + specifier: ^8.42.3 + version: 8.42.3 '@typescript-eslint/eslint-plugin': - specifier: ^7.8.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.8.1 + version: 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/parser': - specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.8.1 + version: 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/utils': - specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.8.1 + version: 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + '@vitest/eslint-plugin': + specifier: ^1.1.7 + version: 1.1.7(@typescript-eslint/utils@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.3(@types/node@22.5.1)(jsdom@24.1.0)(terser@5.31.0)) eslint: - specifier: ^8.57.0 - version: 8.57.0 + specifier: ^9.12.0 + version: 9.12.0(jiti@1.21.6) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@9.12.0(jiti@1.21.6)) eslint-import-resolver-typescript: - specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + specifier: ^3.6.3 + version: 3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@1.21.6)) eslint-plugin-eslint-comments: specifier: ^3.2.0 - version: 3.2.0(eslint@8.57.0) + version: 3.2.0(eslint@9.12.0(jiti@1.21.6)) eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + specifier: ^2.31.0 + version: 2.31.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@1.21.6)) eslint-plugin-jsonc: - specifier: ^2.15.1 - version: 2.16.0(eslint@8.57.0) + specifier: ^2.16.0 + version: 2.16.0(eslint@9.12.0(jiti@1.21.6)) eslint-plugin-playwright: - specifier: ^1.6.0 - version: 1.6.0(eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0) + specifier: ^1.7.0 + version: 1.7.0(eslint@9.12.0(jiti@1.21.6)) eslint-plugin-tsdoc: specifier: ^0.3.0 version: 0.3.0 eslint-plugin-unicorn: - specifier: ^52.0.0 - version: 52.0.0(eslint@8.57.0) - eslint-plugin-vitest: - specifier: ^0.3.18 - version: 0.3.26(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)(vitest@2.0.5) + specifier: ^56.0.0 + version: 56.0.0(eslint@9.12.0(jiti@1.21.6)) eslint-plugin-vue: - specifier: ^9.25.0 - version: 9.25.0(eslint@8.57.0) + specifier: ^9.29.0 + version: 9.29.0(eslint@9.12.0(jiti@1.21.6)) eslint-plugin-vuejs-accessibility: - specifier: ^2.3.0 - version: 2.3.0(eslint@8.57.0) + specifier: ^2.4.1 + version: 2.4.1(eslint@9.12.0(jiti@1.21.6)) jsonc-eslint-parser: specifier: ^2.4.0 version: 2.4.0 typescript: specifier: 5.6.3 version: 5.6.3 + typescript-eslint: + specifier: ^8.8.1 + version: 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) vue-eslint-parser: - specifier: ^9.4.2 - version: 9.4.2(eslint@8.57.0) + specifier: ^9.4.3 + version: 9.4.3(eslint@9.12.0(jiti@1.21.6)) devDependencies: '@eslint/eslintrc': - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^3.1.0 + version: 3.1.0 '@swc/cli': specifier: ^0.4.0 - version: 0.4.0(@swc/core@1.3.82)(chokidar@3.6.0) + version: 0.4.0(@swc/core@1.7.36)(chokidar@3.6.0) '@swc/core': - specifier: ^1.3.82 - version: 1.3.82 + specifier: ^1.7.35 + version: 1.7.36 '@typescript-eslint/rule-tester': - specifier: ^7.8.0 - version: 7.8.0(@eslint/eslintrc@3.0.2)(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.8.1 + version: 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) babel-plugin-add-module-exports: specifier: ^1.0.4 version: 1.0.4 vitest: - specifier: ^2.0.5 - version: 2.0.5(@types/node@22.5.1)(@vitest/ui@2.0.5)(jsdom@24.1.0)(terser@5.31.0) + specifier: ^2.1.2 + version: 2.1.3(@types/node@22.5.1)(jsdom@24.1.0)(terser@5.31.0) packages/js/k6: devDependencies: @@ -1578,6 +1600,12 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-plugin-eslint-comments@4.4.0': + resolution: {integrity: sha512-yljsWl5Qv3IkIRmJ38h3NrHXFCm4EUl55M8doGTF6hvzvFF8kRpextgSrg2dwHev9lzBZyafCr9RelGIyQm6fw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1588,21 +1616,42 @@ packages: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@1.4.1': - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/compat@1.2.0': + resolution: {integrity: sha512-CkPWddN7J9JPrQedEr2X7AjK9y1jaMJtxZ4A/+jTMFA2+n5BWhcKHW/EbJyARqg2zzQfgtWUtVmG3hrG6+nGpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/eslintrc@3.0.2': - resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.12.0': + resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} @@ -1617,18 +1666,21 @@ packages: '@floating-ui/utils@0.2.5': resolution: {integrity: sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.0': + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.5': + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} '@intlify/bundle-utils@7.5.1': resolution: {integrity: sha512-UovJl10oBIlmYEcWw+VIHdKY5Uv5sdPG0b/b6bOYxGLln3UwB75+2dlc0F3Fsa0RhoznQ5Rp589/BZpABpE4Xw==} @@ -1650,11 +1702,11 @@ packages: resolution: {integrity: sha512-R+l9DRqzfK0yT9UgaCq3sl24NJAP4f/djAu4z9zLknAUBEal2q/tXFV+oGzcGpvi3uXWNvF9Gctj+IsuPwJjoA==} engines: {node: '>= 16'} - '@intlify/eslint-plugin-vue-i18n@2.0.0': - resolution: {integrity: sha512-ECBD0TvQNa56XKyuM6FPIGAAl7MP6ODcgjBQJrzucNxcTb8fYTWmZ+xgBuvmvAtA0iE0D4Wp18UMild2N0bGyw==} - engines: {node: ^14.17.0 || >=16.0.0} + '@intlify/eslint-plugin-vue-i18n@3.0.0': + resolution: {integrity: sha512-s4fe+VOiqMZGhDrXWnL1xLyHbcFWBcEBeD/KpVrkOtL+utH2LPTi7uZ8RvWSthMS0mUL/7L74hFJ//OUU7AYww==} + engines: {node: '>=18.0.0'} peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.0.0 || ^9.0.0-0 '@intlify/h3@0.5.0': resolution: {integrity: sha512-cgfrtD3qu3BPJ47gfZ35J2LJpI64Riic0K8NGgid5ilyPXRQTNY7mXlT/B+HZYQg1hmBxKa5G5HJXyAZ4R2H5A==} @@ -1819,6 +1871,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@nuxt/devalue@2.0.2': resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} @@ -2282,6 +2338,10 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.48.1': resolution: {integrity: sha512-s9RtWoxkOLmRJdw3oFvhFbs9OJS0BzrLUc8Hf6l2UdCNd1rqeEyD4BhCJkvzeEoD1FsK4mirsWwGerhVmYKtZg==} engines: {node: '>=18'} @@ -2499,6 +2559,9 @@ packages: cpu: [x64] os: [win32] + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@sentry-internal/browser-utils@8.26.0': resolution: {integrity: sha512-O2Tj+WK33/ZVp5STnz6ZL0OO+/Idk2KqsH0ITQkQmyZ2z0kdzWOeqK7s7q3/My6rB1GfPcyqPcBBv4dVv92FYQ==} engines: {node: '>=14.18'} @@ -2764,71 +2827,71 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.3.82': - resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==} + '@swc/core-darwin-arm64@1.7.36': + resolution: {integrity: sha512-8vDczXzCgv3ceTPhEivlpGprN44YlrCK1nbfU9g2TrhV/Aiqi09W/eM5zLesdoM1Z3mJl492gc/8nlTkpDdusw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.3.82': - resolution: {integrity: sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==} + '@swc/core-darwin-x64@1.7.36': + resolution: {integrity: sha512-Pa2Gao7+Wf5m3SsK4abKRtd48AtoUnJInvaC3d077swBfgZjbjUbQvcpdc2dOeQtWwo49rFqUZJonMsL0jnPgQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.3.82': - resolution: {integrity: sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==} + '@swc/core-linux-arm-gnueabihf@1.7.36': + resolution: {integrity: sha512-3YsMWd7V+WZEjbfBnLkkz/olcRBa8nyoK0iIOnNARJBMcYaJxjkJSMZpmSojCnIVwvjA1N83CPAbUL+W+fCnHg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.3.82': - resolution: {integrity: sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==} + '@swc/core-linux-arm64-gnu@1.7.36': + resolution: {integrity: sha512-lqM3aBB7kJazJYOwHeA5OGNLqXoQPZ/76b3dV+XcjN1GhD0CcXz6mW5PRYVin6OSN1eKrKBKJjtDA1mqADDEvw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.3.82': - resolution: {integrity: sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==} + '@swc/core-linux-arm64-musl@1.7.36': + resolution: {integrity: sha512-bqei2YDzvUfG0pth5W2xJaj0eG4XWYk0d/NJ75vBX6bkIzK6dC8iuKQ41jOfUWonnrAs7rTDDJW0sTn/evvRdw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.3.82': - resolution: {integrity: sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==} + '@swc/core-linux-x64-gnu@1.7.36': + resolution: {integrity: sha512-03maXTUyaBjeCxlDltmdzHje1ryQt1C4OWmmNgSSRXjLb+GNnAenwOJMSrcvHP/aNClD2pwsFCnYKDGy+sYE6w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.3.82': - resolution: {integrity: sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==} + '@swc/core-linux-x64-musl@1.7.36': + resolution: {integrity: sha512-XXysqLkvjtQnXm1zHqLhy00UYPv/gk5OtwR732X+piNisnEbcJBqI8Qp9O7YvLWllRcoP8IMBGDWLGdGLSpViA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.3.82': - resolution: {integrity: sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==} + '@swc/core-win32-arm64-msvc@1.7.36': + resolution: {integrity: sha512-k7+dmb13a/zPw+E4XYfPmLZFWJgcOcBRKIjYl9nQErtYsgsg3Ji6TBbsvJVETy23lNHyewZ17V5Vq6NzaG0hzg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.3.82': - resolution: {integrity: sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==} + '@swc/core-win32-ia32-msvc@1.7.36': + resolution: {integrity: sha512-ridD3ay6YM2PEYHZXXFN+edYEv0FOynaqOBP+NSnGNHA35azItIjoIe+KNi4WltGtAjpKCHSpjGCNfna12wdYQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.3.82': - resolution: {integrity: sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==} + '@swc/core-win32-x64-msvc@1.7.36': + resolution: {integrity: sha512-j1z2Z1Ln9d0E3dHsPkC1K9XDh0ojhRPwV+GfRTu4D61PE+aYhYLvbJC6xPvL4/204QrStRS7eDu3m+BcDp3rgQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.3.82': - resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==} + '@swc/core@1.7.36': + resolution: {integrity: sha512-bu7ymMX+LCJOSSrKank25Jaq66ymLVA9fOUuy4ck3/6rbXdLw+pIJPnIDKQ9uNcxww8KDxOuJk9Ui9pqR+aGFw==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': ^0.5.0 + '@swc/helpers': '*' peerDependenciesMeta: '@swc/helpers': optional: true @@ -2836,8 +2899,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.4': - resolution: {integrity: sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg==} + '@swc/types@0.1.13': + resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -2918,9 +2981,21 @@ packages: '@types/emscripten@1.39.13': resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} + '@types/eslint-config-prettier@6.11.3': + resolution: {integrity: sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/eslint__js@8.42.3': + resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/express-serve-static-core@4.19.5': resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} @@ -3044,97 +3119,68 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@7.8.0': - resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.10.0': + resolution: {integrity: sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.8.0': - resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.10.0': + resolution: {integrity: sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/rule-tester@7.8.0': - resolution: {integrity: sha512-f1wXWeZx8XJB/z9Oyjx0ZLmhvcFelSJ0CVvOurCkrISOZhre+imIj5FQQz1rBy/Ips0dCbVl5G4MWTuzlzj5QQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/rule-tester@8.10.0': + resolution: {integrity: sha512-/+Cms6eddJv4UW1wzxbRYeaZKJOlwWrfzuPQCGtzMsiZMTn5SaABS/wyCSZ+po+nUXc86OtP5QajUfsZGH/tSg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@eslint/eslintrc': '>=2' - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/scope-manager@7.8.0': - resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.10.0': + resolution: {integrity: sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.8.0': - resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.10.0': + resolution: {integrity: sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/types@7.8.0': - resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/types@8.10.0': + resolution: {integrity: sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.8.0': - resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.10.0': + resolution: {integrity: sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/utils@7.8.0': - resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.10.0': + resolution: {integrity: sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@7.8.0': - resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.10.0': + resolution: {integrity: sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -3180,27 +3226,67 @@ packages: peerDependencies: vitest: 2.0.5 + '@vitest/eslint-plugin@1.1.7': + resolution: {integrity: sha512-pTWGW3y6lH2ukCuuffpan6kFxG6nIuoesbhMiQxskyQMRcCN5t9SXsKrNHvEw3p8wcCsgJoRqFZVkOTn6TjclA==} + peerDependencies: + '@typescript-eslint/utils': '>= 8.0' + eslint: '>= 8.57.0' + typescript: '>= 5.0.0' + vitest: '*' + peerDependenciesMeta: + typescript: + optional: true + vitest: + optional: true + '@vitest/expect@1.6.0': resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + '@vitest/expect@2.1.3': + resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==} + + '@vitest/mocker@2.1.3': + resolution: {integrity: sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==} + peerDependencies: + '@vitest/spy': 2.1.3 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@2.0.5': resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/pretty-format@2.1.3': + resolution: {integrity: sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==} + '@vitest/runner@2.0.5': resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + '@vitest/runner@2.1.3': + resolution: {integrity: sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==} + '@vitest/snapshot@2.0.5': resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@vitest/snapshot@2.1.3': + resolution: {integrity: sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==} + '@vitest/spy@1.6.0': resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} '@vitest/spy@2.0.5': resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/spy@2.1.3': + resolution: {integrity: sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==} + '@vitest/ui@2.0.5': resolution: {integrity: sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==} peerDependencies: @@ -3212,6 +3298,9 @@ packages: '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + '@vitest/utils@2.1.3': + resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} + '@volar/language-core@2.4.1': resolution: {integrity: sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ==} @@ -3500,10 +3589,6 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} @@ -4295,10 +4380,6 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -4306,10 +4387,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - doctypes@1.1.0: resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} @@ -4505,15 +4582,21 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.6.1: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + eslint-import-resolver-typescript@3.6.3: + resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4539,37 +4622,24 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true - eslint-plugin-jest@28.5.0: - resolution: {integrity: sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - eslint-plugin-jsonc@2.16.0: resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' - eslint-plugin-playwright@1.6.0: - resolution: {integrity: sha512-tI1E/EDbHT4Fx5KvukUG3RTIT0gk44gvTP8bNwxLCFsUXVM98ZJG5zWU6Om5JOzH9FrmN4AhMu/UKyEsu0ZoDA==} + eslint-plugin-playwright@1.7.0: + resolution: {integrity: sha512-pDp2jFeWbBmlwDfZ39Ypdlz1+IafmRKvFTnnonX0TbS7hAByy4oh7Y6ioZRKvLGE+djd/e2VbqOo9sxgZSY2ow==} engines: {node: '>=16.6.0'} peerDependencies: eslint: '>=8.40.0' @@ -4581,33 +4651,20 @@ packages: eslint-plugin-tsdoc@0.3.0: resolution: {integrity: sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==} - eslint-plugin-unicorn@52.0.0: - resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} - engines: {node: '>=16'} + eslint-plugin-unicorn@56.0.0: + resolution: {integrity: sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==} + engines: {node: '>=18.18'} peerDependencies: eslint: '>=8.56.0' - eslint-plugin-vitest@0.3.26: - resolution: {integrity: sha512-oxe5JSPgRjco8caVLTh7Ti8PxpwJdhSV0hTQAmkFcNcmy/9DnqLB/oNVRA11RmVRP//2+jIIT6JuBEcpW3obYg==} - engines: {node: ^18.0.0 || >= 20.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': '*' - eslint: '>=8.0.0' - vitest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - vitest: - optional: true - - eslint-plugin-vue@9.25.0: - resolution: {integrity: sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==} + eslint-plugin-vue@9.29.0: + resolution: {integrity: sha512-hamyjrBhNH6Li6R1h1VF9KHfshJlKgKEg3ARbGTn72CMNDSMhWbgC7NdkRDEh25AFW+4SDATzyNM+3gWuZii8g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-vuejs-accessibility@2.3.0: - resolution: {integrity: sha512-zQ6IzK+3obZzPsjeVUeL3xAUlMHXZgRZ8vgXvQAmoZVbsp1xZe6UwXIKUFIim5h3tq/7bOLgei09GoBjJQs+Cw==} + eslint-plugin-vuejs-accessibility@2.4.1: + resolution: {integrity: sha512-ZRZhPdslplZXSF71MtSG+zXYRAT5KiHR4JVuo/DERQf9noAkDvi5W418VOE1qllmJd7wTenndxi1q8XeDMxdHw==} engines: {node: '>=16.0.0'} peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -4616,6 +4673,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4624,11 +4685,19 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.12.0: + resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm-resolve@1.0.11: resolution: {integrity: sha512-LxF0wfUQm3ldUDHkkV2MIbvvY0TgzIpJ420jHSV1Dm+IlplBEWiJTKWM61GtxUfvjV6iD4OtTYFGAGM2uuIUWg==} @@ -4637,6 +4706,10 @@ packages: resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4650,6 +4723,10 @@ packages: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -4762,9 +4839,9 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-type@17.1.6: resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} @@ -4820,9 +4897,9 @@ packages: resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} engines: {node: '>=12'} - flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -4950,8 +5027,8 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.0: - resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} @@ -5012,14 +5089,14 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@15.11.0: + resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} + engines: {node: '>=18'} + globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globby@14.0.2: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} @@ -5288,6 +5365,9 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-bun-module@1.2.1: + resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -5295,6 +5375,10 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} @@ -5373,10 +5457,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -5679,6 +5759,9 @@ packages: keyv@4.5.3: resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -6447,10 +6530,6 @@ packages: path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - path-type@5.0.0: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} @@ -7604,6 +7683,10 @@ packages: resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} engines: {node: '>=12.20'} + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} @@ -7689,6 +7772,12 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyglobby@0.2.5: resolution: {integrity: sha512-Dlqgt6h0QkoHttG53/WGADNh9QhcjCAIZMTERAVhdpmIBEejSuLI9ZmGKWzB7tweBjlk30+s/ofi4SLmBeTYhw==} engines: {node: '>=12.0.0'} @@ -7861,6 +7950,15 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typescript-eslint@8.10.0: + resolution: {integrity: sha512-YIu230PeN7z9zpu/EtqCIuRVHPs4iSlqW6TEvjbyDAE3MZsSl2RXBo+5ag+lbABCG8sFM1WVKEXhlQ8Ml8A3Fw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} @@ -8105,6 +8203,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@2.1.3: + resolution: {integrity: sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-plugin-checker@0.7.2: resolution: {integrity: sha512-xeYeJbG0gaCaT0QcUC4B2Zo4y5NR8ZhYenc5gPbttrZvraRFwkEADCYwq+BfEHl9zYz7yf85TxsiGoYwyyIjhw==} engines: {node: '>=14.16'} @@ -8226,6 +8329,31 @@ packages: jsdom: optional: true + vitest@2.1.3: + resolution: {integrity: sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.3 + '@vitest/ui': 2.1.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -8287,8 +8415,8 @@ packages: peerDependencies: vue: '>=2' - vue-eslint-parser@9.4.2: - resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' @@ -8542,7 +8670,6 @@ snapshots: dependencies: '@babel/highlight': 7.25.7 picocolors: 1.1.0 - optional: true '@babel/compat-data@7.25.4': {} @@ -8805,7 +8932,6 @@ snapshots: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.0 - optional: true '@babel/parser@7.25.6': dependencies: @@ -9828,45 +9954,39 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-plugin-eslint-comments@4.4.0(eslint@9.12.0(jiti@1.21.6))': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 9.12.0(jiti@1.21.6) + ignore: 5.3.2 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0(jiti@1.21.6))': dependencies: - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} - '@eslint/eslintrc@1.4.1': - dependencies: - ajv: 6.12.6 - debug: 4.3.7(supports-color@9.4.0) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@eslint-community/regexpp@4.11.1': {} - '@eslint/eslintrc@2.1.4': + '@eslint/compat@1.2.0(eslint@9.12.0(jiti@1.21.6))': + optionalDependencies: + eslint: 9.12.0(jiti@1.21.6) + + '@eslint/config-array@0.18.0': dependencies: - ajv: 6.12.6 + '@eslint/object-schema': 2.1.4 debug: 4.3.7(supports-color@9.4.0) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 minimatch: 3.1.2 - strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.0.2': + '@eslint/core@0.6.0': {} + + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.7(supports-color@9.4.0) espree: 10.0.1 globals: 14.0.0 ignore: 5.3.2 @@ -9877,7 +9997,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@9.12.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.0': + dependencies: + levn: 0.4.1 '@fastify/busboy@2.1.1': {} @@ -9892,17 +10018,16 @@ snapshots: '@floating-ui/utils@0.2.5': {} - '@humanwhocodes/config-array@0.11.14': + '@humanfs/core@0.19.0': {} + + '@humanfs/node@0.16.5': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@9.4.0) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.0 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} '@intlify/bundle-utils@7.5.1(vue-i18n@9.13.1(vue@3.5.0(typescript@5.6.3)))': dependencies: @@ -9929,15 +10054,18 @@ snapshots: '@intlify/core-base': 9.13.1 '@intlify/shared': 9.13.1 - '@intlify/eslint-plugin-vue-i18n@2.0.0(eslint@8.57.0)': + '@intlify/eslint-plugin-vue-i18n@3.0.0(eslint@9.12.0(jiti@1.21.6))': dependencies: - '@eslint/eslintrc': 1.4.1 + '@eslint/eslintrc': 3.1.0 '@intlify/core-base': 9.13.1 '@intlify/message-compiler': 9.13.1 - debug: 4.3.6 - eslint: 8.57.0 - glob: 8.1.0 + debug: 4.3.7(supports-color@9.4.0) + eslint: 9.12.0(jiti@1.21.6) + eslint-compat-utils: 0.5.0(eslint@9.12.0(jiti@1.21.6)) + glob: 10.4.5 + globals: 15.11.0 ignore: 5.3.2 + import-fresh: 3.3.0 is-language-code: 3.1.0 js-yaml: 4.1.0 json5: 2.2.3 @@ -9945,7 +10073,8 @@ snapshots: lodash: 4.17.21 parse5: 7.1.2 semver: 7.6.3 - vue-eslint-parser: 9.4.2(eslint@8.57.0) + synckit: 0.9.2 + vue-eslint-parser: 9.4.3(eslint@9.12.0(jiti@1.21.6)) yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - supports-color @@ -9958,7 +10087,7 @@ snapshots: '@intlify/message-compiler@9.13.1': dependencies: '@intlify/shared': 9.13.1 - source-map-js: 1.2.0 + source-map-js: 1.2.1 '@intlify/shared@9.13.1': {} @@ -10202,6 +10331,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + '@nolyfill/is-core-module@1.0.39': {} + '@nuxt/devalue@2.0.2': {} '@nuxt/devtools-kit@1.4.1(magicast@0.3.4)(rollup@4.22.4)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(webpack-sources@3.2.3)': @@ -10452,7 +10583,7 @@ snapshots: - supports-color - webpack-sources - '@nuxt/vite-builder@3.13.1(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxt/vite-builder@3.13.1(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.22.4)(webpack-sources@3.2.3) '@rollup/plugin-replace': 5.0.7(rollup@4.22.4) @@ -10485,7 +10616,7 @@ snapshots: unplugin: 1.13.1(webpack-sources@3.2.3) vite: 5.4.3(@types/node@22.5.1)(terser@5.31.0) vite-node: 2.0.5(@types/node@22.5.1)(terser@5.31.0) - vite-plugin-checker: 0.7.2(eslint@8.57.0)(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3)) + vite-plugin-checker: 0.7.2(eslint@9.12.0(jiti@1.21.6))(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3)) vue: 3.5.0(typescript@5.6.3) vue-bundle-renderer: 2.1.0 transitivePeerDependencies: @@ -10603,11 +10734,11 @@ snapshots: - vue - webpack-sources - '@nuxtjs/storybook@8.3.0-28764731.a9bf66d(@babel/preset-env@7.25.4(@babel/core@7.24.7))(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxtjs/storybook@8.3.0-28764731.a9bf66d(@babel/preset-env@7.25.4(@babel/core@7.24.7))(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: '@nuxt/devtools-kit': 1.4.1(magicast@0.3.4)(rollup@4.22.4)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.22.4)(webpack-sources@3.2.3) - '@storybook-vue/nuxt': 8.3.0-28764731.a9bf66d(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) + '@storybook-vue/nuxt': 8.3.0-28764731.a9bf66d(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) '@storybook/core-common': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7))) '@storybook/core-server': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7))) chalk: 5.3.0 @@ -11117,6 +11248,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.1.1': {} + '@playwright/test@1.48.1': dependencies: playwright: 1.48.1 @@ -11320,6 +11453,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.22.4': optional: true + '@rtsao/scc@1.1.0': {} + '@sentry-internal/browser-utils@8.26.0': dependencies: '@sentry/core': 8.26.0 @@ -11438,18 +11573,18 @@ snapshots: '@sinonjs/commons': 3.0.1 optional: true - '@storybook-vue/nuxt@8.3.0-28764731.a9bf66d(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3)': + '@storybook-vue/nuxt@8.3.0-28764731.a9bf66d(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.1(rollup@4.22.4)(webpack-sources@3.2.3) - '@nuxt/vite-builder': 3.13.1(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) + '@nuxt/vite-builder': 3.13.1(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) '@rollup/plugin-replace': 5.0.7(rollup@4.22.4) '@storybook/builder-vite': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(webpack-sources@3.2.3) '@storybook/vue3': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(vue@3.5.0(typescript@5.6.3)) '@storybook/vue3-vite': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.24.7)))(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) json-stable-stringify: 1.1.1 mlly: 1.7.1 - nuxt: 3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3) + nuxt: 3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3) ofetch: 1.3.4 pathe: 1.1.2 unctx: 2.3.1(webpack-sources@3.2.3) @@ -11777,10 +11912,10 @@ snapshots: vue: 3.5.0(typescript@5.6.3) vue-component-type-helpers: 2.1.6 - '@swc/cli@0.4.0(@swc/core@1.3.82)(chokidar@3.6.0)': + '@swc/cli@0.4.0(@swc/core@1.7.36)(chokidar@3.6.0)': dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.82 + '@swc/core': 1.7.36 '@swc/counter': 0.1.3 commander: 8.3.0 fast-glob: 3.3.2 @@ -11792,54 +11927,57 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - '@swc/core-darwin-arm64@1.3.82': + '@swc/core-darwin-arm64@1.7.36': optional: true - '@swc/core-darwin-x64@1.3.82': + '@swc/core-darwin-x64@1.7.36': optional: true - '@swc/core-linux-arm-gnueabihf@1.3.82': + '@swc/core-linux-arm-gnueabihf@1.7.36': optional: true - '@swc/core-linux-arm64-gnu@1.3.82': + '@swc/core-linux-arm64-gnu@1.7.36': optional: true - '@swc/core-linux-arm64-musl@1.3.82': + '@swc/core-linux-arm64-musl@1.7.36': optional: true - '@swc/core-linux-x64-gnu@1.3.82': + '@swc/core-linux-x64-gnu@1.7.36': optional: true - '@swc/core-linux-x64-musl@1.3.82': + '@swc/core-linux-x64-musl@1.7.36': optional: true - '@swc/core-win32-arm64-msvc@1.3.82': + '@swc/core-win32-arm64-msvc@1.7.36': optional: true - '@swc/core-win32-ia32-msvc@1.3.82': + '@swc/core-win32-ia32-msvc@1.7.36': optional: true - '@swc/core-win32-x64-msvc@1.3.82': + '@swc/core-win32-x64-msvc@1.7.36': optional: true - '@swc/core@1.3.82': + '@swc/core@1.7.36': dependencies: - '@swc/types': 0.1.4 + '@swc/counter': 0.1.3 + '@swc/types': 0.1.13 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.82 - '@swc/core-darwin-x64': 1.3.82 - '@swc/core-linux-arm-gnueabihf': 1.3.82 - '@swc/core-linux-arm64-gnu': 1.3.82 - '@swc/core-linux-arm64-musl': 1.3.82 - '@swc/core-linux-x64-gnu': 1.3.82 - '@swc/core-linux-x64-musl': 1.3.82 - '@swc/core-win32-arm64-msvc': 1.3.82 - '@swc/core-win32-ia32-msvc': 1.3.82 - '@swc/core-win32-x64-msvc': 1.3.82 + '@swc/core-darwin-arm64': 1.7.36 + '@swc/core-darwin-x64': 1.7.36 + '@swc/core-linux-arm-gnueabihf': 1.7.36 + '@swc/core-linux-arm64-gnu': 1.7.36 + '@swc/core-linux-arm64-musl': 1.7.36 + '@swc/core-linux-x64-gnu': 1.7.36 + '@swc/core-linux-x64-musl': 1.7.36 + '@swc/core-win32-arm64-msvc': 1.7.36 + '@swc/core-win32-ia32-msvc': 1.7.36 + '@swc/core-win32-x64-msvc': 1.7.36 '@swc/counter@0.1.3': {} - '@swc/types@0.1.4': {} + '@swc/types@0.1.13': + dependencies: + '@swc/counter': 0.1.3 '@szmarczak/http-timer@4.0.6': dependencies: @@ -11930,8 +12068,21 @@ snapshots: '@types/emscripten@1.39.13': {} + '@types/eslint-config-prettier@6.11.3': {} + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/eslint__js@8.42.3': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/express-serve-static-core@4.19.5': dependencies: '@types/node': 22.5.1 @@ -12072,86 +12223,75 @@ snapshots: '@types/yargs-parser': 21.0.3 optional: true - '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 7.8.0 - debug: 4.3.6 - eslint: 8.57.0 + '@typescript-eslint/parser': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 + eslint: 9.12.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 7.8.0 - debug: 4.3.6 - eslint: 8.57.0 + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 + debug: 4.3.7(supports-color@9.4.0) + eslint: 9.12.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@7.8.0(@eslint/eslintrc@3.0.2)(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/rule-tester@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint/eslintrc': 3.0.2 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.6.3) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) ajv: 6.12.6 - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) + json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - optional: true - - '@typescript-eslint/scope-manager@7.8.0': + '@typescript-eslint/scope-manager@8.10.0': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 - '@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.6.3) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) debug: 4.3.7(supports-color@9.4.0) - eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@7.18.0': - optional: true + '@typescript-eslint/types@8.10.0': {} - '@typescript-eslint/types@7.8.0': {} - - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.10.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 debug: 4.3.7(supports-color@9.4.0) - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 @@ -12160,58 +12300,21 @@ snapshots: typescript: 5.6.3 transitivePeerDependencies: - supports-color - optional: true - '@typescript-eslint/typescript-estree@7.8.0(typescript@5.6.3)': + '@typescript-eslint/utils@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 - debug: 4.3.7(supports-color@9.4.0) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - optional: true - - '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.6.3) - eslint: 8.57.0 - semver: 7.6.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + eslint: 9.12.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.18.0': + '@typescript-eslint/visitor-keys@8.10.0': dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - optional: true - - '@typescript-eslint/visitor-keys@7.8.0': - dependencies: - '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/types': 8.10.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -12294,6 +12397,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.3(@types/node@22.5.1)(jsdom@24.1.0)(terser@5.31.0))': + dependencies: + '@typescript-eslint/utils': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.12.0(jiti@1.21.6) + optionalDependencies: + typescript: 5.6.3 + vitest: 2.1.3(@types/node@22.5.1)(jsdom@24.1.0)(terser@5.31.0) + '@vitest/expect@1.6.0': dependencies: '@vitest/spy': 1.6.0 @@ -12307,21 +12418,51 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 + '@vitest/expect@2.1.3': + dependencies: + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))': + dependencies: + '@vitest/spy': 2.1.3 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.3(@types/node@22.5.1)(terser@5.31.0) + '@vitest/pretty-format@2.0.5': dependencies: tinyrainbow: 1.2.0 + '@vitest/pretty-format@2.1.3': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/runner@2.0.5': dependencies: '@vitest/utils': 2.0.5 pathe: 1.1.2 + '@vitest/runner@2.1.3': + dependencies: + '@vitest/utils': 2.1.3 + pathe: 1.1.2 + '@vitest/snapshot@2.0.5': dependencies: '@vitest/pretty-format': 2.0.5 magic-string: 0.30.11 pathe: 1.1.2 + '@vitest/snapshot@2.1.3': + dependencies: + '@vitest/pretty-format': 2.1.3 + magic-string: 0.30.11 + pathe: 1.1.2 + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 @@ -12330,6 +12471,10 @@ snapshots: dependencies: tinyspy: 3.0.0 + '@vitest/spy@2.1.3': + dependencies: + tinyspy: 3.0.0 + '@vitest/ui@2.0.5(vitest@2.0.5)': dependencies: '@vitest/utils': 2.0.5 @@ -12355,6 +12500,12 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 + '@vitest/utils@2.1.3': + dependencies: + '@vitest/pretty-format': 2.1.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + '@volar/language-core@2.4.1': dependencies: '@volar/source-map': 2.4.1 @@ -12763,8 +12914,6 @@ snapshots: get-intrinsic: 1.2.4 is-string: 1.0.7 - array-union@2.1.0: {} - array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 @@ -13006,7 +13155,6 @@ snapshots: braces@3.0.3: dependencies: fill-range: 7.1.1 - optional: true browser-assert@1.2.1: {} @@ -13168,7 +13316,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -13599,20 +13747,12 @@ snapshots: diff@5.2.0: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dlv@1.1.3: {} doctrine@2.1.0: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - doctypes@1.1.0: {} dom-accessibility-api@0.5.16: {} @@ -13896,128 +14036,119 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.0(eslint@8.57.0): + eslint-compat-utils@0.5.0(eslint@9.12.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@9.12.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.15.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@1.21.6)): dependencies: - debug: 4.3.6 + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@9.4.0) enhanced-resolve: 5.16.1 - eslint: 8.57.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint: 9.12.0(jiti@1.21.6) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@1.21.6)) fast-glob: 3.3.2 - get-tsconfig: 4.7.0 - is-core-module: 2.13.1 + get-tsconfig: 4.8.1 + is-bun-module: 1.2.1 is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@1.21.6)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.6.3) - eslint: 8.57.0 + '@typescript-eslint/parser': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.12.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): + eslint-plugin-eslint-comments@3.2.0(eslint@9.12.0(jiti@1.21.6)): dependencies: escape-string-regexp: 1.0.5 - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) ignore: 5.3.2 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@1.21.6)): dependencies: + '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@1.21.6)) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.0 semver: 6.3.1 + string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3): + eslint-plugin-jsonc@2.16.0(eslint@9.12.0(jiti@1.21.6)): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) - eslint: 8.57.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) - transitivePeerDependencies: - - supports-color - - typescript - optional: true - - eslint-plugin-jsonc@2.16.0(eslint@8.57.0): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) + eslint: 9.12.0(jiti@1.21.6) + eslint-compat-utils: 0.5.0(eslint@9.12.0(jiti@1.21.6)) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-playwright@1.6.0(eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0): + eslint-plugin-playwright@1.7.0(eslint@9.12.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) globals: 13.24.0 - optionalDependencies: - eslint-plugin-jest: 28.5.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) eslint-plugin-tsdoc@0.3.0: dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - eslint-plugin-unicorn@52.0.0(eslint@8.57.0): + eslint-plugin-unicorn@56.0.0(eslint@9.12.0(jiti@1.21.6)): dependencies: - '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint/eslintrc': 2.1.4 + '@babel/helper-validator-identifier': 7.25.7 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.38.1 - eslint: 8.57.0 - esquery: 1.5.0 + eslint: 9.12.0(jiti@1.21.6) + esquery: 1.6.0 + globals: 15.11.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 @@ -14027,40 +14158,27 @@ snapshots: regjsparser: 0.10.0 semver: 7.6.3 strip-indent: 3.0.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)(vitest@2.0.5): - dependencies: - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.6.3) - eslint: 8.57.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) - vitest: 2.0.5(@types/node@22.5.1)(@vitest/ui@2.0.5)(jsdom@24.1.0)(terser@5.31.0) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-vue@9.25.0(eslint@8.57.0): + eslint-plugin-vue@9.29.0(eslint@9.12.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) + eslint: 9.12.0(jiti@1.21.6) globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.6.3 - vue-eslint-parser: 9.4.2(eslint@8.57.0) + vue-eslint-parser: 9.4.3(eslint@9.12.0(jiti@1.21.6)) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-vuejs-accessibility@2.3.0(eslint@8.57.0): + eslint-plugin-vuejs-accessibility@2.4.1(eslint@9.12.0(jiti@1.21.6)): dependencies: aria-query: 5.3.0 emoji-regex: 10.2.1 - eslint: 8.57.0 - vue-eslint-parser: 9.4.2(eslint@8.57.0) + eslint: 9.12.0(jiti@1.21.6) + vue-eslint-parser: 9.4.3(eslint@9.12.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color @@ -14069,50 +14187,56 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.1.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.0.0: {} - eslint@8.57.0: + eslint-visitor-keys@4.1.0: {} + + eslint@9.12.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.12.0 + '@eslint/plugin-kit': 0.2.0 + '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@humanwhocodes/retry': 0.3.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 - doctrine: 3.0.0 + debug: 4.3.7(supports-color@9.4.0) escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - strip-ansi: 6.0.1 text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 transitivePeerDependencies: - supports-color @@ -14124,6 +14248,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 4.0.0 + espree@10.2.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.1.0 + espree@9.6.1: dependencies: acorn: 8.12.1 @@ -14136,6 +14266,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -14306,9 +14440,9 @@ snapshots: fflate@0.8.2: {} - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.1.0 + flat-cache: 4.0.1 file-type@17.1.6: dependencies: @@ -14333,7 +14467,6 @@ snapshots: fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - optional: true finalhandler@1.2.0: dependencies: @@ -14379,11 +14512,10 @@ snapshots: dependencies: semver-regex: 4.0.5 - flat-cache@3.1.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.1 - keyv: 4.5.3 - rimraf: 3.0.2 + keyv: 4.5.4 flatted@3.3.1: {} @@ -14501,7 +14633,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.0: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -14541,7 +14673,7 @@ snapshots: dependencies: foreground-child: 3.1.1 jackspeak: 3.4.3 - minimatch: 9.0.4 + minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 1.11.1 @@ -14584,19 +14716,12 @@ snapshots: globals@14.0.0: {} + globals@15.11.0: {} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -14898,12 +15023,20 @@ snapshots: dependencies: builtin-modules: 3.3.0 + is-bun-module@1.2.1: + dependencies: + semver: 7.6.3 + is-callable@1.2.7: {} is-core-module@2.13.1: dependencies: hasown: 2.0.2 + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 @@ -14964,8 +15097,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-path-inside@4.0.0: {} is-plain-obj@1.1.0: {} @@ -15349,6 +15480,10 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kind-of@6.0.3: {} kleur@3.0.3: {} @@ -15987,14 +16122,14 @@ snapshots: - vue - webpack-sources - nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3): + nuxt@3.13.1(@parcel/watcher@2.4.1)(@types/node@22.5.1)(encoding@0.1.13)(eslint@9.12.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3): dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/devtools': 1.4.1(rollup@4.22.4)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.1(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/telemetry': 2.5.4(magicast@0.3.4)(rollup@4.22.4)(webpack-sources@3.2.3) - '@nuxt/vite-builder': 3.13.1(@types/node@22.5.1)(eslint@8.57.0)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) + '@nuxt/vite-builder': 3.13.1(@types/node@22.5.1)(eslint@9.12.0(jiti@1.21.6))(magicast@0.3.4)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.0(typescript@5.6.3))(webpack-sources@3.2.3) '@unhead/dom': 1.10.4 '@unhead/ssr': 1.10.4 '@unhead/vue': 1.10.4(vue@3.5.0(typescript@5.6.3)) @@ -16299,7 +16434,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.25.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -16354,8 +16489,6 @@ snapshots: path-to-regexp@6.2.2: {} - path-type@4.0.0: {} - path-type@5.0.0: {} pathe@1.1.2: {} @@ -17533,6 +17666,11 @@ snapshots: dependencies: tslib: 2.6.2 + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + system-architecture@0.1.0: {} tabbable@6.2.0: {} @@ -17664,6 +17802,10 @@ snapshots: tinybench@2.8.0: {} + tinybench@2.9.0: {} + + tinyexec@0.3.1: {} + tinyglobby@0.2.5: dependencies: fdir: 6.3.0(picomatch@4.0.2) @@ -17807,6 +17949,17 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typescript-eslint@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color + typescript@5.5.4: {} typescript@5.6.2: {} @@ -18092,7 +18245,24 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.7.2(eslint@8.57.0)(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3)): + vite-node@2.1.3(@types/node@22.5.1)(terser@5.31.0): + dependencies: + cac: 6.7.14 + debug: 4.3.7(supports-color@9.4.0) + pathe: 1.1.2 + vite: 5.4.3(@types/node@22.5.1)(terser@5.31.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-checker@0.7.2(eslint@9.12.0(jiti@1.21.6))(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0))(vue-tsc@2.1.6(typescript@5.6.3)): dependencies: '@babel/code-frame': 7.24.7 ansi-escapes: 4.3.2 @@ -18110,7 +18280,7 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - eslint: 8.57.0 + eslint: 9.12.0(jiti@1.21.6) optionator: 0.9.3 typescript: 5.6.3 vue-tsc: 2.1.6(typescript@5.6.3) @@ -18238,6 +18408,41 @@ snapshots: - supports-color - terser + vitest@2.1.3(@types/node@22.5.1)(jsdom@24.1.0)(terser@5.31.0): + dependencies: + '@vitest/expect': 2.1.3 + '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.3(@types/node@22.5.1)(terser@5.31.0)) + '@vitest/pretty-format': 2.1.3 + '@vitest/runner': 2.1.3 + '@vitest/snapshot': 2.1.3 + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 + chai: 5.1.1 + debug: 4.3.7(supports-color@9.4.0) + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.0 + tinyrainbow: 1.2.0 + vite: 5.4.3(@types/node@22.5.1)(terser@5.31.0) + vite-node: 2.1.3(@types/node@22.5.1)(terser@5.31.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.5.1 + jsdom: 24.1.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + void-elements@3.1.0: {} vscode-jsonrpc@6.0.0: {} @@ -18300,10 +18505,10 @@ snapshots: vue: 3.5.0(typescript@5.6.3) vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.0(typescript@5.6.3)) - vue-eslint-parser@9.4.2(eslint@8.57.0): + vue-eslint-parser@9.4.3(eslint@9.12.0(jiti@1.21.6)): dependencies: - debug: 4.3.6 - eslint: 8.57.0 + debug: 4.3.7(supports-color@9.4.0) + eslint: 9.12.0(jiti@1.21.6) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 From 0331b2badfcc7934f9a04c342837d58a26bce150 Mon Sep 17 00:00:00 2001 From: Olga Bulat Date: Fri, 18 Oct 2024 17:22:51 +0300 Subject: [PATCH 2/4] Fix auto-fixable problems Signed-off-by: Olga Bulat --- automations/js/src/label_pr.mjs | 1 + frontend/src/components/VErrorSection/VErrorImage.vue | 2 +- frontend/src/components/VMediaInfo/VMediaDetails.vue | 2 +- frontend/src/components/VSafeBrowsing/VSafeBrowsing.vue | 8 ++++---- frontend/src/components/VScrollableLine.vue | 4 ++-- frontend/src/components/VTabs/VTab.vue | 2 +- frontend/src/components/VTabs/VTabs.vue | 4 ++-- frontend/src/layouts/search-layout.vue | 2 +- frontend/test/proxy.js | 2 +- .../specs/components/AudioTrack/v-audio-track.spec.js | 2 -- frontend/test/unit/specs/stores/search-store.spec.ts | 1 - frontend/test/unit/specs/stores/ui-store.spec.ts | 1 - justfile | 1 + packages/js/api-client/vitest.config.mjs | 1 + 14 files changed, 16 insertions(+), 17 deletions(-) diff --git a/automations/js/src/label_pr.mjs b/automations/js/src/label_pr.mjs index 13b6a3d9b71..299611c5f87 100644 --- a/automations/js/src/label_pr.mjs +++ b/automations/js/src/label_pr.mjs @@ -1,4 +1,5 @@ import { readFileSync } from "fs" + import { PullRequest } from "./utils/pr.mjs" import { IdSet } from "./utils/id_set.mjs" diff --git a/frontend/src/components/VErrorSection/VErrorImage.vue b/frontend/src/components/VErrorSection/VErrorImage.vue index fdb3951615e..236b66ba491 100644 --- a/frontend/src/components/VErrorSection/VErrorImage.vue +++ b/frontend/src/components/VErrorSection/VErrorImage.vue @@ -28,7 +28,7 @@ const i18n = useI18n({ useScope: "global" }) const images = Object.fromEntries( imageInfo.errors.map((errorItem) => { - let image = errorItem.image + const image = errorItem.image const errorImage: ErrorImage = { ...image, originalTitle: image.title, diff --git a/frontend/src/components/VMediaInfo/VMediaDetails.vue b/frontend/src/components/VMediaInfo/VMediaDetails.vue index 81ba9a2e4b8..cb52ed33215 100644 --- a/frontend/src/components/VMediaInfo/VMediaDetails.vue +++ b/frontend/src/components/VMediaInfo/VMediaDetails.vue @@ -20,7 +20,7 @@ const metadata = computed(() => { if (!props.media) { return null } - let imageInfo = + const imageInfo = props.media.frontendMediaType === IMAGE ? { width: props.media.width, diff --git a/frontend/src/components/VSafeBrowsing/VSafeBrowsing.vue b/frontend/src/components/VSafeBrowsing/VSafeBrowsing.vue index 4a4bafdfb1c..0c1f7b9b0b5 100644 --- a/frontend/src/components/VSafeBrowsing/VSafeBrowsing.vue +++ b/frontend/src/components/VSafeBrowsing/VSafeBrowsing.vue @@ -22,8 +22,8 @@ const sensitivityPath = computed(() => localePath("/sensitive-content")) const featureFlagStore = useFeatureFlagStore() const { $sendCustomEvent } = useNuxtApp() -let fetchSensitive = computed(() => featureFlagStore.isOn("fetch_sensitive")) -let setFetchSensitive = (data: Omit) => { +const fetchSensitive = computed(() => featureFlagStore.isOn("fetch_sensitive")) +const setFetchSensitive = (data: Omit) => { const checked = data.checked ?? false featureFlagStore.toggleFeature("fetch_sensitive", checked ? ON : OFF) $sendCustomEvent("TOGGLE_FETCH_SENSITIVE", { checked }) @@ -36,8 +36,8 @@ let setFetchSensitive = (data: Omit) => { } const uiStore = useUiStore() -let blurSensitive = computed(() => uiStore.shouldBlurSensitive) -let setBlurSensitive = (data: { checked?: boolean }) => { +const blurSensitive = computed(() => uiStore.shouldBlurSensitive) +const setBlurSensitive = (data: { checked?: boolean }) => { const checked = data.checked ?? false uiStore.setShouldBlurSensitive(checked) $sendCustomEvent("TOGGLE_BLUR_SENSITIVE", { checked }) diff --git a/frontend/src/components/VScrollableLine.vue b/frontend/src/components/VScrollableLine.vue index 3af5625269a..b12d0d47f1d 100644 --- a/frontend/src/components/VScrollableLine.vue +++ b/frontend/src/components/VScrollableLine.vue @@ -108,7 +108,7 @@ const scroll = (to: "start" | "end") => { showScrollButton[to === "start" ? "end" : "start"] = true - let distToSide = getDistToSide(to, dir.value, innerContainer) + const distToSide = getDistToSide(to, dir.value, innerContainer) let adjustedScrollStep = scrollStep // If the scroll step is larger than the distance to the side, scroll @@ -127,7 +127,7 @@ const scroll = (to: "start" | "end") => { adjustedScrollStep = -adjustedScrollStep } - let left = to === "start" ? -adjustedScrollStep : adjustedScrollStep + const left = to === "start" ? -adjustedScrollStep : adjustedScrollStep buttonsRef.value?.scrollBy({ left, behavior: "smooth" }) } diff --git a/frontend/src/components/VTabs/VTab.vue b/frontend/src/components/VTabs/VTab.vue index 7b5c3d5d757..792293657d1 100644 --- a/frontend/src/components/VTabs/VTab.vue +++ b/frontend/src/components/VTabs/VTab.vue @@ -86,7 +86,7 @@ const getFocusDirection = ( } const handleKeyDown = (event: KeyboardEvent) => { - let list = tabContext.tabs.value + const list = tabContext.tabs.value .map((tab) => getDomElement(tab)) .filter(Boolean) as HTMLElement[] const tabControlKeys = [ diff --git a/frontend/src/components/VTabs/VTabs.vue b/frontend/src/components/VTabs/VTabs.vue index 82621c17a7d..94eaa59a135 100644 --- a/frontend/src/components/VTabs/VTabs.vue +++ b/frontend/src/components/VTabs/VTabs.vue @@ -81,7 +81,7 @@ const tabGroupContext: TabsState = { } }, unregisterTab(tab: (typeof tabs)["value"][number]) { - let idx = tabs.value.indexOf(tab) + const idx = tabs.value.indexOf(tab) if (idx !== -1) { tabs.value.splice(idx, 1) } @@ -92,7 +92,7 @@ const tabGroupContext: TabsState = { } }, unregisterPanel(panel: (typeof panels)["value"][number]) { - let idx = panels.value.indexOf(panel) + const idx = panels.value.indexOf(panel) if (idx !== -1) { panels.value.splice(idx, 1) } diff --git a/frontend/src/layouts/search-layout.vue b/frontend/src/layouts/search-layout.vue index ad54d3f18f1..9868d7d0663 100644 --- a/frontend/src/layouts/search-layout.vue +++ b/frontend/src/layouts/search-layout.vue @@ -47,7 +47,7 @@ const showScrollButton = ref(false) * * Note: template refs do not work in a Nuxt layout, so we get the `main-page` element using `document.getElementById`. */ -let mainPageElement = ref(null) +const mainPageElement = ref(null) const { y: mainPageY } = useScroll(mainPageElement) watch(mainPageY, (y) => { diff --git a/frontend/test/proxy.js b/frontend/test/proxy.js index e4d90a3f5b3..b489eabb824 100644 --- a/frontend/test/proxy.js +++ b/frontend/test/proxy.js @@ -14,7 +14,7 @@ const zlib = require("zlib") // TS doesn't pull the type in correctly for the next dependency when it's `require`'d. /** @type {import('talkback')['default']} */ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore const talkback = require("talkback") diff --git a/frontend/test/unit/specs/components/AudioTrack/v-audio-track.spec.js b/frontend/test/unit/specs/components/AudioTrack/v-audio-track.spec.js index 455f5fb3c69..9386e855631 100644 --- a/frontend/test/unit/specs/components/AudioTrack/v-audio-track.spec.js +++ b/frontend/test/unit/specs/components/AudioTrack/v-audio-track.spec.js @@ -130,10 +130,8 @@ describe("AudioTrack", () => { // Only the UnknownError should be sent to Sentry. if (errorType === "UnknownError") { - // eslint-disable-next-line vitest/no-conditional-expect expect(captureExceptionMock).toHaveBeenCalledWith(playError) } else { - // eslint-disable-next-line vitest/no-conditional-expect expect(captureExceptionMock).not.toHaveBeenCalled() } } diff --git a/frontend/test/unit/specs/stores/search-store.spec.ts b/frontend/test/unit/specs/stores/search-store.spec.ts index 6b758a747a4..ff84a74c92f 100644 --- a/frontend/test/unit/specs/stores/search-store.spec.ts +++ b/frontend/test/unit/specs/stores/search-store.spec.ts @@ -355,7 +355,6 @@ describe("Search Store", () => { }, }) if (isSupportedSearchType(searchType)) { - // eslint-disable-next-line vitest/no-conditional-expect expect(searchStore.apiSearchQueryParams).not.toEqual( expectedQueryParams ) diff --git a/frontend/test/unit/specs/stores/ui-store.spec.ts b/frontend/test/unit/specs/stores/ui-store.spec.ts index df3baf74b4c..f4a6d8ec153 100644 --- a/frontend/test/unit/specs/stores/ui-store.spec.ts +++ b/frontend/test/unit/specs/stores/ui-store.spec.ts @@ -285,7 +285,6 @@ describe("Ui Store", () => { expect(uiStore.dismissedBanners).toEqual(expectedState) if (areCookiesSet) { - // eslint-disable-next-line vitest/no-conditional-expect expect(dismissedBannersCookie).toEqual(expectedState) } } diff --git a/justfile b/justfile index dd75344f03c..e36636fa6d1 100644 --- a/justfile +++ b/justfile @@ -368,6 +368,7 @@ eslint *args: pnpm exec eslint \ --max-warnings=0 \ --no-warn-ignored \ + --fix \ "${files[@]}" # Alias for `just packages/js/k6/run` or `just p k6 run` diff --git a/packages/js/api-client/vitest.config.mjs b/packages/js/api-client/vitest.config.mjs index f24dc34b456..8f1bf761172 100644 --- a/packages/js/api-client/vitest.config.mjs +++ b/packages/js/api-client/vitest.config.mjs @@ -1,5 +1,6 @@ import { defineConfig } from "vitest/config" import tsconfigPaths from "vite-tsconfig-paths" + export default defineConfig({ plugins: [tsconfigPaths()], }) From 6969ea0d35633ff0db008b54d33b7c81beff5a54 Mon Sep 17 00:00:00 2001 From: Olga Bulat Date: Fri, 18 Oct 2024 18:33:49 +0300 Subject: [PATCH 3/4] Fix other problems Signed-off-by: Olga Bulat --- automations/js/src/last_week_tonight.mjs | 1 + automations/js/src/project_thread_updates.js | 1 + eslint.config.mjs | 8 +++++--- .../src/components/VContentReport/VContentReportForm.vue | 2 +- frontend/src/composables/use-dialog-control.ts | 6 +++++- frontend/src/plugins/errors.ts | 4 ++-- frontend/src/stores/media/single-result.ts | 6 +++++- frontend/src/stores/provider.ts | 8 +++++--- frontend/src/types/home-gallery.ts | 3 +-- frontend/src/utils/decode-data.ts | 2 +- frontend/tailwind.config.ts | 2 +- frontend/test/unit/specs/components/v-link.spec.js | 2 -- frontend/typings/extend.d.ts | 2 ++ packages/js/eslint-plugin/src/configs/import.ts | 6 ++++++ packages/js/eslint-plugin/src/index.ts | 2 +- packages/js/k6/src/frontend/scenarios.ts | 1 + 16 files changed, 38 insertions(+), 18 deletions(-) diff --git a/automations/js/src/last_week_tonight.mjs b/automations/js/src/last_week_tonight.mjs index 76265b895d0..229eef83e05 100644 --- a/automations/js/src/last_week_tonight.mjs +++ b/automations/js/src/last_week_tonight.mjs @@ -35,6 +35,7 @@ if (!(pat && username && password)) process.exit(1) /* Read GitHub information from the data files */ const githubDataFile = resolve("../data/github.yml") // resolved from `package.json` +// eslint-disable-next-line import/no-named-as-default-member const githubInfo = yaml.load(readFileSync(githubDataFile)) const org = githubInfo.org const repos = Object.values(githubInfo.repos) diff --git a/automations/js/src/project_thread_updates.js b/automations/js/src/project_thread_updates.js index fec91c05a78..df56d5db904 100644 --- a/automations/js/src/project_thread_updates.js +++ b/automations/js/src/project_thread_updates.js @@ -61,6 +61,7 @@ const GET_PROJECT_CARDS = ` */ module.exports = async ({ github, core }) => { try { + // eslint-disable-next-line no-constant-binary-expression const isDryRun = process.env.DRY_RUN === "true" ?? false const currentDate = new Date() diff --git a/eslint.config.mjs b/eslint.config.mjs index 5f2e5787a04..59c5b1b3580 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -7,7 +7,6 @@ import { config as defineConfig } from "typescript-eslint" import { includeIgnoreFile } from "@eslint/compat" import openverse from "@openverse/eslint-plugin" -// @ts-ignore const __dirname = path.dirname(fileURLToPath(import.meta.url)) const gitignoreFiles = [ @@ -36,8 +35,11 @@ const eslintIgnores = [ let ignoreConfigs = gitignoreFiles .map((gitignoreFile) => includeIgnoreFile(gitignoreFile)) .reduce( - (acc, gitignoreFile, index) => { - return { ...acc, ignores: acc.ignores.concat(gitignoreFile.ignores) } + (acc, gitignoreFile) => { + return { + ...acc, + ignores: (acc.ignores ?? []).concat(gitignoreFile.ignores ?? []), + } }, { name: "openverse:ignore-files", ignores: eslintIgnores } ) diff --git a/frontend/src/components/VContentReport/VContentReportForm.vue b/frontend/src/components/VContentReport/VContentReportForm.vue index ee239976a92..5e9bc2999d0 100644 --- a/frontend/src/components/VContentReport/VContentReportForm.vue +++ b/frontend/src/components/VContentReport/VContentReportForm.vue @@ -83,7 +83,7 @@ const handleSubmit = async (event: Event) => { }, }) updateStatus(SENT) - } catch (error) { + } catch { updateStatus(FAILED) } } diff --git a/frontend/src/composables/use-dialog-control.ts b/frontend/src/composables/use-dialog-control.ts index 9b229c6bf9f..5842a983f27 100644 --- a/frontend/src/composables/use-dialog-control.ts +++ b/frontend/src/composables/use-dialog-control.ts @@ -40,7 +40,11 @@ export function useDialogControl({ watch(internalVisibleRef, (visible, _, onCleanup) => { triggerA11yProps["aria-expanded"] = visible if (shouldLockBodyScroll.value) { - visible ? lock() : unlock() + if (visible) { + lock() + } else { + unlock() + } } emit(visible ? "open" : "close") onCleanup(() => { diff --git a/frontend/src/plugins/errors.ts b/frontend/src/plugins/errors.ts index ab8ac86f471..f33549ffd01 100644 --- a/frontend/src/plugins/errors.ts +++ b/frontend/src/plugins/errors.ts @@ -1,6 +1,6 @@ import { defineNuxtPlugin } from "#imports" -import axios from "axios" +import { isAxiosError } from "axios" import { ERR_UNKNOWN, ErrorCode, errorCodes } from "~/constants/errors" import type { FetchingError, RequestKind } from "~/types/fetch-state" @@ -45,7 +45,7 @@ export function normalizeFetchingError( code: ERR_UNKNOWN, } - if (!axios.isAxiosError(error)) { + if (!isAxiosError(error)) { fetchingError.message = (error as Error).message return fetchingError } diff --git a/frontend/src/stores/media/single-result.ts b/frontend/src/stores/media/single-result.ts index 95460e0b3b4..4a792d113f4 100644 --- a/frontend/src/stores/media/single-result.ts +++ b/frontend/src/stores/media/single-result.ts @@ -58,7 +58,11 @@ export const useSingleResultStore = defineStore("single-result", { }, _updateFetchState(action: "start" | "end", option?: FetchingError) { - action === "start" ? this._startFetching() : this._endFetching(option) + if (action === "start") { + this._startFetching() + } else { + this._endFetching(option) + } }, reset() { diff --git a/frontend/src/stores/provider.ts b/frontend/src/stores/provider.ts index c5766a2b72a..4b75039c2db 100644 --- a/frontend/src/stores/provider.ts +++ b/frontend/src/stores/provider.ts @@ -82,9 +82,11 @@ export const useProviderStore = defineStore("provider", { action: "start" | "end", option?: FetchingError ) { - action === "start" - ? this._startFetching(mediaType) - : this._endFetching(mediaType, option) + if (action === "start") { + this._startFetching(mediaType) + } else { + this._endFetching(mediaType, option) + } }, _getProvider(providerCode: string, mediaType: SupportedMediaType) { diff --git a/frontend/src/types/home-gallery.ts b/frontend/src/types/home-gallery.ts index 847ff15ced1..6ab778c6ee4 100644 --- a/frontend/src/types/home-gallery.ts +++ b/frontend/src/types/home-gallery.ts @@ -1,2 +1 @@ -const GALLERY_SETS = ["universe", "pottery", "olympics", "random"] as const -export type GallerySet = (typeof GALLERY_SETS)[number] +export type GallerySet = "universe" | "pottery" | "olympics" | "random" diff --git a/frontend/src/utils/decode-data.ts b/frontend/src/utils/decode-data.ts index 97b147acc77..3ebe8dbdeeb 100644 --- a/frontend/src/utils/decode-data.ts +++ b/frontend/src/utils/decode-data.ts @@ -6,7 +6,7 @@ const encodeGroup = (prefix: string, group: string) => { const encoded = String.fromCharCode(parseInt(group, 16)) encodeURIComponent(encoded) return decodeURI(encoded) - } catch (e) { + } catch { return prefix + group } } diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts index f86ca96c584..356b71c6bdf 100644 --- a/frontend/tailwind.config.ts +++ b/frontend/tailwind.config.ts @@ -340,7 +340,7 @@ export default { }, }, plugins: [ - require("@tailwindcss/typography"), + require("@tailwindcss/typography"), // eslint-disable-line @typescript-eslint/no-require-imports // Focus styles // This plugin has related stylesheets in `src/styles/tailwind.css`. plugin(({ matchUtilities, theme }) => { diff --git a/frontend/test/unit/specs/components/v-link.spec.js b/frontend/test/unit/specs/components/v-link.spec.js index 786ed6976b7..e866a15d39c 100644 --- a/frontend/test/unit/specs/components/v-link.spec.js +++ b/frontend/test/unit/specs/components/v-link.spec.js @@ -5,7 +5,6 @@ import { createApp } from "vue" import VLink from "~/components/VLink.vue" -// eslint-disable-next-line vue/one-component-per-file const RouterLinkStub = createApp({}).component("RouterLink", { template: "", props: ["to"], @@ -46,7 +45,6 @@ describe("VLink", () => { ${"http://localhost"} `("VLink handles click", async ({ href }) => { const createVLinkWrapper = (href) => - // eslint-disable-next-line vue/one-component-per-file createApp({}).component("VLinkWrapper", { components: { VLink }, data: () => ({ text: "Link Text" }), diff --git a/frontend/typings/extend.d.ts b/frontend/typings/extend.d.ts index 6976d141762..998ebc9d13f 100644 --- a/frontend/typings/extend.d.ts +++ b/frontend/typings/extend.d.ts @@ -15,7 +15,9 @@ import type { } from "vue" declare module "@vue/runtime-core" { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface ComponentCustomProperties extends _ComponentCustomProperties {} + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface ComponentCustomOptions extends _ComponentCustomOptions {} } diff --git a/packages/js/eslint-plugin/src/configs/import.ts b/packages/js/eslint-plugin/src/configs/import.ts index c352cfb15e1..5747ccfce41 100644 --- a/packages/js/eslint-plugin/src/configs/import.ts +++ b/packages/js/eslint-plugin/src/configs/import.ts @@ -135,5 +135,11 @@ export default tseslint.config( "import/export": "off", "import/no-unresolved": "off", }, + }, + { + files: ["**/*.mjs"], + rules: { + "import/extensions": "off", + }, } ) diff --git a/packages/js/eslint-plugin/src/index.ts b/packages/js/eslint-plugin/src/index.ts index 7f1edf72aeb..250a57c4cd0 100644 --- a/packages/js/eslint-plugin/src/index.ts +++ b/packages/js/eslint-plugin/src/index.ts @@ -2,7 +2,7 @@ import * as tseslint from "typescript-eslint" import unicornPlugin from "eslint-plugin-unicorn" import playwrightPlugin from "eslint-plugin-playwright" -// @ts-ignore +// @ts-expect-error Vitest is an ECMAScript module, and this file will produce `require` calls import vitestPlugin from "@vitest/eslint-plugin" import jsoncPlugin from "eslint-plugin-jsonc" import eslintCommentsConfigs from "@eslint-community/eslint-plugin-eslint-comments/configs" diff --git a/packages/js/k6/src/frontend/scenarios.ts b/packages/js/k6/src/frontend/scenarios.ts index e9f89b9c5d9..93d6cebfb0c 100644 --- a/packages/js/k6/src/frontend/scenarios.ts +++ b/packages/js/k6/src/frontend/scenarios.ts @@ -89,6 +89,7 @@ export function visitSearchPages() { } } +// eslint-disable-next-line @typescript-eslint/no-unused-vars const actions = { visitStaticPages, visitSearchPages, From b4208eac97fafabf81bdae91d85de481ac2b8da2 Mon Sep 17 00:00:00 2001 From: Olga Bulat Date: Fri, 18 Oct 2024 19:23:12 +0300 Subject: [PATCH 4/4] Update code owners Signed-off-by: Olga Bulat --- .github/CODEOWNERS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e4bec49a6dd..02811618baa 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,8 +12,7 @@ /frontend/ @WordPress/openverse-frontend /packages/js/ @WordPress/openverse-frontend -/.eslintignore @WordPress/openverse-frontend -/.eslintrc.js @WordPress/openverse-frontend +/eslint.config.mjs @WordPress/openverse-frontend /.npmrc @WordPress/openverse-frontend /.pnpmfile.cjs @WordPress/openverse-frontend /.prettierignore @WordPress/openverse-frontend