From 0a453590f3b93b5952051e9570664135f110c8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E7=86=B1?= Date: Wed, 3 Jun 2026 19:23:13 +0800 Subject: [PATCH] chore(examples): add interactive entry selection for dev builds (#7012) --- examples/.gitignore | 1 + examples/esbuild.config.ts | 214 ++--------------------- examples/package.json | 1 + examples/scripts/esbuild/build-config.ts | 116 ++++++++++++ examples/scripts/esbuild/build-tasks.ts | 61 +++++++ examples/scripts/esbuild/logger.ts | 90 ++++++++++ examples/scripts/select-entries.ts | 128 ++++++++++++++ examples/scripts/sync-demos.ts | 13 +- pnpm-lock.yaml | 165 ++++++----------- 9 files changed, 472 insertions(+), 317 deletions(-) create mode 100644 examples/scripts/esbuild/build-config.ts create mode 100644 examples/scripts/esbuild/build-tasks.ts create mode 100644 examples/scripts/esbuild/logger.ts create mode 100644 examples/scripts/select-entries.ts diff --git a/examples/.gitignore b/examples/.gitignore index 9a0f6625c0..633dec9c4a 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -2,3 +2,4 @@ public !public/index.html !public/favicon.svg src/demos.ts +entry-selection.json diff --git a/examples/esbuild.config.ts b/examples/esbuild.config.ts index 33347aa9d9..a7c14fdbb8 100644 --- a/examples/esbuild.config.ts +++ b/examples/esbuild.config.ts @@ -14,120 +14,17 @@ * limitations under the License. */ -import type { BuildOptions, Plugin, PluginBuild, SameShape } from 'esbuild'; -import { execSync } from 'node:child_process'; -import path from 'node:path'; +import type { Plugin, PluginBuild } from 'esbuild'; import process from 'node:process'; -import { fileURLToPath } from 'node:url'; -import { ignoreGlobalCssPlugin, removeClassnameNewlinesPlugin } from '@univerjs-infra/shared/esbuild'; import detect from 'detect-port'; import esbuild from 'esbuild'; -import aliasPlugin from 'esbuild-plugin-alias'; -import cleanPlugin from 'esbuild-plugin-clean'; -import copyPlugin from 'esbuild-plugin-copy'; -import vue3 from 'esbuild-plugin-vue3'; -import stylePlugin from 'esbuild-style-plugin'; import minimist from 'minimist'; -import * as React from 'react'; -import tailwindcss from 'tailwindcss'; -import { syncDemoArtifacts } from './scripts/sync-demos'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -const nodeModules = path.resolve(process.cwd(), './node_modules'); +import { createBuildConfig } from './scripts/esbuild/build-config'; +import { monacoBuildTask, nodeBuildTask } from './scripts/esbuild/build-tasks'; +import { createLogger, formatDuration } from './scripts/esbuild/logger'; const args = minimist(process.argv.slice(2)); const isE2E = !!args.e2e; -const isReact16 = React.version.startsWith('16'); - -// User should also config their bundler to build monaco editor's resources for web worker. -const monacoEditorEntryPoints = [ - 'vs/language/json/json.worker.js', - 'vs/language/css/css.worker.js', - 'vs/language/html/html.worker.js', - 'vs/language/typescript/ts.worker.js', - 'vs/editor/editor.worker.js', -]; - -const supportsColor = !!process.stdout.isTTY && process.env.NO_COLOR == null; -const ansi = { - reset: '\x1B[0m', - bold: '\x1B[1m', - dim: '\x1B[2m', - red: '\x1B[31m', - green: '\x1B[32m', - yellow: '\x1B[33m', - blue: '\x1B[34m', - cyan: '\x1B[36m', - gray: '\x1B[90m', - underline: '\x1B[4m', -} as const; - -type TLogLevel = 'error' | 'info' | 'ready' | 'recover' | 'watch'; - -const levelStyleMap: Record = { - error: [ansi.bold, ansi.red], - info: [ansi.bold, ansi.blue], - ready: [ansi.bold, ansi.green], - recover: [ansi.bold, ansi.cyan], - watch: [ansi.bold, ansi.yellow], -}; - -function colorize(text: string, styles: string[]) { - if (!supportsColor || styles.length === 0) { - return text; - } - - return `${styles.join('')}${text}${ansi.reset}`; -} - -function formatLabel(level: TLogLevel) { - return colorize(`[${level}]`, levelStyleMap[level]); -} - -function formatMuted(text: string) { - return colorize(text, [ansi.dim, ansi.gray]); -} - -function formatUrl(url: string) { - return colorize(url, [ansi.bold, ansi.underline, ansi.cyan]); -} - -function formatDuration(durationMs: number) { - if (durationMs < 1000) { - return `${durationMs}ms`; - } - - return `${(durationMs / 1000).toFixed(durationMs < 10_000 ? 1 : 0)}s`; -} - -function createLogger() { - function write(level: TLogLevel, message: string, method: 'error' | 'log' = 'log') { - console[method](`${formatLabel(level)} ${message}`); - } - - return { - error(message: string) { - write('error', message, 'error'); - }, - info(message: string) { - write('info', message); - }, - ready(message: string) { - write('ready', message); - }, - recover(message: string) { - write('recover', message); - }, - watch(message: string) { - write('watch', message); - }, - muted(message: string) { - console.log(formatMuted(message)); - }, - url: formatUrl, - }; -} const logger = createLogger(); @@ -181,103 +78,6 @@ function createWatchStatusPlugin() { }; } -function nodeBuildTask() { - return esbuild.build({ - bundle: true, - color: true, - minify: false, - target: 'chrome70', - entryPoints: [ - './src/node/cases/basic.ts', - './src/node/sdk/worker.ts', - ], - platform: 'node', - outdir: './dist', - define: { - 'process.env.NODE_ENV': '"production"', - }, - }); -} - -/** - * Build monaco editor's resources for web worker - */ -function monacoBuildTask() { - return esbuild.build({ - entryPoints: monacoEditorEntryPoints.map((entry) => `./node_modules/monaco-editor/esm/${entry}`), - bundle: true, - color: true, - target: 'chrome70', - format: 'iife', - outbase: './node_modules/monaco-editor/esm/', - outdir: './local', - plugins: [ - cleanPlugin({ - patterns: ['./local'], - }), - ], - }); -} - -const define: Record = { - 'process.env.NODE_ENV': args.watch ? '"development"' : '"production"', - 'process.env.IS_E2E': isE2E ? 'true' : 'false', -}; - -if (!args.watch) { - const gitCommitHash = isE2E ? 'E2E' : execSync('git rev-parse --short HEAD').toString().trim(); - const gitRefName = isE2E ? 'E2E' : execSync('git symbolic-ref -q --short HEAD || git describe --tags --exact-match').toString().trim(); - - define['process.env.GIT_COMMIT_HASH'] = `"${gitCommitHash}"`; - define['process.env.GIT_REF_NAME'] = `"${gitRefName}"`; - define['process.env.BUILD_TIME'] = `"${new Date().toISOString()}"`; -} - -const { entryPoints } = syncDemoArtifacts(); - -const config: SameShape = { - bundle: true, - format: 'esm', - splitting: true, - color: true, - loader: { '.svg': 'file', '.ttf': 'file' }, - sourcemap: args.watch, - minify: false, - target: 'chrome70', - plugins: [ - ignoreGlobalCssPlugin(), - removeClassnameNewlinesPlugin(), - copyPlugin({ - assets: { - from: ['./public/**/*'], - to: ['./'], - }, - }), - stylePlugin({ - postcss: { - plugins: [tailwindcss as any], - }, - renderOptions: { - lessOptions: { - paths: [nodeModules], - }, - }, - }), - vue3() as unknown as Plugin, - ], - entryPoints, - outdir: './local', - define, -}; - -if (isReact16) { - config.plugins?.push( - aliasPlugin({ - 'react-dom/client': path.resolve(__dirname, './src/client.ts'), - }) - ); -} - /** * Build the project */ @@ -286,6 +86,12 @@ async function main() { logger.info('Starting examples dev server...'); } + const config = await createBuildConfig({ + watch: !!args.watch, + e2e: isE2E, + all: !!args.all, + }); + await monacoBuildTask(); if (args.watch) { diff --git a/examples/package.json b/examples/package.json index dc354a8024..3296fce95e 100644 --- a/examples/package.json +++ b/examples/package.json @@ -85,6 +85,7 @@ "rxjs": "^7.8.2" }, "devDependencies": { + "@clack/prompts": "^0.10.0", "@types/fs-extra": "^11.0.4", "@types/minimist": "^1.2.5", "@univerjs-infra/shared": "workspace:*", diff --git a/examples/scripts/esbuild/build-config.ts b/examples/scripts/esbuild/build-config.ts new file mode 100644 index 0000000000..ac0e96847f --- /dev/null +++ b/examples/scripts/esbuild/build-config.ts @@ -0,0 +1,116 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { BuildOptions, Plugin, SameShape } from 'esbuild'; +import { execSync } from 'node:child_process'; +import path from 'node:path'; +import process from 'node:process'; +import { fileURLToPath } from 'node:url'; +import { ignoreGlobalCssPlugin, removeClassnameNewlinesPlugin } from '@univerjs-infra/shared/esbuild'; +import aliasPlugin from 'esbuild-plugin-alias'; +import copyPlugin from 'esbuild-plugin-copy'; +import vue3 from 'esbuild-plugin-vue3'; +import stylePlugin from 'esbuild-style-plugin'; +import * as React from 'react'; +import tailwindcss from 'tailwindcss'; +import { syncDemoArtifacts } from '../sync-demos'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const nodeModules = path.resolve(process.cwd(), './node_modules'); +const isReact16 = React.version.startsWith('16'); + +export interface IBuildArgs { + watch: boolean; + e2e: boolean; + all: boolean; +} + +export function createEnvDefinitions(args: IBuildArgs): Record { + const define: Record = { + 'process.env.NODE_ENV': args.watch ? '"development"' : '"production"', + 'process.env.IS_E2E': args.e2e ? 'true' : 'false', + }; + + if (!args.watch) { + const gitCommitHash = args.e2e ? 'E2E' : execSync('git rev-parse --short HEAD').toString().trim(); + const gitRefName = args.e2e ? 'E2E' : execSync('git symbolic-ref -q --short HEAD || git describe --tags --exact-match').toString().trim(); + + define['process.env.GIT_COMMIT_HASH'] = `"${gitCommitHash}"`; + define['process.env.GIT_REF_NAME'] = `"${gitRefName}"`; + define['process.env.BUILD_TIME'] = `"${new Date().toISOString()}"`; + } + + return define; +} + +export async function createBuildConfig(args: IBuildArgs): Promise> { + const isAll = !!args.all; + let entryPoints: string[]; + + if (args.watch && !isAll) { + const { selectEntries } = await import('../select-entries'); + const result = await selectEntries(); + entryPoints = result.entryPoints; + } else { + const { entryPoints: eps } = syncDemoArtifacts(); + entryPoints = eps; + } + + const config: SameShape = { + bundle: true, + format: 'esm', + splitting: true, + color: true, + loader: { '.svg': 'file', '.ttf': 'file' }, + sourcemap: args.watch, + minify: false, + target: 'chrome70', + plugins: [ + ignoreGlobalCssPlugin(), + removeClassnameNewlinesPlugin(), + copyPlugin({ + assets: { + from: ['./public/**/*'], + to: ['./'], + }, + }), + stylePlugin({ + postcss: { + plugins: [tailwindcss as unknown as { postcssPlugin: string }], + }, + renderOptions: { + lessOptions: { + paths: [nodeModules], + }, + }, + }), + vue3() as unknown as Plugin, + ], + entryPoints, + outdir: './local', + define: createEnvDefinitions(args), + }; + + if (isReact16) { + config.plugins?.push( + aliasPlugin({ + 'react-dom/client': path.resolve(__dirname, '../../src/client.ts'), + }) + ); + } + + return config; +} diff --git a/examples/scripts/esbuild/build-tasks.ts b/examples/scripts/esbuild/build-tasks.ts new file mode 100644 index 0000000000..6e7b4f6836 --- /dev/null +++ b/examples/scripts/esbuild/build-tasks.ts @@ -0,0 +1,61 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import esbuild from 'esbuild'; +import cleanPlugin from 'esbuild-plugin-clean'; + +export function monacoBuildTask() { + const monacoEditorEntryPoints = [ + 'vs/language/json/json.worker.js', + 'vs/language/css/css.worker.js', + 'vs/language/html/html.worker.js', + 'vs/language/typescript/ts.worker.js', + 'vs/editor/editor.worker.js', + ]; + + return esbuild.build({ + entryPoints: monacoEditorEntryPoints.map((entry) => `./node_modules/monaco-editor/esm/${entry}`), + bundle: true, + color: true, + target: 'chrome70', + format: 'iife', + outbase: './node_modules/monaco-editor/esm/', + outdir: './local', + plugins: [ + cleanPlugin({ + patterns: ['./local'], + }), + ], + }); +} + +export function nodeBuildTask() { + return esbuild.build({ + bundle: true, + color: true, + minify: false, + target: 'chrome70', + entryPoints: [ + './src/node/cases/basic.ts', + './src/node/sdk/worker.ts', + ], + platform: 'node', + outdir: './dist', + define: { + 'process.env.NODE_ENV': '"production"', + }, + }); +} diff --git a/examples/scripts/esbuild/logger.ts b/examples/scripts/esbuild/logger.ts new file mode 100644 index 0000000000..cd1bdc32c8 --- /dev/null +++ b/examples/scripts/esbuild/logger.ts @@ -0,0 +1,90 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import process from 'node:process'; + +const supportsColor = !!process.stdout.isTTY && process.env.NO_COLOR == null; + +const ansi = { + reset: '\x1B[0m', + bold: '\x1B[1m', + dim: '\x1B[2m', + red: '\x1B[31m', + green: '\x1B[32m', + yellow: '\x1B[33m', + blue: '\x1B[34m', + cyan: '\x1B[36m', + gray: '\x1B[90m', + underline: '\x1B[4m', +} as const; + +type TLogLevel = 'error' | 'info' | 'ready' | 'recover' | 'watch'; + +const levelStyleMap: Record = { + error: [ansi.bold, ansi.red], + info: [ansi.bold, ansi.blue], + ready: [ansi.bold, ansi.green], + recover: [ansi.bold, ansi.cyan], + watch: [ansi.bold, ansi.yellow], +}; + +function colorize(text: string, styles: string[]) { + if (!supportsColor || styles.length === 0) { + return text; + } + return `${styles.join('')}${text}${ansi.reset}`; +} + +function formatLabel(level: TLogLevel) { + return colorize(`[${level}]`, levelStyleMap[level]); +} + +export function formatDuration(durationMs: number) { + if (durationMs < 1000) { + return `${durationMs}ms`; + } + return `${(durationMs / 1000).toFixed(durationMs < 10_000 ? 1 : 0)}s`; +} + +export function createLogger() { + function write(level: TLogLevel, message: string, method: 'error' | 'log' = 'log') { + console[method](`${formatLabel(level)} ${message}`); + } + + return { + error(message: string) { + write('error', message, 'error'); + }, + info(message: string) { + write('info', message); + }, + ready(message: string) { + write('ready', message); + }, + recover(message: string) { + write('recover', message); + }, + watch(message: string) { + write('watch', message); + }, + muted(message: string) { + console.log(colorize(message, [ansi.dim, ansi.gray])); + }, + url(url: string) { + return colorize(url, [ansi.bold, ansi.underline, ansi.cyan]); + }, + }; +} diff --git a/examples/scripts/select-entries.ts b/examples/scripts/select-entries.ts new file mode 100644 index 0000000000..54268e9c5d --- /dev/null +++ b/examples/scripts/select-entries.ts @@ -0,0 +1,128 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { DemoDefinition } from './sync-demos'; +import path from 'node:path'; +import process from 'node:process'; +import { fileURLToPath } from 'node:url'; +import * as p from '@clack/prompts'; +import fs from 'fs-extra'; +import { discoverDemos, syncDemoArtifacts } from './sync-demos'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const EXAMPLES_ROOT = path.resolve(__dirname, '..'); +const SELECTION_FILE = path.resolve(EXAMPLES_ROOT, 'entry-selection.json'); + +export interface ISelectionFile { + selected: string[]; + known: string[]; +} + +export interface ISelectionResult { + entryPoints: string[]; + selectedDirs: string[]; +} + +export async function selectEntries(): Promise { + const demos = discoverDemos(); + + if (!process.stdout.isTTY) { + const { entryPoints } = syncDemoArtifacts(); + return { + entryPoints, + selectedDirs: demos.map((d) => d.dir), + }; + } + + const saved = await readSelection(); + const merged = mergeSelection(demos, saved); + + const selectedDirs = await promptSelection(demos, merged); + await writeSelection(selectedDirs, demos); + + const { entryPoints } = syncDemoArtifacts(selectedDirs); + + return { entryPoints, selectedDirs }; +} + +export async function readSelection(filePath = SELECTION_FILE): Promise { + try { + if (!await fs.pathExists(filePath)) { + return null; + } + const content = await fs.readFile(filePath, 'utf-8'); + const parsed = JSON.parse(content); + // Backward compat: old format was just an array of strings + if (Array.isArray(parsed)) { + return { selected: parsed.filter((item): item is string => typeof item === 'string'), known: [] }; + } + if (parsed && typeof parsed === 'object' && Array.isArray(parsed.selected) && Array.isArray(parsed.known)) { + return { + selected: parsed.selected.filter((item: unknown): item is string => typeof item === 'string'), + known: parsed.known.filter((item: unknown): item is string => typeof item === 'string'), + }; + } + return null; + } catch { + return null; + } +} + +export function mergeSelection(demos: DemoDefinition[], saved: ISelectionFile | null): string[] { + const currentDirs = new Set(demos.map((d) => d.dir)); + if (!saved) { + return [...currentDirs].sort(); + } + const selectedValid = saved.selected.filter((dir) => currentDirs.has(dir)); + const knownSet = new Set(saved.known); + const merged = new Set(selectedValid); + for (const dir of currentDirs) { + if (!knownSet.has(dir)) { + merged.add(dir); // new demo, default select + } + } + return [...merged].sort(); +} + +async function promptSelection(demos: DemoDefinition[], initial: string[]): Promise { + const options = demos.map((demo) => ({ + value: demo.dir, + label: demo.title, + })); + + const initialSet = new Set(initial); + + const result = await p.multiselect({ + message: 'Select demo entries to start (a: toggle all, space: select, enter: confirm, esc: cancel)', + options, + initialValues: options.filter((opt) => initialSet.has(opt.value)).map((opt) => opt.value), + }); + + if (p.isCancel(result)) { + p.cancel('Operation cancelled'); + process.exit(0); + } + + return result; +} + +async function writeSelection(selectedDirs: string[], demos: DemoDefinition[]): Promise { + const file: ISelectionFile = { + selected: selectedDirs, + known: demos.map((d) => d.dir), + }; + await fs.writeFile(SELECTION_FILE, `${JSON.stringify(file, null, 4)}\n`); +} diff --git a/examples/scripts/sync-demos.ts b/examples/scripts/sync-demos.ts index 74c8fbab9e..75c75f7019 100644 --- a/examples/scripts/sync-demos.ts +++ b/examples/scripts/sync-demos.ts @@ -141,6 +141,10 @@ export function discoverDemos() { .filter((demo): demo is DemoDefinition => demo !== null); } +function filterDemos(demos: DemoDefinition[], selectedDirs?: string[]): DemoDefinition[] { + return selectedDirs ? demos.filter((demo) => selectedDirs.includes(demo.dir)) : demos; +} + function syncDemoHtml(demos: DemoDefinition[]) { fs.ensureDirSync(PUBLIC_DIR); @@ -189,12 +193,13 @@ function syncDemosModule(demos: DemoDefinition[]) { fs.writeFileSync(GENERATED_DEMOS_FILE, content); } -export function getDemoEntryPoints() { - return ['./src/main.tsx', ...discoverDemos().flatMap((demo) => demo.entryPoints)]; +export function getDemoEntryPoints(selectedDirs?: string[]) { + const demos = filterDemos(discoverDemos(), selectedDirs); + return ['./src/main.tsx', ...demos.flatMap((demo) => demo.entryPoints)]; } -export function syncDemoArtifacts() { - const demos = discoverDemos(); +export function syncDemoArtifacts(selectedDirs?: string[]) { + const demos = filterDemos(discoverDemos(), selectedDirs); syncDemoHtml(demos); syncDemosModule(demos); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 718be99f9e..e8aa67171a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,7 +110,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) common/debugger: dependencies: @@ -683,6 +683,9 @@ importers: specifier: ^7.8.2 version: 7.8.2 devDependencies: + '@clack/prompts': + specifier: ^0.10.0 + version: 0.10.1 '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -773,7 +776,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/core: dependencies: @@ -831,7 +834,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/data-validation: dependencies: @@ -856,7 +859,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/design: dependencies: @@ -954,7 +957,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/docs-drawing: dependencies: @@ -973,7 +976,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/docs-drawing-ui: dependencies: @@ -1041,7 +1044,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/docs-hyper-link-ui: dependencies: @@ -1317,7 +1320,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/drawing-ui: dependencies: @@ -1388,7 +1391,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/engine-render: dependencies: @@ -1493,7 +1496,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/protocol: dependencies: @@ -1512,7 +1515,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/rpc: dependencies: @@ -1531,7 +1534,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/rpc-node: dependencies: @@ -1553,7 +1556,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets: dependencies: @@ -1587,7 +1590,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-conditional-formatting: dependencies: @@ -1621,7 +1624,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-conditional-formatting-ui: dependencies: @@ -1759,7 +1762,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-data-validation-ui: dependencies: @@ -1845,7 +1848,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-drawing-ui: dependencies: @@ -1934,7 +1937,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-filter-ui: dependencies: @@ -2020,7 +2023,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-formula: dependencies: @@ -2054,7 +2057,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-formula-ui: dependencies: @@ -2134,7 +2137,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-hyper-link: dependencies: @@ -2162,7 +2165,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-hyper-link-ui: dependencies: @@ -2257,7 +2260,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-note-ui: dependencies: @@ -2331,7 +2334,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-numfmt-ui: dependencies: @@ -2405,7 +2408,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-sort-ui: dependencies: @@ -2488,7 +2491,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-table-ui: dependencies: @@ -2574,7 +2577,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/sheets-thread-comment-ui: dependencies: @@ -2764,7 +2767,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/slides-ui: dependencies: @@ -2832,7 +2835,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/themes: devDependencies: @@ -2857,7 +2860,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/thread-comment-ui: dependencies: @@ -2971,7 +2974,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) vue: specifier: ^3.5.34 version: 3.5.34(typescript@6.0.3) @@ -2993,7 +2996,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages/uniscript: dependencies: @@ -3058,7 +3061,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) tests/formula-integration: dependencies: @@ -3110,7 +3113,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) packages: @@ -3383,9 +3386,15 @@ packages: peerDependencies: storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 + '@clack/core@0.4.2': + resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==} + '@clack/core@1.1.0': resolution: {integrity: sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==} + '@clack/prompts@0.10.1': + resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==} + '@clack/prompts@1.1.0': resolution: {integrity: sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==} @@ -11864,10 +11873,21 @@ snapshots: - '@chromatic-com/cypress' - '@chromatic-com/playwright' + '@clack/core@0.4.2': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@clack/core@1.1.0': dependencies: sisteransi: 1.0.5 + '@clack/prompts@0.10.1': + dependencies: + '@clack/core': 0.4.2 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@clack/prompts@1.1.0': dependencies: '@clack/core': 1.1.0 @@ -12033,11 +12053,6 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.14)': - dependencies: - postcss: 8.5.14 - optional: true - '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.15)': dependencies: postcss: 8.5.15 @@ -14624,7 +14639,7 @@ snapshots: magicast: 0.5.3 obug: 2.1.1 tinyrainbow: 3.1.0 - vitest: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + vitest: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -14636,7 +14651,7 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.59.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 - vitest: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) + vitest: 4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -15599,15 +15614,6 @@ snapshots: cssfontparser@1.2.1: {} - cssstyle@5.3.1(postcss@8.5.14): - dependencies: - '@asamuzakjp/css-color': 4.0.5 - '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.14) - css-tree: 3.1.0 - transitivePeerDependencies: - - postcss - optional: true - cssstyle@5.3.1(postcss@8.5.15): dependencies: '@asamuzakjp/css-color': 4.0.5 @@ -17406,35 +17412,6 @@ snapshots: jsdoc-type-pratt-parser@7.1.1: {} - jsdom@27.0.1(postcss@8.5.14): - dependencies: - '@asamuzakjp/dom-selector': 6.7.3 - cssstyle: 5.3.1(postcss@8.5.14) - data-urls: 6.0.0 - decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - parse5: 8.0.0 - rrweb-cssom: 0.8.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - ws: 8.18.3 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - postcss - - supports-color - - utf-8-validate - optional: true - jsdom@27.0.1(postcss@8.5.15): dependencies: '@asamuzakjp/dom-selector': 6.7.3 @@ -20319,36 +20296,6 @@ snapshots: tsx: 4.22.3 yaml: 2.9.0 - vitest@4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.14))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.7 - '@vitest/runner': 4.1.7 - '@vitest/snapshot': 4.1.7 - '@vitest/spy': 4.1.7 - '@vitest/utils': 4.1.7 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.3 - tinyglobby: 0.2.16 - tinyrainbow: 3.1.0 - vite: 8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 25.9.1 - '@vitest/coverage-istanbul': 4.1.7(vitest@4.1.7) - happy-dom: 20.9.0 - jsdom: 27.0.1(postcss@8.5.14) - transitivePeerDependencies: - - msw - vitest@4.1.7(@types/node@25.9.1)(@vitest/coverage-istanbul@4.1.7)(happy-dom@20.9.0)(jsdom@27.0.1(postcss@8.5.15))(vite@8.0.11(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.87.0)(terser@5.47.1)(tsx@4.22.3)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.7