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/.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 diff --git a/automations/js/src/count_user_reviewable_prs.js b/automations/js/src/count_user_reviewable_prs.js index 0c165147461..f8606b0d63e 100644 --- a/automations/js/src/count_user_reviewable_prs.js +++ b/automations/js/src/count_user_reviewable_prs.js @@ -59,7 +59,7 @@ query ($repoOwner: String!, $repo: String!, $cursor: String) { try { let hasNextPage = true let cursor = null - let reviewablePrs = [] + const reviewablePrs = [] const pullRequest = context.payload.pull_request const result = { pr_count: 0, diff --git a/automations/js/src/label_pr.mjs b/automations/js/src/label_pr.mjs index 13b6a3d9b71..6c790c71610 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" @@ -40,12 +41,12 @@ function getLabelsFromChanges(allLabels, changes) { * @returns {boolean} whether the list of labels covers all requirements */ function getIsFullyLabeled(labels) { - for (let req of exactlyOne) { + for (const req of exactlyOne) { if (labels.filter((label) => label.name.includes(req)).length !== 1) { return false } } - for (let req of atleastOne) { + for (const req of atleastOne) { if (labels.filter((label) => label.name.includes(req)).length < 1) { return false } @@ -133,7 +134,7 @@ export const main = async (octokit, core) => { // For each label that we only need one of, we check if the PR already has // such a label. If not, we check if the label pool contains any valid labels // and add the first one we find. - for (let rule of exactlyOne) { + for (const rule of exactlyOne) { if (finalLabels.items.some((label) => label.name.includes(rule))) { core.info(`PR already has a "${rule}" label.`) continue @@ -147,7 +148,7 @@ export const main = async (octokit, core) => { // For each label that we need at least one of, we add all the valid labels // from the label pool. Our ID set implementation will weed out duplicates. - for (let rule of atleastOne) { + for (const rule of atleastOne) { const validLabels = labelPool.filter((label) => label.name.includes(rule)) core.info( `Adding labels "${validLabels diff --git a/automations/js/src/last_week_tonight.mjs b/automations/js/src/last_week_tonight.mjs index 76265b895d0..181035cc3e2 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) @@ -87,7 +88,7 @@ const getItemsHtml = (title, items) => { ].sort() // Aggregate items by stack - let itemsByStack = {} + const itemsByStack = {} for (const stack of stacks) { const stackName = stack.split(":")[1].trim() diff --git a/automations/js/src/project_automation/prs.mjs b/automations/js/src/project_automation/prs.mjs index ade8aae0d72..48ed244f889 100644 --- a/automations/js/src/project_automation/prs.mjs +++ b/automations/js/src/project_automation/prs.mjs @@ -41,7 +41,7 @@ async function syncReviews(core, pr, prBoard, prCard) { async function syncIssues(core, pr, backlogBoard, destColumn) { core.info(`Synchronizing issues for PR ${pr.nodeId}.`) - for (let linkedIssue of pr.linkedIssues) { + for (const linkedIssue of pr.linkedIssues) { core.info(`Syncing issue ${linkedIssue.id}.`) // Create new, or get the existing, card for the current issue. diff --git a/automations/js/src/project_thread_updates.js b/automations/js/src/project_thread_updates.js index fec91c05a78..35d75d894ba 100644 --- a/automations/js/src/project_thread_updates.js +++ b/automations/js/src/project_thread_updates.js @@ -61,7 +61,7 @@ const GET_PROJECT_CARDS = ` */ module.exports = async ({ github, core }) => { try { - const isDryRun = process.env.DRY_RUN === "true" ?? false + const isDryRun = process.env.DRY_RUN === "true" const currentDate = new Date() // Create a date by subtracting DAYS_UPDATED_WITHIN days diff --git a/automations/js/src/sync_labels.mjs b/automations/js/src/sync_labels.mjs index a47d7d0d4df..c16f24e5b99 100644 --- a/automations/js/src/sync_labels.mjs +++ b/automations/js/src/sync_labels.mjs @@ -68,7 +68,7 @@ export const main = async (octokit, core) => { infraLabels.map((label) => [label.name, label]) ) - for (let label of monoLabels) { + for (const label of monoLabels) { if (exclusions.some((rule) => label.name.match(rule))) { core.info(`Label "${label.name}" is excluded from sync.`) continue diff --git a/automations/js/src/utils/pr.mjs b/automations/js/src/utils/pr.mjs index 3fe24c7f176..73e8d7a2910 100644 --- a/automations/js/src/utils/pr.mjs +++ b/automations/js/src/utils/pr.mjs @@ -155,7 +155,7 @@ export class PullRequest { DISMISSED: 0, PENDING: 0, } - for (let reviewState of this.reviewStates) { + for (const reviewState of this.reviewStates) { reviewCounts[reviewState] += 1 } return reviewCounts diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000000..15804c42ac4 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,72 @@ +import { fileURLToPath } from "node:url" +import path from "node:path" +import fs from "node:fs" + +// eslint-disable-next-line import/no-unresolved +import { config as defineConfig } from "typescript-eslint" +import { convertIgnorePatternToMinimatch } from "@eslint/compat" +import openverse from "@openverse/eslint-plugin" + +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"), +] + +/** + * Vendored in from `@eslint/compat` to support multiple ignore files. + * Reads an ignore file and returns a list of ignore patterns. + * @param {string[]} ignoreFilePaths The absolute path to the ignore file. + * @returns {string[]} An array of ignore patterns. + * @throws {Error} If the ignore file path is not an absolute path. + */ +function mapIgnoreFiles(ignoreFilePaths) { + for (const ignoreFilePath of ignoreFilePaths) { + if (!path.isAbsolute(ignoreFilePath)) { + throw new Error("The ignore file location must be an absolute path.") + } + } + + /** @type {string[]} */ + const ignores = [] + for (const ignoreFilePath of ignoreFilePaths) { + const ignoreFile = fs.readFileSync(ignoreFilePath, "utf8") + const lines = ignoreFile.split(/\r?\n/u) + ignores.push( + ...lines + .map((line) => line.trim()) + .filter((line) => line && !line.startsWith("#")) + .map(convertIgnorePatternToMinimatch) + ) + } + + return ignores +} + +// 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/**", +] + +export default defineConfig( + { + name: "openverse:ignore-files", + ignores: [...mapIgnoreFiles(gitignoreFiles), ...eslintIgnores], + }, + { files: [".pnpmfile.cjs"] }, + ...openverse.default.configs.project +) diff --git a/frontend/scripts/document-media.js b/frontend/scripts/document-media.js index 52d974d5229..f707bce39a0 100644 --- a/frontend/scripts/document-media.js +++ b/frontend/scripts/document-media.js @@ -127,7 +127,7 @@ function getInterfaceFields(node, ast) { function extractComments(node, ast) { const fullText = node.getFullText(ast) - let commentRanges = ts.getLeadingCommentRanges(fullText, 0) + const commentRanges = ts.getLeadingCommentRanges(fullText, 0) if (!commentRanges) { return undefined } @@ -140,8 +140,8 @@ function extractComments(node, ast) { return undefined } - let links = [] - let text = comments + const links = [] + const text = comments .at(-1) // retain only the last doc comment .split("\n") .map((line) => 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/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/VHeader/meta/VFilterButton.stories.js b/frontend/src/components/VHeader/meta/VFilterButton.stories.js index f553e98b23e..d162f4385bb 100644 --- a/frontend/src/components/VHeader/meta/VFilterButton.stories.js +++ b/frontend/src/components/VHeader/meta/VFilterButton.stories.js @@ -35,7 +35,7 @@ const Template = (args) => ({ // Skip license type filters as they can disable license filters let filterTypeIdx = 1 for (let i = 0; i < filterCount; i++) { - let filterType = filterTypes[filterTypeIdx] + const filterType = filterTypes[filterTypeIdx] searchStore.toggleFilter({ filterType, codeIdx: filterIdx, 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 c4e0d6ccc16..99c0ef4c199 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/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/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/src/locales/scripts/json-pot-helpers.js b/frontend/src/locales/scripts/json-pot-helpers.js index 9ad28899de8..bfa9b0f6a4d 100644 --- a/frontend/src/locales/scripts/json-pot-helpers.js +++ b/frontend/src/locales/scripts/json-pot-helpers.js @@ -100,13 +100,13 @@ const getComment = (entry) => { } // comments given by the programmer, directed at the translator (#.) - let vars = checkStringForVars(entry.value) + const vars = checkStringForVars(entry.value) if (vars) { comment.push(vars) } // comments containing references to the program’s source code (#:) - let refComments = getRefComments(entry.lineage) + const refComments = getRefComments(entry.lineage) if (refComments.length) { comment.push(...refComments) } @@ -128,8 +128,8 @@ const toPot = (entry) => { } // string-string type mapping - let poEntry = [] - let comment = getComment(entry) + const poEntry = [] + const comment = getComment(entry) if (comment) { poEntry.push(comment) } diff --git a/frontend/src/locales/scripts/read-i18n.js b/frontend/src/locales/scripts/read-i18n.js index bf2fd3e55d1..0fa36df7e9c 100644 --- a/frontend/src/locales/scripts/read-i18n.js +++ b/frontend/src/locales/scripts/read-i18n.js @@ -167,9 +167,9 @@ const parseValue = (entry, valueNode) => { * @return {Entry} the entry generated by parsing the node */ const parseObjProperty = (node) => { - let key = parseKey(node.key) - let comments = node.leadingComments?.map(parseComment).join("") - let entry = new Entry(key, comments) + const key = parseKey(node.key) + const comments = node.leadingComments?.map(parseComment).join("") + const entry = new Entry(key, comments) parseValue(entry, node.value) return entry } diff --git a/frontend/src/locales/scripts/utils.js b/frontend/src/locales/scripts/utils.js index e2fd31cd4a5..f4fc54aa853 100644 --- a/frontend/src/locales/scripts/utils.js +++ b/frontend/src/locales/scripts/utils.js @@ -28,10 +28,10 @@ function kebabToCamel(input) { * @param {unknown} value - The value to set at the path. */ exports.setToValue = function setValue(obj, path, value) { - var a = path.split(".") - var o = obj + const a = path.split(".") + let o = obj while (a.length - 1) { - var n = a.shift() + const n = a.shift() if (!(n in o)) { o[n] = {} } @@ -64,7 +64,7 @@ exports.setToValue = function setValue(obj, path, value) { * @param {object} deprecatedKeys - object to store deprecated kebab-cased keys and number of replacements. * @return {any} the sanitised JSON object */ -let replacePlaceholders = (json, locale, deprecatedKeys) => { +const replacePlaceholders = (json, locale, deprecatedKeys) => { if (json === null) { return null } @@ -105,7 +105,7 @@ let replacePlaceholders = (json, locale, deprecatedKeys) => { console.warn(`Found {} in ${locale} translation strings: ${replaced}`) replaced = "" } - let withoutOpenverseChannel = replaced.replace("#openverse", "") + const withoutOpenverseChannel = replaced.replace("#openverse", "") if (withoutOpenverseChannel.includes("#")) { console.warn( `Found left-over # in ${locale} translation strings: ${replaced}` @@ -114,10 +114,10 @@ let replacePlaceholders = (json, locale, deprecatedKeys) => { } return replaced } - let currentJson = { ...json } + const currentJson = { ...json } for (const row of Object.entries(currentJson)) { - let [key, value] = row + const [key, value] = row currentJson[key] = replacePlaceholders(value, locale, deprecatedKeys) } return currentJson 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 5d50cf061cc..b34a299e633 100644 --- a/frontend/tailwind.config.ts +++ b/frontend/tailwind.config.ts @@ -1,3 +1,4 @@ +import tailwindcssTypography from "@tailwindcss/typography" import defaultTheme from "tailwindcss/defaultTheme" import plugin from "tailwindcss/plugin" @@ -343,7 +344,7 @@ export default { }, }, plugins: [ - require("@tailwindcss/typography"), + tailwindcssTypography, // Focus styles // This plugin has related stylesheets in `src/styles/tailwind.css`. plugin(({ matchUtilities, theme }) => { diff --git a/frontend/test/proxy.js b/frontend/test/proxy.js index e4d90a3f5b3..63afffa2c2c 100644 --- a/frontend/test/proxy.js +++ b/frontend/test/proxy.js @@ -39,7 +39,7 @@ const urlPatterns = { * @returns {{match: ({groups}|*), type: string}|null} */ const findTypeMatch = (urlString) => { - for (let [matchName, matchPattern] of Object.entries(urlPatterns)) { + for (const [matchName, matchPattern] of Object.entries(urlPatterns)) { const patternMatch = urlString.match(matchPattern) if (patternMatch && patternMatch.groups) { return { type: matchName, match: patternMatch } 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..8ed7bc01704 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 @@ -34,7 +34,7 @@ const stubs = { describe("AudioTrack", () => { let options = null let props = null - let captureExceptionMock = vi.fn() + const captureExceptionMock = vi.fn() beforeEach(() => { props = { @@ -164,8 +164,8 @@ describe("AudioTrack", () => { options.props.audio.isSensitive = true options.props.layout = "row" const screen = await render(VAudioTrack, options) - let { title, creator } = options.props.audio - let match = RegExp(`(${title}|${creator})`) + const { title, creator } = options.props.audio + const match = RegExp(`(${title}|${creator})`) expect(screen.queryAllByText(match)).toEqual([]) expect(screen.queryAllByTitle(match)).toEqual([]) expect(screen.queryAllByAltText(match)).toEqual([]) diff --git a/frontend/test/unit/specs/components/AudioTrack/v-box-layout.spec.js b/frontend/test/unit/specs/components/AudioTrack/v-box-layout.spec.js index 2c09a67cc81..8574cab0074 100644 --- a/frontend/test/unit/specs/components/AudioTrack/v-box-layout.spec.js +++ b/frontend/test/unit/specs/components/AudioTrack/v-box-layout.spec.js @@ -7,7 +7,7 @@ import VBoxLayout from "~/components/VAudioTrack/layouts/VBoxLayout.vue" describe("VBoxLayout", () => { let options = null - let props = { + const props = { audio: getAudioObj(), size: "m", } diff --git a/frontend/test/unit/specs/components/v-image-cell.spec.js b/frontend/test/unit/specs/components/v-image-cell.spec.js index 972234198b0..6e5b8ec22b3 100644 --- a/frontend/test/unit/specs/components/v-image-cell.spec.js +++ b/frontend/test/unit/specs/components/v-image-cell.spec.js @@ -44,7 +44,7 @@ describe("VImageCell", () => { it("is does not contain title anywhere when the image is sensitive", async () => { options.props.image.isSensitive = true const screen = await render(VImageCell, options) - let match = RegExp(image.title) + const match = RegExp(image.title) expect(screen.queryAllByText(match)).toEqual([]) expect(screen.queryAllByTitle(match)).toEqual([]) expect(screen.queryAllByAltText(match)).toEqual([]) diff --git a/frontend/test/unit/specs/components/v-license.spec.js b/frontend/test/unit/specs/components/v-license.spec.js index 3457c7aa60d..99df32eee58 100644 --- a/frontend/test/unit/specs/components/v-license.spec.js +++ b/frontend/test/unit/specs/components/v-license.spec.js @@ -7,7 +7,7 @@ import { render } from "~~/test/unit/test-utils/render" import VLicense from "~/components/VLicense/VLicense.vue" describe("VLicense", () => { - let options = { + const options = { props: { license: "by", }, 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/test/unit/specs/components/v-search-results-title.spec.js b/frontend/test/unit/specs/components/v-search-results-title.spec.js index 8bf19ffbbbc..d8204d59cac 100644 --- a/frontend/test/unit/specs/components/v-search-results-title.spec.js +++ b/frontend/test/unit/specs/components/v-search-results-title.spec.js @@ -20,7 +20,7 @@ const DEFAULT_PROPS = { */ function getScenarios() { const counts = [0, 10, 4300, 240, 240] - let scenarios = [] + const scenarios = [] counts.forEach((count) => { counts.forEach((innerCount) => { scenarios.push({ diff --git a/frontend/test/unit/specs/utils/api-token/api-token-unsuccessful.spec.js b/frontend/test/unit/specs/utils/api-token/api-token-unsuccessful.spec.js index b315011f930..1c544324b35 100644 --- a/frontend/test/unit/specs/utils/api-token/api-token-unsuccessful.spec.js +++ b/frontend/test/unit/specs/utils/api-token/api-token-unsuccessful.spec.js @@ -63,7 +63,7 @@ describe("unsuccessful token retrieval", () => { expect(token1).toBeUndefined() await getApiAccessToken() - let { $openverseApiToken: token2 } = app + const { $openverseApiToken: token2 } = app expect(process.tokenData.accessToken).toBeFalsy() expect(process.tokenData.accessTokenExpiry).toBeFalsy() expect(token2).toEqual("") 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/justfile b/justfile index bdddcda99c9..3a31bdd9301 100644 --- a/justfile +++ b/justfile @@ -418,14 +418,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 \ + --no-warn-ignored \ --fix \ "${files[@]}" diff --git a/package.json b/package.json index 07a3fea2beb..11232da86e7 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,14 @@ "node": ">= 22.0.0 <23" }, "devDependencies": { - "@types/node": "22.8.1", + "@eslint/compat": "^1.2.2", + "@types/node": "^22.8.5", "@openverse/eslint-plugin": "workspace:*", "bindings": "1.5.0", "prettier": "3.3.3", "prettier-plugin-tailwindcss": "0.6.8", "typescript": "5.6.3", + "typescript-eslint": "^8.12.2", "vue-tsc": "2.1.8" } } diff --git a/packages/js/api-client/vitest.config.mjs b/packages/js/api-client/vitest.config.mjs deleted file mode 100644 index f24dc34b456..00000000000 --- a/packages/js/api-client/vitest.config.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from "vitest/config" -import tsconfigPaths from "vite-tsconfig-paths" -export default defineConfig({ - plugins: [tsconfigPaths()], -}) diff --git a/packages/js/eslint-plugin/package.json b/packages/js/eslint-plugin/package.json index c492b3619d3..81216e36dd1 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.18.0", - "@typescript-eslint/parser": "^7.18.0", - "@typescript-eslint/utils": "^7.18.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.13.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": "^2.0.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.12.2", + "vue-eslint-parser": "^9.4.3" }, "devDependencies": { - "@eslint/eslintrc": "^3.0.2", - "@swc/cli": "^0.4.0", - "@swc/core": "^1.3.82", - "@typescript-eslint/rule-tester": "^7.18.0", + "@eslint/eslintrc": "^3.1.0", + "@swc/cli": "^0.5.0", + "@swc/core": "^1.7.35", + "@typescript-eslint/rule-tester": "^8.12.2", "babel-plugin-add-module-exports": "^1.0.4", - "vitest": "^2.1.3" + "vitest": "^2.1.4" } } 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..5747ccfce41 100644 --- a/packages/js/eslint-plugin/src/configs/import.ts +++ b/packages/js/eslint-plugin/src/configs/import.ts @@ -1,133 +1,145 @@ -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", + }, + }, + { + files: ["**/*.mjs"], + rules: { + "import/extensions": "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 index 1a4d505c8b2..e69de29bb2d 100644 --- a/packages/js/eslint-plugin/src/configs/index.ts +++ b/packages/js/eslint-plugin/src/configs/index.ts @@ -1,171 +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", - ], - }, - ], - - "no-restricted-imports": [ - "error", - { - name: "@playwright/test", - importNames: ["test"], - message: - "Import test from `~~/test/playwright/utils/test` to ensure global fixtures are used.", - }, - ], - }, - }, - { - 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..15b66497e8b 100644 --- a/packages/js/eslint-plugin/src/configs/typescript.ts +++ b/packages/js/eslint-plugin/src/configs/typescript.ts @@ -1,24 +1,32 @@ -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( + { + plugins: { + "@typescript-eslint": plugin, + tsdoc: tsdocPlugin, + }, }, - plugins: ["@typescript-eslint", "tsdoc"], - extends: ["plugin:@typescript-eslint/recommended"], - rules: { - "@typescript-eslint/no-var-requires": ["off"], + { + name: "vue-typescript", + files: ["**/*.ts", "**/*.js", "**/*.mjs", "**/*.vue"], + extends: [eslint.configs.recommended, ...tsConfigs.recommended], + rules: { + "@typescript-eslint/no-require-imports": ["off"], + }, }, - 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..a25e5eb3abe 100644 --- a/packages/js/eslint-plugin/src/index.ts +++ b/packages/js/eslint-plugin/src/index.ts @@ -1,10 +1,201 @@ +import * as tseslint from "typescript-eslint" + +import unicornPlugin from "eslint-plugin-unicorn" +import playwrightPlugin from "eslint-plugin-playwright" +// @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" + +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:common-config", + plugins: { + "@openverse": plugin, + 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: { + "@openverse/analytics-configuration": [ + "error", + { + reservedPropNames: ["width", "height"], + }, + ], + "@openverse/no-unexplained-disabled-test": ["error"], + "@openverse/translation-strings": ["error"], + "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/**"], + extends: [vitestPlugin.configs.recommended], + 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/**"], + extends: [vitestPlugin.configs.recommended], + rules: { + "vitest/consistent-test-filename": [ + "error", + { pattern: ".*\\.spec\\.(ts|js)$" }, + ], + "vitest/no-focused-tests": ["error"], + "vitest/no-conditional-expect": ["error"], + "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", + ], + }, + ], + + "no-restricted-imports": [ + "error", + { + name: "@playwright/test", + importNames: ["test"], + message: + "Import test from `~~/test/playwright/utils/test` to ensure global fixtures are used.", + }, + ], + }, + }, + { + 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/packages/js/k6/src/frontend/scenarios.ts b/packages/js/k6/src/frontend/scenarios.ts index 27b87ae79e2..5e5642deece 100644 --- a/packages/js/k6/src/frontend/scenarios.ts +++ b/packages/js/k6/src/frontend/scenarios.ts @@ -93,6 +93,7 @@ export function visitSearchPages() { } } +// eslint-disable-next-line @typescript-eslint/no-unused-vars const actions = { visitStaticPages, visitSearchPages, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5501359a514..5721014ad1b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,12 +10,15 @@ importers: .: devDependencies: + '@eslint/compat': + specifier: ^1.2.2 + version: 1.2.2(eslint@9.13.0(jiti@1.21.6)) '@openverse/eslint-plugin': specifier: workspace:* version: link:packages/js/eslint-plugin '@types/node': - specifier: 22.8.1 - version: 22.8.1 + specifier: ^22.8.5 + version: 22.8.5 bindings: specifier: 1.5.0 version: 1.5.0 @@ -28,6 +31,9 @@ importers: typescript: specifier: 5.6.3 version: 5.6.3 + typescript-eslint: + specifier: ^8.12.2 + version: 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) vue-tsc: specifier: 2.1.8 version: 2.1.8(typescript@5.6.3) @@ -67,10 +73,10 @@ importers: version: 1.0.3(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxtjs/robots': specifier: ^4.0.2 - version: 4.1.3(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + version: 4.1.3(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@nuxtjs/sitemap': specifier: ^6.0.0 - version: 6.1.2(h3@1.12.0)(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + version: 6.1.2(h3@1.12.0)(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@nuxtjs/tailwindcss': specifier: ^6.12.1 version: 6.12.1(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) @@ -134,19 +140,19 @@ importers: version: 7.25.7 '@nuxt/test-utils': specifier: ^3.14.1 - version: 3.14.1(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + version: 3.14.1(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@nuxtjs/i18n': specifier: 8.5.5 version: 8.5.5(magicast@0.3.5)(rollup@4.22.4)(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@nuxtjs/storybook': specifier: 8.3.2 - version: 8.3.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(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.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + version: 8.3.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(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.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@playwright/test': specifier: 1.48.1 version: 1.48.1 '@storybook-vue/nuxt': specifier: 8.3.2 - version: 8.3.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.3.6)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + version: 8.3.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.3.6)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@storybook/addon-essentials': specifier: ^8.3.6 version: 8.3.6(storybook@8.3.6)(webpack-sources@3.2.3) @@ -182,7 +188,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.13.0(jiti@1.21.6)) jsdom: specifier: ^24.1.0 version: 24.1.0 @@ -194,7 +200,7 @@ importers: version: 7.0.1 nuxt: specifier: 3.13.2 - version: 3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3) + version: 3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -209,7 +215,7 @@ importers: version: 5.6.3 vitest: specifier: ^2.1.3 - version: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) + version: 2.1.3(@types/node@22.8.5)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) vitest-dom: specifier: ^0.1.1 version: 0.1.1(vitest@2.1.3) @@ -246,89 +252,104 @@ importers: version: 5.6.3 vite: specifier: 5.4.6 - version: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + version: 5.4.6(@types/node@22.8.5)(terser@5.31.0) vitest: specifier: ^2.1.3 - version: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) + version: 2.1.3(@types/node@22.8.5)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) packages/js/eslint-plugin: dependencies: + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.4.0 + version: 4.4.1(eslint@9.13.0(jiti@1.21.6)) + '@eslint/js': + specifier: ^9.12.0 + version: 9.13.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.13.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.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.8.1 + version: 8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.8.1 + version: 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/utils': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.8.1 + version: 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + '@vitest/eslint-plugin': + specifier: ^1.1.7 + version: 1.1.7(@typescript-eslint/utils@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.4(@types/node@22.8.5)(jsdom@24.1.0)(terser@5.31.0)) eslint: - specifier: ^8.57.0 - version: 8.57.0 + specifier: ^9.13.0 + version: 9.13.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.13.0(jiti@1.21.6)) eslint-import-resolver-typescript: - specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.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.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.13.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.13.0(jiti@1.21.6)) eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.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.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.13.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.13.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.18.0(@typescript-eslint/parser@7.18.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: ^2.0.0 + version: 2.0.0(eslint@9.13.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.18.0(@typescript-eslint/parser@7.18.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.1.3) + specifier: ^56.0.0 + version: 56.0.0(eslint@9.13.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.30.0(eslint@9.13.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.13.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.12.2 + version: 8.12.2(eslint@9.13.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.13.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) + specifier: ^0.5.0 + version: 0.5.0(@swc/core@1.7.42)(chokidar@3.6.0) '@swc/core': - specifier: ^1.3.82 - version: 1.3.82 + specifier: ^1.7.35 + version: 1.7.42 '@typescript-eslint/rule-tester': - specifier: ^7.18.0 - version: 7.18.0(@eslint/eslintrc@3.0.2)(eslint@8.57.0)(typescript@5.6.3) + specifier: ^8.12.2 + version: 8.12.2(eslint@9.13.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.1.3 - version: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.8.5)(jsdom@24.1.0)(terser@5.31.0) packages/js/k6: devDependencies: @@ -1052,6 +1073,12 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-plugin-eslint-comments@4.4.1': + resolution: {integrity: sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==} + 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} @@ -1062,21 +1089,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.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + 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.2': + resolution: {integrity: sha512-jhgiIrsw+tRfcBQ4BFl2C3vCrIUw2trCY0cnDvGZpwTtKCEDmZhAtMfrEUP/KpnwM6PrO0T+Ltm+ccW74olG3Q==} + 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.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + 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.13.0': + resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} + 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.2': + resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} @@ -1091,18 +1139,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.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + 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==} @@ -1124,11 +1175,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==} @@ -1293,6 +1344,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==} @@ -1757,6 +1812,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'} @@ -1974,6 +2033,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'} @@ -2225,8 +2287,8 @@ packages: storybook: ^8.3.6 vue: ^3.0.0 - '@swc/cli@0.4.0': - resolution: {integrity: sha512-4JdVrPtF/4rCMXp6Q1h5I6YkYZrCCcqod7Wk97ZQq7K8vNGzJUryBv4eHCvqx5sJOJBrbYm9fcswe1B0TygNoA==} + '@swc/cli@0.5.0': + resolution: {integrity: sha512-eFsrNt85SbHTeX6svpBNcA5DQLP/wrSyCs3KVZjbuEHWD7JGpajZOIwH74lVhyrmrXOcGxgbnxXEbDIfRlLcSw==} engines: {node: '>= 16.14.0'} hasBin: true peerDependencies: @@ -2236,71 +2298,71 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.3.82': - resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==} + '@swc/core-darwin-arm64@1.7.42': + resolution: {integrity: sha512-fWhaCs2+8GDRIcjExVDEIfbptVrxDqG8oHkESnXgymmvqTWzWei5SOnPNMS8Q+MYsn/b++Y2bDxkcwmq35Bvxg==} 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.42': + resolution: {integrity: sha512-ZaVHD2bijrlkCyD7NDzLmSK849Jgcx+6DdL4x1dScoz1slJ8GTvLtEu0JOUaaScQwA+cVlhmrmlmi9ssjbRLGQ==} 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.42': + resolution: {integrity: sha512-iF0BJj7hVTbY/vmbvyzVTh/0W80+Q4fbOYschdUM3Bsud39TA+lSaPOefOHywkNH58EQ1z3EAxYcJOWNES7GFQ==} 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.42': + resolution: {integrity: sha512-xGu8j+DOLYTLkVmsfZPJbNPW1EkiWgSucT0nOlz77bLxImukt/0+HVm2hOwHSKuArQ8C3cjahAMY3b/s4VH2ww==} 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.42': + resolution: {integrity: sha512-qtW3JNO7i1yHEko59xxz+jY38+tYmB96JGzj6XzygMbYJYZDYbrOpXQvKbMGNG3YeTDan7Fp2jD0dlKf7NgDPA==} 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.42': + resolution: {integrity: sha512-F9WY1TN+hhhtiEzZjRQziNLt36M5YprMeOBHjsLVNqwgflzleSI7ulgnlQECS8c8zESaXj3ksGduAoJYtPC1cA==} 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.42': + resolution: {integrity: sha512-7YMdOaYKLMQ8JGfnmRDwidpLFs/6ka+80zekeM0iCVO48yLrJR36G0QGXzMjKsXI0BPhq+mboZRRENK4JfQnEA==} 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.42': + resolution: {integrity: sha512-C5CYWaIZEyqPl5W/EwcJ/mLBJFHVoUEa/IwWi0b4q2fCXcSCktQGwKXOQ+d67GneiZoiq0HasgcdMmMpGS9YRQ==} 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.42': + resolution: {integrity: sha512-3j47seZ5pO62mbrqvPe1iwhe2BXnM5q7iB+n2xgA38PCGYt0mnaJafqmpCXm/uYZOCMqSNynaoOWCMMZm4sqtA==} 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.42': + resolution: {integrity: sha512-FXl9MdeUogZLGDcLr6QIRdDVkpG0dkN4MLM4dwQ5kcAk+XfKPrQibX6M2kcfhsCx+jtBqtK7hRFReRXPWJZGbA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.3.82': - resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==} + '@swc/core@1.7.42': + resolution: {integrity: sha512-iQrRk3SKndQZ4ptJv1rzeQSiCYQIhMjiO97QXOlCcCoaazOLKPnLnXzU4Kv0FuBFyYfG2FE94BoR0XI2BN02qw==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': ^0.5.0 + '@swc/helpers': '*' peerDependenciesMeta: '@swc/helpers': optional: true @@ -2308,8 +2370,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==} @@ -2367,9 +2429,21 @@ packages: '@types/connect@3.4.36': resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + '@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==} @@ -2403,6 +2477,9 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -2427,8 +2504,8 @@ packages: '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - '@types/node@22.8.1': - resolution: {integrity: sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==} + '@types/node@22.8.5': + resolution: {integrity: sha512-5iYk6AMPtsMbkZqCO1UGF9W5L38twq11S2pYWkybGHH2ogPUvXWNlQqJBzuEZWKj/WRH+QTeiv6ySWqJtvIEgA==} '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -2484,70 +2561,68 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.12.2': + resolution: {integrity: sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==} + 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.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.12.2': + resolution: {integrity: sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==} + 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.18.0': - resolution: {integrity: sha512-ClrFQlwen9pJcYPIBLuarzBpONQAwjmJ0+YUjAo1TGzoZFJPyUK/A7bb4Mps0u+SMJJnFXbfMN8I9feQDf0O5A==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/rule-tester@8.12.2': + resolution: {integrity: sha512-aggjJT+aZj/LJVUx/qX+97tYGGqpML6vnuLwjmNrjpRP047cuSlYutG1zX8fr3ibr9tzHxiwc03dlKFsLMd12g==} + 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@8.12.2': + resolution: {integrity: sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.12.2': + resolution: {integrity: sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==} + 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@8.12.2': + resolution: {integrity: sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.12.2': + resolution: {integrity: sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==} + 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} + '@typescript-eslint/utils@8.12.2': + resolution: {integrity: sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.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} + '@typescript-eslint/visitor-keys@8.12.2': + resolution: {integrity: sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -2597,12 +2672,28 @@ packages: '@vitest/browser': optional: true + '@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@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} '@vitest/expect@2.1.3': resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==} + '@vitest/expect@2.1.4': + resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==} + '@vitest/mocker@2.1.3': resolution: {integrity: sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==} peerDependencies: @@ -2615,24 +2706,47 @@ packages: vite: optional: true + '@vitest/mocker@2.1.4': + resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==} + peerDependencies: + msw: ^2.4.9 + 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/pretty-format@2.1.4': + resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} + '@vitest/runner@2.1.3': resolution: {integrity: sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==} + '@vitest/runner@2.1.4': + resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==} + '@vitest/snapshot@2.1.3': resolution: {integrity: sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==} + '@vitest/snapshot@2.1.4': + resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==} + '@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/spy@2.1.4': + resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==} + '@vitest/ui@2.1.3': resolution: {integrity: sha512-2XwTrHVJw3t9NYES26LQUYy51ZB8W4bRPgqUH2Eyda3kIuOlYw1ZdPNU22qcVlUVx4WKgECFQOSXuopsczuVjQ==} peerDependencies: @@ -2644,6 +2758,9 @@ packages: '@vitest/utils@2.1.3': resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} + '@vitest/utils@2.1.4': + resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} + '@volar/language-core@2.4.8': resolution: {integrity: sha512-K/GxMOXGq997bO00cdFhTNuR85xPxj0BEEAy+BaqqayTmy9Tmhfgmq2wpJcVspRhcwfgPoE2/mEJa26emUhG/g==} @@ -2799,6 +2916,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + adm-zip@0.5.14: resolution: {integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==} engines: {node: '>=12.0'} @@ -2904,10 +3026,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'} @@ -3148,6 +3266,10 @@ packages: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3612,10 +3734,6 @@ packages: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} 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==} @@ -3623,10 +3741,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==} @@ -3810,15 +3924,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': '*' @@ -3844,75 +3964,45 @@ 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@2.0.0: + resolution: {integrity: sha512-nPa44nSp48mp/U+GSneabrhlyIyGvrcv+Z14u6sgno+jX8N0bH+ooSLEC1L6dvMDSHs7tj+kMIbls3l8gCJJSg==} engines: {node: '>=16.6.0'} peerDependencies: eslint: '>=8.40.0' - eslint-plugin-jest: '>=25' - peerDependenciesMeta: - eslint-plugin-jest: - optional: true 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.30.0: + resolution: {integrity: sha512-CyqlRgShvljFkOeYK8wN5frh/OGTvkj1S7wlr2Q2pUvwq+X5VYiLd6ZjujpgSgLnys2W8qrBLkXQ41SUYaoPIQ==} 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 @@ -3921,6 +4011,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + 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} @@ -3929,11 +4023,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.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.13.0: + resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} + 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==} @@ -3942,6 +4044,10 @@ packages: resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + 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} @@ -3955,6 +4061,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'} @@ -4005,6 +4115,10 @@ packages: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4064,9 +4178,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==} @@ -4110,9 +4224,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==} @@ -4236,8 +4350,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==} @@ -4298,14 +4412,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'} @@ -4571,6 +4685,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'} @@ -4578,6 +4695,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'} @@ -4652,10 +4773,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'} @@ -4937,8 +5054,8 @@ packages: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} - keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -5048,6 +5165,9 @@ packages: loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -5080,6 +5200,9 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -5642,10 +5765,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'} @@ -6730,6 +6849,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'} @@ -6814,6 +6937,10 @@ packages: resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + tinyrainbow@1.2.0: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} @@ -6822,6 +6949,10 @@ packages: resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -6953,6 +7084,15 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typescript-eslint@8.12.2: + resolution: {integrity: sha512-UbuVUWSrHVR03q9CWx+JDHeO6B/Hr9p4U5lRH++5tq/EbFq1faYZe50ZSBePptgfIKLEti0aPQ3hFgnPVcd8ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} @@ -7146,6 +7286,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@2.1.4: + resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-plugin-checker@0.8.0: resolution: {integrity: sha512-UA5uzOGm97UvZRTdZHiQVYFnd86AVn8EVaD4L3PoVzxH+IZSfaAw14WGFwX9QS23UW3lV/5bVKZn6l0w+q9P0g==} engines: {node: '>=14.16'} @@ -7259,6 +7404,31 @@ packages: jsdom: optional: true + vitest@2.1.4: + resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} + 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.4 + '@vitest/ui': 2.1.4 + 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'} @@ -7298,12 +7468,12 @@ packages: typescript: optional: true + vue-component-type-helpers@2.1.10: + resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==} + vue-component-type-helpers@2.1.6: resolution: {integrity: sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w==} - vue-component-type-helpers@2.1.8: - resolution: {integrity: sha512-ii36gDzrYAfOQIkOlo44yceDdT5269gKmNGxf07Qx6seH2U50+tQ2ol02XLhYPmxrh6YabAsOdte8WDrpaO6Tw==} - vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -7323,8 +7493,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' @@ -8075,42 +8245,36 @@ 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.1(eslint@9.13.0(jiti@1.21.6))': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 9.13.0(jiti@1.21.6) + ignore: 5.3.2 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@1.21.6))': dependencies: - eslint: 8.57.0 + eslint: 9.13.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.12.1': {} - '@eslint/eslintrc@2.1.4': + '@eslint/compat@1.2.2(eslint@9.13.0(jiti@1.21.6))': + optionalDependencies: + eslint: 9.13.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.7.0': {} + + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 debug: 4.3.7(supports-color@9.4.0) @@ -8124,7 +8288,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@9.13.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.2': + dependencies: + levn: 0.4.1 '@fastify/busboy@2.1.1': {} @@ -8139,17 +8309,16 @@ snapshots: '@floating-ui/utils@0.2.5': {} - '@humanwhocodes/config-array@0.11.14': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': 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.1 + '@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.12(typescript@5.6.3)))': dependencies: @@ -8176,15 +8345,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.13.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.7(supports-color@9.4.0) - eslint: 8.57.0 - glob: 8.1.0 + eslint: 9.13.0(jiti@1.21.6) + eslint-compat-utils: 0.5.0(eslint@9.13.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 @@ -8192,7 +8364,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.13.0(jiti@1.21.6)) yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - supports-color @@ -8258,7 +8431,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.1 + '@types/node': 22.8.5 jest-mock: 29.7.0 optional: true @@ -8279,7 +8452,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.8.1 + '@types/node': 22.8.5 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8326,7 +8499,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/yargs': 17.0.33 chalk: 4.1.2 optional: true @@ -8450,14 +8623,16 @@ 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.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3)': + '@nuxt/devtools-kit@1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.2(rollup@4.22.4)(webpack-sources@3.2.3) execa: 7.2.0 - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) transitivePeerDependencies: - magicast - rollup @@ -8477,13 +8652,13 @@ snapshots: rc9: 2.1.2 semver: 7.6.3 - '@nuxt/devtools@1.6.0(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxt/devtools@1.6.0(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3) + '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3) '@nuxt/devtools-wizard': 1.6.0 '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) - '@vue/devtools-core': 7.4.4(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3)) + '@vue/devtools-core': 7.4.4(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3)) '@vue/devtools-kit': 7.4.4 birpc: 0.2.17 consola: 3.2.3 @@ -8512,9 +8687,9 @@ snapshots: sirv: 2.0.4 tinyglobby: 0.2.6 unimport: 3.13.1(rollup@4.22.4)(webpack-sources@3.2.3) - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) - vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3))(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0)) - vite-plugin-vue-inspector: 5.1.3(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0)) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) + vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3))(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)) + vite-plugin-vue-inspector: 5.1.3(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)) which: 3.0.1 ws: 8.18.0 transitivePeerDependencies: @@ -8598,7 +8773,7 @@ snapshots: - supports-color - webpack-sources - '@nuxt/test-utils@3.14.1(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxt/test-utils@3.14.1(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.2(rollup@4.22.4)(webpack-sources@3.2.3) @@ -8624,8 +8799,8 @@ snapshots: ufo: 1.5.4 unenv: 1.10.0 unplugin: 1.14.1(webpack-sources@3.2.3) - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) - vitest-environment-nuxt: 1.0.0(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) + vitest-environment-nuxt: 1.0.0(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) vue: 3.5.12(typescript@5.6.3) vue-router: 4.4.5(vue@3.5.12(typescript@5.6.3)) optionalDependencies: @@ -8636,19 +8811,19 @@ snapshots: '@vue/test-utils': 2.4.6 jsdom: 24.1.0 playwright-core: 1.48.1 - vitest: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.1.3(@types/node@22.8.5)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) transitivePeerDependencies: - magicast - rollup - supports-color - webpack-sources - '@nuxt/vite-builder@3.13.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxt/vite-builder@3.13.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) '@rollup/plugin-replace': 5.0.7(rollup@4.22.4) - '@vitejs/plugin-vue': 5.1.3(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3)) - '@vitejs/plugin-vue-jsx': 4.0.1(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3)) + '@vitejs/plugin-vue': 5.1.3(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3)) + '@vitejs/plugin-vue-jsx': 4.0.1(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3)) autoprefixer: 10.4.20(postcss@8.4.47) clear: 0.1.0 consola: 3.2.3 @@ -8674,9 +8849,9 @@ snapshots: ufo: 1.5.4 unenv: 1.10.0 unplugin: 1.14.1(webpack-sources@3.2.3) - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) - vite-node: 2.1.3(@types/node@22.8.1)(terser@5.31.0) - vite-plugin-checker: 0.8.0(eslint@8.57.0)(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3)) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) + vite-node: 2.1.3(@types/node@22.8.5)(terser@5.31.0) + vite-plugin-checker: 0.8.0(eslint@9.13.0(jiti@1.21.6))(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3)) vue: 3.5.12(typescript@5.6.3) vue-bundle-renderer: 2.1.0 transitivePeerDependencies: @@ -8747,13 +8922,13 @@ snapshots: - supports-color - webpack-sources - '@nuxtjs/robots@4.1.3(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxtjs/robots@4.1.3(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: - '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3) + '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) consola: 3.2.3 defu: 6.1.4 - nuxt-site-config: 2.2.18(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + nuxt-site-config: 2.2.18(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) nuxt-site-config-kit: 2.2.18(magicast@0.3.5)(rollup@4.22.4)(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) pathe: 1.1.2 pkg-types: 1.2.1 @@ -8768,14 +8943,14 @@ snapshots: - vue - webpack-sources - '@nuxtjs/sitemap@6.1.2(h3@1.12.0)(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxtjs/sitemap@6.1.2(h3@1.12.0)(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: - '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3) + '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) chalk: 5.3.0 defu: 6.1.4 h3-compression: 0.3.2(h3@1.12.0) - nuxt-site-config: 2.2.18(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + nuxt-site-config: 2.2.18(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) nuxt-site-config-kit: 2.2.18(magicast@0.3.5)(rollup@4.22.4)(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) ofetch: 1.4.1 pathe: 1.1.2 @@ -8794,11 +8969,11 @@ snapshots: - vue - webpack-sources - '@nuxtjs/storybook@8.3.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(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.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@nuxtjs/storybook@8.3.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(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.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: - '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3) + '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) - '@storybook-vue/nuxt': 8.3.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.3.6)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + '@storybook-vue/nuxt': 8.3.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.3.6)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@storybook/core-common': 8.3.6(storybook@8.3.6) '@storybook/core-server': 8.3.6(storybook@8.3.6) chalk: 5.3.0 @@ -9301,6 +9476,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.1.1': {} + '@playwright/test@1.48.1': dependencies: playwright: 1.48.1 @@ -9495,6 +9672,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 @@ -9614,22 +9793,22 @@ snapshots: '@sinonjs/commons': 3.0.1 optional: true - '@storybook-vue/nuxt@8.3.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.3.6)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@storybook-vue/nuxt@8.3.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3))(optionator@0.9.3)(rollup@4.22.4)(storybook@8.3.6)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.2(rollup@4.22.4)(webpack-sources@3.2.3) - '@nuxt/vite-builder': 3.13.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + '@nuxt/vite-builder': 3.13.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@rollup/plugin-replace': 6.0.1(rollup@4.22.4) - '@storybook/builder-vite': 8.3.6(storybook@8.3.6)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3) + '@storybook/builder-vite': 8.3.6(storybook@8.3.6)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3) '@storybook/vue3': 8.3.6(storybook@8.3.6)(vue@3.5.12(typescript@5.6.3)) - '@storybook/vue3-vite': 8.3.6(storybook@8.3.6)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + '@storybook/vue3-vite': 8.3.6(storybook@8.3.6)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) json-stable-stringify: 1.1.1 mlly: 1.7.2 - nuxt: 3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3) + nuxt: 3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3) ofetch: 1.4.1 pathe: 1.1.2 unctx: 2.3.1(webpack-sources@3.2.3) - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) vue: 3.5.12(typescript@5.6.3) vue-router: 4.4.5(vue@3.5.12(typescript@5.6.3)) transitivePeerDependencies: @@ -9782,7 +9961,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.3.6(storybook@8.3.6)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3)': + '@storybook/builder-vite@8.3.6(storybook@8.3.6)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3)': dependencies: '@storybook/csf-plugin': 8.3.6(storybook@8.3.6)(webpack-sources@3.2.3) '@types/find-cache-dir': 3.2.1 @@ -9794,7 +9973,7 @@ snapshots: magic-string: 0.30.11 storybook: 8.3.6 ts-dedent: 2.2.0 - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -9889,15 +10068,15 @@ snapshots: dependencies: storybook: 8.3.6 - '@storybook/vue3-vite@8.3.6(storybook@8.3.6)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@storybook/vue3-vite@8.3.6(storybook@8.3.6)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': dependencies: - '@storybook/builder-vite': 8.3.6(storybook@8.3.6)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3) + '@storybook/builder-vite': 8.3.6(storybook@8.3.6)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3) '@storybook/vue3': 8.3.6(storybook@8.3.6)(vue@3.5.12(typescript@5.6.3)) find-package-json: 1.2.0 magic-string: 0.30.11 storybook: 8.3.6 typescript: 5.6.3 - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) vue-component-meta: 2.1.6(typescript@5.6.3) vue-docgen-api: 4.79.2(vue@3.5.12(typescript@5.6.3)) transitivePeerDependencies: @@ -9919,12 +10098,12 @@ snapshots: ts-dedent: 2.2.0 type-fest: 2.19.0 vue: 3.5.12(typescript@5.6.3) - vue-component-type-helpers: 2.1.8 + vue-component-type-helpers: 2.1.10 - '@swc/cli@0.4.0(@swc/core@1.3.82)(chokidar@3.6.0)': + '@swc/cli@0.5.0(@swc/core@1.7.42)(chokidar@3.6.0)': dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.82 + '@swc/core': 1.7.42 '@swc/counter': 0.1.3 commander: 8.3.0 fast-glob: 3.3.2 @@ -9936,54 +10115,57 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - '@swc/core-darwin-arm64@1.3.82': + '@swc/core-darwin-arm64@1.7.42': optional: true - '@swc/core-darwin-x64@1.3.82': + '@swc/core-darwin-x64@1.7.42': optional: true - '@swc/core-linux-arm-gnueabihf@1.3.82': + '@swc/core-linux-arm-gnueabihf@1.7.42': optional: true - '@swc/core-linux-arm64-gnu@1.3.82': + '@swc/core-linux-arm64-gnu@1.7.42': optional: true - '@swc/core-linux-arm64-musl@1.3.82': + '@swc/core-linux-arm64-musl@1.7.42': optional: true - '@swc/core-linux-x64-gnu@1.3.82': + '@swc/core-linux-x64-gnu@1.7.42': optional: true - '@swc/core-linux-x64-musl@1.3.82': + '@swc/core-linux-x64-musl@1.7.42': optional: true - '@swc/core-win32-arm64-msvc@1.3.82': + '@swc/core-win32-arm64-msvc@1.7.42': optional: true - '@swc/core-win32-ia32-msvc@1.3.82': + '@swc/core-win32-ia32-msvc@1.7.42': optional: true - '@swc/core-win32-x64-msvc@1.3.82': + '@swc/core-win32-x64-msvc@1.7.42': optional: true - '@swc/core@1.3.82': + '@swc/core@1.7.42': 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.42 + '@swc/core-darwin-x64': 1.7.42 + '@swc/core-linux-arm-gnueabihf': 1.7.42 + '@swc/core-linux-arm64-gnu': 1.7.42 + '@swc/core-linux-arm64-musl': 1.7.42 + '@swc/core-linux-x64-gnu': 1.7.42 + '@swc/core-linux-x64-musl': 1.7.42 + '@swc/core-win32-arm64-msvc': 1.7.42 + '@swc/core-win32-ia32-msvc': 1.7.42 + '@swc/core-win32-x64-msvc': 1.7.42 '@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: @@ -10051,24 +10233,37 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.36 - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/responselike': 1.0.0 '@types/connect@3.4.36': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 + + '@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.8.1 + '@types/node': 22.8.5 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -10084,7 +10279,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 optional: true '@types/hast@3.0.4': @@ -10097,7 +10292,7 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/istanbul-lib-coverage@2.0.6': optional: true @@ -10112,13 +10307,15 @@ snapshots: '@types/istanbul-lib-report': 3.0.3 optional: true + '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} '@types/k6@0.53.1': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/lodash@4.17.7': {} @@ -10128,14 +10325,14 @@ snapshots: '@types/mysql@2.15.22': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/node-fetch@2.6.11': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 form-data: 4.0.0 - '@types/node@22.8.1': + '@types/node@22.8.5': dependencies: undici-types: 6.19.8 @@ -10147,7 +10344,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 pg-protocol: 1.6.1 pg-types: 2.2.0 @@ -10166,17 +10363,17 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@types/send': 0.17.4 '@types/shimmer@1.0.5': {} @@ -10198,15 +10395,15 @@ snapshots: '@types/yargs-parser': 21.0.3 optional: true - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.0 + '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/type-utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.12.2 + eslint: 9.13.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -10216,26 +10413,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.12.2 debug: 4.3.7(supports-color@9.4.0) - eslint: 8.57.0 + eslint: 9.13.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@7.18.0(@eslint/eslintrc@3.0.2)(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/rule-tester@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint/eslintrc': 3.0.2 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) ajv: 6.12.6 - eslint: 8.57.0 + eslint: 9.13.0(jiti@1.21.6) json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 semver: 7.6.3 @@ -10243,31 +10439,31 @@ snapshots: - supports-color - typescript - '@typescript-eslint/scope-manager@7.18.0': + '@typescript-eslint/scope-manager@8.12.2': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@9.13.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': {} + '@typescript-eslint/types@8.12.2': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.12.2(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 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 @@ -10277,20 +10473,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.12.2(eslint@9.13.0(jiti@1.21.6))(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 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + eslint: 9.13.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.18.0': + '@typescript-eslint/visitor-keys@8.12.2': dependencies: - '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/types': 8.12.2 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -10341,19 +10537,19 @@ snapshots: - encoding - supports-color - '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))': dependencies: '@babel/core': 7.25.7 '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.25.7) '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.7) - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) vue: 3.5.12(typescript@5.6.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.1.3(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.1.3(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))': dependencies: - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) vue: 3.5.12(typescript@5.6.3) '@vitest/coverage-v8@2.1.3(vitest@2.1.3)': @@ -10370,10 +10566,18 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.1.3(@types/node@22.8.5)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) transitivePeerDependencies: - supports-color + '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.4(@types/node@22.8.5)(jsdom@24.1.0)(terser@5.31.0))': + dependencies: + '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.13.0(jiti@1.21.6) + optionalDependencies: + typescript: 5.6.3 + vitest: 2.1.4(@types/node@22.8.5)(jsdom@24.1.0)(terser@5.31.0) + '@vitest/expect@2.0.5': dependencies: '@vitest/spy': 2.0.5 @@ -10388,13 +10592,28 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))': + '@vitest/expect@2.1.4': + dependencies: + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))': dependencies: '@vitest/spy': 2.1.3 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) + + '@vitest/mocker@2.1.4(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))': + dependencies: + '@vitest/spy': 2.1.4 + estree-walker: 3.0.3 + magic-string: 0.30.12 + optionalDependencies: + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -10404,17 +10623,32 @@ snapshots: dependencies: tinyrainbow: 1.2.0 + '@vitest/pretty-format@2.1.4': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/runner@2.1.3': dependencies: '@vitest/utils': 2.1.3 pathe: 1.1.2 + '@vitest/runner@2.1.4': + dependencies: + '@vitest/utils': 2.1.4 + 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/snapshot@2.1.4': + dependencies: + '@vitest/pretty-format': 2.1.4 + magic-string: 0.30.12 + pathe: 1.1.2 + '@vitest/spy@2.0.5': dependencies: tinyspy: 3.0.0 @@ -10423,6 +10657,10 @@ snapshots: dependencies: tinyspy: 3.0.0 + '@vitest/spy@2.1.4': + dependencies: + tinyspy: 3.0.2 + '@vitest/ui@2.1.3(vitest@2.1.3)': dependencies: '@vitest/utils': 2.1.3 @@ -10432,7 +10670,7 @@ snapshots: sirv: 2.0.4 tinyglobby: 0.2.6 tinyrainbow: 1.2.0 - vitest: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.1.3(@types/node@22.8.5)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) '@vitest/utils@2.0.5': dependencies: @@ -10447,6 +10685,12 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 + '@vitest/utils@2.1.4': + dependencies: + '@vitest/pretty-format': 2.1.4 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + '@volar/language-core@2.4.8': dependencies: '@volar/source-map': 2.4.8 @@ -10538,14 +10782,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.4.4(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))': + '@vue/devtools-core@7.4.4(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.4.4 '@vue/devtools-shared': 7.5.2 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0)) + vite-hot-client: 0.2.3(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)) vue: 3.5.12(typescript@5.6.3) transitivePeerDependencies: - vite @@ -10670,10 +10914,16 @@ snapshots: dependencies: acorn: 8.12.1 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn@7.4.1: {} acorn@8.12.1: {} + acorn@8.14.0: {} + adm-zip@0.5.14: {} agent-base@6.0.2: @@ -10795,8 +11045,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 @@ -11067,7 +11315,7 @@ snapshots: clone-response: 1.0.3 get-stream: 5.2.0 http-cache-semantics: 4.1.1 - keyv: 4.5.3 + keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 @@ -11106,6 +11354,14 @@ snapshots: loupe: 3.1.1 pathval: 2.0.0 + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -11531,20 +11787,12 @@ snapshots: diff@7.0.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: {} @@ -11820,128 +12068,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.13.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.13.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.13.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.13.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.18.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.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@1.21.6)): dependencies: + '@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.18.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.18.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint: 9.13.0(jiti@1.21.6) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.12.2(eslint@9.13.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.13.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.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.13.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.18.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.12.2(eslint@9.13.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.13.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.6.3) - eslint: 8.57.0 + '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.13.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.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.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.13.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.13.0(jiti@1.21.6)): dependencies: escape-string-regexp: 1.0.5 - eslint: 8.57.0 + eslint: 9.13.0(jiti@1.21.6) ignore: 5.3.2 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.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.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.13.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.13.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.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.12.2(eslint@9.13.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.13.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.18.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.12.2(eslint@9.13.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.18.0(@typescript-eslint/parser@7.18.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): - 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.18.0(@typescript-eslint/parser@7.18.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): + eslint-plugin-jsonc@2.16.0(eslint@9.13.0(jiti@1.21.6)): 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.13.0(jiti@1.21.6)) + eslint: 9.13.0(jiti@1.21.6) + eslint-compat-utils: 0.5.0(eslint@9.13.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.18.0(@typescript-eslint/parser@7.18.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@2.0.0(eslint@9.13.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.13.0(jiti@1.21.6) globals: 13.24.0 - optionalDependencies: - eslint-plugin-jest: 28.5.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.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.13.0(jiti@1.21.6)): dependencies: '@babel/helper-validator-identifier': 7.25.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint/eslintrc': 2.1.4 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.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.13.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 @@ -11951,40 +12190,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.18.0(@typescript-eslint/parser@7.18.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.1.3): - 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.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) - vitest: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(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.30.0(eslint@9.13.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.13.0(jiti@1.21.6)) + eslint: 9.13.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.13.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.13.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.13.0(jiti@1.21.6) + vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color @@ -11993,50 +12219,56 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.2.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.2.0: {} + + eslint@9.13.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.13.0(jiti@1.21.6)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.13.0 + '@eslint/plugin-kit': 0.2.2 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@humanwhocodes/retry': 0.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.7(supports-color@9.4.0) - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.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 @@ -12048,6 +12280,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 4.0.0 + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@9.6.1: dependencies: acorn: 8.12.1 @@ -12060,6 +12298,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 @@ -12130,6 +12372,8 @@ snapshots: dependencies: pify: 2.3.0 + expect-type@1.1.0: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -12226,9 +12470,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: @@ -12284,11 +12528,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: {} @@ -12404,7 +12647,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 @@ -12487,19 +12730,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 @@ -12799,12 +13035,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 @@ -12863,8 +13107,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: {} @@ -13004,7 +13246,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.8.1 + '@types/node': 22.8.5 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13041,7 +13283,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.1 + '@types/node': 22.8.5 jest-util: 29.7.0 optional: true @@ -13077,7 +13319,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.1 + '@types/node': 22.8.5 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -13086,7 +13328,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -13211,7 +13453,7 @@ snapshots: dependencies: tsscmp: 1.0.6 - keyv@4.5.3: + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -13357,6 +13599,8 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.2: {} + lowercase-keys@2.0.0: {} lru-cache@10.4.3: {} @@ -13384,6 +13628,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.12: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.5: dependencies: '@babel/parser': 7.25.7 @@ -13749,9 +13997,9 @@ snapshots: - vue - webpack-sources - nuxt-site-config@2.2.18(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3): + nuxt-site-config@2.2.18(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3): dependencies: - '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(webpack-sources@3.2.3) + '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.2(rollup@4.22.4)(webpack-sources@3.2.3) nuxt-site-config-kit: 2.2.18(magicast@0.3.5)(rollup@4.22.4)(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) @@ -13768,14 +14016,14 @@ snapshots: - vue - webpack-sources - nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.1)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3): + nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.5)(encoding@0.1.13)(eslint@9.13.0(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3))(webpack-sources@3.2.3): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.6.0(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + '@nuxt/devtools': 1.6.0(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.2(rollup@4.22.4)(webpack-sources@3.2.3) '@nuxt/telemetry': 2.6.0(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) - '@nuxt/vite-builder': 3.13.2(@types/node@22.8.1)(eslint@8.57.0)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + '@nuxt/vite-builder': 3.13.2(@types/node@22.8.5)(eslint@9.13.0(jiti@1.21.6))(magicast@0.3.5)(optionator@0.9.3)(rollup@4.22.4)(terser@5.31.0)(typescript@5.6.3)(vue-tsc@2.1.8(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) '@unhead/dom': 1.11.10 '@unhead/shared': 1.11.10 '@unhead/ssr': 1.11.10 @@ -13836,7 +14084,7 @@ snapshots: vue-router: 4.4.5(vue@3.5.12(typescript@5.6.3)) optionalDependencies: '@parcel/watcher': 2.4.1 - '@types/node': 22.8.1 + '@types/node': 22.8.5 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -14115,8 +14363,6 @@ snapshots: path-to-regexp@6.2.2: {} - path-type@4.0.0: {} - path-type@5.0.0: {} pathe@1.1.2: {} @@ -15200,6 +15446,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: {} @@ -15327,10 +15578,14 @@ snapshots: tinypool@1.0.0: {} + tinypool@1.0.1: {} + tinyrainbow@1.2.0: {} tinyspy@3.0.0: {} + tinyspy@3.0.2: {} + tmpl@1.0.5: optional: true @@ -15451,6 +15706,17 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typescript-eslint@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color + typescript@5.6.3: {} ufo@1.5.4: {} @@ -15660,16 +15926,33 @@ snapshots: vary@1.1.2: {} - vite-hot-client@0.2.3(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0)): + vite-hot-client@0.2.3(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)): dependencies: - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) + + vite-node@2.1.3(@types/node@22.8.5)(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.6(@types/node@22.8.5)(terser@5.31.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser - vite-node@2.1.3(@types/node@22.8.1)(terser@5.31.0): + vite-node@2.1.4(@types/node@22.8.5)(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.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - less @@ -15681,7 +15964,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.8.0(eslint@8.57.0)(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3)): + vite-plugin-checker@0.8.0(eslint@9.13.0(jiti@1.21.6))(optionator@0.9.3)(typescript@5.6.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vue-tsc@2.1.8(typescript@5.6.3)): dependencies: '@babel/code-frame': 7.25.7 ansi-escapes: 4.3.2 @@ -15693,18 +15976,18 @@ snapshots: npm-run-path: 4.0.1 strip-ansi: 6.0.1 tiny-invariant: 1.3.3 - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - eslint: 8.57.0 + eslint: 9.13.0(jiti@1.21.6) optionator: 0.9.3 typescript: 5.6.3 vue-tsc: 2.1.8(typescript@5.6.3) - vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3))(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0)): + vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3))(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.2(rollup@4.22.4) @@ -15715,14 +15998,14 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.0 sirv: 2.0.4 - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) optionalDependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.4)(webpack-sources@3.2.3) transitivePeerDependencies: - rollup - supports-color - vite-plugin-vue-inspector@5.1.3(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0)): + vite-plugin-vue-inspector@5.1.3(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)): dependencies: '@babel/core': 7.25.7 '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.25.7) @@ -15733,17 +16016,17 @@ snapshots: '@vue/compiler-dom': 3.5.12 kolorist: 1.8.0 magic-string: 0.30.11 - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) transitivePeerDependencies: - supports-color - vite@5.4.6(@types/node@22.8.1)(terser@5.31.0): + vite@5.4.6(@types/node@22.8.5)(terser@5.31.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.22.4 optionalDependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 fsevents: 2.3.3 terser: 5.31.0 @@ -15755,11 +16038,11 @@ snapshots: dom-accessibility-api: 0.6.3 lodash-es: 4.17.21 redent: 4.0.0 - vitest: 2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.1.3(@types/node@22.8.5)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0) - vitest-environment-nuxt@1.0.0(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3): + vitest-environment-nuxt@1.0.0(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3): dependencies: - '@nuxt/test-utils': 3.14.1(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.1)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + '@nuxt/test-utils': 3.14.1(@jest/globals@29.7.0)(@playwright/test@1.48.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@5.6.3)))(@vitest/ui@2.1.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(jsdom@24.1.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.1)(rollup@4.22.4)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0))(vitest@2.1.3)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -15781,10 +16064,10 @@ snapshots: - vue-router - webpack-sources - vitest@2.1.3(@types/node@22.8.1)(@vitest/ui@2.1.3)(jsdom@24.1.0)(terser@5.31.0): + vitest@2.1.3(@types/node@22.8.5)(@vitest/ui@2.1.3)(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.6(@types/node@22.8.1)(terser@5.31.0)) + '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)) '@vitest/pretty-format': 2.1.3 '@vitest/runner': 2.1.3 '@vitest/snapshot': 2.1.3 @@ -15799,11 +16082,11 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@22.8.1)(terser@5.31.0) - vite-node: 2.1.3(@types/node@22.8.1)(terser@5.31.0) + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) + vite-node: 2.1.3(@types/node@22.8.5)(terser@5.31.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.8.1 + '@types/node': 22.8.5 '@vitest/ui': 2.1.3(vitest@2.1.3) jsdom: 24.1.0 transitivePeerDependencies: @@ -15817,6 +16100,42 @@ snapshots: - supports-color - terser + vitest@2.1.4(@types/node@22.8.5)(jsdom@24.1.0)(terser@5.31.0): + dependencies: + '@vitest/expect': 2.1.4 + '@vitest/mocker': 2.1.4(vite@5.4.6(@types/node@22.8.5)(terser@5.31.0)) + '@vitest/pretty-format': 2.1.4 + '@vitest/runner': 2.1.4 + '@vitest/snapshot': 2.1.4 + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 + debug: 4.3.7(supports-color@9.4.0) + expect-type: 1.1.0 + magic-string: 0.30.12 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.6(@types/node@22.8.5)(terser@5.31.0) + vite-node: 2.1.4(@types/node@22.8.5)(terser@5.31.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.8.5 + 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: {} @@ -15855,9 +16174,9 @@ snapshots: optionalDependencies: typescript: 5.6.3 - vue-component-type-helpers@2.1.6: {} + vue-component-type-helpers@2.1.10: {} - vue-component-type-helpers@2.1.8: {} + vue-component-type-helpers@2.1.6: {} vue-demi@0.14.10(vue@3.5.12(typescript@5.6.3)): dependencies: @@ -15881,10 +16200,10 @@ snapshots: vue: 3.5.12(typescript@5.6.3) vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.12(typescript@5.6.3)) - vue-eslint-parser@9.4.2(eslint@8.57.0): + vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@1.21.6)): dependencies: debug: 4.3.7(supports-color@9.4.0) - eslint: 8.57.0 + eslint: 9.13.0(jiti@1.21.6) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1