diff --git a/packages/backend/package.json b/packages/backend/package.json index 6b2e76480b..40d963f3c7 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": "7.3.1" + "vite": "8.0.2" } } diff --git a/packages/frontend-builder/locale-inliner/collect-modifications.ts b/packages/frontend-builder/locale-inliner/collect-modifications.ts index 59e5d96517..2e92a407c9 100644 --- a/packages/frontend-builder/locale-inliner/collect-modifications.ts +++ b/packages/frontend-builder/locale-inliner/collect-modifications.ts @@ -3,10 +3,11 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { parseAst } from 'vite'; +import { parseAst } from 'rolldown/parseAst'; import * as estreeWalker from 'estree-walker'; import { assertNever, assertType } from '../utils.js'; -import type { AstNode, ProgramNode } from 'rollup'; +import type { ESTree as RolldownESTree } from 'rolldown/utils'; +import type { AstNode } from 'rollup'; import type * as estree from 'estree'; import type { LocaleInliner, TextModification } from '../locale-inliner.js'; import type { Logger } from '../logger.js'; @@ -17,7 +18,7 @@ interface WalkerContext { } export function collectModifications(sourceCode: string, fileName: string, fileLogger: Logger, inliner: LocaleInliner): TextModification[] { - let programNode: ProgramNode; + let programNode: RolldownESTree.Program; try { programNode = parseAst(sourceCode); } catch (err) { @@ -35,7 +36,8 @@ 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 - estreeWalker.walk(programNode, { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (estreeWalker.walk as any)(programNode, { enter(this: WalkerContext, node: Node) { assertType(node); @@ -118,8 +120,9 @@ 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; - estreeWalker.walk(programNode, { - enter(node) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (estreeWalker.walk as any)(programNode, { + enter(node: Node) { if (node.type === 'VariableDeclaration') { assertType(node); for (const id of node.declarations.flatMap(x => declsOfPattern(x.id))) { @@ -145,8 +148,9 @@ export function collectModifications(sourceCode: string, fileName: string, fileL const toSkip = new Set(); toSkip.add(i18nImport); - estreeWalker.walk(programNode, { - enter(this: WalkerContext, node, parent, property) { + // 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) { assertType(node); assertType(parent); if (toSkip.has(node)) { @@ -379,7 +383,7 @@ type SpecifierResult = | { type: 'specifier', localI18nIdentifier: string, importNode: estree.ImportDeclaration & AstNode } ; -function findImportSpecifier(programNode: ProgramNode, i18nFileName: string, i18nSymbol: string): SpecifierResult { +function findImportSpecifier(programNode: RolldownESTree.Program, 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 f4326907d2..28bcc47d63 100644 --- a/packages/frontend-builder/package.json +++ b/packages/frontend-builder/package.json @@ -17,9 +17,10 @@ "rollup": "4.60.0" }, "dependencies": { - "i18n": "workspace:*", "estree-walker": "3.0.3", + "i18n": "workspace:*", "magic-string": "0.30.21", - "vite": "7.3.1" + "rolldown": "1.0.0-rc.11", + "vite": "8.0.2" } } diff --git a/packages/frontend-builder/rollup-plugin-remove-unref-i18n.ts b/packages/frontend-builder/rollup-plugin-remove-unref-i18n.ts index 4a2bfa67d9..6ff62b8f77 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 MagicString from 'magic-string'; +import { RolldownMagicString } from 'rolldown'; import { assertType } from './utils.js'; +import type { ESTree } from 'rolldown/utils'; import type { Plugin } from 'vite'; -import type { CallExpression, Expression, Program } from 'estree'; -import type { AstNode } from 'rollup'; +import type { CallExpression, Expression } from 'estree'; // 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,12 +23,13 @@ export function pluginRemoveUnrefI18n( } = {}): Plugin { return { name: 'UnwindCssModuleClassName', - renderChunk(code) { + renderChunk(code, _chunk, _options, meta) { if (!code.includes('unref(i18n)')) return null; - const ast = this.parse(code) as Program; - const magicString = new MagicString(code); - estreeWalker.walk(ast, { - enter(node) { + 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) { if (node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'unref' && node.arguments.length === 1) { // calls to unref with single argument @@ -36,18 +37,16 @@ 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 { - code: magicString.toString(), - map: magicString.generateMap({ hires: true }), - }; + + return magicString; }, }; } diff --git a/packages/frontend-embed/build.ts b/packages/frontend-embed/build.ts index 4e1f588802..0b4058f33a 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/vite.json5.ts b/packages/frontend-embed/lib/vite-plugin-json5.ts similarity index 90% rename from packages/frontend-embed/vite.json5.ts rename to packages/frontend-embed/lib/vite-plugin-json5.ts index 87b67c2142..921324b67a 100644 --- a/packages/frontend-embed/vite.json5.ts +++ b/packages/frontend-embed/lib/vite-plugin-json5.ts @@ -1,7 +1,10 @@ -// Original: https://github.com/rollup/plugins/tree/8835dd2aed92f408d7dc72d7cc25a9728e16face/packages/json +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ import JSON5 from 'json5'; -import { Plugin } from 'rollup'; +import { Plugin } from 'vite'; import { createFilter, dataToEsm } from '@rollup/pluginutils'; import { RollupJsonOptions } from '@rollup/plugin-json'; diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json index fa5ba3038e..3bb8e00d59 100644 --- a/packages/frontend-embed/package.json +++ b/packages/frontend-embed/package.json @@ -12,7 +12,6 @@ "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", @@ -26,11 +25,9 @@ "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": { @@ -57,8 +54,10 @@ "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 9e5c24f9d4..7f5be591e8 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 './vite.json5.js'; +import pluginJson5 from './lib/vite-plugin-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')).url : null; +const url = process.env.NODE_ENV === 'development' ? (yaml.load(await fsp.readFile('../../.config/default.yml', 'utf-8')) as any).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,11 +113,6 @@ export function getConfig(): UserConfig { } }, }, - preprocessorOptions: { - scss: { - api: 'modern-compiler', - }, - }, }, define: { @@ -137,7 +132,10 @@ export function getConfig(): UserConfig { 'safari16', ], manifest: 'manifest.json', - rollupOptions: { + rolldownOptions: { + experimental: { + nativeMagicString: true, + }, input: { i18n: './src/i18n.ts', entry: './src/boot.ts', @@ -145,10 +143,15 @@ export function getConfig(): UserConfig { external: externalPackages.map(p => p.match), preserveEntrySignatures: 'allow-extension', output: { - manualChunks: { - vue: ['vue'], - // dependencies of i18n.ts - 'config': ['@@/js/config.js'], + codeSplitting: { + groups: [{ + name: 'vue', + test: /node_modules[\\/]vue/, + }, { + // dependencies of i18n.ts + name: 'config', + test: /@@[\\/]js[\\/]config\.js/, + }], }, entryFileNames: `scripts/${localesHash}-[hash:8].js`, chunkFileNames: `scripts/${localesHash}-[hash:8].js`, 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 ccfa08575b..0a5000f46d 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 type * as estree from 'estree'; +import { parseAst } from 'rolldown/parseAst'; +import type { ESTree } from 'rolldown/utils'; +import { RolldownMagicString } from 'rolldown'; -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; +function parseExpression(code: string): ESTree.Expression { + const program = parseAst(code, { sourceType: 'module' }); + const statement = program.body[0] as ESTree.ExpressionStatement; return statement.expression; } @@ -57,7 +57,7 @@ describe(normalizeClass.name, () => { }); it('Composition API (standard)', () => { - const ast = parse(` + const code = ` 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,17 +170,19 @@ const cssModules = { const index_photos = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]); export { index_photos as default }; -`.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'; +`.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'; import './photoswipe-!~{003}~.js'; -const _hoisted_1 = createBaseVNode("i", { - class: "ti ti-photo" -}, null, -1); -const index_photos = defineComponent({ + +const _hoisted_1 = /* @__PURE__ */ createBaseVNode("i", { class: "ti ti-photo" }, null, -1); +const index_photos = /* @__PURE__ */ defineComponent({ __name: "index.photos", props: { user: {} @@ -193,12 +195,20 @@ const index_photos = 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({ @@ -213,60 +223,77 @@ const index_photos = 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)); + + +export { index_photos as default }; +`.slice(1), + ); }); it('Composition API (with `useCssModule()`)', () => { - const ast = parse(` + 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'; @@ -437,11 +464,15 @@ const cssModules = { const MkDateSeparatedList = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]); 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'; +`.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; @@ -458,6 +489,7 @@ function stackTraceInstances() { } return stack; } + const _sfc_main = defineComponent({ props: { items: { @@ -485,7 +517,7 @@ const _sfc_main = defineComponent({ default: false } }, - setup(props, {slots, expose}) { + setup(props, { slots, expose }) { const $style = useCssModule(); function getDateText(time) { const date = new Date(time).getDate(); @@ -495,28 +527,40 @@ const _sfc_main = defineComponent({ day: date.toString() }); } - if (props.items.length === 0) return; + if (props.items.length === 0) + return; const renderChildrenImpl = () => props.items.map((item, i) => { - if (!slots || !slots.default) return; + if (!slots || !slots.default) + return; const el = slots.default({ item })[0]; - if (el.key == null && item.id) el.key = item.id; + 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"]}\` - })])])); + }, [ + 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_) { @@ -532,17 +576,13 @@ const _sfc_main = defineComponent({ const renderChildren = () => { const children = renderChildrenImpl(); if (isDebuggerEnabled(6864)) { - const nodes = children.flatMap(node => node ?? []); - const keys = new Set(nodes.map(node => node.key)); + 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 - }); + console.warn({ id, debugId: 6864, stack: instances }); } } return children; @@ -555,45 +595,136 @@ const _sfc_main = defineComponent({ 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" + 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 + } : {} }, - ...prefer.s.animation ? { - name: "list", - tag: "div", - onBeforeLeave, - onLeaveCanceled - } : {} - }, { - default: renderChildren - }); + { 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" + "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}; +const MkDateSeparatedList = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]); + +export { MkDateSeparatedList as M }; `.slice(1)); }); + +it('Composition API (inlined output)', () => { + const code = ` +import { a as normalizeClass, 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: normalizeClass([e.$style.root, "extra"]) + }, null, 2); + } +}), [["__cssModules", { + "$style": { + root: "x1234" + } +}]]); + +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'); +}); + +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 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" + } +}]]); + +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('}), []);'); +}); + +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'); +}); 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 7ecb1e9179..d82f1512fc 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,17 +3,16 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -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 * as estreeWalker from 'estree-walker'; import type { Plugin } from 'vite'; +import type { ESTree } from 'rolldown/utils'; +import { RolldownMagicString } from 'rolldown'; -function isFalsyIdentifier(identifier: estree.Identifier): boolean { +function isFalsyIdentifier(identifier: Extract): 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') { @@ -26,7 +25,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 : ''); }, ''); } @@ -72,44 +71,144 @@ 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, ''); } -export function unwindCssModuleClassName(ast: estree.Node): void { - (walk as typeof estreeWalker.walk)(ast, { - enter(node, parent): void { +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 { //#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; - 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; + 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[1].type !== 'ArrayExpression') return; if (node.declarations[0].init.arguments[1].elements.length === 0) return; - const __cssModulesIndex = node.declarations[0].init.arguments[1].elements.findIndex((x) => { + const cssModulesEntry = node.declarations[0].init.arguments[1].elements.find((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; - }); - if (!~__cssModulesIndex) return; + }) as ESTree.ArrayExpression | undefined; + const __cssModulesIndex = node.declarations[0].init.arguments[1].elements.indexOf(cssModulesEntry ?? null); + if (cssModulesEntry === undefined || __cssModulesIndex < 0) return; /* This region assumeed that the entered node looks like the following code. * * ```ts @@ -118,21 +217,10 @@ export function unwindCssModuleClassName(ast: estree.Node): void { */ //#endregion //#region - 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]]; - })); + const cssModuleForest = cssModulesEntry.elements[1]; + if (cssModuleForest?.type !== 'Identifier' && cssModuleForest?.type !== 'ObjectExpression') return; + const moduleForest = resolveModuleForest(ast, cssModuleForest); + if (moduleForest === null) return; /* This region collected a VariableDeclaration node in the module that looks like the following code. * * ```ts @@ -143,35 +231,13 @@ export function unwindCssModuleClassName(ast: estree.Node): void { */ //#endregion //#region - 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]; + 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]; 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 @@ -186,33 +252,8 @@ export function unwindCssModuleClassName(ast: estree.Node): void { * ``` */ //#endregion - for (const [key, value] of moduleForest) { + for (const [key, moduleTree] 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 @@ -226,17 +267,14 @@ export function unwindCssModuleClassName(ast: estree.Node): void { */ //#endregion //#region - (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); + (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); if (actualValue === undefined) return; + magicString.overwrite(childNode.start, childNode.end, JSON.stringify(actualValue)); this.replace({ type: 'Literal', value: actualValue, @@ -276,20 +314,13 @@ export function unwindCssModuleClassName(ast: estree.Node): void { */ //#endregion //#region - (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', - }); + (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'); }, }); /* This region replaced the reference identifier of missing class names in the render function with `undefined`, as in the following code. @@ -300,7 +331,7 @@ export function unwindCssModuleClassName(ast: estree.Node): void { * ... * return (_ctx, _cache) => { * ... - * return openBlock(), createElementBlock("div", { + * return openBlock(), createElementBlock('div', { * class: normalizeClass(_ctx.$style.hoge), * }, null); * }; @@ -316,7 +347,7 @@ export function unwindCssModuleClassName(ast: estree.Node): void { * ... * return (_ctx, _cache) => { * ... - * return openBlock(), createElementBlock("div", { + * return openBlock(), createElementBlock('div', { * class: normalizeClass(undefined), * }, null); * }; @@ -326,18 +357,15 @@ export function unwindCssModuleClassName(ast: estree.Node): void { */ //#endregion //#region - (walk as typeof estreeWalker.walk)(render.argument.body, { - enter(childNode) { + (estreeWalker.walk as any)(render.body, { + enter(childNode: ESTree.Node, childParent: ESTree.Node | null) { 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; - this.replace({ - type: 'Literal', - value: normalized, - }); + magicString.overwrite(childNode.start, childNode.end, JSON.stringify(normalized)); }, }); /* This region compiled the `normalizeClass` call into a pseudo-AOT compilation, as in the following code. @@ -374,19 +402,34 @@ export function unwindCssModuleClassName(ast: estree.Node): void { */ //#endregion } - //#region - if (node.declarations[0].init.arguments[1].elements.length === 1) { - (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, - }); + 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(); }, }); - this.remove(); + 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); + } /* NOTE: The above logic is valid as long as the following two conditions are met. * * - the uniqueness of `ident` is kept throughout the module @@ -411,31 +454,10 @@ export function unwindCssModuleClassName(ast: estree.Node): void { }); */ } else { - 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', - }); + 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 region removed the `__cssModules` reference from the second argument of `_export_sfc`, as in the following code. * @@ -474,10 +496,11 @@ export function unwindCssModuleClassName(ast: estree.Node): void { export default function pluginUnwindCssModuleClassName(): Plugin { return { name: 'UnwindCssModuleClassName', - renderChunk(code): { code: string } { - const ast = this.parse(code) as unknown as estree.Node; - unwindCssModuleClassName(ast); - return { code: generate(ast) }; + 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; }, }; } diff --git a/packages/frontend/lib/vite-plugin-create-search-index.ts b/packages/frontend/lib/vite-plugin-create-search-index.ts index cfbba0823c..4126a4f8c0 100644 --- a/packages/frontend/lib/vite-plugin-create-search-index.ts +++ b/packages/frontend/lib/vite-plugin-create-search-index.ts @@ -13,11 +13,12 @@ import { type LogOptions, normalizePath, type Plugin, - type PluginOption + type PluginOption, } from 'vite'; import fs from 'node:fs'; import JSON5 from 'json5'; -import MagicString, { SourceMap } from 'magic-string'; +import { RolldownMagicString } from 'rolldown'; +import type { TransformResult } from 'rolldown'; import path from 'node:path' import { hash, toBase62 } from '../vite.config'; import { minimatch } from 'minimatch'; @@ -63,7 +64,7 @@ interface MarkerRelation { let logger = { info: (msg: string, options?: LogOptions) => { }, warn: (msg: string, options?: LogOptions) => { }, - error: (msg: string, options?: LogErrorOptions | unknown) => { }, + error: (msg: string, options?: LogErrorOptions) => { }, }; let loggerInitialized = false; @@ -460,9 +461,18 @@ function propertyAccessProxy(path: string[]): AccessProxy { const i18nProxy = propertyAccessProxy(['i18n']); -export function collectFileMarkers(id: string, code: string): SearchIndexItem[] { +export function collectFileMarkers(id: string, code: string | RolldownMagicString | undefined): SearchIndexItem[] { try { - const { descriptor, errors } = vueSfcParse(code, { + 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, { filename: id, }); @@ -473,7 +483,8 @@ export function collectFileMarkers(id: string, code: string): SearchIndexItem[] return extractUsageInfoFromTemplateAst(descriptor.template?.ast, id); } catch (error) { - logger.error(`Error analyzing file ${id}:`, error); + let _error = error instanceof Error ? error : new Error(String(error)); + logger.error(`Error analyzing file ${id}:`, { error: _error }); } return []; @@ -481,10 +492,7 @@ export function collectFileMarkers(id: string, code: string): SearchIndexItem[] // endregion -type TransformedCode = { - code: string, - map: SourceMap, -}; +type TransformedCode = Exclude; export class MarkerIdAssigner { // key: file id @@ -509,13 +517,12 @@ export class MarkerIdAssigner { } #processImpl(id: string, code: string): TransformedCode { - const s = new MagicString(code); // magic-string のインスタンスを作成 + const s = new RolldownMagicString(code); // magic-string のインスタンスを作成 const parsed = vueSfcParse(code, { filename: id }); if (!parsed.descriptor.template) { return { - code, - map: s.generateMap({ source: id, includeContent: true }), + code, // テンプレートがない場合は元のコードを返す }; } const ast = parsed.descriptor.template.ast; // テンプレート AST を取得 @@ -523,8 +530,7 @@ export class MarkerIdAssigner { if (!ast) { return { - code: s.toString(), // 変更後のコードを返す - map: s.generateMap({ source: id, includeContent: true }), // ソースマップも生成 (sourceMap: true が必要) + code, }; } @@ -611,7 +617,6 @@ export class MarkerIdAssigner { return { code: s.toString(), // 変更後のコードを返す - map: s.generateMap({ source: id, includeContent: true }), // ソースマップも生成 (sourceMap: true が必要) }; } @@ -642,7 +647,7 @@ export class MarkerIdAssigner { } } -// Rollup プラグインとして export +// Vite プラグインとして export export default function pluginCreateSearchIndex(options: Options): PluginOption { const assigner = new MarkerIdAssigner(); return [ diff --git a/packages/frontend/vite.json5.ts b/packages/frontend/lib/vite-plugin-json5.ts similarity index 90% rename from packages/frontend/vite.json5.ts rename to packages/frontend/lib/vite-plugin-json5.ts index 87b67c2142..921324b67a 100644 --- a/packages/frontend/vite.json5.ts +++ b/packages/frontend/lib/vite-plugin-json5.ts @@ -1,7 +1,10 @@ -// Original: https://github.com/rollup/plugins/tree/8835dd2aed92f408d7dc72d7cc25a9728e16face/packages/json +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ import JSON5 from 'json5'; -import { Plugin } from 'rollup'; +import { Plugin } from 'vite'; import { createFilter, dataToEsm } from '@rollup/pluginutils'; import { RollupJsonOptions } from '@rollup/plugin-json'; diff --git a/packages/frontend/lib/vite-plugin-watch-locales.ts b/packages/frontend/lib/vite-plugin-watch-locales.ts index 372e9039d5..2fed7f60fa 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() { +export default function pluginWatchLocales(): Plugin { return { name: 'watch-locales', diff --git a/packages/frontend/package.json b/packages/frontend/package.json index a99918e7b6..7bcf097ec4 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -21,10 +21,7 @@ "@github/webauthn-json": "2.1.1", "@mcaptcha/core-glue": "0.1.0-alpha-5", "@misskey-dev/browser-image-resizer": "2024.1.0", - "@rollup/plugin-json": "6.1.0", - "@rollup/plugin-replace": "6.0.3", - "@rollup/pluginutils": "5.3.0", - "@sentry/vue": "10.45.0", + "@sentry/vue": "10.40.0", "@syuilo/aiscript": "1.2.1", "@syuilo/aiscript-0-19-0": "npm:@syuilo/aiscript@^0.19.0", "@twemoji/parser": "16.0.0", @@ -64,21 +61,20 @@ "punycode.js": "2.3.1", "qr-code-styling": "1.9.2", "qr-scanner": "1.4.2", - "rollup": "4.60.0", - "sanitize-html": "2.17.2", - "sass": "1.98.0", + "sanitize-html": "2.17.1", "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", @@ -123,7 +119,6 @@ "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", @@ -132,11 +127,14 @@ "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 260d1215df..b061733333 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 './vite.json5.js'; +import pluginJson5 from './lib/vite-plugin-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')).url : null; +const url = process.env.NODE_ENV === 'development' ? (yaml.load(await fsp.readFile('../../.config/default.yml', 'utf-8')) as any).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,11 +121,10 @@ export function getConfig(): UserConfig { pluginGlsl({ minify: true }), ...process.env.NODE_ENV === 'production' ? [ - pluginReplace({ + replacePlugin({ + 'isChromatic()': JSON.stringify(false), + }, { preventAssignment: true, - values: { - 'isChromatic()': JSON.stringify(false), - }, }), ] : [], @@ -154,11 +153,6 @@ export function getConfig(): UserConfig { } }, }, - preprocessorOptions: { - scss: { - api: 'modern-compiler', - }, - }, }, define: { @@ -178,7 +172,10 @@ export function getConfig(): UserConfig { 'safari16', ], manifest: 'manifest.json', - rollupOptions: { + rolldownOptions: { + experimental: { + nativeMagicString: true, + }, input: { i18n: './src/i18n.ts', entry: './src/_boot_.ts', @@ -186,11 +183,18 @@ export function getConfig(): UserConfig { external: externalPackages.map(p => p.match), preserveEntrySignatures: 'allow-extension', output: { - manualChunks: { - vue: ['vue'], - photoswipe: ['photoswipe', 'photoswipe/lightbox', 'photoswipe/style.css'], - // dependencies of i18n.ts - 'config': ['@@/js/config.js'], + codeSplitting: { + groups: [{ + name: 'vue', + test: /node_modules[\\/]vue/, + }, { + name: 'photoswipe', + test: /node_modules[\\/]photoswipe/, + }, { + // dependencies of i18n.ts + name: 'config', + test: /@@[\\/]js[\\/]config\.js/, + }], }, entryFileNames: `scripts/${localesHash}-[hash:8].js`, chunkFileNames: `scripts/${localesHash}-[hash:8].js`, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c16139fa4..32f051d31d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -557,8 +557,8 @@ importers: specifier: 7.2.2 version: 7.2.2 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) + 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) optionalDependencies: '@swc/core-android-arm64': specifier: 1.3.11 @@ -665,18 +665,9 @@ 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.45.0 - version: 10.45.0(vue@3.5.30(typescript@5.9.3)) + specifier: 10.40.0 + version: 10.40.0(vue@3.5.30(typescript@5.9.3)) '@syuilo/aiscript': specifier: 1.2.1 version: 1.2.1 @@ -688,7 +679,7 @@ importers: version: 16.0.0 '@vitejs/plugin-vue': specifier: 6.0.5 - 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)) + 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)) aiscript-vscode: specifier: github:aiscript-dev/aiscript-vscode#v0.1.16 version: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/1dc7f60cda78d030dadfc518a33c472202b2ef67 @@ -794,15 +785,9 @@ 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.2 - version: 2.17.2 - sass: - specifier: 1.98.0 - version: 1.98.0 + specifier: 2.17.1 + version: 2.17.1 shiki: specifier: 3.23.0 version: 3.23.0 @@ -821,9 +806,6 @@ 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) @@ -834,6 +816,12 @@ 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)) @@ -869,7 +857,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@7.3.1(@types/node@24.12.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@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/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)) @@ -884,7 +872,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@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)) + 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)) '@tabler/icons-webfont': specifier: 3.35.0 version: 3.35.0 @@ -935,7 +923,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@7.3.1(@types/node@24.12.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@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/compiler-core': specifier: 3.5.30 version: 3.5.30 @@ -966,9 +954,6 @@ 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 @@ -993,6 +978,12 @@ 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 @@ -1008,18 +999,21 @@ 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@7.3.1(@types/node@24.12.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@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 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@7.3.1(@types/node@24.12.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@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: 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@7.3.1(@types/node@24.12.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@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-component-type-helpers: specifier: 3.2.6 version: 3.2.6 @@ -1041,9 +1035,12 @@ 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: 7.3.1 - version: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0) + 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) devDependencies: '@types/estree': specifier: 1.0.8 @@ -1069,9 +1066,6 @@ 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) @@ -1080,7 +1074,7 @@ importers: version: 16.0.0 '@vitejs/plugin-vue': specifier: 6.0.5 - 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)) + 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)) buraha: specifier: 0.0.1 version: 0.0.1 @@ -1111,9 +1105,6 @@ 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 @@ -1123,9 +1114,6 @@ 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) @@ -1165,7 +1153,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@7.3.1(@types/node@24.12.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@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/runtime-core': specifier: 3.5.30 version: 3.5.30 @@ -1199,12 +1187,18 @@ 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 @@ -1377,7 +1371,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@7.3.1(@types/node@24.12.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@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))) esbuild: specifier: 0.27.4 version: 0.27.4 @@ -1395,10 +1389,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@7.3.1(@types/node@24.12.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@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: 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@7.3.1(@types/node@24.12.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@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))) packages/misskey-js/generator: devDependencies: @@ -1871,6 +1865,9 @@ 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==} @@ -1955,9 +1952,15 @@ 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==} @@ -2874,6 +2877,9 @@ 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: @@ -3173,6 +3179,9 @@ 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==} @@ -3343,6 +3352,104 @@ 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==} @@ -3355,15 +3462,6 @@ 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'} @@ -3547,10 +3645,18 @@ 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'} @@ -3559,18 +3665,34 @@ 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'} @@ -3621,6 +3743,19 @@ 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'} @@ -4400,6 +4535,9 @@ 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==} @@ -5778,6 +5916,9 @@ 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'} @@ -7084,6 +7225,9 @@ 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==} @@ -7845,6 +7989,80 @@ 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'} @@ -9490,6 +9708,11 @@ 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'} @@ -9540,9 +9763,129 @@ 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'} @@ -10102,6 +10445,14 @@ 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'} @@ -10619,6 +10970,9 @@ 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'} @@ -10649,15 +11003,16 @@ packages: vite-plugin-turbosnap@1.0.3: resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==} - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@8.0.2: + resolution: {integrity: sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==} 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' @@ -10668,12 +11023,14 @@ 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: @@ -11793,6 +12150,8 @@ snapshots: '@borewit/text-codec@0.1.1': {} + '@bufbuild/protobuf@2.11.0': {} + '@canvas/image-data@1.1.0': {} '@chainsafe/is-ip@2.1.0': {} @@ -11931,11 +12290,22 @@ 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': @@ -12546,11 +12916,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@7.3.1(@types/node@24.12.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@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))': dependencies: glob: 13.0.1 react-docgen-typescript: 2.4.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) + 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) optionalDependencies: typescript: 5.9.3 @@ -12834,6 +13204,13 @@ 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 @@ -13188,6 +13565,8 @@ 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 @@ -13412,6 +13791,55 @@ 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)': @@ -13420,13 +13848,6 @@ 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 @@ -13553,10 +13974,18 @@ 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 @@ -13566,16 +13995,34 @@ 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 @@ -13584,6 +14031,8 @@ 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)': @@ -13657,6 +14106,12 @@ 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 @@ -14215,12 +14670,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@7.3.1(@types/node@24.12.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@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))': 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@7.3.1(@types/node@24.12.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@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: 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: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) transitivePeerDependencies: - esbuild - rollup @@ -14234,14 +14689,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@7.3.1(@types/node@24.12.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@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))': 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: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) '@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: @@ -14286,11 +14741,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@7.3.1(@types/node@24.12.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@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))': dependencies: - '@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)) + '@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)) '@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@7.3.1(@types/node@24.12.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@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': 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 @@ -14300,7 +14755,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: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) transitivePeerDependencies: - esbuild - rollup @@ -14348,14 +14803,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@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))': + '@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))': 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@7.3.1(@types/node@24.12.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@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/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: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) 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: @@ -14660,6 +15115,11 @@ 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 @@ -15128,13 +15588,13 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@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))': + '@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))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) 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@7.3.1(@types/node@24.12.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@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)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.1 @@ -15146,7 +15606,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@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/expect@2.0.5': dependencies: @@ -15172,14 +15632,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@7.3.1(@types/node@24.12.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@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))': 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: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) '@vitest/pretty-format@2.0.5': dependencies: @@ -16303,6 +16763,8 @@ snapshots: colorette@2.0.20: {} + colorjs.io@0.5.2: {} + colors@1.4.0: optional: true @@ -17957,6 +18419,13 @@ 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 @@ -18928,6 +19397,55 @@ 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: {} @@ -20773,6 +21291,27 @@ 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 @@ -20860,6 +21399,15 @@ 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 @@ -20869,6 +21417,93 @@ 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 @@ -20876,6 +21511,7 @@ snapshots: source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 + optional: true sax@1.5.0: {} @@ -21525,6 +22161,12 @@ 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: {} @@ -21992,6 +22634,8 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + varint@6.0.0: {} + vary@1.1.2: {} verror@1.10.0: @@ -22010,44 +22654,45 @@ 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@7.3.1(@types/node@24.12.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@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)): dependencies: - vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) optionalDependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.0) esbuild: 0.27.4 vite-plugin-turbosnap@1.0.3: {} - vite@7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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): dependencies: - esbuild: 0.27.4 - fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.32.0 picomatch: 4.0.3 postcss: 8.5.8 - rollup: 4.60.0 + rolldown: 1.0.0-rc.11 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@7.3.1(@types/node@24.12.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@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))): 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@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-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))): + 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))): 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@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)): + 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)): 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@7.3.1(@types/node@24.12.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@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/pretty-format': 4.1.1 '@vitest/runner': 4.1.1 '@vitest/snapshot': 4.1.1 @@ -22064,7 +22709,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.12.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.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) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0