From 7463ee08053c3ce590ac51502561b287e32f1585 Mon Sep 17 00:00:00 2001 From: UltimeLam <35449771+UltimeLam@users.noreply.github.com> Date: Tue, 10 Nov 2026 20:41:33 +0800 Subject: [PATCH] =?UTF-8?q?feat!:=20=E6=94=B6=E7=B4=A7=E5=87=BA=E5=8F=A3?= =?UTF-8?q?=E4=B8=8E=E9=85=8D=E7=BD=AE=E5=99=A8=E5=A5=91=E7=BA=A6=EF=BC=8C?= =?UTF-8?q?=E5=8F=91=E5=B8=83=200.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `./tools` 移除 `require` 条件,全包统一 ESM-only(Breaking)。 - 依赖 `@ultime/studio ^0.2.0`:字段分合法域与建议区间,`min` / `max` 越界阻断导出,`suggested` 只提示。 - 配置器只缓存 core 原版派生(无 selection / derivation),`inspect` 返回副本,调用方改动不污染基线。 - 合同诊断:`error` 永不截断,非 error 合同提示最多 12 条并给截断摘要;`radius` / `duration` / `loop` / `delay` 增加非空校验。 - 包根文档统一命名(`SKILLS.md`),AI 文档、hooks 与版本戳同步。 --- .gitignore | 4 +- {.githooks => .vite-hooks}/pre-commit | 2 +- AGENTS.md | 29 +- CHANGELOG.md | 11 + DESIGN.md | 2 +- README.md | 4 +- skills.md => SKILLS.md | 4 +- agent.md | 49 -- llms.txt | 12 +- package.json | 20 +- pnpm-lock.yaml | 648 +++++++++++++------------- pnpm-workspace.yaml | 12 +- rules/01-architecture.md | 4 +- rules/02-tokens.md | 2 +- rules/03-testing.md | 2 +- rules/04-release.md | 9 +- rules/README.md | 2 +- src/contracts.ts | 12 +- src/studio/diagnostics.ts | 40 ++ src/studio/fields.ts | 79 +++- src/studio/index.ts | 49 +- tests/studio-diagnostics.test.ts | 49 ++ tests/studio.test.ts | 59 ++- 23 files changed, 638 insertions(+), 466 deletions(-) rename {.githooks => .vite-hooks}/pre-commit (95%) rename skills.md => SKILLS.md (97%) delete mode 100644 agent.md create mode 100644 src/studio/diagnostics.ts create mode 100644 tests/studio-diagnostics.test.ts diff --git a/.gitignore b/.gitignore index 2786f23..eaeab45 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,5 @@ coverage/ *.tsbuildinfo .DS_Store -# Vite+ 生成的 Git hook dispatcher(项目自己的 hook 在 .githooks/pre-commit) -.githooks/_/ +# Vite+ 生成的 Git hook dispatcher(项目自己的 hook 在 .vite-hooks/pre-commit) +.vite-hooks/_/ diff --git a/.githooks/pre-commit b/.vite-hooks/pre-commit similarity index 95% rename from .githooks/pre-commit rename to .vite-hooks/pre-commit index 9b0c13c..10376a6 100644 --- a/.githooks/pre-commit +++ b/.vite-hooks/pre-commit @@ -6,7 +6,7 @@ # · build.ts --check 在内存重算产物并与工作区逐字节比对; # · 检出不同步时改源后重跑 `pnpm build:tokens`,不要手改产物。 # 环境不具备(没有 node)时放行并提示,不算不合格。 -# 手动安装:pnpm exec vp hooks enable --hooks-dir .githooks +# 手动安装:pnpm exec vp hooks enable # ============================================================================ set -e ROOT="$(git rev-parse --show-toplevel)" diff --git a/AGENTS.md b/AGENTS.md index a3e09df..8bc576f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,20 +1,33 @@ # AGENTS.md — @ultime/core -> 给在本仓库工作的 AI 与协作者:只放入口与红线,不复述 README。 -> 适用版本:0.7.x +> 给在本仓库工作的 AI 与协作者:入口、可写 / 只读、红线与验收。 +> 适用版本:0.8.x ## 先读 1. [`README.md`](./README.md) — 用法、出口、产物与边界。 2. [`DESIGN.md`](./DESIGN.md) — 设计理念与数值出处;判断某内容该不该进 core。 3. [`rules/README.md`](./rules/README.md) — 本包开发规范。 -4. [`llms.txt`](./llms.txt) — AI 索引;能力表见 [`skills.md`](./skills.md),操作约束见 [`agent.md`](./agent.md)。 +4. [`llms.txt`](./llms.txt) — AI 索引;能力表见 [`SKILLS.md`](./SKILLS.md)。 5. [`src/build.ts`](./src/build.ts) — seed → 树 → 合同 → manifest 的唯一装配点。 6. [`src/tools/project.ts`](./src/tools/project.ts) — `planProject`:一次派生 → artifacts / manifest / diagnostics。 7. [`src/studio/selection.ts`](./src/studio/selection.ts) — 配置器选择模型:类别 / 档位过滤与定制产物。 8. [`src/studio/derivation.ts`](./src/studio/derivation.ts) — 配置器自定义派生:只调参数化引擎函数。 9. [`scripts/check-model.ts`](./scripts/check-model.ts) — 结构与依赖方向守卫。 +## 可写 / 只读 + +| 路径 | 条件 | +|---|---| +| `src/seed.ts` / `src/model/**` | 值或派生规则变更;必须有合同或测试 | +| `src/exporters/**` | 只改翻译写法,不改值与派生 | +| `src/tools/**` / `src/studio/**` | 工具层 / 配置器定义;不引入文件 IO 或 DOM | +| `tests/**` | 与代码改动同批 | +| `scripts/**` | 守卫或构建入口;不放业务逻辑 | +| `rules/` / `llms.txt` / `SKILLS.md` | 随版本同批更新 | + +只读:`tokens.css` / `tokens.json` / `tokens.dtcg.json` / `kernel.json`(生成物,改源后重跑);`dist/**`;`node_modules/**`。 + ## 红线 - **功能变更同批更新**:测试、README、`CHANGELOG.md` 与 AI 文档;没有功能性更新时只改文档并写明。 @@ -27,6 +40,8 @@ - **派生优先**:能由 seed 参数算出的值不写第二份名单;同一事实只保留一份。 - **不带载体语法**:模型只产出值、量纲与 `$type`;`px` / `rem` / `var()` / `color-mix` 只出现在出口。 - **不引第三方运行时依赖**:`@ultime/studio` 仅在 `src/studio/**` 使用。 +- **不放宽守卫**:不为让检查通过而改守卫或跳过;守卫缺口按缺陷登记。 +- **文档不抄数值**:数值从 `ultime schema --json` 或 `kernel.json` 查,不从 Markdown 抄。 ## 验证 @@ -36,8 +51,14 @@ pnpm test pnpm typecheck ``` -没跑或没跑通时,必须说明是哪一条、为什么。 +- 改了 seed / model:再跑 `pnpm build:tokens`,看产物 diff; +- 改了导出面:同步 `README.md`、`SKILLS.md` 与版本戳; +- 没跑或没跑通时,必须说明是哪一条、为什么。 ## 提交 一个主题一个提交;源与生成物同改同提。 + +## 不确定时 + +先查 `DESIGN.md` 的五问;仍不确定就停下来问,不猜默认值、不新造 token。 diff --git a/CHANGELOG.md b/CHANGELOG.md index a4697fd..41222a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## 0.8.0 - 2026-11-10 + +- **Breaking**:`./tools` 出口移除 `require` 条件,全包统一 ESM-only;不再承诺 `require('@ultime/core/tools')` 这条 CJS 路径。 +- 配置器只为 core 原版配置(`THEME_DEFAULTS`,无 selection / derivation)缓存一份派生,进程内只算一次;用户自定义配置每次独立派生。`inspect` 返回的 manifest / counts / diagnostics 是副本,调用方改动不会污染基线。 +- 配置器字段区分**合法域**与**建议区间**:`min` / `max` 越界给 `error` 并阻断导出(API 侧防乱传),新增 `suggested` 越界只给 `warn`;core 字段按安全边界重新分配(alpha 0–1、档数 ≥ 1 等为合法域,常用取值落在建议区间)。 +- 合同补齐结构非空校验:`radius` / `duration` / `loop` / `delay` 档数为 0 时判失败并阻断导出。 +- 合同诊断不再整体截断:`error` 永不截断,非 error 合同诊断最多展示 12 条,超出追加 `core/contract.truncated` 摘要,避免阻断判定被截掉。 +- 收紧 npm 包内容:`AGENTS.md`(含可写 / 只读与操作约束)/ `rules/` 留仓;`llms.txt` / `SKILLS.md` 作为消费侧 AI 入口随包发布,并与 `exports` 对齐。 +- `README` 补 AI 入口与 ESM-only 说明;`DESIGN.md` 的玻璃条目改为只描述归属,不带实现状态。 +- `engineVersion` 保持 0.7.0(派生结果未变)。 + ## 0.7.0 - 2026-11-09 - 新增 `@ultime/core/studio` 无头选择 API:`selectBuild` / `selectTree`,按类别与档位从完整树导出定制 tokens。 diff --git a/DESIGN.md b/DESIGN.md index b997ede..c60f47a 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -96,7 +96,7 @@ | 图表分类 / 连续 / 发散色板 | 组件层 / 风格包 | 与状态语义混淆,属独立维度 | | 交互反馈改几何 | kit / 风格包 | 状态反馈恒定几何是上层契约 | -**玻璃是唯一例外**:它作为填充角色进入 core(`blur` + 透明度,待实现),不算材质轴;渗色、噪点与其余材质仍归风格层。 +**玻璃不单独成轴**:它只是填充的一种(`blur` + 透明度),不算材质轴;渗色、噪点与其余材质仍归风格层。 判断口诀:**它是「值 / 参数」还是「用法 / 策略」?** 值进内核;用法归语义表或组件层。 diff --git a/README.md b/README.md index 5e3c51d..3e9f16b 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ pnpm add @ultime/core Node.js >= 22.18。内核的 `.` / `./exporters` / `./tools` / `./seed` 出口是编译后的 JS,零第三方依赖; `./studio` 出口(配置器)依赖 `@ultime/studio`,`ultime` bin 依赖 `@ultime/cli`;不用配置器 / CLI 时不会进入你的产物。 +所有出口 **ESM-only**:用 `import` / `import()` 消费,不提供 `require` 入口。 + ## 快速开始 ```js @@ -315,7 +317,7 @@ pnpm build:tokens -- --seed path/to/theme.json - 机器入口是 `kernel.json` 与 `ultime schema --json`;不要让 agent 从 Markdown 里抄数值。 - 完整设计规范(取值理由、对比度与配对判据)不随包分发:安装 [`@ultime/designcraft`](https://www.npmjs.com/package/@ultime/designcraft) skill(`npx skills add ultime-space/skills --skill designcraft`)阅读。 -- 在本仓库内工作的约定见 [AGENTS.md](./AGENTS.md)。 +- 包内 AI 入口是 [`llms.txt`](./llms.txt)(路由)与 [`SKILLS.md`](./SKILLS.md)(能力表);`AGENTS.md` / `rules/` 只在仓库内维护。 --- diff --git a/skills.md b/SKILLS.md similarity index 97% rename from skills.md rename to SKILLS.md index 79e1c22..3124148 100644 --- a/skills.md +++ b/SKILLS.md @@ -1,8 +1,8 @@ # @ultime/core · 可调用能力 > 定位:AI 可调用的入口、产物与错误语义。字段清单以 `ultime schema --json` 为准,本文件不手抄。 -> 适用版本:0.7.x -> 同步基线:0.7.x(手写;导出面或 schema 变化时同批更新) +> 适用版本:0.8.x +> 同步基线:0.8.x(手写;导出面或 schema 变化时同批更新) --- diff --git a/agent.md b/agent.md deleted file mode 100644 index 6716b19..0000000 --- a/agent.md +++ /dev/null @@ -1,49 +0,0 @@ -# @ultime/core · 操作约束 - -> 定位:AI 在本仓可以改什么、不能改什么、改完怎么验。与 [`AGENTS.md`](./AGENTS.md) 分工:这里只写操作边界。 -> 适用版本:0.7.x - ---- - -## 可写 - -| 路径 | 条件 | -|---|---| -| `src/seed.ts` / `src/model/**` | 值或派生规则变更;必须有合同或测试 | -| `src/exporters/**` | 只改翻译写法,不改值与派生 | -| `src/tools/**` / `src/studio/**` | 工具层 / 配置器定义;不引入文件 IO 或 DOM | -| `tests/**` | 与代码改动同批 | -| `scripts/**` | 守卫或构建入口;不放业务逻辑 | -| `rules/` / `llms.txt` / `skills.md` / `agent.md` | 随版本同批更新 | - -## 只读 - -- `tokens.css` / `tokens.json` / `tokens.dtcg.json` / `kernel.json`:生成物,改源后重跑; -- `dist/**`:构建物,不手改、不入库; -- `node_modules/**`。 - -## 禁止 - -- 在 `src/model/**` 引入第三方运行时依赖; -- `model` 反向 import `build` / `exporters` / `tools` / `studio`; -- 类别之间互相 import; -- 在模型里写 `px` / `rem` / `var()` / `color-mix` 等载体语法; -- 把语义角色、布局、目标尺寸、交互反馈塞进 core; -- 为让守卫通过而放宽守卫; -- 用 Markdown 里的数值替代 `ultime schema --json` / `kernel.json`。 - -## 验证 - -```bash -pnpm check -pnpm test -pnpm typecheck -``` - -- 改了 seed / model:再跑 `pnpm build:tokens`,看产物 diff; -- 改了导出面:同步 `README.md`、`skills.md` 与版本戳; -- 交付时说明跑了哪些命令;没跑或失败要写清哪一条、为什么。 - -## 不确定时 - -- 先查 `DESIGN.md` 的五问;仍不确定就停下来问,不猜默认值、不新造 token。 diff --git a/llms.txt b/llms.txt index e7c6451..8c5df44 100644 --- a/llms.txt +++ b/llms.txt @@ -1,25 +1,21 @@ # @ultime/core · AI 索引 -适用版本:0.7.x +适用版本:0.8.x ## 去哪找 - 怎么用:[README.md](./README.md) - 为什么这样设计:[DESIGN.md](./DESIGN.md) -- 开发规则:[rules/README.md](./rules/README.md) -- 可调用能力:[skills.md](./skills.md) -- 操作约束:[agent.md](./agent.md) -- 仓库入口:[AGENTS.md](./AGENTS.md) +- 可调用能力:[SKILLS.md](./SKILLS.md) ## 机器入口 - 快照与合同:`kernel.json` - 字段 / 出口 / 语义表:`ultime schema --json` -- 产物同源:`pnpm build:tokens --check` -- 全量校验:`pnpm check && pnpm test` +- 产物同源:`ultime build --check` ## 边界 - 只给档、参数与合同;语义表、布局、目标尺寸、交互归上层。 -- 不手改生成物;改 seed / model 后重跑。 +- 不手改生成物;改 seed / model 后重跑构建。 - 数值不抄进文档;需要时跑查询命令。 diff --git a/package.json b/package.json index 23c483c..8e3cdd0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ultime/core", - "version": "0.7.0", + "version": "0.8.0", "description": "Ultime · core:平台无关的设计系统内核(seed → 树 → 快照);Web 的 CSS 只是它的一个出口", "keywords": [ "color-system", @@ -35,14 +35,11 @@ "theme.example.json", "README.md", "DESIGN.md", + "llms.txt", + "SKILLS.md", "CHANGELOG.md", "CONTRIBUTING.md", - "SECURITY.md", - "AGENTS.md", - "rules", - "llms.txt", - "skills.md", - "agent.md" + "SECURITY.md" ], "type": "module", "sideEffects": [ @@ -63,8 +60,7 @@ }, "./tools": { "types": "./src/tools/index.ts", - "import": "./dist/tools.js", - "require": "./dist/tools.js" + "import": "./dist/tools.js" }, "./seed": { "types": "./src/seed.ts", @@ -90,17 +86,17 @@ "typecheck": "tsc -p tsconfig.json --noEmit", "test": "vp test", "prepublishOnly": "pnpm check && pnpm test && pnpm build", - "prepare": "node -e \"if (require('fs').existsSync('.git')) require('child_process').execSync('vp hooks enable --hooks-dir .githooks', { stdio: 'inherit' })\"" + "prepare": "vp config --no-agent" }, "dependencies": { "@ultime/cli": "^0.1.0", - "@ultime/studio": "^0.1.0" + "@ultime/studio": "^0.2.0" }, "devDependencies": { "@types/node": "^22.20.5", "tsx": "^4.23.15", "typescript": "^5.9.3", - "vite-plus": "1.4.0" + "vite-plus": "1.5.1" }, "engines": { "node": ">=22.18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9066195..354b9b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,8 +170,8 @@ importers: specifier: ^0.1.0 version: 0.1.0 '@ultime/studio': - specifier: ^0.1.0 - version: 0.1.0 + specifier: ^0.2.0 + version: 0.2.0 devDependencies: '@types/node': specifier: ^22.20.5 @@ -183,8 +183,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vite-plus: - specifier: 1.4.0 - version: 1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3) + specifier: 1.5.1 + version: 1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3) packages: @@ -369,289 +369,289 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@oxc-project/runtime@0.155.0': - resolution: {integrity: sha512-VbW9raczGS5ZZ1FMunUBYHe4uV/R684qlQCoMdE3n5JT1PcqQsvmFpMYkF8AD+W04fBLGAq6Tr7YsTk0jjvDBA==} + '@oxc-project/runtime@0.157.0': + resolution: {integrity: sha512-srnUknwVoji5JdmU664pA4XyjBJXmgxP8rWlnZhFovzw6XQxaICGWAuScZdlLmIHI+ZRc7WgeiC2CURF4tAszQ==} engines: {node: ^20.19.0 || >=22.12.0} - '@oxc-project/types@0.155.0': - resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} + '@oxc-project/types@0.157.0': + resolution: {integrity: sha512-95iTox1qdt6WGWce3xwNOVayByOfLaYAq+qGPpub6NWbBh9sv0GG3+zyfh9ZBCO/jVu5A0EWI+qQI7g6fevjxg==} - '@oxfmt/binding-android-arm-eabi@0.74.0': - resolution: {integrity: sha512-xxQwrf5EPI5zxvuCTW8r6tzCTjPQ+h6+HqJ0iRKRy2zS1yBllt/xLVjoIyUc+FnR7g0a5g1SZv2yyDYhTItLbA==} + '@oxfmt/binding-android-arm-eabi@0.76.0': + resolution: {integrity: sha512-z8x4kittQLPsrJWmfoIJyYqs2gNwceGShoUqAJdFRPw3K4kkkKCFHh3Cr4NFRvZb7DPfDS3+JfBjSm3OIyQaJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.74.0': - resolution: {integrity: sha512-FJW3sATVvrWbV64al8xofCPZj4500Z/1W0ad7Tg1rcCUyh0EMbuSrsf3jsZS7CEbwQ5fQ0mRhmkc129GFgofSQ==} + '@oxfmt/binding-android-arm64@0.76.0': + resolution: {integrity: sha512-Zj9fEQhQSKGj8ZTB+X4q4ho4545xWf7qsvJpwREWnBz5BATEFYtStKRgiwYOZvxQ7ORlBEgSj7pmDzuljfV1mQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.74.0': - resolution: {integrity: sha512-TfmNKBD30dGyMu9GCLiaw2rt/z7fms9LS+5cKcNOyWst0QgAs8oZs6wPxMbVaaDVE0/PCdCosgWM1vbu6f5NUg==} + '@oxfmt/binding-darwin-arm64@0.76.0': + resolution: {integrity: sha512-jZy8GpUXaWpic5JPMAvLmaBz95Sx0naZl6hptBPLOMiYmZYiME7jAt6pv8o/tjQqPNWKb+7jKzZhrYx6UqM5MQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.74.0': - resolution: {integrity: sha512-5Usf8+DfC4Q3o/MD8FkN47GrI6y0KbhQ4KhZ2HGzMZcXjcW1AeldwbUn51aKih+1TVuJFF9qkNm6X1nzm6NYng==} + '@oxfmt/binding-darwin-x64@0.76.0': + resolution: {integrity: sha512-U59+a9lVpoRp9enRhTE9GssL3qB1k09CYagRzTfs3dfknopMYV0x0xHZv7Pls3SNMqHlyHR+ufmY76CYafQoLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.74.0': - resolution: {integrity: sha512-eL+1O3gykw1XihbZh2MRAciQvU2988LByrnjhyo/dmNG74X4oZ7XzigRoWPRFLfJCp8hzRkp/LbEhwe7uuT2eA==} + '@oxfmt/binding-freebsd-x64@0.76.0': + resolution: {integrity: sha512-J1R3YJHPdQJ2RQvzMdTVDWyizhihGiRGGAeEZxtGp629j5pcT5ypSLSiBflopD7o7tmiMD+xlNfhIVmjcHKMVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.74.0': - resolution: {integrity: sha512-Xt0QtO2hJ4stnul8IL4LJGVLyp0xnc6ccN9fZ30yuubv8FWSRYxWwd1Za62KsEqAfmPSazoS/cLSUUJpja6npA==} + '@oxfmt/binding-linux-arm-gnueabihf@0.76.0': + resolution: {integrity: sha512-x9qTg6zHoqeyzmFVlIjSb9WlhZdoXaayMTeQeDeUEfKA484AgPJz7f9chLjDMONA6wUUX0FJxnVHsYgX5Zv0+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.74.0': - resolution: {integrity: sha512-/4wYQ0gZl4vUR0QoBTGaay73FmQ1GAjUa9z9101TR2xbGNrg4a+grazlR0yzEOe3/E+PJr5BGfj66MMzm/54vg==} + '@oxfmt/binding-linux-arm-musleabihf@0.76.0': + resolution: {integrity: sha512-303gbamm7NDllTtkeaX+8F5Da+KcSBr64mqELQEFg9XgnjfLX3YBCHUcOfgIlVTSybesy43eoeKai8oGr0P6UA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.74.0': - resolution: {integrity: sha512-846bKzF+HJd+JkOFh3rxzmYvSq4Cm+GMT+p+mW7S13ZYo6GAAGv8bL8cAOi/XcdeMqxEJDCIMTVQLVBXHMCdig==} + '@oxfmt/binding-linux-arm64-gnu@0.76.0': + resolution: {integrity: sha512-j3UAXzCJoWX9bZLaICj6DfwkI/2fzja9RpiCIbIN+2CQAcKoY+5SH5pQUcECvn32mQm17NSPE9YqTAwYx1seZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.74.0': - resolution: {integrity: sha512-nI5FJwZ4Flo6CBdscpwxymZXxO3m3IErQJX55ZS6h+ObfGXu8FostL85L/RWPFaCLnIVE4/WfLw+2q8XvVEeUA==} + '@oxfmt/binding-linux-arm64-musl@0.76.0': + resolution: {integrity: sha512-qFZqWVkEzuxWMtUkCtHxsnohXHnUMBQr/ZIxF0KmlCSt8de/bc1lbpVgpqjb3QxCADQHG/O1s3JcowcBF2sqdw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.74.0': - resolution: {integrity: sha512-BoQYKuqUdsKAFAkK6DLBvkdv4+t0hppSm79sB0wIcE2o/eOwNj+6Z3OlKY4q3Eta/tlssP65FaS9vHn8TeF7vQ==} + '@oxfmt/binding-linux-ppc64-gnu@0.76.0': + resolution: {integrity: sha512-ROiAid0UH2GN5lMMX2JTgKlOKx1rN+6a1WxIuBsU3j5A3MuB9U5XkREMW76XBbAImnH45mfOCFcSIwb+drcVYg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.74.0': - resolution: {integrity: sha512-FSroRrM12+jCdSQklF9aOxsKpI6wFs4ZCo/1cSYG80RWZS6z4LV+l9tXRMT8lDGu+yohIZBwi9M76FzGPFDE2A==} + '@oxfmt/binding-linux-riscv64-gnu@0.76.0': + resolution: {integrity: sha512-Oyd/9ObdM2RYkZ7yzF/GyvVdbNgJcRG8BFVwnAVo3ooqzaem4E2p5eTIGB09FecQD+Q5HQEANOTEnIZTO6rBAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.74.0': - resolution: {integrity: sha512-0VLQD0dhGBLY9Ik/w+otMvD81D0YXi4VDwql65macV+O9UzmSWmUr6CKf+dMtysDeC0PnG3y6kBkRO08BJx52g==} + '@oxfmt/binding-linux-riscv64-musl@0.76.0': + resolution: {integrity: sha512-86DOpmPDR5UzHSOB8y5HlOpYAIBtMx+6L72IyousNx54q1Kz61aykB4ScovFYivZUak+7Ww6tPBUjarluzYKLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.74.0': - resolution: {integrity: sha512-6X7BbZNz34+OHM6Oqjf6TRcUyRn6aRcB4VtIDZAF/uQRyeVhg+G2hv6MlMvmnRekVSyTJ/8rG/u8W2dRFW6glg==} + '@oxfmt/binding-linux-s390x-gnu@0.76.0': + resolution: {integrity: sha512-u6omjjFooKfnHLBI+3UtBVInAeuEhoM/RAIw/OiFop2QQgOan5zDfqPR6guMaylt68L60kV+by07Ibp87KDjrw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.74.0': - resolution: {integrity: sha512-4kYIQK53yJXrxwxSzx8H2bojlf6/KezLGYLRXzV9QCCkoiCsvBTCid9Bg83dUPTLPa3g9K0730f6MKDbck1+OA==} + '@oxfmt/binding-linux-x64-gnu@0.76.0': + resolution: {integrity: sha512-L0/hW1MdMrgsvuLGp9YEQOYOGj5xPHa8wVRtybdd5av03PV4qSpAq3pyfC7sn7UCA8ynRhMRTAa9Kr9nV4LGZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.74.0': - resolution: {integrity: sha512-MfWz4wDREjp/JQDmuxtKieix4FHGa1z5rBvB3betdcPwZvf5fqeQrlCm1mmoyuUVQOh9Pt3M61HwN94kJCxw7Q==} + '@oxfmt/binding-linux-x64-musl@0.76.0': + resolution: {integrity: sha512-JNk/7HaPDJjy5kih3vq6b71Qif3tHx1ZFACGBzeHeNzyKaIpar4eFGya89GR398K2rwX0eEVmEq1npBPlEkkmg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.74.0': - resolution: {integrity: sha512-6rmAApkq5s1kbDjvNI6Nl5A+JqQkLORb2sR941pf5HWsrd01WGKyagK/B4vX9+kh1FfvRkNgEu59FHvVk4H8cQ==} + '@oxfmt/binding-openharmony-arm64@0.76.0': + resolution: {integrity: sha512-MDLrOQPXDuPKvPUCvpP3hC6kO72dsYxfpYiR08Nf5DiM75M0d8+D26JwT4uHDf0bcflvlGHcd58Hn2HpxkHUUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.74.0': - resolution: {integrity: sha512-+5SpRUnZNGeXTyumHnpHa791tQtt04qZs076WT8eTcGF2OJ631VLnf7S0kQSPuDG+PtJM0phadEB2WAr5n1w9g==} + '@oxfmt/binding-win32-arm64-msvc@0.76.0': + resolution: {integrity: sha512-2CcICDrQKqMAOFuzmts/8Ov5iKb+DW/QrW4MFsl2bnRg86uoiUvtqUkHqNSY19Shegc8pBHiXMSEHDjIg94o0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.74.0': - resolution: {integrity: sha512-1Fg+wYBO3Dsti1QX+/6EYHjeQzLC84tLOAqPu/r7ah3UJlUs9C/DB703Ay9Vcg+8VMzqZA2P5VGhzJraVUD4OQ==} + '@oxfmt/binding-win32-ia32-msvc@0.76.0': + resolution: {integrity: sha512-NjZLJg+tQpMWVSyeWBBKCpib7H/uLq84ZzxCvY5eqHzSaItuzCECGA9MBiZwmW8fnkBIfppg49Ib//LSCGAp8Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.74.0': - resolution: {integrity: sha512-y9jXUgPBm2TZIWbQhMYRRYAQM57+r4fbykgc+j24ICIIZl+pcuoNhnq1CRGm3oFiHnEUnZO00qOtSPGQdJ2ziQ==} + '@oxfmt/binding-win32-x64-msvc@0.76.0': + resolution: {integrity: sha512-0vCMaX/qloc7uaKBDRh+62SBW8EqmhS7c8/al+PxD594ao4lyEWdcoEmVoBgnCNVW07GDpg+9uPV7x6ta9mljw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@7.0.2004': - resolution: {integrity: sha512-uJk3ttju7Lz+Nv8WG4CsLyewoL1qf/Ny8S8OksJ7Bm/F14Tc9gMfW6arM1PCc57IzH/X/I79YsCWTgxX1FKibQ==} + '@oxlint-tsgolint/darwin-arm64@7.0.2005': + resolution: {integrity: sha512-VqDZxcZVjlonNLuuvraVNgDQt+1ndwa4yJo8OqsK4HYh/61ba9IlMStCVfi/aaIqRoDhNbAKC8gdcTrXqnb+Ug==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@7.0.2004': - resolution: {integrity: sha512-0BFfHTzDxNDFPcu0UZAXT6CyCJHAXM0dZveyDb4KEHa2qF/DSnOKOrmvK/wFuFol9kvijbGM9JfuOsor+zWXRw==} + '@oxlint-tsgolint/darwin-x64@7.0.2005': + resolution: {integrity: sha512-4kUfLRNYoVpv0Tm3jPYrvxyfOc/LmdvFC3pKZ4tL6K7lA7K/VS81SAtmxRzbYXYSyb3SBWhwsuX+df4neqzxxA==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@7.0.2004': - resolution: {integrity: sha512-TAehQc+qdRXyDN3nl/r/3/oPrBVrbtrDeGMkFyG6mf+XphpoJ2lAMVFLclyvrVZCw02RbKROjyw8h72XwQQHcw==} + '@oxlint-tsgolint/linux-arm64@7.0.2005': + resolution: {integrity: sha512-rhUNcPsBlKvhXtrbhbBUidtRBRdJ8fbEHN9H5Q5N59gby18ruGuDA7KUxl7oRnUzp797uykYQhkBDm+0KpfK/Q==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@7.0.2004': - resolution: {integrity: sha512-LPunZvm6ZbWPfHMAyfZf9ci3HHvNEzLejO8zdqO3GoVGoSEHqqufHUD7+OgeatVSaJP7uXDJ2HaNOHIoH7go4Q==} + '@oxlint-tsgolint/linux-x64@7.0.2005': + resolution: {integrity: sha512-tKs9yinDQZOHygM0e8EJnjTU3mzJtdfkOZP6Udu82iLMePUSHOhTJ9zzU/mSd1hQxURI4LTRRiFhfzC+PzwdNA==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@7.0.2004': - resolution: {integrity: sha512-FVWplzDImWhiuawnIZVETaQecv4GWom6Jv4Fx2xj7hhXXDZ5okEgiw1gTCImHTIQsi2ycC5oSxVwrn69bMh7iw==} + '@oxlint-tsgolint/win32-arm64@7.0.2005': + resolution: {integrity: sha512-VYPnu1gjfbSv+ROhuyNfMs382D4zQU2ZRc8Uc3nuEZo1k2kf+1KfTrg4hrlWh73h9GI+dUWyo+DYCQzUBlPwcQ==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@7.0.2004': - resolution: {integrity: sha512-7PsxuUx11Ry9DYTWcljTzRbmZY9B6O9fFFfZV+aodQEMy6pfRT3fhoQRv9PtGN/89z1pPz3nFKrsFm6WqNtX7w==} + '@oxlint-tsgolint/win32-x64@7.0.2005': + resolution: {integrity: sha512-ekU89cTGy9fpQzuvxIsFHrnoP8XoFjGIRgPEW6eqgY2NYjGy9pwpjF79o04WXRMJFKRrcaVqkZXUUBdLsqpQDw==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.89.0': - resolution: {integrity: sha512-Pflpba5F3gRAQ12sWglRxvWTHEdAusNDvmi4Y5N1T5SY1AGkM7AixOnET8qkrnLJ/F32qAlNokO6eCknT8tmnw==} + '@oxlint/binding-android-arm-eabi@1.91.0': + resolution: {integrity: sha512-eOqJUUS1MCqIoUUxMIkuwaqIdKaHr1SXYA0CQI95UUrF8jwQylQH33bBmnqhZfvWXKlRB2Ylx/+Sbk/ctEqzZQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.89.0': - resolution: {integrity: sha512-dYmyD1x7LaPlb79vZWUcpTShk8dI9z1I+IubtqrBxWNJaDhQdPHwcsvg7q5StTU4xWyd9AwPfLaTYFZY8NZgtQ==} + '@oxlint/binding-android-arm64@1.91.0': + resolution: {integrity: sha512-vIJU4lRxK0EhbBt+iR3rkq3pio4I+V5Gshwjei3plNjN+CIq0WxWHzYVI06J9KN8Ar3hyNSFtzJAjVRLZOYpjg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.89.0': - resolution: {integrity: sha512-Z/oxOPiIqiS7fItRdxaaOEC+6GD3OpGi0IxoR0dMefzQHolsKLzScw2DNcu/5gUPok3tv+G9mslvYB5bo3i0qg==} + '@oxlint/binding-darwin-arm64@1.91.0': + resolution: {integrity: sha512-tLy76MurwAOpQt5QVMkJUgexBSWhB7qdvAYb14bc0xntZS6f55aKicbZoxZ/QlmAbnrdlXeD5+IjwY8EZ9RWTg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.89.0': - resolution: {integrity: sha512-eAjTkHSjAxrdCPJxO6y5sPQL5pYLKb2kvxZz9UU7tXnOZk9I/HLtkvx9S7GHY883k+AmL/eC7mqFt+w7WCwk0w==} + '@oxlint/binding-darwin-x64@1.91.0': + resolution: {integrity: sha512-zPeMmjAqm5vXxbTp/JqYuc9gGSbUuEaeCAkFHB4TCRLTlfJGD//Fkx03YvZHCHZJ7ideLiiLcae+3f2I27qnaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.89.0': - resolution: {integrity: sha512-0lNCA9Tl1n1FKpqy2/9ckp0kIuSrtJ/l9bMRgaEhOtM7TsOHshFuwOcvW8oA9teXLMOJT61LjEKWiaHDFGxF/w==} + '@oxlint/binding-freebsd-x64@1.91.0': + resolution: {integrity: sha512-psOR9+xGMXn0hj4KY5M2kjSQ1n0TCMdYbPOraoV0iQyl7mw2oBBYGUM2+ma40m1YLVrktTBOta4FjrmcOHDhrg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.89.0': - resolution: {integrity: sha512-OTFEvi9W+JczaZD1Caj17SGCoW8H7TE+fvx0D7ATEWa1Lohn91UMxFQ6r145SiGy/yCxeIwptMys/RAM7gSVSQ==} + '@oxlint/binding-linux-arm-gnueabihf@1.91.0': + resolution: {integrity: sha512-1PNA1j4ETxawvxfz6ueDxWgQgWkXPbv44DWZmC7LR07GqojGFDOwWbosOT6/AYiJr7zMXEhn2dPWMkyFFOFpUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.89.0': - resolution: {integrity: sha512-fRxgNHvBLswj6MrhW2uBq5UDhPRQlCbHeq/Nf8yuG9zOxhDsXqX/mi2PX1axgsQxMm88el7HLiJAzglAnflYxw==} + '@oxlint/binding-linux-arm-musleabihf@1.91.0': + resolution: {integrity: sha512-jcNePVpca37lTbHmiPMnVbPAAW0rH9kAoDjsDv6vESEX9pzazIR1q5SyYuc1rQzdjHtc2VVCDN9jDh6tHcOHyA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.89.0': - resolution: {integrity: sha512-v9ENzHvwrQoYSWTtviH1pOYc7R9UovDxVofnck50cNmPihRRTcrg5X0UlRbLOZ7IVtxPOlh2hb7kDO+FpE8SfQ==} + '@oxlint/binding-linux-arm64-gnu@1.91.0': + resolution: {integrity: sha512-TJi78UX6R+9qZ23ZKtzN6adfW83bjY0NXsCRMBRH6H7IizaMXmZbdRAtjedMkx77bT46YQH0csawsY9lwha8MA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.89.0': - resolution: {integrity: sha512-vfffe8mQ484AzVadlUOFpgL+JDwhvs9hrzxTgQP1FVfi4ZEUUYeffXlzC9dFV7Dgnu5s/KrNKvfmG6HxBd/ISQ==} + '@oxlint/binding-linux-arm64-musl@1.91.0': + resolution: {integrity: sha512-OowlLroUTzKq5OBvbu6iegch8SJ2DivXFCukzPWURwvcJhMj7/P0CUGH5qrDlxT1Kh48dcxqYqrvE8qK6xTLKQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.89.0': - resolution: {integrity: sha512-Buonlp4hVS7RGNP5M7bPpGNQrenyzA2C64JcO/oz9C1c6dGOXJ7VEAnaiAMY7voou0JYyCJdvDVlFQc5DZX3DQ==} + '@oxlint/binding-linux-ppc64-gnu@1.91.0': + resolution: {integrity: sha512-QF/5Ge8yGpWg5s4awMNHfVKh1WOmk591Qg082i6CHenXYBa+W1E5RwWZXaKUOw4Ko7CCjqg3TfBc0AzhnqblYg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.89.0': - resolution: {integrity: sha512-1eVwJJrJ3lYIPT+cm7BcBBZZXY6IQZP/oyonaruTor/MrVyWOpvnwt1oD5CLdsHg5aVBIxXodQSvt+1gK6ck5w==} + '@oxlint/binding-linux-riscv64-gnu@1.91.0': + resolution: {integrity: sha512-dXlsKlNhzJQX1nageGKnvWe1D7uTng249hQM80CG/YPZ8F/VZHbxVLhImgurdWBOmu86XOemValLjrW6QIOM/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.89.0': - resolution: {integrity: sha512-fRQQsKUGShdEL5Fl9o9uhj3grkZbeXKLv0icQ5tspUCNYSDy8wzzEcP1WC2bKdTQ0rSszbKlO3iiHORxV22DLg==} + '@oxlint/binding-linux-riscv64-musl@1.91.0': + resolution: {integrity: sha512-tznkj5VrWNRUfymkaLcJetgMLbP9suL5ob/m7j0Fdbnm5u3Li/Ezo/YcBixiuwdL1sg0oGpyTe86It0J6T+Lxg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.89.0': - resolution: {integrity: sha512-dEtYjIy6+fHcjKklsmtmMkZRhwHr2UbzjmpvuPtQYSeN9awQ2hx5JLms5Wvri+8P/NZtD8v5hfgHALUql+/Ycg==} + '@oxlint/binding-linux-s390x-gnu@1.91.0': + resolution: {integrity: sha512-sNvfLiUYQkVsLNUgIW24AEYTHSd2zZ1vAxXssPdjuQHTtCpRvQihYri6d5z5FY7w/QrcnB5+g9E+/sqmZq8tfA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.89.0': - resolution: {integrity: sha512-hqjwIj5KOYM8Wjef/p7IruNi1iByLhSzbMBk62y22P/E8q7Jj0Pp+DeUTKTRYyZYCDtU1wEGlnWOnttHbyNIww==} + '@oxlint/binding-linux-x64-gnu@1.91.0': + resolution: {integrity: sha512-eA25ETvimhUZ89y5BcunNY7yv7qwG2I7V7dFQAU+mIEqZ57gBCXdIERl0yXOEt43zjsw0yK2gRKTc+twF706wQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.89.0': - resolution: {integrity: sha512-iAQN3e6o9UgUCcdGwqRx/jYcKbG3HK7ur3rH6lTqVcQeNGZ85AeWIg6cgn/edwFQ0ofEZZItMwkzyCVTahnvEA==} + '@oxlint/binding-linux-x64-musl@1.91.0': + resolution: {integrity: sha512-4hZ4Z9K+OkcTpAHDoUTMg/8MModbM0aocrl9KnGzp9h5iKqjrXraEUZorYoVCT7xoK93CAHXgTndxRBrOjH/fA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.89.0': - resolution: {integrity: sha512-MNxjEByz3N/7Q4qFQuPWvc14TpN9LoD3pECEDsJTZbP/wyB7U+hduUXEl7QAbbgVezFwsb9sWtNUO6XVBndOhg==} + '@oxlint/binding-openharmony-arm64@1.91.0': + resolution: {integrity: sha512-gtqn4b0kLpGe46Qh7NHiR86wZpd+TLaesO106s7V3RG33r63VB94LW5qPKEDJX64osh3xfjnPFn1M0484bC7wQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.89.0': - resolution: {integrity: sha512-xxe+i9wfuFso/VnoL4mfj0UlzE+cfCFiUB06vkXCMyQdgVVmItF5FfAF4tATAktSU6uHruWR+FjqvAT9cHZZzg==} + '@oxlint/binding-win32-arm64-msvc@1.91.0': + resolution: {integrity: sha512-KQItBdsyHN28U3z/bEek6h9pvG3Uqv564QYO8K1bE/V7YRZgpHlRnfNKVPHkk4sfYKyPzEjCgW80QkImOLvJog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.89.0': - resolution: {integrity: sha512-saFy07cO94E664glwgLmKLI40HgTL1PY86y4T6+ud4niX4H0Kdqjcmqmjps7mQNdBytV5guGbXDdyQtRfeLbLA==} + '@oxlint/binding-win32-ia32-msvc@1.91.0': + resolution: {integrity: sha512-XFKqbbsQVmTgw+CyBKuzSZtAa45viom1naFfulKmkTFdDyDaBQaBqEz5J61TI8iwBynU+F8q7qPD+9mplZRhEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.89.0': - resolution: {integrity: sha512-hLFJ/o0f/dTJh/EW0vmcbREYSQO9tYgfiAAlsOkiLFiJuRRWvYtFELUXN5o2ijpSo/tlO1n+YlWN58tZwPG18A==} + '@oxlint/binding-win32-x64-msvc@1.91.0': + resolution: {integrity: sha512-DmpK0PthG66Bcz5Y4JqNbzXltzyLQtg3ofYpd25+ejm7kQYUM78VL1uIP/ZFct2781mwUyBX37LatFPCTVp35A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/plugins@1.89.0': - resolution: {integrity: sha512-TJBBNl4KIxbxrSk7gsqlz6iM1kxidfyTizEzfWqXvijF2Ou8/Da58GvjemBVmCmaUamwRij+JwsVc0kpBFuqfg==} + '@oxlint/plugins@1.91.0': + resolution: {integrity: sha512-Fh+SOBxMu7/pbSk84WG4BN6npcxxlF4jWNQJ+S4IUNyvSVeQwOVTFQMD/Dx2EqBQ1lVeCADcJ+0rzT1BKQ9cUA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@polka/url@1.0.0-next.29': @@ -686,22 +686,22 @@ packages: resolution: {integrity: sha512-NQ6T6KOKBnTmVvGzZQKz9ka4ilS3dKk7Nuc+B5pgDdrCnvmjjsMqd8f1oEE0uANGLB/xm8QUzabBL0KRr3wyrA==} engines: {node: '>=22.18'} - '@ultime/studio@0.1.0': - resolution: {integrity: sha512-z/9edJuGFsuHmB0vYya05wEVmk6XMeyYScD1/crIFYUxOM1pvLDhPbjAEQpT3BGc5vfo9uhtKKfKKqfBpgjaww==} + '@ultime/studio@0.2.0': + resolution: {integrity: sha512-emm3SXsQI0UZjKlTEzlQ7FTQUECZv03mh0DTYAB7uLbDsQIRQdUwNRLgbZVDa8SU16LevG9o1dvHJaWahUf5Gw==} engines: {node: '>=22.18'} - '@vitest/browser-preview@5.0.5': - resolution: {integrity: sha512-ViNg4UlomGSJHtnnr7Txm+55P7/aAMMoS+1WYnWjp5w5tzf7YEUAICcs2sb1uMovEnC8el/8zUfkWZ8+7fPCKA==} + '@vitest/browser-preview@5.1.0': + resolution: {integrity: sha512-z9SbodBSMoJtYy5VTCaSP5SSZfNYRlfIlR0P/uH1PAuhUJbstSyOYvxXCYmqG+EemIiZzd3uGUtREX5zbXLR8A==} peerDependencies: - vitest: 5.0.5 + vitest: 5.1.0 - '@vitest/browser@5.0.5': - resolution: {integrity: sha512-IDMoZX/iZ8rkilw7weaSgN8tJ7iZ9hUv0wYoKXyiyjWjWFwLSWAY707DcVTgxTYOudWC1E3HA9LYn7kVa9a7uQ==} + '@vitest/browser@5.1.0': + resolution: {integrity: sha512-2sjGVAC/Rs8Jwv+xxBgklNG2g1LGyNgcFMBw71AcfBstLz25UGv1+fVvvZ+z8IfSuNg3nipERijnFtoEIdRDEA==} peerDependencies: - vitest: 5.0.5 + vitest: 5.1.0 - '@vitest/mocker@5.0.5': - resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} + '@vitest/mocker@5.1.0': + resolution: {integrity: sha512-5umB9/jlWcqVS6fsrFmv5Gdnpu6wAUio/lEOwAmvB7v+lFo/IW2B9FhAD0p19GCULTgMzLCdUmuCDCnAzWgppQ==} peerDependencies: msw: ^2.4.9 || ^3.0.0 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -711,25 +711,25 @@ packages: vite: optional: true - '@vitest/pretty-format@5.0.5': - resolution: {integrity: sha512-24sSdIlMA9DVPXnYiB9siwU0bTd887Y9jX3+vabztCSsvHwo7ipvJ/a2L3Rljw8+2rK1f5fCj3h5U9I/Jsqgbw==} + '@vitest/pretty-format@5.1.0': + resolution: {integrity: sha512-IRx5mc30CrFzyMNni6SZKQ1r53kv049Mcvvk0WbWcD6PUz/bFjG4zYv0KosQAeonPpGp5WxqYBMqdSOfJfvVWw==} - '@vitest/snapshot@5.0.5': - resolution: {integrity: sha512-dHyFElWMQy0wFBGrIaPPeUWfJFh+jAUrv46ImIJGd8CADdKV3mlrAu3FyD0wesdxELFCs9M807e040Kba/XKtA==} + '@vitest/snapshot@5.1.0': + resolution: {integrity: sha512-6tLM70+37LVXz+A6QmOlMQUuj+taODAyXZhz58lNNNNKHH0D81yzPBEezKQQGPlABc8OpAQBOBVvssVLLQqixw==} - '@vitest/spy@5.0.5': - resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} + '@vitest/spy@5.1.0': + resolution: {integrity: sha512-2DPO5OMHWKrBngC+fCmTQqemNF0gidRhp3lxbBmRhW+M1XJrfgPpqNqWVevXtn2f2ufD5ZaR1B6B641aAlcX5A==} - '@vitest/ui@5.0.5': - resolution: {integrity: sha512-dCoGUOdgmCaSB2g+WQ/spPCBkytAWdNUkFSXY4z+eYp2d8JEOY8v0uDRaJTG9qf/kTlTVZ4CuYMYMz/f1HS/qQ==} + '@vitest/ui@5.1.0': + resolution: {integrity: sha512-00S3x4NRmqIBUiTVWF9/xLaA9EP9KeKv0+1sBO7e2Y4luBISlW+2ttnhlk/zjbTqEvVhJWCCo7MXzu6zNbefqQ==} peerDependencies: - vitest: 5.0.5 + vitest: 5.1.0 - '@vitest/utils@5.0.5': - resolution: {integrity: sha512-/rBu7gzLDQI/SC79Tn98b5DwOgaHU/Gt4I9OVeP3YofzNaYtbImRCOJQmT1S6vOJg9gEIlWC+r3QxKkjuSa1nQ==} + '@vitest/utils@5.1.0': + resolution: {integrity: sha512-V+qgCwkvVw+s1t1S5TaoBHsLi5Sz/YmohCMoOu0mZ8ZQst2bKhRYARAQucWpVg8D0mv0x5MHcWXY5QdOsoiGBQ==} - '@voidzero-dev/vite-plus-core@1.4.0': - resolution: {integrity: sha512-LTGXCdZ58qJKfuCOmf0hnZOVA64eOgzDQOqYpI+71tPxk/0cGqPQhYDGQQZoEvNLAn1G2Lo4gKadsQdWxb99WQ==} + '@voidzero-dev/vite-plus-core@1.5.1': + resolution: {integrity: sha512-34nfvz01DlXmNTRtqOiA2OnI/QsnMZ/XkH2EJYXhXl7D5xloi9EBO87e57Zuo9sgqwDksvtp2gOH72MZZIz0qQ==} engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0} peerDependencies: '@arethetypeswrong/core': ^0.18.1 @@ -797,54 +797,54 @@ packages: yaml: optional: true - '@voidzero-dev/vite-plus-darwin-arm64@1.4.0': - resolution: {integrity: sha512-5Ie3vnrFrF5GFU+0VhbLuyoSmnzd8m42BvbLjncMOmAb6D1sEq4g37dlxPiVcJEqITM0t4zFnLkNSF4YAlk0FQ==} + '@voidzero-dev/vite-plus-darwin-arm64@1.5.1': + resolution: {integrity: sha512-hYxibkQivI54eOYpkEgYeXmxbRM+ovO9nYetDL6EJP7XHesuohaT/IpQgOigLlWj6+Bfqs0MTCfDHoS4gmUXcw==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [darwin] - '@voidzero-dev/vite-plus-darwin-x64@1.4.0': - resolution: {integrity: sha512-vaR7F+ix/91EycJYXOQ24Nzw470U12x3L+YLbbtuRwHDMW67fCbhXzcW+otZS8q4eRdIzEcA5svv9P8kcsaRkA==} + '@voidzero-dev/vite-plus-darwin-x64@1.5.1': + resolution: {integrity: sha512-h82GIWf4zkG/UqYYaEtUv1oQWi755QAqG4m9S+ApB4dQvZQkSxsUZfKgBXASz2x6SH/SRcElZipnslTEBAghoA==} engines: {node: '>=20.0.0'} cpu: [x64] os: [darwin] - '@voidzero-dev/vite-plus-linux-arm64-gnu@1.4.0': - resolution: {integrity: sha512-58/PZrp+f3Hy6kFVKqbrZVenjo5t012rTOgRSgMoJyOhJjXBHqvORh9lB9GIip9r9maoWN31R1a44obPX9MD7g==} + '@voidzero-dev/vite-plus-linux-arm64-gnu@1.5.1': + resolution: {integrity: sha512-Vg1vugNxq2tI6eV6gn9e3S2QZP1XvCuqyHdhQuBMjPa852+jhUC2Yz1iqzSYthn6CGO7oGRK/Zj6xsvnzjk9Vg==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-arm64-musl@1.4.0': - resolution: {integrity: sha512-Ij08vPrxG1J23wQVm0LtLPrQevv4tos8TirP/jGTpQQmQAgYOpmIfMrx8BF+vOGMncOIo+kKacp4jPVmhctfhg==} + '@voidzero-dev/vite-plus-linux-arm64-musl@1.5.1': + resolution: {integrity: sha512-53lJyznOJmIHT7Q2Bi2v3hB4qr8XqTHVDZsfN1H7JMk1ptCuD7A++OKAsBh8/60xMhKEyCIH713vuzqJVW6drA==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-linux-x64-gnu@1.4.0': - resolution: {integrity: sha512-RbM21Y5cSx5WesaFV/Swo22JRvimjO6NDItoL5wNI6NTa987ck7v19HBmp+V4nkOCFHbMdxwfhyALDw0y06xEA==} + '@voidzero-dev/vite-plus-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-aU+cnwcnjDcH11dDe+roQ7GJRjLwt9YtYslcPQg+L1pLUSEuQUjlyfasuCoS8Xhb/Gz/miS3dQ5aZbhMIETk3g==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-x64-musl@1.4.0': - resolution: {integrity: sha512-Q+p+YJztEmqjJoumTmPaBQ/PEx3eFhiNTQTn5+85gkBUiRexkFQ8A86TMFxbKVgrJbiAOltkrJRmVRhRs5Q0sA==} + '@voidzero-dev/vite-plus-linux-x64-musl@1.5.1': + resolution: {integrity: sha512-x0Ch0s+7y1rCKR/22jjrCL8UfaEXSp3tPedwhPk3wG6VE9bREaeiXCDagymMvWp6VuT3QeW1dTpg4/WrIrjaXQ==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-win32-arm64-msvc@1.4.0': - resolution: {integrity: sha512-PLGVov8c4/QfveOM/AYjYDlgMCQ0SxCmJp392qBgxaSXP0nEg6yP4hn5UtnhxvluhHEzVkTf2r1Q3LNlZRI7kw==} + '@voidzero-dev/vite-plus-win32-arm64-msvc@1.5.1': + resolution: {integrity: sha512-VbVBuOxBYuxd1/1zbGmVpw9ey+N81F3v2E2aZc+OpPx8ZEytMb6b08/yKcJky/WA+fWHV5mkBYP4Kz/WZrByRg==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [win32] - '@voidzero-dev/vite-plus-win32-x64-msvc@1.4.0': - resolution: {integrity: sha512-DYG7wDsMLLs2/+8qfeyLScdoMh+aPM4IZanoVPSNt8fMeeXR2GQiiZDKc0qZHKN9+YcdCGK1HLAdMAGSywKvsA==} + '@voidzero-dev/vite-plus-win32-x64-msvc@1.5.1': + resolution: {integrity: sha512-GlljpfSCydZXpiC9GGGLpWAyf0ZoUuOdbzYgTjF+DvHW4ntMWxgd7x1WnynFjMtLN2fp6KJ7mzgz9Y2k1uNW2Q==} engines: {node: '>=20.0.0'} cpu: [x64] os: [win32] @@ -1083,12 +1083,12 @@ packages: resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} engines: {node: '>=12.20.0'} - oxfmt@0.74.0: - resolution: {integrity: sha512-G4OP7FgwGYZR5ttRpCOOfJdyRsSyvtn34vSXnjDq6Oqed5Dufg5mB44mank+51nAdHOKuTJ0lj0mksY7L+N61A==} + oxfmt@0.76.0: + resolution: {integrity: sha512-Yo9RIn9lRWTm/U8obHbXUWc39lCpEFXlEggFoPx01zS18OCFi7mAwMmL05+p1AunuJgSkONffWyBHJzpMMCRuQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@astrojs/compiler-rs': ^0.4.0 || ^0.5.0 + '@astrojs/compiler-rs': ^0.5.0 svelte: ^5.0.0 vite-plus: '*' peerDependenciesMeta: @@ -1099,16 +1099,16 @@ packages: vite-plus: optional: true - oxlint-tsgolint@7.0.2004: - resolution: {integrity: sha512-vQ9WDF3fiZJvRdSDosNOflerOCOpwol6vWzVDxW76RcU19cjTh7engvkHLvmv+tzedR8fAiJUVUGr6IVZdkzXQ==} + oxlint-tsgolint@7.0.2005: + resolution: {integrity: sha512-6ccPGu4u4J9bwYPHXBFPee3RZrX3BboRdU7k14zRDDB1lvN3O7J/vPRFdaEfa1+CWx4xnQQOp4ctoaF66oO0uw==} hasBin: true - oxlint@1.89.0: - resolution: {integrity: sha512-a25hkfo61okGPvJz432fRIPoxlKtNnOVy9w4rzrmGgNm4iVTPwpSQlmdqNWnp6p9QyyPVfAZRgnf5XvSBZFk/A==} + oxlint@1.91.0: + resolution: {integrity: sha512-vjy/cBZcEFcYh3dbxUoQK+bjc+QaY3ZWo86aJkZ5YAwp/HyiqP7dTdNgbvcIVJafhAH5sZbTqBp4sZcicEZngA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=7.0.2003' + oxlint-tsgolint: '>=7.0.2005' vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: @@ -1189,12 +1189,12 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - vite-plus@1.4.0: - resolution: {integrity: sha512-bLyUKNFl0XjbHe20FpDM6OuknOb2E4ueoWKCW4n+wMO2+lQtA9tmAjW+Xs0Xe9rg2+tCgY3W13GOgDh2wjwjAQ==} + vite-plus@1.5.1: + resolution: {integrity: sha512-Ckl9Vc5fg3BC8SlxPKujSQz+p1CbFy+5++yrFVbwZRdcpHzj0ExaWuNccKdnW128xGU8ECX6RK7n5YPXSHFWpg==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: - '@vitest/browser-playwright': 5.0.5 + '@vitest/browser-playwright': 5.1.0 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 playwright: '*' peerDependenciesMeta: @@ -1205,20 +1205,20 @@ packages: playwright: optional: true - vitest@5.0.5: - resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} + vitest@5.1.0: + resolution: {integrity: sha512-MzmNFnrwa8v8lF1bLxw3UJ4EREwVOVb75VqJZmUDRjJ6EluK/x9th7qTbaeDk41WxE1GxWqmTXcdsfobfH5sOA==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.5 - '@vitest/browser-preview': 5.0.5 + '@vitest/browser-playwright': 5.1.0 + '@vitest/browser-preview': 5.1.0 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.5 - '@vitest/coverage-v8': 5.0.5 - '@vitest/ui': 5.0.5 + '@vitest/coverage-istanbul': 5.1.0 + '@vitest/coverage-v8': 5.1.0 + '@vitest/ui': 5.1.0 happy-dom: '*' jsdom: '*' vite: ^6.4.0 || ^7.0.0 || ^8.0.0 @@ -1372,143 +1372,143 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 - '@oxc-project/runtime@0.155.0': {} + '@oxc-project/runtime@0.157.0': {} - '@oxc-project/types@0.155.0': {} + '@oxc-project/types@0.157.0': {} - '@oxfmt/binding-android-arm-eabi@0.74.0': + '@oxfmt/binding-android-arm-eabi@0.76.0': optional: true - '@oxfmt/binding-android-arm64@0.74.0': + '@oxfmt/binding-android-arm64@0.76.0': optional: true - '@oxfmt/binding-darwin-arm64@0.74.0': + '@oxfmt/binding-darwin-arm64@0.76.0': optional: true - '@oxfmt/binding-darwin-x64@0.74.0': + '@oxfmt/binding-darwin-x64@0.76.0': optional: true - '@oxfmt/binding-freebsd-x64@0.74.0': + '@oxfmt/binding-freebsd-x64@0.76.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.74.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.76.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.74.0': + '@oxfmt/binding-linux-arm-musleabihf@0.76.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.74.0': + '@oxfmt/binding-linux-arm64-gnu@0.76.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.74.0': + '@oxfmt/binding-linux-arm64-musl@0.76.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.74.0': + '@oxfmt/binding-linux-ppc64-gnu@0.76.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.74.0': + '@oxfmt/binding-linux-riscv64-gnu@0.76.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.74.0': + '@oxfmt/binding-linux-riscv64-musl@0.76.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.74.0': + '@oxfmt/binding-linux-s390x-gnu@0.76.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.74.0': + '@oxfmt/binding-linux-x64-gnu@0.76.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.74.0': + '@oxfmt/binding-linux-x64-musl@0.76.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.74.0': + '@oxfmt/binding-openharmony-arm64@0.76.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.74.0': + '@oxfmt/binding-win32-arm64-msvc@0.76.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.74.0': + '@oxfmt/binding-win32-ia32-msvc@0.76.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.74.0': + '@oxfmt/binding-win32-x64-msvc@0.76.0': optional: true - '@oxlint-tsgolint/darwin-arm64@7.0.2004': + '@oxlint-tsgolint/darwin-arm64@7.0.2005': optional: true - '@oxlint-tsgolint/darwin-x64@7.0.2004': + '@oxlint-tsgolint/darwin-x64@7.0.2005': optional: true - '@oxlint-tsgolint/linux-arm64@7.0.2004': + '@oxlint-tsgolint/linux-arm64@7.0.2005': optional: true - '@oxlint-tsgolint/linux-x64@7.0.2004': + '@oxlint-tsgolint/linux-x64@7.0.2005': optional: true - '@oxlint-tsgolint/win32-arm64@7.0.2004': + '@oxlint-tsgolint/win32-arm64@7.0.2005': optional: true - '@oxlint-tsgolint/win32-x64@7.0.2004': + '@oxlint-tsgolint/win32-x64@7.0.2005': optional: true - '@oxlint/binding-android-arm-eabi@1.89.0': + '@oxlint/binding-android-arm-eabi@1.91.0': optional: true - '@oxlint/binding-android-arm64@1.89.0': + '@oxlint/binding-android-arm64@1.91.0': optional: true - '@oxlint/binding-darwin-arm64@1.89.0': + '@oxlint/binding-darwin-arm64@1.91.0': optional: true - '@oxlint/binding-darwin-x64@1.89.0': + '@oxlint/binding-darwin-x64@1.91.0': optional: true - '@oxlint/binding-freebsd-x64@1.89.0': + '@oxlint/binding-freebsd-x64@1.91.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.89.0': + '@oxlint/binding-linux-arm-gnueabihf@1.91.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.89.0': + '@oxlint/binding-linux-arm-musleabihf@1.91.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.89.0': + '@oxlint/binding-linux-arm64-gnu@1.91.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.89.0': + '@oxlint/binding-linux-arm64-musl@1.91.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.89.0': + '@oxlint/binding-linux-ppc64-gnu@1.91.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.89.0': + '@oxlint/binding-linux-riscv64-gnu@1.91.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.89.0': + '@oxlint/binding-linux-riscv64-musl@1.91.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.89.0': + '@oxlint/binding-linux-s390x-gnu@1.91.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.89.0': + '@oxlint/binding-linux-x64-gnu@1.91.0': optional: true - '@oxlint/binding-linux-x64-musl@1.89.0': + '@oxlint/binding-linux-x64-musl@1.91.0': optional: true - '@oxlint/binding-openharmony-arm64@1.89.0': + '@oxlint/binding-openharmony-arm64@1.91.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.89.0': + '@oxlint/binding-win32-arm64-msvc@1.91.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.89.0': + '@oxlint/binding-win32-ia32-msvc@1.91.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.89.0': + '@oxlint/binding-win32-x64-msvc@1.91.0': optional: true - '@oxlint/plugins@1.89.0': {} + '@oxlint/plugins@1.91.0': {} '@polka/url@1.0.0-next.29': {} @@ -1544,31 +1544,31 @@ snapshots: '@ultime/cli@0.1.0': {} - '@ultime/studio@0.1.0': {} + '@ultime/studio@0.2.0': {} - '@vitest/browser-preview@5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.0.5)': + '@vitest/browser-preview@5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.1.0)': dependencies: '@testing-library/dom': 10.4.2 '@testing-library/user-event': 14.6.8(@testing-library/dom@10.4.2) - '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.0.5) - vitest: 5.0.5(@types/node@22.20.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + '@vitest/browser': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.1.0) + vitest: 5.1.0(@types/node@22.20.5)(@vitest/browser-preview@5.1.0)(@vitest/ui@5.1.0)(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.0.5)': + '@vitest/browser@5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.1.0)': dependencies: '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) - '@vitest/ui': 5.0.5(vitest@5.0.5) - '@vitest/utils': 5.0.5 + '@vitest/mocker': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + '@vitest/ui': 5.1.0(vitest@5.1.0) + '@vitest/utils': 5.1.0 magic-string: 1.4.5 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@22.20.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + vitest: 5.1.0(@types/node@22.20.5)(@vitest/browser-preview@5.1.0)(@vitest/ui@5.1.0)(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) ws: 8.22.1 transitivePeerDependencies: - bufferutil @@ -1576,88 +1576,88 @@ snapshots: - utf-8-validate - vite - '@vitest/mocker@5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))': + '@vitest/mocker@5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.5 + '@vitest/spy': 5.1.0 estree-walker: 3.0.3 magic-string: 1.4.5 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)' + vite: '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)' - '@vitest/pretty-format@5.0.5': + '@vitest/pretty-format@5.1.0': dependencies: tinyrainbow: 3.2.0 - '@vitest/snapshot@5.0.5': + '@vitest/snapshot@5.1.0': dependencies: - '@vitest/pretty-format': 5.0.5 - '@vitest/utils': 5.0.5 + '@vitest/pretty-format': 5.1.0 + '@vitest/utils': 5.1.0 magic-string: 1.4.5 pathe: 2.0.3 - '@vitest/spy@5.0.5': {} + '@vitest/spy@5.1.0': {} - '@vitest/ui@5.0.5(vitest@5.0.5)': + '@vitest/ui@5.1.0(vitest@5.1.0)': dependencies: - '@vitest/utils': 5.0.5 + '@vitest/utils': 5.1.0 fflate: 0.8.3 flatted: 3.4.4 pathe: 2.0.3 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@22.20.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + vitest: 5.1.0(@types/node@22.20.5)(@vitest/browser-preview@5.1.0)(@vitest/ui@5.1.0)(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) - '@vitest/utils@5.0.5': + '@vitest/utils@5.1.0': dependencies: - '@vitest/pretty-format': 5.0.5 + '@vitest/pretty-format': 5.1.0 convert-source-map: 2.0.0 tinyrainbow: 3.2.0 - '@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)': + '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)': dependencies: - '@oxc-project/runtime': 0.155.0 - '@oxc-project/types': 0.155.0 + '@oxc-project/runtime': 0.157.0 + '@oxc-project/types': 0.157.0 lightningcss: 1.33.0 postcss: 8.5.32 yuku-parser: 0.19.0 optionalDependencies: '@types/node': 22.20.5 - '@voidzero-dev/vite-plus-darwin-arm64': 1.4.0 - '@voidzero-dev/vite-plus-darwin-x64': 1.4.0 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.4.0 - '@voidzero-dev/vite-plus-linux-arm64-musl': 1.4.0 - '@voidzero-dev/vite-plus-linux-x64-gnu': 1.4.0 - '@voidzero-dev/vite-plus-linux-x64-musl': 1.4.0 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.4.0 - '@voidzero-dev/vite-plus-win32-x64-msvc': 1.4.0 + '@voidzero-dev/vite-plus-darwin-arm64': 1.5.1 + '@voidzero-dev/vite-plus-darwin-x64': 1.5.1 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.5.1 + '@voidzero-dev/vite-plus-linux-arm64-musl': 1.5.1 + '@voidzero-dev/vite-plus-linux-x64-gnu': 1.5.1 + '@voidzero-dev/vite-plus-linux-x64-musl': 1.5.1 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.5.1 + '@voidzero-dev/vite-plus-win32-x64-msvc': 1.5.1 esbuild: 0.28.2 fsevents: 2.3.3 tsx: 4.23.15 typescript: 5.9.3 - '@voidzero-dev/vite-plus-darwin-arm64@1.4.0': + '@voidzero-dev/vite-plus-darwin-arm64@1.5.1': optional: true - '@voidzero-dev/vite-plus-darwin-x64@1.4.0': + '@voidzero-dev/vite-plus-darwin-x64@1.5.1': optional: true - '@voidzero-dev/vite-plus-linux-arm64-gnu@1.4.0': + '@voidzero-dev/vite-plus-linux-arm64-gnu@1.5.1': optional: true - '@voidzero-dev/vite-plus-linux-arm64-musl@1.4.0': + '@voidzero-dev/vite-plus-linux-arm64-musl@1.5.1': optional: true - '@voidzero-dev/vite-plus-linux-x64-gnu@1.4.0': + '@voidzero-dev/vite-plus-linux-x64-gnu@1.5.1': optional: true - '@voidzero-dev/vite-plus-linux-x64-musl@1.4.0': + '@voidzero-dev/vite-plus-linux-x64-musl@1.5.1': optional: true - '@voidzero-dev/vite-plus-win32-arm64-msvc@1.4.0': + '@voidzero-dev/vite-plus-win32-arm64-msvc@1.5.1': optional: true - '@voidzero-dev/vite-plus-win32-x64-msvc@1.4.0': + '@voidzero-dev/vite-plus-win32-x64-msvc@1.5.1': optional: true '@yuku-core/binding-android-arm64@0.19.0': @@ -1829,63 +1829,63 @@ snapshots: obug@3.0.0: {} - oxfmt@0.74.0(vite-plus@1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)): + oxfmt@0.76.0(vite-plus@1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)): dependencies: tinypool: 2.2.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.74.0 - '@oxfmt/binding-android-arm64': 0.74.0 - '@oxfmt/binding-darwin-arm64': 0.74.0 - '@oxfmt/binding-darwin-x64': 0.74.0 - '@oxfmt/binding-freebsd-x64': 0.74.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.74.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.74.0 - '@oxfmt/binding-linux-arm64-gnu': 0.74.0 - '@oxfmt/binding-linux-arm64-musl': 0.74.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.74.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.74.0 - '@oxfmt/binding-linux-riscv64-musl': 0.74.0 - '@oxfmt/binding-linux-s390x-gnu': 0.74.0 - '@oxfmt/binding-linux-x64-gnu': 0.74.0 - '@oxfmt/binding-linux-x64-musl': 0.74.0 - '@oxfmt/binding-openharmony-arm64': 0.74.0 - '@oxfmt/binding-win32-arm64-msvc': 0.74.0 - '@oxfmt/binding-win32-ia32-msvc': 0.74.0 - '@oxfmt/binding-win32-x64-msvc': 0.74.0 - vite-plus: 1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3) - - oxlint-tsgolint@7.0.2004: + '@oxfmt/binding-android-arm-eabi': 0.76.0 + '@oxfmt/binding-android-arm64': 0.76.0 + '@oxfmt/binding-darwin-arm64': 0.76.0 + '@oxfmt/binding-darwin-x64': 0.76.0 + '@oxfmt/binding-freebsd-x64': 0.76.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.76.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.76.0 + '@oxfmt/binding-linux-arm64-gnu': 0.76.0 + '@oxfmt/binding-linux-arm64-musl': 0.76.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.76.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.76.0 + '@oxfmt/binding-linux-riscv64-musl': 0.76.0 + '@oxfmt/binding-linux-s390x-gnu': 0.76.0 + '@oxfmt/binding-linux-x64-gnu': 0.76.0 + '@oxfmt/binding-linux-x64-musl': 0.76.0 + '@oxfmt/binding-openharmony-arm64': 0.76.0 + '@oxfmt/binding-win32-arm64-msvc': 0.76.0 + '@oxfmt/binding-win32-ia32-msvc': 0.76.0 + '@oxfmt/binding-win32-x64-msvc': 0.76.0 + vite-plus: 1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3) + + oxlint-tsgolint@7.0.2005: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 7.0.2004 - '@oxlint-tsgolint/darwin-x64': 7.0.2004 - '@oxlint-tsgolint/linux-arm64': 7.0.2004 - '@oxlint-tsgolint/linux-x64': 7.0.2004 - '@oxlint-tsgolint/win32-arm64': 7.0.2004 - '@oxlint-tsgolint/win32-x64': 7.0.2004 - - oxlint@1.89.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)): + '@oxlint-tsgolint/darwin-arm64': 7.0.2005 + '@oxlint-tsgolint/darwin-x64': 7.0.2005 + '@oxlint-tsgolint/linux-arm64': 7.0.2005 + '@oxlint-tsgolint/linux-x64': 7.0.2005 + '@oxlint-tsgolint/win32-arm64': 7.0.2005 + '@oxlint-tsgolint/win32-x64': 7.0.2005 + + oxlint@1.91.0(oxlint-tsgolint@7.0.2005)(vite-plus@1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.89.0 - '@oxlint/binding-android-arm64': 1.89.0 - '@oxlint/binding-darwin-arm64': 1.89.0 - '@oxlint/binding-darwin-x64': 1.89.0 - '@oxlint/binding-freebsd-x64': 1.89.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.89.0 - '@oxlint/binding-linux-arm-musleabihf': 1.89.0 - '@oxlint/binding-linux-arm64-gnu': 1.89.0 - '@oxlint/binding-linux-arm64-musl': 1.89.0 - '@oxlint/binding-linux-ppc64-gnu': 1.89.0 - '@oxlint/binding-linux-riscv64-gnu': 1.89.0 - '@oxlint/binding-linux-riscv64-musl': 1.89.0 - '@oxlint/binding-linux-s390x-gnu': 1.89.0 - '@oxlint/binding-linux-x64-gnu': 1.89.0 - '@oxlint/binding-linux-x64-musl': 1.89.0 - '@oxlint/binding-openharmony-arm64': 1.89.0 - '@oxlint/binding-win32-arm64-msvc': 1.89.0 - '@oxlint/binding-win32-ia32-msvc': 1.89.0 - '@oxlint/binding-win32-x64-msvc': 1.89.0 - oxlint-tsgolint: 7.0.2004 - vite-plus: 1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3) + '@oxlint/binding-android-arm-eabi': 1.91.0 + '@oxlint/binding-android-arm64': 1.91.0 + '@oxlint/binding-darwin-arm64': 1.91.0 + '@oxlint/binding-darwin-x64': 1.91.0 + '@oxlint/binding-freebsd-x64': 1.91.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.91.0 + '@oxlint/binding-linux-arm-musleabihf': 1.91.0 + '@oxlint/binding-linux-arm64-gnu': 1.91.0 + '@oxlint/binding-linux-arm64-musl': 1.91.0 + '@oxlint/binding-linux-ppc64-gnu': 1.91.0 + '@oxlint/binding-linux-riscv64-gnu': 1.91.0 + '@oxlint/binding-linux-riscv64-musl': 1.91.0 + '@oxlint/binding-linux-s390x-gnu': 1.91.0 + '@oxlint/binding-linux-x64-gnu': 1.91.0 + '@oxlint/binding-linux-x64-musl': 1.91.0 + '@oxlint/binding-openharmony-arm64': 1.91.0 + '@oxlint/binding-win32-arm64-msvc': 1.91.0 + '@oxlint/binding-win32-ia32-msvc': 1.91.0 + '@oxlint/binding-win32-x64-msvc': 1.91.0 + oxlint-tsgolint: 7.0.2005 + vite-plus: 1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3) pathe@2.0.3: {} @@ -1944,32 +1944,32 @@ snapshots: undici-types@6.21.0: {} - vite-plus@1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3): + vite-plus@1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3): dependencies: - '@oxc-project/runtime': 0.155.0 - '@oxc-project/types': 0.155.0 - '@oxlint/plugins': 1.89.0 - '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.0.5) - '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.0.5) - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) - '@vitest/pretty-format': 5.0.5 - '@vitest/snapshot': 5.0.5 - '@vitest/spy': 5.0.5 - '@vitest/utils': 5.0.5 - oxfmt: 0.74.0(vite-plus@1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) - oxlint: 1.89.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) - oxlint-tsgolint: 7.0.2004 - vite: '@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)' - vitest: 5.0.5(@types/node@22.20.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + '@oxc-project/runtime': 0.157.0 + '@oxc-project/types': 0.157.0 + '@oxlint/plugins': 1.91.0 + '@vitest/browser': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.1.0) + '@vitest/browser-preview': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.1.0) + '@vitest/mocker': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + '@vitest/pretty-format': 5.1.0 + '@vitest/snapshot': 5.1.0 + '@vitest/spy': 5.1.0 + '@vitest/utils': 5.1.0 + oxfmt: 0.76.0(vite-plus@1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + oxlint: 1.91.0(oxlint-tsgolint@7.0.2005)(vite-plus@1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + oxlint-tsgolint: 7.0.2005 + vite: '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)' + vitest: 5.1.0(@types/node@22.20.5)(@vitest/browser-preview@5.1.0)(@vitest/ui@5.1.0)(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) optionalDependencies: - '@voidzero-dev/vite-plus-darwin-arm64': 1.4.0 - '@voidzero-dev/vite-plus-darwin-x64': 1.4.0 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.4.0 - '@voidzero-dev/vite-plus-linux-arm64-musl': 1.4.0 - '@voidzero-dev/vite-plus-linux-x64-gnu': 1.4.0 - '@voidzero-dev/vite-plus-linux-x64-musl': 1.4.0 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.4.0 - '@voidzero-dev/vite-plus-win32-x64-msvc': 1.4.0 + '@voidzero-dev/vite-plus-darwin-arm64': 1.5.1 + '@voidzero-dev/vite-plus-darwin-x64': 1.5.1 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.5.1 + '@voidzero-dev/vite-plus-linux-arm64-musl': 1.5.1 + '@voidzero-dev/vite-plus-linux-x64-gnu': 1.5.1 + '@voidzero-dev/vite-plus-linux-x64-musl': 1.5.1 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.5.1 + '@voidzero-dev/vite-plus-win32-x64-msvc': 1.5.1 transitivePeerDependencies: - '@arethetypeswrong/core' - '@astrojs/compiler-rs' @@ -2005,10 +2005,10 @@ snapshots: - vue-tsc - yaml - vitest@5.0.5(@types/node@22.20.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)): + vitest@5.1.0(@types/node@22.20.5)(@vitest/browser-preview@5.1.0)(@vitest/ui@5.1.0)(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) + '@vitest/mocker': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -2019,12 +2019,12 @@ snapshots: tinybench: 6.2.3 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: '@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)' + vite: '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3)' why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 22.20.5 - '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.0.5) - '@vitest/ui': 5.0.5(vitest@5.0.5) + '@vitest/browser-preview': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(esbuild@0.28.2)(tsx@4.23.15)(typescript@5.9.3))(vitest@5.1.0) + '@vitest/ui': 5.1.0(vitest@5.1.0) transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6e386a1..d6b039a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,4 +3,14 @@ allowBuilds: esbuild: true minimumReleaseAgeExclude: - '@ultime/cli@0.1.0' - - '@ultime/studio@0.1.0' + - '@ultime/studio@0.1.0 || 0.2.0' + - '@voidzero-dev/vite-plus-core@1.5.1' + - '@voidzero-dev/vite-plus-darwin-arm64@1.5.1' + - '@voidzero-dev/vite-plus-darwin-x64@1.5.1' + - '@voidzero-dev/vite-plus-linux-arm64-gnu@1.5.1' + - '@voidzero-dev/vite-plus-linux-arm64-musl@1.5.1' + - '@voidzero-dev/vite-plus-linux-x64-gnu@1.5.1' + - '@voidzero-dev/vite-plus-linux-x64-musl@1.5.1' + - '@voidzero-dev/vite-plus-win32-arm64-msvc@1.5.1' + - '@voidzero-dev/vite-plus-win32-x64-msvc@1.5.1' + - vite-plus@1.5.1 diff --git a/rules/01-architecture.md b/rules/01-architecture.md index e058d19..fc3fb44 100644 --- a/rules/01-architecture.md +++ b/rules/01-architecture.md @@ -1,7 +1,7 @@ # 01 · 架构与边界 > 定位:core 的职责、依赖方向与目录分工。 -> 适用版本:0.7.x +> 适用版本:0.8.x > 关系:规则索引见 [`README`](./README.md);为什么这样分层见 [`DESIGN.md`](../DESIGN.md)。 --- @@ -55,5 +55,5 @@ seed / model → build → exporters - 语义角色(`enter` / `exit` / `press`)、质量带、编排; - 布局、栅格、断点、目标尺寸; -- 材质轴、渗色、spring、手势;玻璃作为唯一填充角色例外(待实现); +- 材质轴、渗色、spring、手势;玻璃只作为填充角色,不单独成轴; - 手写阴影名单与运行时角度。 diff --git a/rules/02-tokens.md b/rules/02-tokens.md index fb684d4..7fbc2a1 100644 --- a/rules/02-tokens.md +++ b/rules/02-tokens.md @@ -1,7 +1,7 @@ # 02 · Token 与生成物 > 定位:seed、树、快照与合同的变更流程。 -> 适用版本:0.7.x +> 适用版本:0.8.x > 关系:目录与边界见 [`01-architecture`](./01-architecture.md);数值出处见 [`DESIGN.md`](../DESIGN.md)。 --- diff --git a/rules/03-testing.md b/rules/03-testing.md index 17f3270..b24c18b 100644 --- a/rules/03-testing.md +++ b/rules/03-testing.md @@ -1,7 +1,7 @@ # 03 · 测试与验收 > 定位:改 core 时跑什么、看什么、什么算通过。 -> 适用版本:0.7.x +> 适用版本:0.8.x > 关系:管线见 [`02-tokens`](./02-tokens.md);发布检查见 [`04-release`](./04-release.md)。 --- diff --git a/rules/04-release.md b/rules/04-release.md index 5fe383a..7dc0969 100644 --- a/rules/04-release.md +++ b/rules/04-release.md @@ -1,7 +1,7 @@ # 04 · 版本与发布 > 定位:core 的三类版本、发布顺序与发布前检查。 -> 适用版本:0.7.x +> 适用版本:0.8.x > 关系:测试见 [`03-testing`](./03-testing.md);发布由仓库 owner 按本清单执行。 --- @@ -20,7 +20,7 @@ ## 发布顺序 -`@ultime/cli` → `@ultime/studio` → `@ultime/core`。被依赖者先发;workspace 内用 `workspace:^`。 +`@ultime/cli` → `@ultime/studio` → `@ultime/core`。被依赖者先发;依赖写已发布版本范围(如 `^0.1.2`),不写 `workspace:*`。 ## 发布前检查 @@ -29,10 +29,11 @@ - [ ] `npm pack --dry-run` 内容正确(`dist` 在、测试与临时文件不在) - [ ] `package.json` 版本、tag、`CHANGELOG.md` 三者一致 - [ ] README「版本与兼容」已更新(契约变更时) -- [ ] AI 文档同步:`rules/` / `llms.txt` / `skills.md` / `agent.md` / `AGENTS.md` 的版本戳与能力表已更新 +- [ ] AI 文档同步:`rules/` / `llms.txt` / `SKILLS.md` / `AGENTS.md` 的版本戳与能力表已更新 +- [ ] 包内配套设施:`npm pack --dry-run` 含 `llms.txt` / `SKILLS.md`,且与 `exports` 对齐 - [ ] 根仓 `pnpm ai-docs:check` 通过 ## 反例 - 只升 `package.json`,忘了 `engineVersion`:manifest 记录的派生版本与代码不符。 -- 发版后才补 `skills.md`:安装到的包与 AI 读到的能力表不是同一版本。 +- 发版后才补 `SKILLS.md`:安装到的包与 AI 读到的能力表不是同一版本。 diff --git a/rules/README.md b/rules/README.md index d96c61e..641ba50 100644 --- a/rules/README.md +++ b/rules/README.md @@ -1,7 +1,7 @@ # core · 开发规则 > 定位:本包开发规范的索引。只写判断、边界与反例;事实以源码、`README.md` 与 `ultime schema --json` 为准。 -> 适用版本:0.7.x +> 适用版本:0.8.x > 关系:入口见 [`AGENTS.md`](../AGENTS.md);设计取舍见 [`DESIGN.md`](../DESIGN.md);怎么用见 [`README.md`](../README.md)。 --- diff --git a/src/contracts.ts b/src/contracts.ts index 9c20aab..29af351 100644 --- a/src/contracts.ts +++ b/src/contracts.ts @@ -183,7 +183,9 @@ export function auditContracts({ seed, tree, skeleton, color, light, motion }: C ) const radius = skeleton.primitives.radius const radiusOk = - radius.length === seed.skeleton.radius.levels && radius.every((v, i) => nearly(v, i * seed.skeleton.radius.base)) + radius.length > 0 && + radius.length === seed.skeleton.radius.levels && + radius.every((v, i) => nearly(v, i * seed.skeleton.radius.base)) rows.push( row('radius-derive', 'radius = (n−1) × base', radius.join(' / '), `${seed.skeleton.radius.levels} 档`, radiusOk), ) @@ -226,7 +228,7 @@ export function auditContracts({ seed, tree, skeleton, color, light, motion }: C 'duration = unit × n', duration.join(' / '), `unit ${seed.motion.duration.unit} × n`, - duration.every((v, i) => v === seed.motion.duration.unit * (i + 1)) && monotonic(duration), + duration.every((v, i) => v === seed.motion.duration.unit * (i + 1)) && duration.length > 0 && monotonic(duration), ), ) rows.push( @@ -244,7 +246,8 @@ export function auditContracts({ seed, tree, skeleton, color, light, motion }: C 'loop = base × ratio^(n−1)', motion.loop.join(' / '), `${seed.motion.loop.base} × ${seed.motion.loop.ratio}^(n−1)`, - motion.loop.every((v, i) => nearly(v, seed.motion.loop.base * seed.motion.loop.ratio ** i)), + motion.loop.length > 0 && + motion.loop.every((v, i) => nearly(v, seed.motion.loop.base * seed.motion.loop.ratio ** i)), ), ) rows.push( @@ -253,7 +256,8 @@ export function auditContracts({ seed, tree, skeleton, color, light, motion }: C 'delay = base × ratio^(n−1)', motion.delay.join(' / '), `${seed.motion.delay.base} × ${seed.motion.delay.ratio}^(n−1)`, - motion.delay.every((v, i) => nearly(v, seed.motion.delay.base * seed.motion.delay.ratio ** i)), + motion.delay.length > 0 && + motion.delay.every((v, i) => nearly(v, seed.motion.delay.base * seed.motion.delay.ratio ** i)), ), ) const easing = motion.easing diff --git a/src/studio/diagnostics.ts b/src/studio/diagnostics.ts new file mode 100644 index 0000000..119765a --- /dev/null +++ b/src/studio/diagnostics.ts @@ -0,0 +1,40 @@ +/** + * diagnostics.ts — 合同诊断到配置器诊断的映射 + * --------------------------------------------------------------------------- + * 合同行数量随 seed 增长:全部展示会淹没配置器,所以非 error 的合同诊断设上限。 + * `error` 永不截断 —— 少了它,导出前的阻断判定会被误放行。 + */ + +import type { Diagnostic } from '@ultime/studio' +import type { ProjectBuild } from '../tools' + +/** 合同诊断里非 error 的展示上限。 */ +const CONTRACT_NOTICE_LIMIT = 12 + +export function toStudioDiagnostics(source: ProjectBuild['diagnostics']): Diagnostic[] { + const other = source.filter((item) => !item.code.startsWith('contract.')) + const contract = source.filter((item) => item.code.startsWith('contract.')) + const errors = contract.filter((item) => item.level === 'error') + const notices = contract.filter((item) => item.level !== 'error') + const kept = notices.slice(0, CONTRACT_NOTICE_LIMIT) + + const diagnostics = [...other, ...errors, ...kept].map(toStudioDiagnostic) + if (notices.length > kept.length) { + diagnostics.push({ + level: 'info', + code: 'core/contract.truncated', + message: `另有 ${notices.length - kept.length} 条合同提示未显示`, + path: '/tokens/seed', + }) + } + return diagnostics +} + +function toStudioDiagnostic(diagnostic: ProjectBuild['diagnostics'][number]): Diagnostic { + return { + level: diagnostic.level, + code: `core/${diagnostic.code}`, + message: diagnostic.message, + path: diagnostic.path ?? '/tokens/seed', + } +} diff --git a/src/studio/fields.ts b/src/studio/fields.ts index a85c22a..82badbe 100644 --- a/src/studio/fields.ts +++ b/src/studio/fields.ts @@ -82,8 +82,9 @@ const seedFields: FieldSpec[] = [ label: '实心面前景目标', type: 'slider', group: 'color', - min: 3, - max: 7, + min: 1, + max: 21, + suggested: { min: 3, max: 7 }, step: 0.1, hint: '带字实心面的对比度目标;不达标只警告', }, @@ -99,20 +100,36 @@ const seedFields: FieldSpec[] = [ label: '画布对称', type: 'slider', group: 'color', - min: 1.15, - max: 1.25, + min: 1, + max: 4, + suggested: { min: 1.15, max: 1.25 }, step: 0.01, hint: '两端画布到各自极点取同一对比度', }, - { path: seedPaths.radiusBase, label: '圆角基座', type: 'number', group: 'skeleton', min: 0, max: 16, unit: 'px' }, - { path: seedPaths.radiusLevels, label: '圆角档数', type: 'number', group: 'skeleton', min: 3, max: 12 }, + { + path: seedPaths.radiusBase, + label: '圆角基座', + type: 'number', + group: 'skeleton', + min: 0, + suggested: { max: 16 }, + unit: 'px', + }, + { + path: seedPaths.radiusLevels, + label: '圆角档数', + type: 'number', + group: 'skeleton', + min: 1, + suggested: { min: 3, max: 12 }, + }, { path: seedPaths.fontSizeBase, label: '字号基准', type: 'number', group: 'skeleton', - min: 8, - max: 20, + min: 1, + suggested: { min: 8, max: 20 }, unit: 'px', hint: '全档整体平移;阶梯形状由 steps 整体替换', }, @@ -132,11 +149,12 @@ const seedFields: FieldSpec[] = [ label: '光源仰角', type: 'slider', group: 'light', - min: 30, - max: 75, + min: 1, + max: 89, + suggested: { min: 30, max: 75 }, step: 5, unit: '°', - hint: '只影响影长,不进运行时', + hint: '只影响影长,不进运行时;0° / 90° 是退化几何', }, { path: '/tokens/seed/light/lightColor', @@ -160,7 +178,8 @@ const seedFields: FieldSpec[] = [ type: 'slider', group: 'light', min: 0, - max: 0.2, + max: 1, + suggested: { max: 0.2 }, step: 0.002, hint: '方向边线的环境底', }, @@ -170,7 +189,8 @@ const seedFields: FieldSpec[] = [ type: 'slider', group: 'light', min: 0, - max: 0.5, + max: 1, + suggested: { max: 0.5 }, step: 0.01, advanced: true, }, @@ -180,7 +200,8 @@ const seedFields: FieldSpec[] = [ type: 'slider', group: 'light', min: 0, - max: 0.5, + max: 1, + suggested: { max: 0.5 }, step: 0.01, advanced: true, }, @@ -190,7 +211,8 @@ const seedFields: FieldSpec[] = [ type: 'slider', group: 'light', min: 0, - max: 0.5, + max: 1, + suggested: { max: 0.5 }, step: 0.01, advanced: true, }, @@ -200,19 +222,36 @@ const seedFields: FieldSpec[] = [ type: 'slider', group: 'light', min: 0, - max: 0.5, + max: 1, + suggested: { max: 0.5 }, step: 0.01, advanced: true, }, - { path: seedPaths.durationUnit, label: '时长步长', type: 'number', group: 'motion', min: 50, max: 200, unit: 'ms' }, - { path: seedPaths.durationCount, label: '时长档数', type: 'number', group: 'motion', min: 3, max: 10 }, + { + path: seedPaths.durationUnit, + label: '时长步长', + type: 'number', + group: 'motion', + min: 1, + suggested: { min: 50, max: 200 }, + unit: 'ms', + }, + { + path: seedPaths.durationCount, + label: '时长档数', + type: 'number', + group: 'motion', + min: 1, + suggested: { min: 3, max: 10 }, + }, { path: seedPaths.easingT, label: '曲线参数 t', type: 'slider', group: 'motion', - min: 0.2, - max: 0.8, + min: 0, + max: 1, + suggested: { min: 0.2, max: 0.8 }, step: 0.01, hint: '0.42 = CSS ease-in-out / Apple easeInEaseOut', }, diff --git a/src/studio/index.ts b/src/studio/index.ts index d58631e..4540099 100644 --- a/src/studio/index.ts +++ b/src/studio/index.ts @@ -2,14 +2,17 @@ * index.ts — core 级配置器定义(`@ultime/core/studio`) * --------------------------------------------------------------------------- * 无头:字段 / 默认值 / 预设 / 校验 / 预览 / 导出 / 选择 / 派生。 - * 同一配置版本的 validate / inspect / preview / export 共享一份 ProjectBuild; - * 改 seed 产生新配置版本,重新派生 —— 这是配置器的职责,不是重复计算。 + * core 原版配置(`THEME_DEFAULTS`,无 selection / derivation)的派生随版本固定, + * 进程内只算一次,validate / inspect / preview / export 共用;用户自定义配置每次独立派生。 + * 供共享的基线构建在读取时复制(manifest / diagnostics / counts),调用方改动不会污染后续结果。 */ import { defineConfigurator, type ConfiguratorDefinition, type Diagnostic, type Preset } from '@ultime/studio' +import { stableStringify } from '../seed' import { planProject, type ProjectBuild } from '../tools' import { ENGINE_VERSION } from '../version' import { THEME_DEFAULTS } from './defaults' +import { toStudioDiagnostics } from './diagnostics' import { THEME_FIELDS, THEME_GROUPS } from './fields' import { selectBuild } from './selection' import type { ThemeStudioConfig } from './types' @@ -27,13 +30,21 @@ export { } from './selection' export { deriveTree, type DerivationConfig, type DerivedTree } from './derivation' -let cached: { key: string; build: ProjectBuild } | undefined +const BASELINE_TOKENS = stableStringify(THEME_DEFAULTS.tokens) +let baselineBuild: ProjectBuild | undefined -/** seed / 出口变化才重新派生;selection / derivation 只消费已有构建。 */ +/** core 原版的派生只算一次;其余配置每次独立派生,不持有跨调用状态。 */ function buildFor(config: ThemeStudioConfig): ProjectBuild { - const key = JSON.stringify(config.tokens) - if (cached?.key === key) return cached.build - const build = planProject({ + const isBaseline = config.selection === undefined && config.derivation === undefined + if (isBaseline && stableStringify(config.tokens) === BASELINE_TOKENS) { + baselineBuild ??= derive(config) + return baselineBuild + } + return derive(config) +} + +function derive(config: ThemeStudioConfig): ProjectBuild { + return planProject({ tokens: { seed: config.tokens.seed, platforms: config.tokens.platforms, @@ -41,8 +52,6 @@ function buildFor(config: ThemeStudioConfig): ProjectBuild { semantics: config.tokens.semantics, }, }) - cached = { key, build } - return build } interface ThemeResult { @@ -107,15 +116,6 @@ const PRESETS: Preset[] = [ }, ] -function toStudioDiagnostic(diagnostic: ProjectBuild['diagnostics'][number]): Diagnostic { - return { - level: diagnostic.level, - code: `core/${diagnostic.code}`, - message: diagnostic.message, - path: diagnostic.path ?? '/tokens/seed', - } -} - const SCENARIOS = [ { id: 'light', label: '浅色' }, { id: 'dark', label: '深色' }, @@ -149,10 +149,7 @@ export const themeStudio: ConfiguratorDefinition = defineConf try { const { build, selected } = resultFor(config) const source = selected?.diagnostics ?? build.diagnostics - const contract = source.filter((item) => item.code.startsWith('contract.')) - const other = source.filter((item) => !item.code.startsWith('contract.')) - diagnostics.push(...other.map(toStudioDiagnostic)) - diagnostics.push(...contract.slice(0, 12).map(toStudioDiagnostic)) + diagnostics.push(...toStudioDiagnostics(source)) } catch (error) { diagnostics.push({ level: 'error', @@ -169,12 +166,14 @@ export const themeStudio: ConfiguratorDefinition = defineConf return { artifacts: [], diagnostics: [] } } const { build, selected } = resultFor(config) + const source = selected?.diagnostics ?? build.diagnostics return { - counts: selected?.counts ?? build.core.counts, + counts: structuredClone(selected?.counts ?? build.core.counts), contracts: { total: build.core.contracts.total, failed: build.core.contracts.failed }, - manifest: build.manifest, + /* 基线构建是共享的:manifest / diagnostics 复制后再给出,调用方改动不会污染后续结果 */ + manifest: structuredClone(build.manifest), artifacts: (selected?.artifacts ?? build.artifacts).map(({ path, bytes }) => ({ path, bytes })), - diagnostics: selected?.diagnostics ?? build.diagnostics, + diagnostics: source.map((item) => ({ ...item })), ...(selected ? { custom: true, selection: config.selection ?? {}, derivation: config.derivation ?? {} } : {}), } }, diff --git a/tests/studio-diagnostics.test.ts b/tests/studio-diagnostics.test.ts new file mode 100644 index 0000000..2c52b5b --- /dev/null +++ b/tests/studio-diagnostics.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it } from 'vite-plus/test' + +import { toStudioDiagnostics } from '../src/studio/diagnostics' +import type { BuildDiagnostic } from '../src/tools' + +const warn = (id: number): BuildDiagnostic => ({ + level: 'warn', + code: `contract.color/pair-${id}`, + message: `warn ${id}`, + path: '/tokens/seed', +}) + +describe('toStudioDiagnostics', () => { + it('合同 error 永不截断', () => { + const source: BuildDiagnostic[] = [...Array.from({ length: 20 }, (_, index) => warn(index))] + source.push({ level: 'error', code: 'contract.space-monotonic', message: 'error', path: '/tokens/seed' }) + + const diagnostics = toStudioDiagnostics(source) + + expect(diagnostics.some((item) => item.level === 'error' && item.code === 'core/contract.space-monotonic')).toBe( + true, + ) + expect(diagnostics.filter((item) => item.level === 'warn')).toHaveLength(12) + expect(diagnostics.at(-1)).toMatchObject({ level: 'info', code: 'core/contract.truncated' }) + expect(diagnostics.at(-1)?.message).toContain('8') + }) + + it('提示不超上限时不加摘要', () => { + const diagnostics = toStudioDiagnostics(Array.from({ length: 12 }, (_, index) => warn(index))) + + expect(diagnostics).toHaveLength(12) + expect(diagnostics.some((item) => item.code === 'core/contract.truncated')).toBe(false) + }) + + it('非合同诊断不参与截断', () => { + const source: BuildDiagnostic[] = [ + ...Array.from({ length: 20 }, (_, index) => warn(index)), + ...Array.from({ length: 20 }, (_, index) => ({ + level: 'info' as const, + code: `selection.steps-${index}`, + message: `info ${index}`, + })), + ] + + const diagnostics = toStudioDiagnostics(source) + + expect(diagnostics.filter((item) => item.code.startsWith('core/selection.'))).toHaveLength(20) + }) +}) diff --git a/tests/studio.test.ts b/tests/studio.test.ts index bcd3426..f147827 100644 --- a/tests/studio.test.ts +++ b/tests/studio.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vite-plus/test' -import { deserializeConfig, exportConfig, serializeConfig } from '@ultime/studio' +import { deserializeConfig, exportConfig, serializeConfig, validateConfig } from '@ultime/studio' import { exportThemeArtifacts, themeStudio } from '../src/studio' import { THEME_DEFAULTS } from '../src/studio/defaults' @@ -69,7 +69,7 @@ describe('studio · core 配置器', () => { expect(inspected?.counts?.total).toBeGreaterThan(0) }) - it('改选择复用同一份 ProjectBuild', () => { + it('改选择各自派生,产物引用不跨调用复用', () => { const color: ThemeStudioConfig = { ...THEME_DEFAULTS, selection: { categories: ['color'] } } const motion: ThemeStudioConfig = { ...THEME_DEFAULTS, @@ -79,7 +79,60 @@ describe('studio · core 配置器', () => { const first = themeStudio.inspect?.(color) as { manifest?: unknown } | undefined const second = themeStudio.inspect?.(motion) as { manifest?: unknown } | undefined - expect(first?.manifest).toBe(second?.manifest) + expect(first?.manifest).toEqual(second?.manifest) + expect(first?.manifest).not.toBe(second?.manifest) + }) + + it('基线派生共享,返回值被改动也不污染下一次', () => { + const first = themeStudio.inspect?.(THEME_DEFAULTS) as + | { manifest?: Record; diagnostics?: unknown[] } + | undefined + if (!first?.manifest) throw new Error('inspect 未返回 manifest') + first.manifest.seedHash = 'tampered' + first.diagnostics?.push({ level: 'error', code: 'tampered', message: 'tampered' }) + + const second = themeStudio.inspect?.(THEME_DEFAULTS) as + | { manifest?: { seedHash?: string }; diagnostics?: unknown[] } + | undefined + expect(second?.manifest?.seedHash).not.toBe('tampered') + expect(second?.diagnostics).toEqual(first.diagnostics?.slice(0, -1)) + }) + + it('档数为 0 时合同报 error,导出被阻断', async () => { + const config: ThemeStudioConfig = { + ...THEME_DEFAULTS, + tokens: { + ...THEME_DEFAULTS.tokens, + seed: { + ...THEME_DEFAULTS.tokens.seed, + skeleton: { ...THEME_DEFAULTS.tokens.seed.skeleton!, radius: { base: 4, levels: 0 } }, + }, + }, + } + + const diagnostics = (await themeStudio.validate?.(config, { mode: 'export' })) ?? [] + expect(diagnostics.some((item) => item.level === 'error' && item.code === 'core/contract.radius-derive')).toBe(true) + }) + + it('合法域越界报 error,建议区间只提示', async () => { + const withSeed = (patch: (seed: NonNullable) => void) => { + const draft = JSON.parse(JSON.stringify(THEME_DEFAULTS)) as ThemeStudioConfig + patch(draft.tokens.seed!) + return draft + } + + const alpha = withSeed((seed) => { + seed.light = { ...seed.light, ambientAlpha: 2 } + }) + const alphaDiagnostics = await validateConfig(themeStudio, alpha) + expect(alphaDiagnostics.some((item) => item.code === 'field/range' && item.level === 'error')).toBe(true) + + const radius = withSeed((seed) => { + seed.skeleton = { ...seed.skeleton, radius: { ...seed.skeleton?.radius, base: 80 } } + }) + const radiusDiagnostics = await validateConfig(themeStudio, radius) + expect(radiusDiagnostics.some((item) => item.code === 'field/suggested' && item.level === 'warn')).toBe(true) + expect(radiusDiagnostics.some((item) => item.code === 'field/range')).toBe(false) }) it('非法选择配置在校验时报 error', async () => {