diff --git a/packages/backend/package.json b/packages/backend/package.json index 40d963f3c7..6b2e76480b 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -228,6 +228,6 @@ "pid-port": "2.1.0", "simple-oauth2": "5.1.0", "supertest": "7.2.2", - "vite": "8.0.2" + "vite": "7.3.1" } } diff --git a/packages/frontend-builder/locale-inliner/collect-modifications.ts b/packages/frontend-builder/locale-inliner/collect-modifications.ts index 2e92a407c9..59e5d96517 100644 --- a/packages/frontend-builder/locale-inliner/collect-modifications.ts +++ b/packages/frontend-builder/locale-inliner/collect-modifications.ts @@ -3,11 +3,10 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { parseAst } from 'rolldown/parseAst'; +import { parseAst } from 'vite'; import * as estreeWalker from 'estree-walker'; import { assertNever, assertType } from '../utils.js'; -import type { ESTree as RolldownESTree } from 'rolldown/utils'; -import type { AstNode } from 'rollup'; +import type { AstNode, ProgramNode } from 'rollup'; import type * as estree from 'estree'; import type { LocaleInliner, TextModification } from '../locale-inliner.js'; import type { Logger } from '../logger.js'; @@ -18,7 +17,7 @@ interface WalkerContext { } export function collectModifications(sourceCode: string, fileName: string, fileLogger: Logger, inliner: LocaleInliner): TextModification[] { - let programNode: RolldownESTree.Program; + let programNode: ProgramNode; try { programNode = parseAst(sourceCode); } catch (err) { @@ -36,8 +35,7 @@ export function collectModifications(sourceCode: string, fileName: string, fileL // 1) replace all `scripts/` path literals with locale code // 2) replace all `localStorage.getItem("lang")` with `localeName` variable // 3) replace all `await window.fetch(`/assets/locales/${d}.${x}.json`).then(u=>u.json())` with `localeJson` variable - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (estreeWalker.walk as any)(programNode, { + estreeWalker.walk(programNode, { enter(this: WalkerContext, node: Node) { assertType(node); @@ -120,9 +118,8 @@ export function collectModifications(sourceCode: string, fileName: string, fileL // Check if the identifier is already declared in the file. // If it is, we may overwrite it and cause issues so we skip inlining let isSupported = true; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (estreeWalker.walk as any)(programNode, { - enter(node: Node) { + estreeWalker.walk(programNode, { + enter(node) { if (node.type === 'VariableDeclaration') { assertType(node); for (const id of node.declarations.flatMap(x => declsOfPattern(x.id))) { @@ -148,9 +145,8 @@ export function collectModifications(sourceCode: string, fileName: string, fileL const toSkip = new Set(); toSkip.add(i18nImport); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (estreeWalker.walk as any)(programNode, { - enter(this: WalkerContext, node: Node, parent: Node | null, property: string | number | symbol | null | undefined) { + estreeWalker.walk(programNode, { + enter(this: WalkerContext, node, parent, property) { assertType(node); assertType(parent); if (toSkip.has(node)) { @@ -383,7 +379,7 @@ type SpecifierResult = | { type: 'specifier', localI18nIdentifier: string, importNode: estree.ImportDeclaration & AstNode } ; -function findImportSpecifier(programNode: RolldownESTree.Program, i18nFileName: string, i18nSymbol: string): SpecifierResult { +function findImportSpecifier(programNode: ProgramNode, i18nFileName: string, i18nSymbol: string): SpecifierResult { const imports = programNode.body.filter(x => x.type === 'ImportDeclaration'); const importNode = imports.find(x => x.source.value === `./${i18nFileName}`) as estree.ImportDeclaration | undefined; if (!importNode) return { type: 'no-import' }; diff --git a/packages/frontend-builder/package.json b/packages/frontend-builder/package.json index 28bcc47d63..f4326907d2 100644 --- a/packages/frontend-builder/package.json +++ b/packages/frontend-builder/package.json @@ -17,10 +17,9 @@ "rollup": "4.60.0" }, "dependencies": { - "estree-walker": "3.0.3", "i18n": "workspace:*", + "estree-walker": "3.0.3", "magic-string": "0.30.21", - "rolldown": "1.0.0-rc.11", - "vite": "8.0.2" + "vite": "7.3.1" } } diff --git a/packages/frontend-builder/rollup-plugin-remove-unref-i18n.ts b/packages/frontend-builder/rollup-plugin-remove-unref-i18n.ts index 6ff62b8f77..4a2bfa67d9 100644 --- a/packages/frontend-builder/rollup-plugin-remove-unref-i18n.ts +++ b/packages/frontend-builder/rollup-plugin-remove-unref-i18n.ts @@ -4,11 +4,11 @@ */ import * as estreeWalker from 'estree-walker'; -import { RolldownMagicString } from 'rolldown'; +import MagicString from 'magic-string'; import { assertType } from './utils.js'; -import type { ESTree } from 'rolldown/utils'; import type { Plugin } from 'vite'; -import type { CallExpression, Expression } from 'estree'; +import type { CallExpression, Expression, Program } from 'estree'; +import type { AstNode } from 'rollup'; // This plugin transforms `unref(i18n)` to `i18n` in the code, which is useful for removing unnecessary unref calls // and helps locale inliner runs after vite build to inline the locale data into the final build. @@ -23,13 +23,12 @@ export function pluginRemoveUnrefI18n( } = {}): Plugin { return { name: 'UnwindCssModuleClassName', - renderChunk(code, _chunk, _options, meta) { + renderChunk(code) { if (!code.includes('unref(i18n)')) return null; - const ast = this.parse(code); - const magicString = meta.magicString ?? new RolldownMagicString(code); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (estreeWalker.walk as any)(ast, { - enter(node: ESTree.Node) { + const ast = this.parse(code) as Program; + const magicString = new MagicString(code); + estreeWalker.walk(ast, { + enter(node) { if (node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'unref' && node.arguments.length === 1) { // calls to unref with single argument @@ -37,16 +36,18 @@ export function pluginRemoveUnrefI18n( if (arg.type === 'Identifier' && arg.name === i18nSymbolName) { // this is unref(i18n) so replace it with i18n // to replace, remove the 'unref(' and the trailing ')' - assertType(node); - assertType(arg); + assertType(node); + assertType(arg); magicString.remove(node.start, arg.start); magicString.remove(arg.end, node.end); } } }, }); - - return magicString; + return { + code: magicString.toString(), + map: magicString.generateMap({ hires: true }), + }; }, }; } diff --git a/packages/frontend-embed/build.ts b/packages/frontend-embed/build.ts index 0b4058f33a..4e1f588802 100644 --- a/packages/frontend-embed/build.ts +++ b/packages/frontend-embed/build.ts @@ -3,7 +3,7 @@ import url from 'node:url'; import path from 'node:path'; import { execa } from 'execa'; import locales from 'i18n'; -import { LocaleInliner } from '../frontend-builder/locale-inliner.js'; +import { LocaleInliner } from '../frontend-builder/locale-inliner.js' import { createLogger } from '../frontend-builder/logger'; // requires node 21 or later diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json index 3bb8e00d59..fa5ba3038e 100644 --- a/packages/frontend-embed/package.json +++ b/packages/frontend-embed/package.json @@ -12,6 +12,7 @@ "dependencies": { "@discordapp/twemoji": "16.0.1", "@rollup/plugin-json": "6.1.0", + "@rollup/plugin-replace": "6.0.3", "@rollup/pluginutils": "5.3.0", "@twemoji/parser": "16.0.0", "@vitejs/plugin-vue": "6.0.5", @@ -25,9 +26,11 @@ "misskey-js": "workspace:*", "punycode.js": "2.3.1", "rollup": "4.60.0", + "sass": "1.98.0", "shiki": "3.23.0", "tinycolor2": "1.6.0", "uuid": "13.0.0", + "vite": "7.3.1", "vue": "3.5.30" }, "devDependencies": { @@ -54,10 +57,8 @@ "msw": "2.12.14", "nodemon": "3.1.14", "prettier": "3.8.1", - "sass-embedded": "1.98.0", "start-server-and-test": "2.1.5", "tsx": "4.21.0", - "vite": "8.0.2", "vite-plugin-turbosnap": "1.0.3", "vue-component-type-helpers": "3.2.6", "vue-eslint-parser": "10.4.0", diff --git a/packages/frontend-embed/vite.config.ts b/packages/frontend-embed/vite.config.ts index 7f5be591e8..9e5c24f9d4 100644 --- a/packages/frontend-embed/vite.config.ts +++ b/packages/frontend-embed/vite.config.ts @@ -7,10 +7,10 @@ import { promises as fsp } from 'fs'; import locales from 'i18n'; import meta from '../../package.json'; import packageInfo from './package.json' with { type: 'json' }; -import pluginJson5 from './lib/vite-plugin-json5.js'; +import pluginJson5 from './vite.json5.js'; import { pluginRemoveUnrefI18n } from '../frontend-builder/rollup-plugin-remove-unref-i18n'; -const url = process.env.NODE_ENV === 'development' ? (yaml.load(await fsp.readFile('../../.config/default.yml', 'utf-8')) as any).url : null; +const url = process.env.NODE_ENV === 'development' ? yaml.load(await fsp.readFile('../../.config/default.yml', 'utf-8')).url : null; const host = url ? (new URL(url)).hostname : undefined; const extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.json', '.json5', '.svg', '.sass', '.scss', '.css', '.vue']; @@ -113,6 +113,11 @@ export function getConfig(): UserConfig { } }, }, + preprocessorOptions: { + scss: { + api: 'modern-compiler', + }, + }, }, define: { @@ -132,10 +137,7 @@ export function getConfig(): UserConfig { 'safari16', ], manifest: 'manifest.json', - rolldownOptions: { - experimental: { - nativeMagicString: true, - }, + rollupOptions: { input: { i18n: './src/i18n.ts', entry: './src/boot.ts', @@ -143,15 +145,10 @@ export function getConfig(): UserConfig { external: externalPackages.map(p => p.match), preserveEntrySignatures: 'allow-extension', output: { - codeSplitting: { - groups: [{ - name: 'vue', - test: /node_modules[\\/]vue/, - }, { - // dependencies of i18n.ts - name: 'config', - test: /@@[\\/]js[\\/]config\.js/, - }], + manualChunks: { + vue: ['vue'], + // dependencies of i18n.ts + 'config': ['@@/js/config.js'], }, entryFileNames: `scripts/${localesHash}-[hash:8].js`, chunkFileNames: `scripts/${localesHash}-[hash:8].js`, diff --git a/packages/frontend-embed/lib/vite-plugin-json5.ts b/packages/frontend-embed/vite.json5.ts similarity index 90% rename from packages/frontend-embed/lib/vite-plugin-json5.ts rename to packages/frontend-embed/vite.json5.ts index 921324b67a..87b67c2142 100644 --- a/packages/frontend-embed/lib/vite-plugin-json5.ts +++ b/packages/frontend-embed/vite.json5.ts @@ -1,10 +1,7 @@ -/* - * SPDX-FileCopyrightText: syuilo and misskey-project - * SPDX-License-Identifier: AGPL-3.0-only - */ +// Original: https://github.com/rollup/plugins/tree/8835dd2aed92f408d7dc72d7cc25a9728e16face/packages/json import JSON5 from 'json5'; -import { Plugin } from 'vite'; +import { Plugin } from 'rollup'; import { createFilter, dataToEsm } from '@rollup/pluginutils'; import { RollupJsonOptions } from '@rollup/plugin-json'; diff --git a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts index 0a5000f46d..ccfa08575b 100644 --- a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts +++ b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts @@ -3,15 +3,15 @@ * SPDX-License-Identifier: AGPL-3.0-only */ +import { parse } from 'acorn'; +import { generate } from 'astring'; import { describe, expect, it } from 'vitest'; import { normalizeClass, unwindCssModuleClassName } from './rollup-plugin-unwind-css-module-class-name.js'; -import { parseAst } from 'rolldown/parseAst'; -import type { ESTree } from 'rolldown/utils'; -import { RolldownMagicString } from 'rolldown'; +import type * as estree from 'estree'; -function parseExpression(code: string): ESTree.Expression { - const program = parseAst(code, { sourceType: 'module' }); - const statement = program.body[0] as ESTree.ExpressionStatement; +function parseExpression(code: string): estree.Expression { + const program = parse(code, { ecmaVersion: 'latest', sourceType: 'module' }) as unknown as estree.Program; + const statement = program.body[0] as estree.ExpressionStatement; return statement.expression; } @@ -57,7 +57,7 @@ describe(normalizeClass.name, () => { }); it('Composition API (standard)', () => { - const code = ` + const ast = parse(` import { c as api, d as store, i as i18n, aD as notePage, bN as ImgWithBlurhash, bY as getStaticImageUrl, _ as _export_sfc } from './app-!~{001}~.js'; import { M as MkContainer } from './MkContainer-!~{03M}~.js'; import { b as defineComponent, a as ref, e as onMounted, z as resolveComponent, g as openBlock, h as createBlock, i as withCtx, K as createTextVNode, E as toDisplayString, u as unref, l as createBaseVNode, q as normalizeClass, B as createCommentVNode, k as createElementBlock, F as Fragment, C as renderList, A as createVNode } from './vue-!~{002}~.js'; @@ -170,19 +170,17 @@ const cssModules = { const index_photos = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]); export { index_photos as default }; -`.slice(1); - const ast = parseAst(code, { sourceType: 'module' }); - const magicString = new RolldownMagicString(code); - unwindCssModuleClassName(ast, magicString); - expect(magicString.toString()).toBe( - ` -import { c as api, d as store, i as i18n, aD as notePage, bN as ImgWithBlurhash, bY as getStaticImageUrl, _ as _export_sfc } from './app-!~{001}~.js'; -import { M as MkContainer } from './MkContainer-!~{03M}~.js'; -import { b as defineComponent, a as ref, e as onMounted, z as resolveComponent, g as openBlock, h as createBlock, i as withCtx, K as createTextVNode, E as toDisplayString, u as unref, l as createBaseVNode, q as normalizeClass, B as createCommentVNode, k as createElementBlock, F as Fragment, C as renderList, A as createVNode } from './vue-!~{002}~.js'; +`.slice(1), { ecmaVersion: 'latest', sourceType: 'module' }); + unwindCssModuleClassName(ast); + expect(generate(ast)).toBe(` +import {c as api, d as store, i as i18n, aD as notePage, bN as ImgWithBlurhash, bY as getStaticImageUrl, _ as _export_sfc} from './app-!~{001}~.js'; +import {M as MkContainer} from './MkContainer-!~{03M}~.js'; +import {b as defineComponent, a as ref, e as onMounted, z as resolveComponent, g as openBlock, h as createBlock, i as withCtx, K as createTextVNode, E as toDisplayString, u as unref, l as createBaseVNode, q as normalizeClass, B as createCommentVNode, k as createElementBlock, F as Fragment, C as renderList, A as createVNode} from './vue-!~{002}~.js'; import './photoswipe-!~{003}~.js'; - -const _hoisted_1 = /* @__PURE__ */ createBaseVNode("i", { class: "ti ti-photo" }, null, -1); -const index_photos = /* @__PURE__ */ defineComponent({ +const _hoisted_1 = createBaseVNode("i", { + class: "ti ti-photo" +}, null, -1); +const index_photos = defineComponent({ __name: "index.photos", props: { user: {} @@ -195,20 +193,12 @@ const index_photos = /* @__PURE__ */ defineComponent({ return store.s.disableShowingAnimatedImages ? getStaticImageUrl(image.url) : image.thumbnailUrl; } onMounted(() => { - const image = [ - "image/jpeg", - "image/webp", - "image/avif", - "image/png", - "image/gif", - "image/apng", - "image/vnd.mozilla.apng" - ]; + const image = ["image/jpeg", "image/webp", "image/avif", "image/png", "image/gif", "image/apng", "image/vnd.mozilla.apng"]; api("users/notes", { userId: props.user.id, fileType: image, limit: 10 - }).then((notes) => { + }).then(notes => { for (const note of notes) { for (const file of note.files) { images.value.push({ @@ -223,508 +213,387 @@ const index_photos = /* @__PURE__ */ defineComponent({ return (_ctx, _cache) => { const _component_MkLoading = resolveComponent("MkLoading"); const _component_MkA = resolveComponent("MkA"); - return openBlock(), createBlock(MkContainer, { + return (openBlock(), createBlock(MkContainer, { "max-height": 300, foldable: true }, { - icon: withCtx(() => [ - _hoisted_1 - ]), - header: withCtx(() => [ - createTextVNode(toDisplayString(unref(i18n).ts.images), 1) - ]), - default: withCtx(() => [ - createBaseVNode("div", { - class: "xenMW" - }, [ - unref(fetching) ? (openBlock(), createBlock(_component_MkLoading, { key: 0 })) : createCommentVNode("", true), - !unref(fetching) && unref(images).length > 0 ? (openBlock(), createElementBlock("div", { - key: 1, - class: "xaZzf" - }, [ - (openBlock(true), createElementBlock(Fragment, null, renderList(unref(images), (image) => { - return openBlock(), createBlock(_component_MkA, { - key: image.note.id + image.file.id, - class: "xtA8t", - to: unref(notePage)(image.note) - }, { - default: withCtx(() => [ - createVNode(ImgWithBlurhash, { - hash: image.file.blurhash, - src: thumbnail(image.file), - title: image.file.name - }, null, 8, ["hash", "src", "title"]) - ]), - _: 2 - }, 1032, ["class", "to"]); - }), 128)) - ], 2)) : createCommentVNode("", true), - !unref(fetching) && unref(images).length == 0 ? (openBlock(), createElementBlock("p", { - key: 2, - class: "xhYKj" - }, toDisplayString(unref(i18n).ts.nothing), 3)) : createCommentVNode("", true) - ], 2) - ]), + icon: withCtx(() => [_hoisted_1]), + header: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).ts.images), 1)]), + default: withCtx(() => [createBaseVNode("div", { + class: "xenMW" + }, [unref(fetching) ? (openBlock(), createBlock(_component_MkLoading, { + key: 0 + })) : createCommentVNode("", true), !unref(fetching) && unref(images).length > 0 ? (openBlock(), createElementBlock("div", { + key: 1, + class: "xaZzf" + }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(images), image => { + return (openBlock(), createBlock(_component_MkA, { + key: image.note.id + image.file.id, + class: "xtA8t", + to: unref(notePage)(image.note) + }, { + default: withCtx(() => [createVNode(ImgWithBlurhash, { + hash: image.file.blurhash, + src: thumbnail(image.file), + title: image.file.name + }, null, 8, ["hash", "src", "title"])]), + _: 2 + }, 1032, ["class", "to"])); + }), 128))], 2)) : createCommentVNode("", true), !unref(fetching) && unref(images).length == 0 ? (openBlock(), createElementBlock("p", { + key: 2, + class: "xhYKj" + }, toDisplayString(unref(i18n).ts.nothing), 3)) : createCommentVNode("", true)], 2)]), _: 1 - }); + })); }; } }); - const root = "xenMW"; const stream = "xaZzf"; const img = "xtA8t"; const empty = "xhYKj"; const style0 = { - root: root, - stream: stream, - img: img, - empty: empty + root: root, + stream: stream, + img: img, + empty: empty }; - const cssModules = { "$style": style0 }; - - -export { index_photos as default }; -`.slice(1), - ); -}); - -it('Composition API (with `useCssModule()`)', () => { - const code = ` -import { a7 as getCurrentInstance, b as defineComponent, G as useCssModule, a1 as h, H as TransitionGroup } from './!~{002}~.js'; -import { d as store, aK as toast, b5 as MkAd, i as i18n, _ as _export_sfc } from './app-!~{001}~.js'; - -function isDebuggerEnabled(id) { - try { - return localStorage.getItem(\`DEBUG_\${id}\`) !== null; - } catch { - return false; - } -} -function stackTraceInstances() { - let instance = getCurrentInstance(); - const stack = []; - while (instance) { - stack.push(instance); - instance = instance.parent; - } - return stack; -} - -const _sfc_main = defineComponent({ - props: { - items: { - type: Array, - required: true - }, - direction: { - type: String, - required: false, - default: "down" - }, - reversed: { - type: Boolean, - required: false, - default: false - }, - noGap: { - type: Boolean, - required: false, - default: false - }, - ad: { - type: Boolean, - required: false, - default: false - } - }, - setup(props, { slots, expose }) { - const $style = useCssModule(); - function getDateText(time) { - const date = new Date(time).getDate(); - const month = new Date(time).getMonth() + 1; - return i18n.t("monthAndDay", { - month: month.toString(), - day: date.toString() - }); - } - if (props.items.length === 0) - return; - const renderChildrenImpl = () => props.items.map((item, i) => { - if (!slots || !slots.default) - return; - const el = slots.default({ - item - })[0]; - if (el.key == null && item.id) - el.key = item.id; - if (i !== props.items.length - 1 && new Date(item.createdAt).getDate() !== new Date(props.items[i + 1].createdAt).getDate()) { - const separator = h("div", { - class: $style["separator"], - key: item.id + ":separator" - }, h("p", { - class: $style["date"] - }, [ - h("span", { - class: $style["date-1"] - }, [ - h("i", { - class: \`ti ti-chevron-up \${$style["date-1-icon"]}\` - }), - getDateText(item.createdAt) - ]), - h("span", { - class: $style["date-2"] - }, [ - getDateText(props.items[i + 1].createdAt), - h("i", { - class: \`ti ti-chevron-down \${$style["date-2-icon"]}\` - }) - ]) - ])); - return [el, separator]; - } else { - if (props.ad && item._shouldInsertAd_) { - return [h(MkAd, { - key: item.id + ":ad", - prefer: ["horizontal", "horizontal-big"] - }), el]; - } else { - return el; - } - } - }); - const renderChildren = () => { - const children = renderChildrenImpl(); - if (isDebuggerEnabled(6864)) { - const nodes = children.flatMap((node) => node ?? []); - const keys = new Set(nodes.map((node) => node.key)); - if (keys.size !== nodes.length) { - const id = crypto.randomUUID(); - const instances = stackTraceInstances(); - toast(instances.reduce((a, c) => \`\${a} at \${c.type.name}\`, \`[DEBUG_6864 (\${id})]: \${nodes.length - keys.size} duplicated keys found\`)); - console.warn({ id, debugId: 6864, stack: instances }); - } - } - return children; - }; - function onBeforeLeave(el) { - el.style.top = \`\${el.offsetTop}px\`; - el.style.left = \`\${el.offsetLeft}px\`; - } - function onLeaveCanceled(el) { - el.style.top = ""; - el.style.left = ""; - } - return () => h( - prefer.s.animation ? TransitionGroup : "div", - { - class: { - [$style["date-separated-list"]]: true, - [$style["date-separated-list-nogap"]]: props.noGap, - [$style["reversed"]]: props.reversed, - [$style["direction-down"]]: props.direction === "down", - [$style["direction-up"]]: props.direction === "up" - }, - ...prefer.s.animation ? { - name: "list", - tag: "div", - onBeforeLeave, - onLeaveCanceled - } : {} - }, - { default: renderChildren } - ); - } -}); - -const reversed = "xxiZh"; -const separator = "xxeDx"; -const date = "xxawD"; -const style0 = { - "date-separated-list": "xfKPa", - "date-separated-list-nogap": "xf9zr", - "direction-up": "x7AeO", - "direction-down": "xBIqc", - reversed: reversed, - separator: separator, - date: date, - "date-1": "xwtmh", - "date-1-icon": "xsNPa", - "date-2": "x1xvw", - "date-2-icon": "x9ZiG" -}; - -const cssModules = { - "$style": style0 -}; -const MkDateSeparatedList = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]); - -export { MkDateSeparatedList as M }; -`.slice(1); - const ast = parseAst(code, { sourceType: 'module' }); - const magicString = new RolldownMagicString(code); - unwindCssModuleClassName(ast, magicString); - expect(magicString.toString()).toBe( - ` -import { a7 as getCurrentInstance, b as defineComponent, G as useCssModule, a1 as h, H as TransitionGroup } from './!~{002}~.js'; -import { d as store, aK as toast, b5 as MkAd, i as i18n, _ as _export_sfc } from './app-!~{001}~.js'; - -function isDebuggerEnabled(id) { - try { - return localStorage.getItem(\`DEBUG_\${id}\`) !== null; - } catch { - return false; - } -} -function stackTraceInstances() { - let instance = getCurrentInstance(); - const stack = []; - while (instance) { - stack.push(instance); - instance = instance.parent; - } - return stack; -} - -const _sfc_main = defineComponent({ - props: { - items: { - type: Array, - required: true - }, - direction: { - type: String, - required: false, - default: "down" - }, - reversed: { - type: Boolean, - required: false, - default: false - }, - noGap: { - type: Boolean, - required: false, - default: false - }, - ad: { - type: Boolean, - required: false, - default: false - } - }, - setup(props, { slots, expose }) { - const $style = useCssModule(); - function getDateText(time) { - const date = new Date(time).getDate(); - const month = new Date(time).getMonth() + 1; - return i18n.t("monthAndDay", { - month: month.toString(), - day: date.toString() - }); - } - if (props.items.length === 0) - return; - const renderChildrenImpl = () => props.items.map((item, i) => { - if (!slots || !slots.default) - return; - const el = slots.default({ - item - })[0]; - if (el.key == null && item.id) - el.key = item.id; - if (i !== props.items.length - 1 && new Date(item.createdAt).getDate() !== new Date(props.items[i + 1].createdAt).getDate()) { - const separator = h("div", { - class: $style["separator"], - key: item.id + ":separator" - }, h("p", { - class: $style["date"] - }, [ - h("span", { - class: $style["date-1"] - }, [ - h("i", { - class: \`ti ti-chevron-up \${$style["date-1-icon"]}\` - }), - getDateText(item.createdAt) - ]), - h("span", { - class: $style["date-2"] - }, [ - getDateText(props.items[i + 1].createdAt), - h("i", { - class: \`ti ti-chevron-down \${$style["date-2-icon"]}\` - }) - ]) - ])); - return [el, separator]; - } else { - if (props.ad && item._shouldInsertAd_) { - return [h(MkAd, { - key: item.id + ":ad", - prefer: ["horizontal", "horizontal-big"] - }), el]; - } else { - return el; - } - } - }); - const renderChildren = () => { - const children = renderChildrenImpl(); - if (isDebuggerEnabled(6864)) { - const nodes = children.flatMap((node) => node ?? []); - const keys = new Set(nodes.map((node) => node.key)); - if (keys.size !== nodes.length) { - const id = crypto.randomUUID(); - const instances = stackTraceInstances(); - toast(instances.reduce((a, c) => \`\${a} at \${c.type.name}\`, \`[DEBUG_6864 (\${id})]: \${nodes.length - keys.size} duplicated keys found\`)); - console.warn({ id, debugId: 6864, stack: instances }); - } - } - return children; - }; - function onBeforeLeave(el) { - el.style.top = \`\${el.offsetTop}px\`; - el.style.left = \`\${el.offsetLeft}px\`; - } - function onLeaveCanceled(el) { - el.style.top = ""; - el.style.left = ""; - } - return () => h( - prefer.s.animation ? TransitionGroup : "div", - { - class: { - [$style["date-separated-list"]]: true, - [$style["date-separated-list-nogap"]]: props.noGap, - [$style["reversed"]]: props.reversed, - [$style["direction-down"]]: props.direction === "down", - [$style["direction-up"]]: props.direction === "up" - }, - ...prefer.s.animation ? { - name: "list", - tag: "div", - onBeforeLeave, - onLeaveCanceled - } : {} - }, - { default: renderChildren } - ); - } -}); - -const reversed = "xxiZh"; -const separator = "xxeDx"; -const date = "xxawD"; -const style0 = { - "date-separated-list": "xfKPa", - "date-separated-list-nogap": "xf9zr", - "direction-up": "x7AeO", - "direction-down": "xBIqc", - reversed: reversed, - separator: separator, - date: date, - "date-1": "xwtmh", - "date-1-icon": "xsNPa", - "date-2": "x1xvw", - "date-2-icon": "x9ZiG" -}; - -const cssModules = { - "$style": style0 -}; -const MkDateSeparatedList = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]); - -export { MkDateSeparatedList as M }; +export {index_photos as default}; `.slice(1)); }); -it('Composition API (inlined output)', () => { - const code = ` -import { a as normalizeClass, b as defineComponent, c as _export_sfc } from './runtime.js'; +it('Composition API (with `useCssModule()`)', () => { + const ast = parse(` +import { a7 as getCurrentInstance, b as defineComponent, G as useCssModule, a1 as h, H as TransitionGroup } from './!~{002}~.js'; +import { d as store, aK as toast, b5 as MkAd, i as i18n, _ as _export_sfc } from './app-!~{001}~.js'; -const CurrentComponent = /* @__PURE__ */ _export_sfc(defineComponent({ - __name: "CurrentComponent", - setup() { - return (e, n) => h("div", { - class: normalizeClass([e.$style.root, "extra"]) - }, null, 2); +function isDebuggerEnabled(id) { + try { + return localStorage.getItem(\`DEBUG_\${id}\`) !== null; + } catch { + return false; } -}), [["__cssModules", { - "$style": { - root: "x1234" +} +function stackTraceInstances() { + let instance = getCurrentInstance(); + const stack = []; + while (instance) { + stack.push(instance); + instance = instance.parent; } -}]]); + return stack; +} -export { CurrentComponent as default }; -`.slice(1); - const ast = parseAst(code, { sourceType: 'module' }); - const magicString = new RolldownMagicString(code); - unwindCssModuleClassName(ast, magicString); - const output = magicString.toString(); - expect(output).toContain('class: "x1234 extra"'); - expect(output).toContain('defineComponent({'); - expect(output).toContain('}), []);'); - expect(output).not.toContain('$style'); +const _sfc_main = defineComponent({ + props: { + items: { + type: Array, + required: true + }, + direction: { + type: String, + required: false, + default: "down" + }, + reversed: { + type: Boolean, + required: false, + default: false + }, + noGap: { + type: Boolean, + required: false, + default: false + }, + ad: { + type: Boolean, + required: false, + default: false + } + }, + setup(props, { slots, expose }) { + const $style = useCssModule(); + function getDateText(time) { + const date = new Date(time).getDate(); + const month = new Date(time).getMonth() + 1; + return i18n.t("monthAndDay", { + month: month.toString(), + day: date.toString() + }); + } + if (props.items.length === 0) + return; + const renderChildrenImpl = () => props.items.map((item, i) => { + if (!slots || !slots.default) + return; + const el = slots.default({ + item + })[0]; + if (el.key == null && item.id) + el.key = item.id; + if (i !== props.items.length - 1 && new Date(item.createdAt).getDate() !== new Date(props.items[i + 1].createdAt).getDate()) { + const separator = h("div", { + class: $style["separator"], + key: item.id + ":separator" + }, h("p", { + class: $style["date"] + }, [ + h("span", { + class: $style["date-1"] + }, [ + h("i", { + class: \`ti ti-chevron-up \${$style["date-1-icon"]}\` + }), + getDateText(item.createdAt) + ]), + h("span", { + class: $style["date-2"] + }, [ + getDateText(props.items[i + 1].createdAt), + h("i", { + class: \`ti ti-chevron-down \${$style["date-2-icon"]}\` + }) + ]) + ])); + return [el, separator]; + } else { + if (props.ad && item._shouldInsertAd_) { + return [h(MkAd, { + key: item.id + ":ad", + prefer: ["horizontal", "horizontal-big"] + }), el]; + } else { + return el; + } + } + }); + const renderChildren = () => { + const children = renderChildrenImpl(); + if (isDebuggerEnabled(6864)) { + const nodes = children.flatMap((node) => node ?? []); + const keys = new Set(nodes.map((node) => node.key)); + if (keys.size !== nodes.length) { + const id = crypto.randomUUID(); + const instances = stackTraceInstances(); + toast(instances.reduce((a, c) => \`\${a} at \${c.type.name}\`, \`[DEBUG_6864 (\${id})]: \${nodes.length - keys.size} duplicated keys found\`)); + console.warn({ id, debugId: 6864, stack: instances }); + } + } + return children; + }; + function onBeforeLeave(el) { + el.style.top = \`\${el.offsetTop}px\`; + el.style.left = \`\${el.offsetLeft}px\`; + } + function onLeaveCanceled(el) { + el.style.top = ""; + el.style.left = ""; + } + return () => h( + prefer.s.animation ? TransitionGroup : "div", + { + class: { + [$style["date-separated-list"]]: true, + [$style["date-separated-list-nogap"]]: props.noGap, + [$style["reversed"]]: props.reversed, + [$style["direction-down"]]: props.direction === "down", + [$style["direction-up"]]: props.direction === "up" + }, + ...prefer.s.animation ? { + name: "list", + tag: "div", + onBeforeLeave, + onLeaveCanceled + } : {} + }, + { default: renderChildren } + ); + } }); -it('should keep cssModules when unresolved references remain', () => { - const code = ` -import { a as normalizeClass, b as defineComponent, c as _export_sfc } from './runtime.js'; +const reversed = "xxiZh"; +const separator = "xxeDx"; +const date = "xxawD"; +const style0 = { + "date-separated-list": "xfKPa", + "date-separated-list-nogap": "xf9zr", + "direction-up": "x7AeO", + "direction-down": "xBIqc", + reversed: reversed, + separator: separator, + date: date, + "date-1": "xwtmh", + "date-1-icon": "xsNPa", + "date-2": "x1xvw", + "date-2-icon": "x9ZiG" +}; -const CurrentComponent = /* @__PURE__ */ _export_sfc(defineComponent({ - __name: "CurrentComponent", - setup() { - return (e, n) => h("div", { - class: normalizeClass([e.$style.root, e.$style[side]]) - }, null, 2); - } -}), [["__cssModules", { - "$style": { - root: "x1234" - } -}]]); +const cssModules = { + "$style": style0 +}; +const MkDateSeparatedList = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]); -export { CurrentComponent as default }; -`.slice(1); - const ast = parseAst(code, { sourceType: 'module' }); - const magicString = new RolldownMagicString(code); - unwindCssModuleClassName(ast, magicString); - const output = magicString.toString(); - expect(output).toContain('e.$style[side]'); - expect(output).toContain('__cssModules'); - expect(output).not.toContain('}), []);'); +export { MkDateSeparatedList as M }; +`.slice(1), { ecmaVersion: 'latest', sourceType: 'module' }); + unwindCssModuleClassName(ast); + expect(generate(ast)).toBe(` +import {a7 as getCurrentInstance, b as defineComponent, G as useCssModule, a1 as h, H as TransitionGroup} from './!~{002}~.js'; +import {d as store, aK as toast, b5 as MkAd, i as i18n, _ as _export_sfc} from './app-!~{001}~.js'; +function isDebuggerEnabled(id) { + try { + return localStorage.getItem(\`DEBUG_\${id}\`) !== null; + } catch { + return false; + } +} +function stackTraceInstances() { + let instance = getCurrentInstance(); + const stack = []; + while (instance) { + stack.push(instance); + instance = instance.parent; + } + return stack; +} +const _sfc_main = defineComponent({ + props: { + items: { + type: Array, + required: true + }, + direction: { + type: String, + required: false, + default: "down" + }, + reversed: { + type: Boolean, + required: false, + default: false + }, + noGap: { + type: Boolean, + required: false, + default: false + }, + ad: { + type: Boolean, + required: false, + default: false + } + }, + setup(props, {slots, expose}) { + const $style = useCssModule(); + function getDateText(time) { + const date = new Date(time).getDate(); + const month = new Date(time).getMonth() + 1; + return i18n.t("monthAndDay", { + month: month.toString(), + day: date.toString() + }); + } + if (props.items.length === 0) return; + const renderChildrenImpl = () => props.items.map((item, i) => { + if (!slots || !slots.default) return; + const el = slots.default({ + item + })[0]; + if (el.key == null && item.id) el.key = item.id; + if (i !== props.items.length - 1 && new Date(item.createdAt).getDate() !== new Date(props.items[i + 1].createdAt).getDate()) { + const separator = h("div", { + class: $style["separator"], + key: item.id + ":separator" + }, h("p", { + class: $style["date"] + }, [h("span", { + class: $style["date-1"] + }, [h("i", { + class: \`ti ti-chevron-up \${$style["date-1-icon"]}\` + }), getDateText(item.createdAt)]), h("span", { + class: $style["date-2"] + }, [getDateText(props.items[i + 1].createdAt), h("i", { + class: \`ti ti-chevron-down \${$style["date-2-icon"]}\` + })])])); + return [el, separator]; + } else { + if (props.ad && item._shouldInsertAd_) { + return [h(MkAd, { + key: item.id + ":ad", + prefer: ["horizontal", "horizontal-big"] + }), el]; + } else { + return el; + } + } + }); + const renderChildren = () => { + const children = renderChildrenImpl(); + if (isDebuggerEnabled(6864)) { + const nodes = children.flatMap(node => node ?? []); + const keys = new Set(nodes.map(node => node.key)); + if (keys.size !== nodes.length) { + const id = crypto.randomUUID(); + const instances = stackTraceInstances(); + toast(instances.reduce((a, c) => \`\${a} at \${c.type.name}\`, \`[DEBUG_6864 (\${id})]: \${nodes.length - keys.size} duplicated keys found\`)); + console.warn({ + id, + debugId: 6864, + stack: instances + }); + } + } + return children; + }; + function onBeforeLeave(el) { + el.style.top = \`\${el.offsetTop}px\`; + el.style.left = \`\${el.offsetLeft}px\`; + } + function onLeaveCanceled(el) { + el.style.top = ""; + el.style.left = ""; + } + return () => h(prefer.s.animation ? TransitionGroup : "div", { + class: { + [$style["date-separated-list"]]: true, + [$style["date-separated-list-nogap"]]: props.noGap, + [$style["reversed"]]: props.reversed, + [$style["direction-down"]]: props.direction === "down", + [$style["direction-up"]]: props.direction === "up" + }, + ...prefer.s.animation ? { + name: "list", + tag: "div", + onBeforeLeave, + onLeaveCanceled + } : {} + }, { + default: renderChildren + }); + } }); - -it('should inline cssModules references used inside class expressions', () => { - const code = ` -import { a as classHelper, b as defineComponent, c as _export_sfc } from './runtime.js'; - -const CurrentComponent = /* @__PURE__ */ _export_sfc(defineComponent({ - __name: "CurrentComponent", - setup() { - return (e, n) => h("div", { - class: classHelper([e.$style.root, { [e.$style.main]: isActive }]) - }, null, 2); - } -}), [["__cssModules", { - "$style": { - root: "x1234", - main: "x5678" - } -}]]); - -export { CurrentComponent as default }; -`.slice(1); - const ast = parseAst(code, { sourceType: 'module' }); - const magicString = new RolldownMagicString(code); - unwindCssModuleClassName(ast, magicString); - const output = magicString.toString(); - expect(output).toContain('class: classHelper(["x1234", { ["x5678"]: isActive }])'); - expect(output).toContain('}), []);'); - expect(output).not.toContain('$style'); +const reversed = "xxiZh"; +const separator = "xxeDx"; +const date = "xxawD"; +const style0 = { + "date-separated-list": "xfKPa", + "date-separated-list-nogap": "xf9zr", + "direction-up": "x7AeO", + "direction-down": "xBIqc", + reversed: reversed, + separator: separator, + date: date, + "date-1": "xwtmh", + "date-1-icon": "xsNPa", + "date-2": "x1xvw", + "date-2-icon": "x9ZiG" +}; +const cssModules = { + "$style": style0 +}; +const MkDateSeparatedList = _export_sfc(_sfc_main, [["__cssModules", cssModules]]); +export {MkDateSeparatedList as M}; +`.slice(1)); }); diff --git a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.ts b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.ts index d82f1512fc..7ecb1e9179 100644 --- a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.ts +++ b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.ts @@ -3,16 +3,17 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import * as estreeWalker from 'estree-walker'; +import { generate } from 'astring'; +import { walk } from '../node_modules/estree-walker/src/index.js'; +import type * as estree from 'estree'; +import type * as estreeWalker from 'estree-walker'; import type { Plugin } from 'vite'; -import type { ESTree } from 'rolldown/utils'; -import { RolldownMagicString } from 'rolldown'; -function isFalsyIdentifier(identifier: Extract): boolean { +function isFalsyIdentifier(identifier: estree.Identifier): boolean { return identifier.name === 'undefined' || identifier.name === 'NaN'; } -function normalizeClassWalker(tree: ESTree.Node, stack: string | undefined): string | null { +function normalizeClassWalker(tree: estree.Node, stack: string | undefined): string | null { if (tree.type === 'Identifier') return isFalsyIdentifier(tree) ? '' : null; if (tree.type === 'Literal') return typeof tree.value === 'string' ? tree.value : ''; if (tree.type === 'BinaryExpression') { @@ -25,7 +26,7 @@ function normalizeClassWalker(tree: ESTree.Node, stack: string | undefined): str if (tree.type === 'TemplateLiteral') { if (tree.expressions.some((x) => x.type !== 'Literal' && (x.type !== 'Identifier' || !isFalsyIdentifier(x)))) return null; return tree.quasis.reduce((a, c, i) => { - const v = i === tree.quasis.length - 1 ? '' : (tree.expressions[i] as Partial>).value; + const v = i === tree.quasis.length - 1 ? '' : (tree.expressions[i] as Partial).value; return a + c.value.raw + (typeof v === 'string' ? v : ''); }, ''); } @@ -71,144 +72,44 @@ function normalizeClassWalker(tree: ESTree.Node, stack: string | undefined): str tree.type !== 'ChainExpression' && tree.type !== 'ConditionalExpression' && tree.type !== 'LogicalExpression' && - tree.type !== 'MemberExpression' - ) { + tree.type !== 'MemberExpression') { console.error(stack ? `Unexpected node type: ${tree.type} (in ${stack})` : `Unexpected node type: ${tree.type}`); } return null; } -export function normalizeClass(tree: ESTree.Node, stack?: string): string | null { +export function normalizeClass(tree: estree.Node, stack?: string): string | null { const walked = normalizeClassWalker(tree, stack); return walked && walked.replace(/^\s+|\s+(?=\s)|\s+$/g, ''); } -function getPropertyName(node: ESTree.Node, computed: boolean): string | null { - if (node.type === 'Identifier') return computed ? null : node.name; - if (node.type === 'Literal' && typeof node.value === 'string') return node.value; - return null; -} - -function getMemberPropertyName(node: ESTree.MemberExpression['property'], computed: boolean): string | null { - if (node.type === 'Identifier') return computed ? null : node.name; - if (node.type === 'Literal' && typeof node.value === 'string') return node.value; - return null; -} - -function findVariableDeclaration(program: ESTree.Program, name: string): ESTree.VariableDeclaration | null { - return program.body.find((x) => { - if (x.type !== 'VariableDeclaration') return false; - if (x.declarations.length !== 1) return false; - if (x.declarations[0].id.type !== 'Identifier') return false; - return x.declarations[0].id.name === name; - }) as ESTree.VariableDeclaration | null; -} - -function resolveObjectExpression(program: ESTree.Program, tree: ESTree.Expression): ESTree.ObjectExpression | null { - if (tree.type === 'ObjectExpression') return tree; - if (tree.type !== 'Identifier') return null; - const declaration = findVariableDeclaration(program, tree.name); - if (declaration?.declarations[0].init?.type !== 'ObjectExpression') return null; - return declaration.declarations[0].init; -} - -function resolveComponentOptions(program: ESTree.Program, tree: ESTree.Expression): ESTree.ObjectExpression | null { - const target = tree.type === 'Identifier' - ? findVariableDeclaration(program, tree.name)?.declarations[0].init ?? null - : tree; - if (target?.type === 'ObjectExpression') return target; - if (target?.type !== 'CallExpression') return null; - if (target.arguments.length !== 1) return null; - if (target.arguments[0].type !== 'ObjectExpression') return null; - return target.arguments[0]; -} - -function resolveModuleTree(program: ESTree.Program, tree: ESTree.Expression): Map | null { - const objectExpression = resolveObjectExpression(program, tree); - if (objectExpression === null) return null; - return new Map(objectExpression.properties.flatMap((property) => { - if (property.type !== 'Property') return []; - const actualKey = getPropertyName(property.key, property.computed); - if (actualKey === null) return []; - if (property.value.type === 'Literal') { - return typeof property.value.value === 'string' ? [[actualKey, property.value.value]] : []; - } - if (property.value.type === 'Identifier') { - const actualValue = findVariableDeclaration(program, property.value.name); - if (actualValue?.declarations[0].init?.type !== 'Literal') return []; - return typeof actualValue.declarations[0].init.value === 'string' ? [[actualKey, actualValue.declarations[0].init.value]] : []; - } - return []; - })); -} - -function resolveModuleForest(program: ESTree.Program, tree: ESTree.Expression): Map> | null { - const objectExpression = resolveObjectExpression(program, tree); - if (objectExpression === null) return null; - return new Map(objectExpression.properties.flatMap((property) => { - if (property.type !== 'Property') return []; - const actualKey = getPropertyName(property.key, property.computed); - if (actualKey === null) return []; - const moduleTree = resolveModuleTree(program, property.value); - return moduleTree === null ? [] : [[actualKey, moduleTree]]; - })); -} - -function findRenderArrow(options: ESTree.ObjectExpression): Extract | null { - const setup = options.properties.find((x) => { - if (x.type !== 'Property') return false; - return getPropertyName(x.key, x.computed) === 'setup'; - }) as Extract | undefined; - if (setup?.value.type !== 'FunctionExpression' && setup?.value.type !== 'ArrowFunctionExpression') return null; - if (setup.value.body == null) return null; - if (setup.value.body.type !== 'BlockStatement') return null; - const render = setup.value.body.body.find((x) => x.type === 'ReturnStatement'); - if (render?.type !== 'ReturnStatement') return null; - return render.argument?.type === 'ArrowFunctionExpression' ? render.argument : null; -} - -function isCssModuleAccess(node: ESTree.Node, ctxName: string, key: string): node is Extract { - if (node.type !== 'MemberExpression') return false; - if (node.object.type !== 'MemberExpression') return false; - if (node.object.object.type !== 'Identifier') return false; - if (node.object.object.name !== ctxName) return false; - return getMemberPropertyName(node.object.property, node.object.computed) === key; - } - -function isCssModuleReference(node: ESTree.Node, ctxName: string, key: string): node is Extract { - if (!isCssModuleAccess(node, ctxName, key)) return false; - return getMemberPropertyName(node.property, node.computed) !== null; -} - -function isClassProperty(node: ESTree.Node | null): node is Extract { - return node?.type === 'Property' && getPropertyName(node.key, node.computed) === 'class'; -} - -export function unwindCssModuleClassName(ast: ESTree.Node, magicString: RolldownMagicString): void { - (estreeWalker.walk as any)(ast, { - enter(node: ESTree.Node, parent: ESTree.Node | null): void { +export function unwindCssModuleClassName(ast: estree.Node): void { + (walk as typeof estreeWalker.walk)(ast, { + enter(node, parent): void { //#region if (parent?.type !== 'Program') return; - if (ast.type !== 'Program') return; if (node.type !== 'VariableDeclaration') return; if (node.declarations.length !== 1) return; if (node.declarations[0].id.type !== 'Identifier') return; const name = node.declarations[0].id.name; if (node.declarations[0].init?.type !== 'CallExpression') return; + if (node.declarations[0].init.callee.type !== 'Identifier') return; + if (node.declarations[0].init.callee.name !== '_export_sfc') return; if (node.declarations[0].init.arguments.length !== 2) return; - const componentNode = node.declarations[0].init.arguments[0]; - if (componentNode.type !== 'Identifier' && componentNode.type !== 'CallExpression' && componentNode.type !== 'ObjectExpression') return; + if (node.declarations[0].init.arguments[0].type !== 'Identifier') return; + const ident = node.declarations[0].init.arguments[0].name; + if (!ident.startsWith('_sfc_main')) return; if (node.declarations[0].init.arguments[1].type !== 'ArrayExpression') return; if (node.declarations[0].init.arguments[1].elements.length === 0) return; - const cssModulesEntry = node.declarations[0].init.arguments[1].elements.find((x) => { + const __cssModulesIndex = node.declarations[0].init.arguments[1].elements.findIndex((x) => { if (x?.type !== 'ArrayExpression') return false; if (x.elements.length !== 2) return false; if (x.elements[0]?.type !== 'Literal') return false; if (x.elements[0].value !== '__cssModules') return false; + if (x.elements[1]?.type !== 'Identifier') return false; return true; - }) as ESTree.ArrayExpression | undefined; - const __cssModulesIndex = node.declarations[0].init.arguments[1].elements.indexOf(cssModulesEntry ?? null); - if (cssModulesEntry === undefined || __cssModulesIndex < 0) return; + }); + if (!~__cssModulesIndex) return; /* This region assumeed that the entered node looks like the following code. * * ```ts @@ -217,10 +118,21 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown */ //#endregion //#region - const cssModuleForest = cssModulesEntry.elements[1]; - if (cssModuleForest?.type !== 'Identifier' && cssModuleForest?.type !== 'ObjectExpression') return; - const moduleForest = resolveModuleForest(ast, cssModuleForest); - if (moduleForest === null) return; + const cssModuleForestName = ((node.declarations[0].init.arguments[1].elements[__cssModulesIndex] as estree.ArrayExpression).elements[1] as estree.Identifier).name; + const cssModuleForestNode = parent.body.find((x) => { + if (x.type !== 'VariableDeclaration') return false; + if (x.declarations.length !== 1) return false; + if (x.declarations[0].id.type !== 'Identifier') return false; + if (x.declarations[0].id.name !== cssModuleForestName) return false; + if (x.declarations[0].init?.type !== 'ObjectExpression') return false; + return true; + }) as unknown as estree.VariableDeclaration; + const moduleForest = new Map((cssModuleForestNode.declarations[0].init as estree.ObjectExpression).properties.flatMap((property) => { + if (property.type !== 'Property') return []; + if (property.key.type !== 'Literal') return []; + if (property.value.type !== 'Identifier') return []; + return [[property.key.value as string, property.value.name as string]]; + })); /* This region collected a VariableDeclaration node in the module that looks like the following code. * * ```ts @@ -231,13 +143,35 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown */ //#endregion //#region - const options = resolveComponentOptions(ast, componentNode); - if (options === null) return; - const render = findRenderArrow(options); - if (render === null) return; - if (render.params.length !== 2) return; - const ctx = render.params[0]; + const sfcMain = parent.body.find((x) => { + if (x.type !== 'VariableDeclaration') return false; + if (x.declarations.length !== 1) return false; + if (x.declarations[0].id.type !== 'Identifier') return false; + if (x.declarations[0].id.name !== ident) return false; + return true; + }) as unknown as estree.VariableDeclaration; + if (sfcMain.declarations[0].init?.type !== 'CallExpression') return; + if (sfcMain.declarations[0].init.callee.type !== 'Identifier') return; + if (sfcMain.declarations[0].init.callee.name !== 'defineComponent') return; + if (sfcMain.declarations[0].init.arguments.length !== 1) return; + if (sfcMain.declarations[0].init.arguments[0].type !== 'ObjectExpression') return; + const setup = sfcMain.declarations[0].init.arguments[0].properties.find((x) => { + if (x.type !== 'Property') return false; + if (x.key.type !== 'Identifier') return false; + if (x.key.name !== 'setup') return false; + return true; + }) as unknown as estree.Property; + if (setup.value.type !== 'FunctionExpression') return; + const render = setup.value.body.body.find((x) => { + if (x.type !== 'ReturnStatement') return false; + return true; + }) as unknown as estree.ReturnStatement; + if (render.argument?.type !== 'ArrowFunctionExpression') return; + if (render.argument.params.length !== 2) return; + const ctx = render.argument.params[0]; if (ctx.type !== 'Identifier') return; + if (ctx.name !== '_ctx') return; + if (render.argument.body.type !== 'BlockStatement') return; /* This region assumed that `sfcMain` looks like the following code. * * ```ts @@ -252,8 +186,33 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown * ``` */ //#endregion - for (const [key, moduleTree] of moduleForest) { + for (const [key, value] of moduleForest) { //#region + const cssModuleTreeNode = parent.body.find((x) => { + if (x.type !== 'VariableDeclaration') return false; + if (x.declarations.length !== 1) return false; + if (x.declarations[0].id.type !== 'Identifier') return false; + if (x.declarations[0].id.name !== value) return false; + return true; + }) as unknown as estree.VariableDeclaration; + if (cssModuleTreeNode.declarations[0].init?.type !== 'ObjectExpression') return; + const moduleTree = new Map(cssModuleTreeNode.declarations[0].init.properties.flatMap((property) => { + if (property.type !== 'Property') return []; + const actualKey = property.key.type === 'Identifier' ? property.key.name : property.key.type === 'Literal' ? property.key.value : null; + if (typeof actualKey !== 'string') return []; + if (property.value.type === 'Literal') return [[actualKey, property.value.value as string]]; + if (property.value.type !== 'Identifier') return []; + const labelledValue = property.value.name; + const actualValue = parent.body.find((x) => { + if (x.type !== 'VariableDeclaration') return false; + if (x.declarations.length !== 1) return false; + if (x.declarations[0].id.type !== 'Identifier') return false; + if (x.declarations[0].id.name !== labelledValue) return false; + return true; + }) as unknown as estree.VariableDeclaration; + if (actualValue.declarations[0].init?.type !== 'Literal') return []; + return [[actualKey, actualValue.declarations[0].init.value as string]]; + })); /* This region collected VariableDeclaration nodes in the module that looks like the following code. * * ```ts @@ -267,14 +226,17 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown */ //#endregion //#region - (estreeWalker.walk as any)(render.body, { - enter(childNode: ESTree.Node) { - if (!isCssModuleReference(childNode, ctx.name, key)) return; - const actualKey = getMemberPropertyName(childNode.property, childNode.computed); - if (actualKey === null) return; - const actualValue = moduleTree.get(actualKey); + (walk as typeof estreeWalker.walk)(render.argument.body, { + enter(childNode) { + if (childNode.type !== 'MemberExpression') return; + if (childNode.object.type !== 'MemberExpression') return; + if (childNode.object.object.type !== 'Identifier') return; + if (childNode.object.object.name !== ctx.name) return; + if (childNode.object.property.type !== 'Identifier') return; + if (childNode.object.property.name !== key) return; + if (childNode.property.type !== 'Identifier') return; + const actualValue = moduleTree.get(childNode.property.name); if (actualValue === undefined) return; - magicString.overwrite(childNode.start, childNode.end, JSON.stringify(actualValue)); this.replace({ type: 'Literal', value: actualValue, @@ -314,13 +276,20 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown */ //#endregion //#region - (estreeWalker.walk as any)(render.body, { - enter(childNode: ESTree.Node) { - if (!isCssModuleReference(childNode, ctx.name, key)) return; - const actualKey = getMemberPropertyName(childNode.property, childNode.computed); - if (actualKey === null) return; - console.error(`Undefined style detected: ${key}.${actualKey} (in ${name})`); - magicString.overwrite(childNode.start, childNode.end, 'undefined'); + (walk as typeof estreeWalker.walk)(render.argument.body, { + enter(childNode) { + if (childNode.type !== 'MemberExpression') return; + if (childNode.object.type !== 'MemberExpression') return; + if (childNode.object.object.type !== 'Identifier') return; + if (childNode.object.object.name !== ctx.name) return; + if (childNode.object.property.type !== 'Identifier') return; + if (childNode.object.property.name !== key) return; + if (childNode.property.type !== 'Identifier') return; + console.error(`Undefined style detected: ${key}.${childNode.property.name} (in ${name})`); + this.replace({ + type: 'Identifier', + name: 'undefined', + }); }, }); /* This region replaced the reference identifier of missing class names in the render function with `undefined`, as in the following code. @@ -331,7 +300,7 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown * ... * return (_ctx, _cache) => { * ... - * return openBlock(), createElementBlock('div', { + * return openBlock(), createElementBlock("div", { * class: normalizeClass(_ctx.$style.hoge), * }, null); * }; @@ -347,7 +316,7 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown * ... * return (_ctx, _cache) => { * ... - * return openBlock(), createElementBlock('div', { + * return openBlock(), createElementBlock("div", { * class: normalizeClass(undefined), * }, null); * }; @@ -357,15 +326,18 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown */ //#endregion //#region - (estreeWalker.walk as any)(render.body, { - enter(childNode: ESTree.Node, childParent: ESTree.Node | null) { + (walk as typeof estreeWalker.walk)(render.argument.body, { + enter(childNode) { if (childNode.type !== 'CallExpression') return; + if (childNode.callee.type !== 'Identifier') return; + if (childNode.callee.name !== 'normalizeClass') return; if (childNode.arguments.length !== 1) return; - if (childNode.callee.type === 'Identifier' && childNode.callee.name !== 'normalizeClass' && !isClassProperty(childParent)) return; - if (childNode.callee.type !== 'Identifier' && !isClassProperty(childParent)) return; const normalized = normalizeClass(childNode.arguments[0], name); if (normalized === null) return; - magicString.overwrite(childNode.start, childNode.end, JSON.stringify(normalized)); + this.replace({ + type: 'Literal', + value: normalized, + }); }, }); /* This region compiled the `normalizeClass` call into a pseudo-AOT compilation, as in the following code. @@ -402,34 +374,19 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown */ //#endregion } - const hasRemainingCssModuleReference = Array.from(moduleForest.keys()).some((key) => { - let found = false; - (estreeWalker.walk as any)(render.body, { - enter(childNode: ESTree.Node) { - if (!isCssModuleAccess(childNode, ctx.name, key)) return; - found = true; - this.skip(); - }, - }); - return found; - }); - if (hasRemainingCssModuleReference) return; //#region if (node.declarations[0].init.arguments[1].elements.length === 1) { - if (componentNode.type === 'Identifier') { - (estreeWalker.walk as any)(ast, { - enter(childNode: ESTree.Node) { - if (childNode.type !== 'Identifier') return; - if (childNode.name !== componentNode.name) return; - magicString.overwrite(childNode.start, childNode.end, name); - }, - }); - magicString.remove(node.start, node.end); - } else { - const removeStart = cssModulesEntry.start; - const removeEnd = node.declarations[0].init.arguments[1].end - 1; - magicString.remove(removeStart, removeEnd); - } + (walk as typeof estreeWalker.walk)(ast, { + enter(childNode) { + if (childNode.type !== 'Identifier') return; + if (childNode.name !== ident) return; + this.replace({ + type: 'Identifier', + name: node.declarations[0].id.name, + }); + }, + }); + this.remove(); /* NOTE: The above logic is valid as long as the following two conditions are met. * * - the uniqueness of `ident` is kept throughout the module @@ -454,10 +411,31 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown }); */ } else { - const nextElement = node.declarations[0].init.arguments[1].elements[__cssModulesIndex + 1]; - const removeStart = node.declarations[0].init.arguments[1].elements[__cssModulesIndex]!.start; - const removeEnd = nextElement ? nextElement.start : node.declarations[0].init.arguments[1].end - 1; - magicString.remove(removeStart, removeEnd); + this.replace({ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: node.declarations[0].id.name, + }, + init: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: '_export_sfc', + }, + arguments: [{ + type: 'Identifier', + name: ident, + }, { + type: 'ArrayExpression', + elements: node.declarations[0].init.arguments[1].elements.slice(0, __cssModulesIndex).concat(node.declarations[0].init.arguments[1].elements.slice(__cssModulesIndex + 1)), + }], + }, + }], + kind: 'const', + }); } /* This region removed the `__cssModules` reference from the second argument of `_export_sfc`, as in the following code. * @@ -496,11 +474,10 @@ export function unwindCssModuleClassName(ast: ESTree.Node, magicString: Rolldown export default function pluginUnwindCssModuleClassName(): Plugin { return { name: 'UnwindCssModuleClassName', - renderChunk(code, _chunk, _options, meta) { - const ast = ('ast' in meta ? meta.ast ?? this.parse(code) : this.parse(code)) as ESTree.Program; - const magicString = meta.magicString ?? new RolldownMagicString(code); - unwindCssModuleClassName(ast, magicString); - return magicString; + renderChunk(code): { code: string } { + const ast = this.parse(code) as unknown as estree.Node; + unwindCssModuleClassName(ast); + return { code: generate(ast) }; }, }; } diff --git a/packages/frontend/lib/vite-plugin-create-search-index.ts b/packages/frontend/lib/vite-plugin-create-search-index.ts index 4126a4f8c0..cfbba0823c 100644 --- a/packages/frontend/lib/vite-plugin-create-search-index.ts +++ b/packages/frontend/lib/vite-plugin-create-search-index.ts @@ -13,12 +13,11 @@ import { type LogOptions, normalizePath, type Plugin, - type PluginOption, + type PluginOption } from 'vite'; import fs from 'node:fs'; import JSON5 from 'json5'; -import { RolldownMagicString } from 'rolldown'; -import type { TransformResult } from 'rolldown'; +import MagicString, { SourceMap } from 'magic-string'; import path from 'node:path' import { hash, toBase62 } from '../vite.config'; import { minimatch } from 'minimatch'; @@ -64,7 +63,7 @@ interface MarkerRelation { let logger = { info: (msg: string, options?: LogOptions) => { }, warn: (msg: string, options?: LogOptions) => { }, - error: (msg: string, options?: LogErrorOptions) => { }, + error: (msg: string, options?: LogErrorOptions | unknown) => { }, }; let loggerInitialized = false; @@ -461,18 +460,9 @@ function propertyAccessProxy(path: string[]): AccessProxy { const i18nProxy = propertyAccessProxy(['i18n']); -export function collectFileMarkers(id: string, code: string | RolldownMagicString | undefined): SearchIndexItem[] { +export function collectFileMarkers(id: string, code: string): SearchIndexItem[] { try { - let codeStr: string; - if (typeof code === 'string') { - codeStr = code; - } else if (code != null) { - codeStr = code.toString(); - } else { - throw new Error(`Code is undefined for file ${id}`); - } - - const { descriptor, errors } = vueSfcParse(codeStr, { + const { descriptor, errors } = vueSfcParse(code, { filename: id, }); @@ -483,8 +473,7 @@ export function collectFileMarkers(id: string, code: string | RolldownMagicStrin return extractUsageInfoFromTemplateAst(descriptor.template?.ast, id); } catch (error) { - let _error = error instanceof Error ? error : new Error(String(error)); - logger.error(`Error analyzing file ${id}:`, { error: _error }); + logger.error(`Error analyzing file ${id}:`, error); } return []; @@ -492,7 +481,10 @@ export function collectFileMarkers(id: string, code: string | RolldownMagicStrin // endregion -type TransformedCode = Exclude; +type TransformedCode = { + code: string, + map: SourceMap, +}; export class MarkerIdAssigner { // key: file id @@ -517,12 +509,13 @@ export class MarkerIdAssigner { } #processImpl(id: string, code: string): TransformedCode { - const s = new RolldownMagicString(code); // magic-string のインスタンスを作成 + const s = new MagicString(code); // magic-string のインスタンスを作成 const parsed = vueSfcParse(code, { filename: id }); if (!parsed.descriptor.template) { return { - code, // テンプレートがない場合は元のコードを返す + code, + map: s.generateMap({ source: id, includeContent: true }), }; } const ast = parsed.descriptor.template.ast; // テンプレート AST を取得 @@ -530,7 +523,8 @@ export class MarkerIdAssigner { if (!ast) { return { - code, + code: s.toString(), // 変更後のコードを返す + map: s.generateMap({ source: id, includeContent: true }), // ソースマップも生成 (sourceMap: true が必要) }; } @@ -617,6 +611,7 @@ export class MarkerIdAssigner { return { code: s.toString(), // 変更後のコードを返す + map: s.generateMap({ source: id, includeContent: true }), // ソースマップも生成 (sourceMap: true が必要) }; } @@ -647,7 +642,7 @@ export class MarkerIdAssigner { } } -// Vite プラグインとして export +// Rollup プラグインとして export export default function pluginCreateSearchIndex(options: Options): PluginOption { const assigner = new MarkerIdAssigner(); return [ diff --git a/packages/frontend/lib/vite-plugin-watch-locales.ts b/packages/frontend/lib/vite-plugin-watch-locales.ts index 2fed7f60fa..372e9039d5 100644 --- a/packages/frontend/lib/vite-plugin-watch-locales.ts +++ b/packages/frontend/lib/vite-plugin-watch-locales.ts @@ -3,16 +3,16 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import path from 'node:path'; +import path from 'node:path' import locales from 'i18n'; -import type { Plugin } from 'vite'; const localesDir = path.resolve(__dirname, '../../../locales') /** * 外部ファイルを監視し、必要に応じてwebSocketでメッセージを送るViteプラグイン + * @returns {import('vite').Plugin} */ -export default function pluginWatchLocales(): Plugin { +export default function pluginWatchLocales() { return { name: 'watch-locales', diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 7bcf097ec4..a99918e7b6 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -21,7 +21,10 @@ "@github/webauthn-json": "2.1.1", "@mcaptcha/core-glue": "0.1.0-alpha-5", "@misskey-dev/browser-image-resizer": "2024.1.0", - "@sentry/vue": "10.40.0", + "@rollup/plugin-json": "6.1.0", + "@rollup/plugin-replace": "6.0.3", + "@rollup/pluginutils": "5.3.0", + "@sentry/vue": "10.45.0", "@syuilo/aiscript": "1.2.1", "@syuilo/aiscript-0-19-0": "npm:@syuilo/aiscript@^0.19.0", "@twemoji/parser": "16.0.0", @@ -61,20 +64,21 @@ "punycode.js": "2.3.1", "qr-code-styling": "1.9.2", "qr-scanner": "1.4.2", - "sanitize-html": "2.17.1", + "rollup": "4.60.0", + "sanitize-html": "2.17.2", + "sass": "1.98.0", "shiki": "3.23.0", "textarea-caret": "3.1.0", "three": "0.183.2", "throttle-debounce": "5.0.2", "tinycolor2": "1.6.0", "v-code-diff": "1.13.1", + "vite": "7.3.1", "vue": "3.5.30", "wanakana": "5.3.1" }, "devDependencies": { "@misskey-dev/summaly": "5.2.5", - "@rollup/plugin-json": "6.1.0", - "@rollup/pluginutils": "5.3.0", "@storybook/addon-essentials": "8.6.18", "@storybook/addon-interactions": "8.6.18", "@storybook/addon-links": "10.3.3", @@ -119,6 +123,7 @@ "estree-walker": "3.0.3", "happy-dom": "20.8.8", "intersection-observer": "0.12.2", + "magic-string": "0.30.21", "micromatch": "4.0.8", "minimatch": "10.2.4", "msw": "2.12.14", @@ -127,14 +132,11 @@ "prettier": "3.8.1", "react": "19.2.4", "react-dom": "19.2.4", - "rolldown": "1.0.0-rc.11", - "sass-embedded": "1.98.0", "seedrandom": "3.0.5", "start-server-and-test": "2.1.5", "storybook": "10.3.3", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "tsx": "4.21.0", - "vite": "8.0.2", "vite-plugin-glsl": "1.5.6", "vite-plugin-turbosnap": "1.0.3", "vitest": "4.1.1", diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts index b061733333..260d1215df 100644 --- a/packages/frontend/vite.config.ts +++ b/packages/frontend/vite.config.ts @@ -1,7 +1,7 @@ import path from 'path'; +import pluginReplace from '@rollup/plugin-replace'; import pluginVue from '@vitejs/plugin-vue'; import pluginGlsl from 'vite-plugin-glsl'; -import { replacePlugin } from 'rolldown/plugins'; import type { UserConfig } from 'vite'; import { defineConfig } from 'vite'; import * as yaml from 'js-yaml'; @@ -11,13 +11,13 @@ import locales from 'i18n'; import meta from '../../package.json'; import packageInfo from './package.json' with { type: 'json' }; import pluginUnwindCssModuleClassName from './lib/rollup-plugin-unwind-css-module-class-name.js'; -import pluginJson5 from './lib/vite-plugin-json5.js'; +import pluginJson5 from './vite.json5.js'; import type { Options as SearchIndexOptions } from './lib/vite-plugin-create-search-index.js'; import pluginCreateSearchIndex from './lib/vite-plugin-create-search-index.js'; import pluginWatchLocales from './lib/vite-plugin-watch-locales.js'; import { pluginRemoveUnrefI18n } from '../frontend-builder/rollup-plugin-remove-unref-i18n.js'; -const url = process.env.NODE_ENV === 'development' ? (yaml.load(await fsp.readFile('../../.config/default.yml', 'utf-8')) as any).url : null; +const url = process.env.NODE_ENV === 'development' ? yaml.load(await fsp.readFile('../../.config/default.yml', 'utf-8')).url : null; const host = url ? (new URL(url)).hostname : undefined; const extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.json', '.json5', '.svg', '.sass', '.scss', '.css', '.vue']; @@ -121,10 +121,11 @@ export function getConfig(): UserConfig { pluginGlsl({ minify: true }), ...process.env.NODE_ENV === 'production' ? [ - replacePlugin({ - 'isChromatic()': JSON.stringify(false), - }, { + pluginReplace({ preventAssignment: true, + values: { + 'isChromatic()': JSON.stringify(false), + }, }), ] : [], @@ -153,6 +154,11 @@ export function getConfig(): UserConfig { } }, }, + preprocessorOptions: { + scss: { + api: 'modern-compiler', + }, + }, }, define: { @@ -172,10 +178,7 @@ export function getConfig(): UserConfig { 'safari16', ], manifest: 'manifest.json', - rolldownOptions: { - experimental: { - nativeMagicString: true, - }, + rollupOptions: { input: { i18n: './src/i18n.ts', entry: './src/_boot_.ts', @@ -183,18 +186,11 @@ export function getConfig(): UserConfig { external: externalPackages.map(p => p.match), preserveEntrySignatures: 'allow-extension', output: { - codeSplitting: { - groups: [{ - name: 'vue', - test: /node_modules[\\/]vue/, - }, { - name: 'photoswipe', - test: /node_modules[\\/]photoswipe/, - }, { - // dependencies of i18n.ts - name: 'config', - test: /@@[\\/]js[\\/]config\.js/, - }], + manualChunks: { + vue: ['vue'], + photoswipe: ['photoswipe', 'photoswipe/lightbox', 'photoswipe/style.css'], + // dependencies of i18n.ts + 'config': ['@@/js/config.js'], }, entryFileNames: `scripts/${localesHash}-[hash:8].js`, chunkFileNames: `scripts/${localesHash}-[hash:8].js`, diff --git a/packages/frontend/lib/vite-plugin-json5.ts b/packages/frontend/vite.json5.ts similarity index 90% rename from packages/frontend/lib/vite-plugin-json5.ts rename to packages/frontend/vite.json5.ts index 921324b67a..87b67c2142 100644 --- a/packages/frontend/lib/vite-plugin-json5.ts +++ b/packages/frontend/vite.json5.ts @@ -1,10 +1,7 @@ -/* - * SPDX-FileCopyrightText: syuilo and misskey-project - * SPDX-License-Identifier: AGPL-3.0-only - */ +// Original: https://github.com/rollup/plugins/tree/8835dd2aed92f408d7dc72d7cc25a9728e16face/packages/json import JSON5 from 'json5'; -import { Plugin } from 'vite'; +import { Plugin } from 'rollup'; import { createFilter, dataToEsm } from '@rollup/pluginutils'; import { RollupJsonOptions } from '@rollup/plugin-json'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32f051d31d..1c16139fa4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -557,8 +557,8 @@ importers: specifier: 7.2.2 version: 7.2.2 vite: - specifier: 8.0.2 - version: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + specifier: 7.3.1 + version: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) optionalDependencies: '@swc/core-android-arm64': specifier: 1.3.11 @@ -665,9 +665,18 @@ importers: '@misskey-dev/browser-image-resizer': specifier: 2024.1.0 version: 2024.1.0 + '@rollup/plugin-json': + specifier: 6.1.0 + version: 6.1.0(rollup@4.60.0) + '@rollup/plugin-replace': + specifier: 6.0.3 + version: 6.0.3(rollup@4.60.0) + '@rollup/pluginutils': + specifier: 5.3.0 + version: 5.3.0(rollup@4.60.0) '@sentry/vue': - specifier: 10.40.0 - version: 10.40.0(vue@3.5.30(typescript@5.9.3)) + specifier: 10.45.0 + version: 10.45.0(vue@3.5.30(typescript@5.9.3)) '@syuilo/aiscript': specifier: 1.2.1 version: 1.2.1 @@ -679,7 +688,7 @@ importers: version: 16.0.0 '@vitejs/plugin-vue': specifier: 6.0.5 - version: 6.0.5(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3)) + version: 6.0.5(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3)) aiscript-vscode: specifier: github:aiscript-dev/aiscript-vscode#v0.1.16 version: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/1dc7f60cda78d030dadfc518a33c472202b2ef67 @@ -785,9 +794,15 @@ importers: qr-scanner: specifier: 1.4.2 version: 1.4.2 + rollup: + specifier: 4.60.0 + version: 4.60.0 sanitize-html: - specifier: 2.17.1 - version: 2.17.1 + specifier: 2.17.2 + version: 2.17.2 + sass: + specifier: 1.98.0 + version: 1.98.0 shiki: specifier: 3.23.0 version: 3.23.0 @@ -806,6 +821,9 @@ importers: v-code-diff: specifier: 1.13.1 version: 1.13.1(vue@3.5.30(typescript@5.9.3)) + vite: + specifier: 7.3.1 + version: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) vue: specifier: 3.5.30 version: 3.5.30(typescript@5.9.3) @@ -816,12 +834,6 @@ importers: '@misskey-dev/summaly': specifier: 5.2.5 version: 5.2.5 - '@rollup/plugin-json': - specifier: 6.1.0 - version: 6.1.0(rollup@4.60.0) - '@rollup/pluginutils': - specifier: 5.3.0 - version: 5.3.0(rollup@4.60.0) '@storybook/addon-essentials': specifier: 8.6.18 version: 8.6.18(@types/react@19.2.2)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6)) @@ -857,7 +869,7 @@ importers: version: 10.3.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(typescript@5.9.3) '@storybook/react-vite': specifier: 10.3.3 - version: 10.3.3(esbuild@0.27.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(typescript@5.9.3)(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + version: 10.3.3(esbuild@0.27.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) '@storybook/test': specifier: 8.6.18 version: 8.6.18(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6)) @@ -872,7 +884,7 @@ importers: version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vue@3.5.30(typescript@5.9.3)) '@storybook/vue3-vite': specifier: 10.3.3 - version: 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3)) + version: 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3)) '@tabler/icons-webfont': specifier: 3.35.0 version: 3.35.0 @@ -923,7 +935,7 @@ importers: version: 8.57.2(eslint@9.39.4)(typescript@5.9.3) '@vitest/coverage-v8': specifier: 4.1.1 - version: 4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) + version: 4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) '@vue/compiler-core': specifier: 3.5.30 version: 3.5.30 @@ -954,6 +966,9 @@ importers: intersection-observer: specifier: 0.12.2 version: 0.12.2 + magic-string: + specifier: 0.30.21 + version: 0.30.21 micromatch: specifier: 4.0.8 version: 4.0.8 @@ -978,12 +993,6 @@ importers: react-dom: specifier: 19.2.4 version: 19.2.4(react@19.2.4) - rolldown: - specifier: 1.0.0-rc.11 - version: 1.0.0-rc.11 - sass-embedded: - specifier: 1.98.0 - version: 1.98.0 seedrandom: specifier: 3.0.5 version: 3.0.5 @@ -999,21 +1008,18 @@ importers: tsx: specifier: 4.21.0 version: 4.21.0 - vite: - specifier: 8.0.2 - version: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) vite-plugin-glsl: specifier: 1.5.6 - version: 1.5.6(@rollup/pluginutils@5.3.0(rollup@4.60.0))(esbuild@0.27.4)(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + version: 1.5.6(@rollup/pluginutils@5.3.0(rollup@4.60.0))(esbuild@0.27.4)(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) vite-plugin-turbosnap: specifier: 1.0.3 version: 1.0.3 vitest: specifier: 4.1.1 - version: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + version: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) vitest-fetch-mock: specifier: 0.4.5 - version: 0.4.5(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) + version: 0.4.5(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) vue-component-type-helpers: specifier: 3.2.6 version: 3.2.6 @@ -1035,12 +1041,9 @@ importers: magic-string: specifier: 0.30.21 version: 0.30.21 - rolldown: - specifier: 1.0.0-rc.11 - version: 1.0.0-rc.11 vite: - specifier: 8.0.2 - version: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + specifier: 7.3.1 + version: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) devDependencies: '@types/estree': specifier: 1.0.8 @@ -1066,6 +1069,9 @@ importers: '@rollup/plugin-json': specifier: 6.1.0 version: 6.1.0(rollup@4.60.0) + '@rollup/plugin-replace': + specifier: 6.0.3 + version: 6.0.3(rollup@4.60.0) '@rollup/pluginutils': specifier: 5.3.0 version: 5.3.0(rollup@4.60.0) @@ -1074,7 +1080,7 @@ importers: version: 16.0.0 '@vitejs/plugin-vue': specifier: 6.0.5 - version: 6.0.5(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3)) + version: 6.0.5(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3)) buraha: specifier: 0.0.1 version: 0.0.1 @@ -1105,6 +1111,9 @@ importers: rollup: specifier: 4.60.0 version: 4.60.0 + sass: + specifier: 1.98.0 + version: 1.98.0 shiki: specifier: 3.23.0 version: 3.23.0 @@ -1114,6 +1123,9 @@ importers: uuid: specifier: 13.0.0 version: 13.0.0 + vite: + specifier: 7.3.1 + version: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) vue: specifier: 3.5.30 version: 3.5.30(typescript@5.9.3) @@ -1153,7 +1165,7 @@ importers: version: 8.57.2(eslint@9.39.4)(typescript@5.9.3) '@vitest/coverage-v8': specifier: 4.1.1 - version: 4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) + version: 4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) '@vue/runtime-core': specifier: 3.5.30 version: 3.5.30 @@ -1187,18 +1199,12 @@ importers: prettier: specifier: 3.8.1 version: 3.8.1 - sass-embedded: - specifier: 1.98.0 - version: 1.98.0 start-server-and-test: specifier: 2.1.5 version: 2.1.5 tsx: specifier: 4.21.0 version: 4.21.0 - vite: - specifier: 8.0.2 - version: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) vite-plugin-turbosnap: specifier: 1.0.3 version: 1.0.3 @@ -1371,7 +1377,7 @@ importers: version: 8.57.2(eslint@9.39.4)(typescript@5.9.3) '@vitest/coverage-v8': specifier: 4.1.1 - version: 4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) + version: 4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) esbuild: specifier: 0.27.4 version: 0.27.4 @@ -1389,10 +1395,10 @@ importers: version: 0.33.0 vitest: specifier: 4.1.1 - version: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + version: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) vitest-websocket-mock: specifier: 0.5.0 - version: 0.5.0(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) + version: 0.5.0(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))) packages/misskey-js/generator: devDependencies: @@ -1865,9 +1871,6 @@ packages: '@borewit/text-codec@0.1.1': resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} - '@bufbuild/protobuf@2.11.0': - resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} - '@canvas/image-data@1.1.0': resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==} @@ -1952,15 +1955,9 @@ packages: '@discordapp/twemoji@16.0.1': resolution: {integrity: sha512-figLiBWzjS5cyrAjLaGjM8AAaowO3qvK8rg5bA2dElB4qsaPMvBVlFDMO2d3x+nC1igt7kgWH4dvNmvvUHUF8w==} - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} - '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -2877,9 +2874,6 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} - '@nestjs/common@11.1.17': resolution: {integrity: sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==} peerDependencies: @@ -3179,9 +3173,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} - '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} @@ -3352,104 +3343,6 @@ packages: resolution: {integrity: sha512-2+O+riuIUgVSuLl3Lyh5AplWZyVMNuG2F98/o6NrutKJfW4/GTZdPpZlIphS0HGgcOHgmWcCSHj+dWFlZaGSHw==} engines: {node: '>=18.17.0', npm: '>=9.5.0'} - '@rolldown/binding-android-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.0.0-rc.11': - resolution: {integrity: sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.0.0-rc.11': - resolution: {integrity: sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11': - resolution: {integrity: sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.11': - resolution: {integrity: sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.11': - resolution: {integrity: sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.11': - resolution: {integrity: sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11': - resolution: {integrity: sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.11': - resolution: {integrity: sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.0-rc.11': - resolution: {integrity: sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==} - '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} @@ -3462,6 +3355,15 @@ packages: rollup: optional: true + '@rollup/plugin-replace@6.0.3': + resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -3645,18 +3547,10 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sentry-internal/browser-utils@10.40.0': - resolution: {integrity: sha512-3CDeVNBXYOIvBVdT0SOdMZx5LzYDLuhGK/z7A14sYZz4Cd2+f4mSeFDaEOoH/g2SaY2CKR5KGkAADy8IyjZ21w==} - engines: {node: '>=18'} - '@sentry-internal/browser-utils@10.45.0': resolution: {integrity: sha512-ZPZpeIarXKScvquGx2AfNKcYiVNDA4wegMmjyGVsTA2JPmP0TrJoO3UybJS6KGDeee8V3I3EfD/ruauMm7jOFQ==} engines: {node: '>=18'} - '@sentry-internal/feedback@10.40.0': - resolution: {integrity: sha512-V/ixkcdCNMo04KgsCEeNEu966xUUTD6czKT2LOAO5siZACqFjT/Rp9VR1n7QQrVo3sL7P3QNiTHtX0jaeWbwzg==} - engines: {node: '>=18'} - '@sentry-internal/feedback@10.45.0': resolution: {integrity: sha512-vCSurazFVq7RUeYiM5X326jA5gOVrWYD6lYX2fbjBOMcyCEhDnveNxMT62zKkZDyNT/jyD194nz/cjntBUkyWA==} engines: {node: '>=18'} @@ -3665,34 +3559,18 @@ packages: resolution: {integrity: sha512-oLHVYurqZfADPh5hvmQYS5qx8t0UZzT2u6+/68VXsFruQEOnYJTODKgU3BVLmemRs3WE6kCJjPeFdHVYOQGSzQ==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.40.0': - resolution: {integrity: sha512-wzQwilFHO2baeCt0dTMf0eW+rgK8O+mkisf9sQzPXzG3Krr/iVtFg1T5T1Th3YsCsEdn6yQ3hcBPLEXjMSvccg==} - engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.45.0': resolution: {integrity: sha512-nvq/AocdZTuD7y0KSiWi3gVaY0s5HOFy86mC/v1kDZmT/jsBAzN5LDkk/f1FvsWma1peqQmpUqxvhC+YIW294Q==} engines: {node: '>=18'} - '@sentry-internal/replay@10.40.0': - resolution: {integrity: sha512-vsH2Ut0KIIQIHNdS3zzEGLJ2C9btbpvJIWAVk7l7oft66JzlUNC89qNaQ5SAypjLQx4Ln2V/ZTqfEoNzXOAsoQ==} - engines: {node: '>=18'} - '@sentry-internal/replay@10.45.0': resolution: {integrity: sha512-vjosRoGA1bzhVAEO1oce+CsRdd70quzBeo7WvYqpcUnoLe/Rv8qpOMqWX3j26z7XfFHMExWQNQeLxmtYOArvlw==} engines: {node: '>=18'} - '@sentry/browser@10.40.0': - resolution: {integrity: sha512-nCt3FKUMFad0C6xl5wCK0Jz+qT4Vev4fv6HJRn0YoNRRDQCfsUVxAz7pNyyiPNGM/WCDp9wJpGJsRvbBRd2anw==} - engines: {node: '>=18'} - '@sentry/browser@10.45.0': resolution: {integrity: sha512-e/a8UMiQhqqv706McSIcG6XK+AoQf9INthi2pD+giZfNRTzXTdqHzUT5OIO5hg8Am6eF63nDJc+vrYNPhzs51Q==} engines: {node: '>=18'} - '@sentry/core@10.40.0': - resolution: {integrity: sha512-/wrcHPp9Avmgl6WBimPjS4gj810a1wU5oX9fF1bzJfeIIbF3jTsAbv0oMbgDp0cSDnkwv2+NvcPnn3+c5J6pBA==} - engines: {node: '>=18'} - '@sentry/core@10.45.0': resolution: {integrity: sha512-s69UXxvefeQxuZ5nY7/THtTrIEvJxNVCp3ns4kwoCw1qMpgpvn/296WCKVmM7MiwnaAdzEKnAvLAwaxZc2nM7Q==} engines: {node: '>=18'} @@ -3743,19 +3621,6 @@ packages: engines: {node: '>=18'} hasBin: true - '@sentry/vue@10.40.0': - resolution: {integrity: sha512-VnsGlSgG4RBgxcsGwS5+5XNUZackUsApgKdCjmwkwWchvLMm1S/RXMXBHT01BabcmUNjxmzWEfI7aboVUoLiGA==} - engines: {node: '>=18'} - peerDependencies: - '@tanstack/vue-router': ^1.64.0 - pinia: 2.x || 3.x - vue: 2.x || 3.x - peerDependenciesMeta: - '@tanstack/vue-router': - optional: true - pinia: - optional: true - '@sentry/vue@10.45.0': resolution: {integrity: sha512-p6ghTgQtiCBZ+Yw0B2xmC69S8AdCRRsYvbTHW7MJYspwNnJDs7rqgCBqOxNhvr3tsKdDuEOEHLtf/5hbKi+8xQ==} engines: {node: '>=18'} @@ -4535,9 +4400,6 @@ packages: '@twemoji/parser@16.0.0': resolution: {integrity: sha512-jmuIjkp3OIaEemwMy3sArBwZSuZkRqmueGwRe2Zk4cFzbUJISFBJSZLDUUBNIgq3c+nY49ideYN2OiII6JUqwA==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} @@ -5916,9 +5778,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - colorjs.io@0.5.2: - resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} - colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -7225,9 +7084,6 @@ packages: htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} @@ -7989,80 +7845,6 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -9708,11 +9490,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rolldown@1.0.0-rc.11: - resolution: {integrity: sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - rollup@4.60.0: resolution: {integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -9763,129 +9540,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sanitize-html@2.17.1: - resolution: {integrity: sha512-ehFCW+q1a4CSOWRAdX97BX/6/PDEkCqw7/0JXZAGQV57FQB3YOkTa/rrzHPeJ+Aghy4vZAFfWMYyfxIiB7F/gw==} - sanitize-html@2.17.2: resolution: {integrity: sha512-EnffJUl46VE9uvZ0XeWzObHLurClLlT12gsOk1cHyP2Ol1P0BnBnsXmShlBmWVJM+dKieQI68R0tsPY5m/B+Jg==} - sass-embedded-all-unknown@1.98.0: - resolution: {integrity: sha512-6n4RyK7/1mhdfYvpP3CClS3fGoYqDvRmLClCESS6I7+SAzqjxvGG6u5Fo+cb1nrPNbbilgbM4QKdgcgWHO9NCA==} - cpu: ['!arm', '!arm64', '!riscv64', '!x64'] - - sass-embedded-android-arm64@1.98.0: - resolution: {integrity: sha512-M9Ra98A6vYJHpwhoC/5EuH1eOshQ9ZyNwC8XifUDSbRl/cGeQceT1NReR9wFj3L7s1pIbmes1vMmaY2np0uAKQ==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [android] - - sass-embedded-android-arm@1.98.0: - resolution: {integrity: sha512-LjGiMhHgu7VL1n7EJxTCre1x14bUsWd9d3dnkS2rku003IWOI/fxc7OXgaKagoVzok1kv09rzO3vFXJR5ZeONQ==} - engines: {node: '>=14.0.0'} - cpu: [arm] - os: [android] - - sass-embedded-android-riscv64@1.98.0: - resolution: {integrity: sha512-WPe+0NbaJIZE1fq/RfCZANMeIgmy83x4f+SvFOG7LhUthHpZWcOcrPTsCKKmN3xMT3iw+4DXvqTYOCYGRL3hcQ==} - engines: {node: '>=14.0.0'} - cpu: [riscv64] - os: [android] - - sass-embedded-android-x64@1.98.0: - resolution: {integrity: sha512-zrD25dT7OHPEgLWuPEByybnIfx4rnCtfge4clBgjZdZ3lF6E7qNLRBtSBmoFflh6Vg0RlEjJo5VlpnTMBM5MQQ==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [android] - - sass-embedded-darwin-arm64@1.98.0: - resolution: {integrity: sha512-cgr1z9rBnCdMf8K+JabIaYd9Rag2OJi5mjq08XJfbJGMZV/TA6hFJCLGkr5/+ZOn4/geTM5/3aSfQ8z5EIJAOg==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [darwin] - - sass-embedded-darwin-x64@1.98.0: - resolution: {integrity: sha512-OLBOCs/NPeiMqTdOrMFbVHBQFj19GS3bSVSxIhcCq16ZyhouUkYJEZjxQgzv9SWA2q6Ki8GCqp4k6jMeUY9dcA==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [darwin] - - sass-embedded-linux-arm64@1.98.0: - resolution: {integrity: sha512-axOE3t2MTBwCtkUCbrdM++Gj0gC0fdHJPrgzQ+q1WUmY9NoNMGqflBtk5mBZaWUeha2qYO3FawxCB8lctFwCtw==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [linux] - libc: glibc - - sass-embedded-linux-arm@1.98.0: - resolution: {integrity: sha512-03baQZCxVyEp8v1NWBRlzGYrmVT/LK7ZrHlF1piscGiGxwfdxoLXVuxsylx3qn/dD/4i/rh7Bzk7reK1br9jvQ==} - engines: {node: '>=14.0.0'} - cpu: [arm] - os: [linux] - libc: glibc - - sass-embedded-linux-musl-arm64@1.98.0: - resolution: {integrity: sha512-LeqNxQA8y4opjhe68CcFvMzCSrBuJqYVFbwElEj9bagHXQHTp9xVPJRn6VcrC+0VLEDq13HVXMv7RslIuU0zmA==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [linux] - libc: musl - - sass-embedded-linux-musl-arm@1.98.0: - resolution: {integrity: sha512-OBkjTDPYR4hSaueOGIM6FDpl9nt/VZwbSRpbNu9/eEJcxE8G/vynRugW8KRZmCFjPy8j/jkGBvvS+k9iOqKV3g==} - engines: {node: '>=14.0.0'} - cpu: [arm] - os: [linux] - libc: musl - - sass-embedded-linux-musl-riscv64@1.98.0: - resolution: {integrity: sha512-7w6hSuOHKt8FZsmjRb3iGSxEzM87fO9+M8nt5JIQYMhHTj5C+JY/vcske0v715HCVj5e1xyTnbGXf8FcASeAIw==} - engines: {node: '>=14.0.0'} - cpu: [riscv64] - os: [linux] - libc: musl - - sass-embedded-linux-musl-x64@1.98.0: - resolution: {integrity: sha512-QikNyDEJOVqPmxyCFkci8ZdCwEssdItfjQFJB+D+Uy5HFqcS5Lv3d3GxWNX/h1dSb23RPyQdQc267ok5SbEyJw==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [linux] - libc: musl - - sass-embedded-linux-riscv64@1.98.0: - resolution: {integrity: sha512-E7fNytc/v4xFBQKzgzBddV/jretA4ULAPO6XmtBiQu4zZBdBozuSxsQLe2+XXeb0X4S2GIl72V7IPABdqke/vA==} - engines: {node: '>=14.0.0'} - cpu: [riscv64] - os: [linux] - libc: glibc - - sass-embedded-linux-x64@1.98.0: - resolution: {integrity: sha512-VsvP0t/uw00mMNPv3vwyYKUrFbqzxQHnRMO+bHdAMjvLw4NFf6mscpym9Bzf+NXwi1ZNKnB6DtXjmcpcvqFqYg==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [linux] - libc: glibc - - sass-embedded-unknown-all@1.98.0: - resolution: {integrity: sha512-C4MMzcAo3oEDQnW7L8SBgB9F2Fq5qHPnaYTZRMOH3Mp/7kM4OooBInXpCiiFjLnjY95hzP4KyctVx0uYR6MYlQ==} - os: ['!android', '!darwin', '!linux', '!win32'] - - sass-embedded-win32-arm64@1.98.0: - resolution: {integrity: sha512-nP/10xbAiPbhQkMr3zQfXE4TuOxPzWRQe1Hgbi90jv2R4TbzbqQTuZVOaJf7KOAN4L2Bo6XCTRjK5XkVnwZuwQ==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [win32] - - sass-embedded-win32-x64@1.98.0: - resolution: {integrity: sha512-/lbrVsfbcbdZQ5SJCWcV0NVPd6YRs+FtAnfedp4WbCkO/ZO7Zt/58MvI4X2BVpRY/Nt5ZBo1/7v2gYcQ+J4svQ==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [win32] - - sass-embedded@1.98.0: - resolution: {integrity: sha512-Do7u6iRb6K+lrllcTkB1BXcHwOxcKe3rEfOF/GcCLE2w3WpddakRAosJOHFUR37DpsvimQXEt5abs3NzUjEIqg==} - engines: {node: '>=16.0.0'} - hasBin: true - sass@1.98.0: resolution: {integrity: sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==} engines: {node: '>=14.0.0'} @@ -10445,14 +10102,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - sync-child-process@1.0.2: - resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} - engines: {node: '>=16.0.0'} - - sync-message-port@1.2.0: - resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} - engines: {node: '>=16.0.0'} - systeminformation@5.31.5: resolution: {integrity: sha512-5SyLdip4/3alxD4Kh+63bUQTJmu7YMfYQTC+koZy7X73HgNqZSD2P4wOZQWtUncvPvcEmnfIjCoygN4MRoEejQ==} engines: {node: '>=8.0.0'} @@ -10970,9 +10619,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - varint@6.0.0: - resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -11003,16 +10649,15 @@ packages: vite-plugin-turbosnap@1.0.3: resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==} - vite@8.0.2: - resolution: {integrity: sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.0 - esbuild: ^0.27.0 jiti: '>=1.21.0' less: ^4.0.0 + lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -11023,14 +10668,12 @@ packages: peerDependenciesMeta: '@types/node': optional: true - '@vitejs/devtools': - optional: true - esbuild: - optional: true jiti: optional: true less: optional: true + lightningcss: + optional: true sass: optional: true sass-embedded: @@ -12150,8 +11793,6 @@ snapshots: '@borewit/text-codec@0.1.1': {} - '@bufbuild/protobuf@2.11.0': {} - '@canvas/image-data@1.1.0': {} '@chainsafe/is-ip@2.1.0': {} @@ -12290,22 +11931,11 @@ snapshots: jsonfile: 5.0.0 universalify: 0.1.2 - '@emnapi/core@1.9.1': - dependencies: - '@emnapi/wasi-threads': 1.2.0 - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.0': - dependencies: - tslib: 2.8.1 - optional: true - '@epic-web/invariant@1.0.0': {} '@esbuild/aix-ppc64@0.27.4': @@ -12916,11 +12546,11 @@ snapshots: '@types/yargs': 17.0.34 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': dependencies: glob: 13.0.1 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) optionalDependencies: typescript: 5.9.3 @@ -13204,13 +12834,6 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.1': - dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.7.1 - '@tybys/wasm-util': 0.10.1 - optional: true - '@nestjs/common@11.1.17(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: file-type: 21.3.2 @@ -13565,8 +13188,6 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@oxc-project/types@0.122.0': {} - '@paralleldrive/cuid2@2.3.1': dependencies: '@noble/hashes': 1.8.0 @@ -13791,55 +13412,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.11': - optional: true - - '@rolldown/binding-darwin-arm64@1.0.0-rc.11': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0-rc.11': - optional: true - - '@rolldown/binding-freebsd-x64@1.0.0-rc.11': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.11': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.11': - optional: true - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.11': - optional: true - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.11': - optional: true - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.11': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.11': - optional: true - - '@rolldown/pluginutils@1.0.0-rc.11': {} - '@rolldown/pluginutils@1.0.0-rc.2': {} '@rollup/plugin-json@6.1.0(rollup@4.60.0)': @@ -13848,6 +13420,13 @@ snapshots: optionalDependencies: rollup: 4.60.0 + '@rollup/plugin-replace@6.0.3(rollup@4.60.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.60.0) + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.60.0 + '@rollup/pluginutils@5.3.0(rollup@4.60.0)': dependencies: '@types/estree': 1.0.8 @@ -13974,18 +13553,10 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@sentry-internal/browser-utils@10.40.0': - dependencies: - '@sentry/core': 10.40.0 - '@sentry-internal/browser-utils@10.45.0': dependencies: '@sentry/core': 10.45.0 - '@sentry-internal/feedback@10.40.0': - dependencies: - '@sentry/core': 10.40.0 - '@sentry-internal/feedback@10.45.0': dependencies: '@sentry/core': 10.45.0 @@ -13995,34 +13566,16 @@ snapshots: detect-libc: 2.1.2 node-abi: 3.85.0 - '@sentry-internal/replay-canvas@10.40.0': - dependencies: - '@sentry-internal/replay': 10.40.0 - '@sentry/core': 10.40.0 - '@sentry-internal/replay-canvas@10.45.0': dependencies: '@sentry-internal/replay': 10.45.0 '@sentry/core': 10.45.0 - '@sentry-internal/replay@10.40.0': - dependencies: - '@sentry-internal/browser-utils': 10.40.0 - '@sentry/core': 10.40.0 - '@sentry-internal/replay@10.45.0': dependencies: '@sentry-internal/browser-utils': 10.45.0 '@sentry/core': 10.45.0 - '@sentry/browser@10.40.0': - dependencies: - '@sentry-internal/browser-utils': 10.40.0 - '@sentry-internal/feedback': 10.40.0 - '@sentry-internal/replay': 10.40.0 - '@sentry-internal/replay-canvas': 10.40.0 - '@sentry/core': 10.40.0 - '@sentry/browser@10.45.0': dependencies: '@sentry-internal/browser-utils': 10.45.0 @@ -14031,8 +13584,6 @@ snapshots: '@sentry-internal/replay-canvas': 10.45.0 '@sentry/core': 10.45.0 - '@sentry/core@10.40.0': {} - '@sentry/core@10.45.0': {} '@sentry/node-core@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': @@ -14106,12 +13657,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@sentry/vue@10.40.0(vue@3.5.30(typescript@5.9.3))': - dependencies: - '@sentry/browser': 10.40.0 - '@sentry/core': 10.40.0 - vue: 3.5.30(typescript@5.9.3) - '@sentry/vue@10.45.0(vue@3.5.30(typescript@5.9.3))': dependencies: '@sentry/browser': 10.45.0 @@ -14670,12 +14215,12 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@storybook/builder-vite@10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': + '@storybook/builder-vite@10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': dependencies: - '@storybook/csf-plugin': 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + '@storybook/csf-plugin': 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) storybook: 10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) ts-dedent: 2.2.0 - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) transitivePeerDependencies: - esbuild - rollup @@ -14689,14 +14234,14 @@ snapshots: dependencies: storybook: 10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) - '@storybook/csf-plugin@10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': + '@storybook/csf-plugin@10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': dependencies: storybook: 10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) unplugin: 2.3.10 optionalDependencies: esbuild: 0.27.4 rollup: 4.60.0 - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) '@storybook/csf-plugin@8.6.18(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))': dependencies: @@ -14741,11 +14286,11 @@ snapshots: react-dom: 19.2.4(react@19.2.4) storybook: 10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) - '@storybook/react-vite@10.3.3(esbuild@0.27.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(typescript@5.9.3)(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': + '@storybook/react-vite@10.3.3(esbuild@0.27.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) '@rollup/pluginutils': 5.3.0(rollup@4.60.0) - '@storybook/builder-vite': 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + '@storybook/builder-vite': 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) '@storybook/react': 10.3.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 @@ -14755,7 +14300,7 @@ snapshots: resolve: 1.22.11 storybook: 10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) tsconfig-paths: 4.2.0 - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) transitivePeerDependencies: - esbuild - rollup @@ -14803,14 +14348,14 @@ snapshots: dependencies: storybook: 10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) - '@storybook/vue3-vite@10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3))': + '@storybook/vue3-vite@10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3))': dependencies: - '@storybook/builder-vite': 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + '@storybook/builder-vite': 10.3.3(esbuild@0.27.4)(rollup@4.60.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) '@storybook/vue3': 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6))(vue@3.5.30(typescript@5.9.3)) magic-string: 0.30.21 storybook: 10.3.3(@testing-library/dom@10.4.0)(bufferutil@4.1.0)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) typescript: 5.9.3 - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) vue-component-meta: 2.2.12(typescript@5.9.3) vue-docgen-api: 4.79.2(vue@3.5.30(typescript@5.9.3)) transitivePeerDependencies: @@ -15115,11 +14660,6 @@ snapshots: '@twemoji/parser@16.0.0': {} - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - '@types/accepts@1.3.7': dependencies: '@types/node': 24.12.0 @@ -15588,13 +15128,13 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@6.0.5(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.5(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.30(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) vue: 3.5.30(typescript@5.9.3) - '@vitest/coverage-v8@4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)))': + '@vitest/coverage-v8@4.1.1(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.1 @@ -15606,7 +15146,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.0.3 - vitest: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + vitest: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) '@vitest/expect@2.0.5': dependencies: @@ -15632,14 +15172,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.1.1(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': + '@vitest/mocker@4.1.1(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.1.1 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.14(@types/node@24.12.0)(typescript@5.9.3) - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -16763,8 +16303,6 @@ snapshots: colorette@2.0.20: {} - colorjs.io@0.5.2: {} - colors@1.4.0: optional: true @@ -18419,13 +17957,6 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 4.5.0 - htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 @@ -19397,55 +18928,6 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.1 - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -21291,27 +20773,6 @@ snapshots: glob: 7.2.3 optional: true - rolldown@1.0.0-rc.11: - dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.11 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.11 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.11 - '@rolldown/binding-darwin-x64': 1.0.0-rc.11 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.11 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.11 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.11 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.11 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.11 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.11 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.11 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.11 - rollup@4.60.0: dependencies: '@types/estree': 1.0.8 @@ -21399,15 +20860,6 @@ snapshots: safer-buffer@2.1.2: {} - sanitize-html@2.17.1: - dependencies: - deepmerge: 4.3.1 - escape-string-regexp: 4.0.0 - htmlparser2: 8.0.2 - is-plain-object: 5.0.0 - parse-srcset: 1.0.2 - postcss: 8.5.8 - sanitize-html@2.17.2: dependencies: deepmerge: 4.3.1 @@ -21417,93 +20869,6 @@ snapshots: parse-srcset: 1.0.2 postcss: 8.5.8 - sass-embedded-all-unknown@1.98.0: - dependencies: - sass: 1.98.0 - optional: true - - sass-embedded-android-arm64@1.98.0: - optional: true - - sass-embedded-android-arm@1.98.0: - optional: true - - sass-embedded-android-riscv64@1.98.0: - optional: true - - sass-embedded-android-x64@1.98.0: - optional: true - - sass-embedded-darwin-arm64@1.98.0: - optional: true - - sass-embedded-darwin-x64@1.98.0: - optional: true - - sass-embedded-linux-arm64@1.98.0: - optional: true - - sass-embedded-linux-arm@1.98.0: - optional: true - - sass-embedded-linux-musl-arm64@1.98.0: - optional: true - - sass-embedded-linux-musl-arm@1.98.0: - optional: true - - sass-embedded-linux-musl-riscv64@1.98.0: - optional: true - - sass-embedded-linux-musl-x64@1.98.0: - optional: true - - sass-embedded-linux-riscv64@1.98.0: - optional: true - - sass-embedded-linux-x64@1.98.0: - optional: true - - sass-embedded-unknown-all@1.98.0: - dependencies: - sass: 1.98.0 - optional: true - - sass-embedded-win32-arm64@1.98.0: - optional: true - - sass-embedded-win32-x64@1.98.0: - optional: true - - sass-embedded@1.98.0: - dependencies: - '@bufbuild/protobuf': 2.11.0 - colorjs.io: 0.5.2 - immutable: 5.1.5 - rxjs: 7.8.2 - supports-color: 8.1.1 - sync-child-process: 1.0.2 - varint: 6.0.0 - optionalDependencies: - sass-embedded-all-unknown: 1.98.0 - sass-embedded-android-arm: 1.98.0 - sass-embedded-android-arm64: 1.98.0 - sass-embedded-android-riscv64: 1.98.0 - sass-embedded-android-x64: 1.98.0 - sass-embedded-darwin-arm64: 1.98.0 - sass-embedded-darwin-x64: 1.98.0 - sass-embedded-linux-arm: 1.98.0 - sass-embedded-linux-arm64: 1.98.0 - sass-embedded-linux-musl-arm: 1.98.0 - sass-embedded-linux-musl-arm64: 1.98.0 - sass-embedded-linux-musl-riscv64: 1.98.0 - sass-embedded-linux-musl-x64: 1.98.0 - sass-embedded-linux-riscv64: 1.98.0 - sass-embedded-linux-x64: 1.98.0 - sass-embedded-unknown-all: 1.98.0 - sass-embedded-win32-arm64: 1.98.0 - sass-embedded-win32-x64: 1.98.0 - sass@1.98.0: dependencies: chokidar: 5.0.0 @@ -21511,7 +20876,6 @@ snapshots: source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 - optional: true sax@1.5.0: {} @@ -22161,12 +21525,6 @@ snapshots: symbol-tree@3.2.4: optional: true - sync-child-process@1.0.2: - dependencies: - sync-message-port: 1.2.0 - - sync-message-port@1.2.0: {} - systeminformation@5.31.5: {} tagged-tag@1.0.0: {} @@ -22634,8 +21992,6 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - varint@6.0.0: {} - vary@1.1.2: {} verror@1.10.0: @@ -22654,45 +22010,44 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-glsl@1.5.6(@rollup/pluginutils@5.3.0(rollup@4.60.0))(esbuild@0.27.4)(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)): + vite-plugin-glsl@1.5.6(@rollup/pluginutils@5.3.0(rollup@4.60.0))(esbuild@0.27.4)(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)): dependencies: - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) optionalDependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.0) esbuild: 0.27.4 vite-plugin-turbosnap@1.0.3: {} - vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0): + vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0): dependencies: - lightningcss: 1.32.0 + esbuild: 0.27.4 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.8 - rolldown: 1.0.0-rc.11 + rollup: 4.60.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.12.0 - esbuild: 0.27.4 fsevents: 2.3.3 sass: 1.98.0 - sass-embedded: 1.98.0 terser: 5.46.1 tsx: 4.21.0 - vitest-fetch-mock@0.4.5(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))): + vitest-fetch-mock@0.4.5(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))): dependencies: - vitest: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + vitest: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) - vitest-websocket-mock@0.5.0(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))): + vitest-websocket-mock@0.5.0(vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0))): dependencies: '@vitest/utils': 3.2.4 mock-socket: 9.3.1 - vitest: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + vitest: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) - vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)): + vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@24.12.0)(happy-dom@20.8.8(bufferutil@4.1.0)(utf-8-validate@6.0.6))(jsdom@27.2.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)): dependencies: '@vitest/expect': 4.1.1 - '@vitest/mocker': 4.1.1(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) + '@vitest/mocker': 4.1.1(msw@2.12.14(@types/node@24.12.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)) '@vitest/pretty-format': 4.1.1 '@vitest/runner': 4.1.1 '@vitest/snapshot': 4.1.1 @@ -22709,7 +22064,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 8.0.2(@types/node@24.12.0)(esbuild@0.27.4)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0