diff --git a/AGENTS.md b/AGENTS.md index 3bf4627..a421d2e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,15 +1,28 @@ # AGENTS.md — @ultime/studio -> 给在本仓库工作的 AI 与协作者:只放入口与红线,不复述 README。 -> 适用版本:0.1.x +> 给在本仓库工作的 AI 与协作者:入口、可写 / 只读、红线与验收。 +> 适用版本:0.2.x ## 先读 1. [`README.md`](./README.md) — 协议、控制器、导出与边界。 2. [`rules/README.md`](./rules/README.md) — 本包开发规范。 -3. [`llms.txt`](./llms.txt) — AI 索引;能力表见 [`skills.md`](./skills.md),操作约束见 [`agent.md`](./agent.md)。 +3. [`llms.txt`](./llms.txt) — AI 索引;能力表见 [`SKILLS.md`](./SKILLS.md)。 4. [`src/definition.ts`](./src/definition.ts) — 定义协议;先看它再改运行时。 +## 可写 / 只读 + +| 路径 | 条件 | +|---|---| +| `src/definition.ts` | 协议变更;必须同步所有领域包与契约测试 | +| `src/controller.ts` | 状态 / 历史 / 校验 / 导出编排 | +| `src/normalize.ts` / `src/diagnostics.ts` | 规范化与通用校验 | +| `src/persistence.ts` / `src/preview.ts` / `src/export.ts` | 纯编解码 / 预览模型 / 导出编排 | +| `tests/**` | 与改动同批 | +| `rules/` / `llms.txt` / `SKILLS.md` | 随版本同批更新 | + +只读:`node_modules/**`;领域包的源码与产物(只在定义层消费,不跨包改)。 + ## 红线 - **本包是上游通用运行时**:只放协议与运行时;领域字段 / 默认值 / 示例 / UI 都在上层包,不进入本包。 @@ -18,6 +31,7 @@ - **不决定布局与控件形态**:运行时只处理配置数据。 - **导出确定性**:同输入逐字节相同,lock 不含时间戳。 - **字段是唯一 schema 载体**:不在别处维护第二份字段表。 +- **不改已发布版本元数据**:版本、许可与作者信息随新版本生效。 ## 验证 @@ -27,4 +41,5 @@ pnpm test pnpm typecheck ``` -没跑或没跑通时,必须说明是哪一条、为什么。 +- 改协议:同步 README、`SKILLS.md`、受影响的领域包与版本戳; +- 没跑或没跑通时,必须说明是哪一条、为什么。 diff --git a/CHANGELOG.md b/CHANGELOG.md index df510a6..04bba54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.2.0 - 2026-11-10 + +- **行为变更**:字段范围分两层——`min` / `max` 是合法域,越界给 `error` 并阻断导出(API 侧防乱传);新增 `suggested` 建议区间,越界只给 `warn`。类型 / 枚举 / 缺失仍是 `error`。 +- `hue` 明确为控件提示:运行时等同 `number`,不强制 0–360,也不隐式回绕。 +- 包内新增 `llms.txt` / `SKILLS.md` 作为消费侧 AI 入口,并与 `exports` 对齐;`rules/` 留仓,操作约束并入 `AGENTS.md`。 +- 协议注释与 README 同步上述口径。 + ## 0.1.2 - 2026-11-09 - 测试与文档领域中立化:fixture 改为通用 `theme` 配置,不再使用任何具体领域的路径或字段。 diff --git a/README.md b/README.md index 51668ea..37497df 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ pnpm add @ultime/studio 领域定义不在这里:各领域包自行提供 `/studio` 子入口,本包只认通用协议。 +AI 入口:[`llms.txt`](./llms.txt)(路由)与 [`SKILLS.md`](./SKILLS.md)(能力表)随包发布。 + ## 三层分工 | 层 | 谁写 | 内容 | @@ -63,12 +65,15 @@ const direct = await exportConfig(configurator, config) | 项 | 约定 | |---|---| | `fields` | 唯一 schema 载体;`type` 只是 UI 提示,运行时只做通用类型 / 枚举 / 范围校验 | +| `hue` | 只是控件提示(色相盘);运行时等同 `number`,不强制 0–360,也不隐式回绕 | +| `min` / `max` | 合法域;越界给 `error` 并阻断导出(防乱传导致产物不可用) | +| `suggested` | 建议区间;越界只给 `warn`,不阻断导出 —— 风格好不好看由用户决定 | | `custom` | 通用校验跳过,语义交给定义的 `validate()` | | `set(path, value)` | 只改一个 JSON Pointer,做字段级取值修正;不自动重算诊断 | | `patch(patch)` | `add` / `remove` / `replace` 子集;AI 与诊断 fix 都产出 patch,可审阅 | | `replace` / `applyPreset` | 整体替换 config,baseline 不变 | | `reset` | 默认回 baseline;`mode: 'defaults'` 回定义默认值;带 `path` 只复位一个字段 | -| `validate()` | 通用字段校验 + 定义 `validate()`;`error` 阻断导出,`warn` / `info` 不阻断 | +| `validate()` | 通用字段校验 + 定义 `validate()`;类型 / 枚举 / 缺失 / 合法域越界 / 领域阻断给 `error`,建议类给 `warn` / `info` | | `export()` | 规范化 → 校验 → 定义 `export()`;返回 `ExportOutcome`,无文件 IO / 下载 | | `serialize()` | 稳定 JSON(对象键排序),可直接落项目配置(字段由定义包决定),不含派生值 | | `toURL()` / `fromURL()` | 纯编解码,`#studio=v1.…`,版本随串走;不依赖 `btoa` / `Buffer` / localStorage | @@ -126,7 +131,7 @@ pnpm typecheck ## 版本与兼容 -- 当前 `0.1.x`;0.x 阶段 `ConfiguratorDefinition` 仍可能调整。 +- 当前 `0.2.x`;0.x 阶段 `ConfiguratorDefinition` 仍可能调整。 - 破坏性变更写进 [CHANGELOG](./CHANGELOG.md),并在本节目说明迁移方式;协议变更先发 studio,再发依赖包。 - 零第三方运行时依赖。 diff --git a/skills.md b/SKILLS.md similarity index 84% rename from skills.md rename to SKILLS.md index 7c9771e..af524bf 100644 --- a/skills.md +++ b/SKILLS.md @@ -1,8 +1,8 @@ # @ultime/studio · 可调用能力 > 定位:AI 可调用的协议、方法与错误语义。字段与预设内容由领域包定义,本文件不手抄。 -> 适用版本:0.1.x -> 同步基线:0.1.x(手写;导出面或协议变化时同批更新) +> 适用版本:0.2.x +> 同步基线:0.2.x(手写;导出面或协议变化时同批更新) --- @@ -28,7 +28,7 @@ import { ## 错误语义 -- `validate()` 返回诊断数组:`error` 阻断导出,`warn` / `info` 不阻断。 +- `validate()` 返回诊断数组:类型 / 枚举 / 缺失 / `min`·`max` 合法域越界 / 领域阻断是 `error` 并阻断导出;`suggested` 建议区间与提示是 `warn` / `info`,不阻断。 - `export()` 不抛异常;失败时返回 `ok: false` 与诊断。 - 未知字段按 `unknownPolicy` 处理,只查对象键、不深入数组元素。 - `$schema` / `$version` 视为元信息,不参与未知字段判定。 diff --git a/agent.md b/agent.md deleted file mode 100644 index 513756a..0000000 --- a/agent.md +++ /dev/null @@ -1,42 +0,0 @@ -# @ultime/studio · 操作约束 - -> 定位:AI 在本仓可以改什么、不能改什么、改完怎么验。 -> 适用版本:0.1.x - ---- - -## 可写 - -| 路径 | 条件 | -|---|---| -| `src/definition.ts` | 协议变更;必须同步所有领域包与契约测试 | -| `src/controller.ts` | 状态 / 历史 / 校验 / 导出编排 | -| `src/normalize.ts` / `src/diagnostics.ts` | 规范化与通用校验 | -| `src/persistence.ts` / `src/preview.ts` / `src/export.ts` | 纯编解码 / 预览模型 / 导出编排 | -| `tests/**` | 与改动同批 | -| `rules/` / `llms.txt` / `skills.md` / `agent.md` | 随版本同批更新 | - -## 只读 - -- `node_modules/**`; -- 领域包的源码与产物;只在定义层消费,不跨包改。 - -## 禁止 - -- import 任何领域包; -- 读写文件、访问 DOM、`localStorage`、网络; -- 在运行时决定布局与控件形态; -- 在 `set()` 里自动重算诊断; -- 让 `preview()` 维护与 `export()` 不同源的 CSS; -- 改已发布版本的元数据。 - -## 验证 - -```bash -pnpm check -pnpm test -pnpm typecheck -``` - -- 改协议:同步 README、`skills.md`、受影响的领域包与版本戳; -- 交付时说明跑了哪些命令;没跑或失败要写清哪一条、为什么。 diff --git a/llms.txt b/llms.txt index ce7b0d0..718f6e8 100644 --- a/llms.txt +++ b/llms.txt @@ -1,18 +1,15 @@ # @ultime/studio · AI 索引 -适用版本:0.1.x +适用版本:0.2.x ## 去哪找 - 怎么用:[README.md](./README.md) -- 开发规则:[rules/README.md](./rules/README.md) -- 可调用能力:[skills.md](./skills.md) -- 操作约束:[agent.md](./agent.md) -- 仓库入口:[AGENTS.md](./AGENTS.md) +- 可调用能力:[SKILLS.md](./SKILLS.md) ## 机器入口 -- 协议形状:`src/definition.ts` +- 公共出口:`@ultime/studio` 的 `defineConfigurator` / `createConfigurator` / `exportConfig` / `normalizeConfig` / `assertContract` - 契约测试:`assertContract(definition)` - 校验 / 导出:`createConfigurator` / `exportConfig` diff --git a/package.json b/package.json index 1e7cd93..9ff1713 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ultime/studio", - "version": "0.1.2", + "version": "0.2.0", "description": "Ultime · studio:配置器无头运行时(定义 / 状态 / 规范化 / 诊断 / 预览模型 / 导出清单),纯 TS、零依赖、不碰 DOM 与文件系统", "keywords": [ "configuration", @@ -25,6 +25,8 @@ "dist", "src", "README.md", + "llms.txt", + "SKILLS.md", "CHANGELOG.md", "CONTRIBUTING.md", "SECURITY.md" @@ -49,7 +51,7 @@ "devDependencies": { "@types/node": "^22.20.5", "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 be67b27..2777240 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,8 +173,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)(typescript@5.9.3) + specifier: 1.5.1 + version: 1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(typescript@5.9.3) packages: @@ -203,289 +203,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': @@ -516,18 +516,18 @@ packages: '@types/node@22.20.5': resolution: {integrity: sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==} - '@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 @@ -537,25 +537,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 @@ -623,54 +623,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] @@ -904,12 +904,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: @@ -920,16 +920,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: @@ -1005,12 +1005,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: @@ -1021,20 +1021,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 @@ -1110,143 +1110,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': {} @@ -1280,29 +1280,29 @@ snapshots: dependencies: undici-types: 6.21.0 - '@vitest/browser-preview@5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(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)(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)(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)(typescript@5.9.3)) + '@vitest/browser': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(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)(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)(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)(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)(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)(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)(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)(typescript@5.9.3)) ws: 8.22.1 transitivePeerDependencies: - bufferutil @@ -1310,86 +1310,86 @@ snapshots: - utf-8-validate - vite - '@vitest/mocker@5.0.5(@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(typescript@5.9.3))': + '@vitest/mocker@5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(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)(typescript@5.9.3)' + vite: '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(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)(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)(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)(typescript@5.9.3)': + '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(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 fsevents: 2.3.3 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': @@ -1532,63 +1532,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)(typescript@5.9.3)): + oxfmt@0.76.0(vite-plus@1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(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)(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)(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)(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)(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)(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)(typescript@5.9.3) pathe@2.0.3: {} @@ -1641,32 +1641,32 @@ snapshots: undici-types@6.21.0: {} - vite-plus@1.4.0(@types/node@22.20.5)(@vitest/ui@5.0.5)(typescript@5.9.3): + vite-plus@1.5.1(@types/node@22.20.5)(@vitest/ui@5.1.0)(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)(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)(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)(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)(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)(typescript@5.9.3)) - oxlint-tsgolint: 7.0.2004 - vite: '@voidzero-dev/vite-plus-core@1.4.0(@types/node@22.20.5)(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)(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)(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)(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)(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)(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)(typescript@5.9.3)) + oxlint-tsgolint: 7.0.2005 + vite: '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(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)(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' @@ -1702,10 +1702,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)(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)(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)(typescript@5.9.3)) + '@vitest/mocker': 5.1.0(@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(typescript@5.9.3)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -1716,12 +1716,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)(typescript@5.9.3)' + vite: '@voidzero-dev/vite-plus-core@1.5.1(@types/node@22.20.5)(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)(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)(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 3da2847..845b14b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1 +1,12 @@ packages: ['.'] +minimumReleaseAgeExclude: + - '@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 074d040..c65c1de 100644 --- a/rules/01-architecture.md +++ b/rules/01-architecture.md @@ -1,7 +1,7 @@ # 01 · 架构与依赖 > 定位:studio 的三层分工、依赖方向与目录职责。 -> 适用版本:0.1.x +> 适用版本:0.2.x > 关系:规则索引见 [`README`](./README.md);协议细节见 [`02-contract`](./02-contract.md)。 --- diff --git a/rules/02-contract.md b/rules/02-contract.md index 9b1ae22..9d78bb4 100644 --- a/rules/02-contract.md +++ b/rules/02-contract.md @@ -1,14 +1,14 @@ # 02 · 定义协议与确定性 > 定位:定义协议、字段校验、诊断与导出的稳定口径。 -> 适用版本:0.1.x +> 适用版本:0.2.x > 关系:架构见 [`01-architecture`](./01-architecture.md);测试见 [`03-testing`](./03-testing.md)。 --- ## 定义协议 -- `fields` 是**唯一 schema 载体**;`type` 只是 UI 提示,运行时只做通用类型 / 枚举 / 范围校验。 +- `fields` 是**唯一 schema 载体**;`type` 只是 UI 提示,运行时只做通用类型 / 枚举 / 范围校验。`min` / `max` 是合法域(越界 error),`suggested` 是建议区间(越界 warn)。 - `custom` 字段跳过通用校验,语义交给定义的 `validate()`。 - 配置根上 `$` 开头的键(`$schema` / `$version`)是元信息,不参与未知字段判定;`$version` 只在导入时用于迁移。 @@ -20,7 +20,7 @@ | `patch(patch)` | `add` / `remove` / `replace` 子集;AI 与诊断 fix 都产出 patch,可审阅 | | `replace` / `applyPreset` | 整体替换 config,baseline 不变 | | `reset` | 回 baseline;`mode: 'defaults'` 回定义默认值;带 `path` 只复位一个字段 | -| `validate()` | 通用字段校验 + 定义 `validate()`;`error` 阻断导出,`warn` / `info` 不阻断 | +| `validate()` | 通用字段校验 + 定义 `validate()`;类型 / 枚举 / 缺失 / 合法域越界 / 领域阻断给 `error`,建议区间与提示给 `warn` / `info` | | `export()` | 规范化 → 校验 → 定义 `export()`;返回 `ExportOutcome`,无文件 IO | | `serialize()` | 稳定 JSON(对象键排序),可直接落配置;不含派生值 | | `toURL()` / `fromURL()` | 纯编解码,版本随串走;不依赖 `btoa` / `Buffer` / localStorage | diff --git a/rules/03-testing.md b/rules/03-testing.md index 1ab0058..4da0aa2 100644 --- a/rules/03-testing.md +++ b/rules/03-testing.md @@ -1,7 +1,7 @@ # 03 · 测试与验收 > 定位:改 studio 时跑什么、什么算通过。 -> 适用版本:0.1.x +> 适用版本:0.2.x > 关系:协议见 [`02-contract`](./02-contract.md);发布检查见 [`04-release`](./04-release.md)。 --- @@ -22,7 +22,7 @@ pnpm typecheck | `tests/normalize.test.ts` | 默认值补齐、未知字段策略、迁移、字段级修正 | | `tests/contract.test.ts` | 定义协议:字段自洽 / 默认值规范形 / 往返 / 导出确定性 | -- 新增协议字段:必须同时补契约测试与 README / `skills.md`。 +- 新增协议字段:必须同时补契约测试与 README / `SKILLS.md`。 - 改导出或序列化:必须有「同输入逐字节相同」的断言。 - 改 URL 编解码:必须覆盖旧版本串的兼容或明确迁移。 diff --git a/rules/04-release.md b/rules/04-release.md index 671f959..8bebc2a 100644 --- a/rules/04-release.md +++ b/rules/04-release.md @@ -1,7 +1,7 @@ # 04 · 版本与发布 > 定位:studio 的编译 ESM 形态、发布顺序与检查。 -> 适用版本:0.1.x +> 适用版本:0.2.x > 关系:测试见 [`03-testing`](./03-testing.md);发布由仓库 owner 按本清单执行。 --- @@ -19,10 +19,11 @@ ## 发布前检查 - [ ] `pnpm check` / `pnpm test` / `pnpm typecheck` 全绿 -- [ ] `npm pack --dry-run` 只带 `src` / `README.md` +- [ ] `npm pack --dry-run` 只带 `dist` / `src` / `README.md` / 附属文件(不含 `tests/` / `rules/` / `evals`) - [ ] `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` 对齐 ## 兼容 diff --git a/rules/README.md b/rules/README.md index 265820a..3c7b369 100644 --- a/rules/README.md +++ b/rules/README.md @@ -1,7 +1,7 @@ # studio · 开发规则 > 定位:本包开发规范的索引。只写判断、边界与反例;协议与 API 以 README 和 `src/definition.ts` 为准。 -> 适用版本:0.1.x +> 适用版本:0.2.x > 关系:入口见 [`AGENTS.md`](../AGENTS.md);怎么用见 [`README.md`](../README.md)。 --- diff --git a/src/definition.ts b/src/definition.ts index 2d1ae22..99ef9de 100644 --- a/src/definition.ts +++ b/src/definition.ts @@ -4,6 +4,8 @@ * 定义包只写领域规则:字段、默认值、预设、校验、预览、导出; * 表单层级、控件形态、窄屏收纳归上游 UI,运行时只给元数据与状态。 * `FieldSpec.type` 是 UI 提示;运行时只做通用的类型 / 枚举 / 范围校验。 + * `hue` 只是控件提示(色相盘),运行时等同 `number`,不强制 0–360。 + * `min` / `max` 是合法域,越界给 `error` 并阻断导出;`suggested` 是建议区间,越界只给 `warn`。 */ import type { Awaitable, Diagnostic, ExportContext, ExportResult, ValidationContext } from './types.ts' @@ -32,8 +34,12 @@ export interface FieldSpec { group?: string hint?: string optional?: boolean + /** 合法域下限;越界给 error,阻断导出 */ min?: number + /** 合法域上限;越界给 error,阻断导出 */ max?: number + /** 建议区间;越界只给 warn,不阻断导出(审美取舍归用户) */ + suggested?: { min?: number; max?: number } step?: number unit?: string /** `select` / `multi-select` 必填 */ diff --git a/src/diagnostics.ts b/src/diagnostics.ts index ac334a8..a6a6712 100644 --- a/src/diagnostics.ts +++ b/src/diagnostics.ts @@ -3,6 +3,7 @@ * --------------------------------------------------------------------------- * 运行时只做通用的类型 / 枚举 / 范围校验;对比度、依赖闭包这类领域规则由定义的 validate() 提供。 * `error` 阻断导出,`warn` / `info` 只提示;诊断带 path,上游据此定位到字段。 + * 范围分两层:`min` / `max` 是合法域(越界 error),`suggested` 是建议区间(越界 warn)。 */ import type { ConfiguratorDefinition, FieldSpec } from './definition.ts' @@ -21,8 +22,8 @@ function isOptionValue(field: FieldSpec, value: unknown): boolean { function checkField(field: FieldSpec, value: unknown): Diagnostic[] { const at = field.path - const push = (code: string, message: string): Diagnostic => ({ - level: 'error', + const push = (code: string, message: string, level: DiagnosticLevel = 'error'): Diagnostic => ({ + level, code: `field/${code}`, message: `${field.label}:${message}`, path: at, @@ -37,10 +38,20 @@ function checkField(field: FieldSpec, value: unknown): Diagnostic[] { case 'slider': case 'hue': { if (typeof value !== 'number' || !Number.isFinite(value)) return [push('type', '应为数字')] - const issues: Diagnostic[] = [] - if (field.min !== undefined && value < field.min) issues.push(push('range', `不得小于 ${field.min}`)) - if (field.max !== undefined && value > field.max) issues.push(push('range', `不得大于 ${field.max}`)) - return issues + const hard: Diagnostic[] = [] + if (field.min !== undefined && value < field.min) hard.push(push('range', `不得小于 ${field.min}`)) + if (field.max !== undefined && value > field.max) hard.push(push('range', `不得大于 ${field.max}`)) + if (hard.length) return hard + + const advice: Diagnostic[] = [] + const suggested = field.suggested + if (suggested?.min !== undefined && value < suggested.min) { + advice.push(push('suggested', `建议不小于 ${suggested.min}`, 'warn')) + } + if (suggested?.max !== undefined && value > suggested.max) { + advice.push(push('suggested', `建议不大于 ${suggested.max}`, 'warn')) + } + return advice } case 'switch': return typeof value === 'boolean' ? [] : [push('type', '应为布尔值')] diff --git a/tests/controller.test.ts b/tests/controller.test.ts index d6b01fa..4b9ce89 100644 --- a/tests/controller.test.ts +++ b/tests/controller.test.ts @@ -148,14 +148,32 @@ describe('createConfigurator · 校验与导出', () => { expect(controller.getState().diagnostics).toEqual(diagnostics) }) - it('范围错误会阻断导出', async () => { + it('合法域越界阻断导出', async () => { const controller = createConfigurator(demoDefinition) controller.set('/theme/accent/lightness', 0.95) const outcome = await controller.export() expect(outcome.ok).toBe(false) expect(outcome.files).toEqual([]) - expect(outcome.diagnostics.some((item) => item.code === 'field/range')).toBe(true) + expect(outcome.diagnostics.some((item) => item.code === 'field/range' && item.level === 'error')).toBe(true) + }) + + it('建议区间越界只提示,不阻断导出', async () => { + const controller = createConfigurator(demoDefinition) + controller.set('/theme/accent/hue', 300) + + const outcome = await controller.export() + expect(outcome.ok).toBe(true) + expect(outcome.diagnostics.some((item) => item.code === 'field/suggested' && item.level === 'warn')).toBe(true) + }) + + it('超出合法域的色相同样阻断', async () => { + const controller = createConfigurator(demoDefinition) + controller.set('/theme/accent/hue', 720) + + const outcome = await controller.export() + expect(outcome.ok).toBe(false) + expect(outcome.diagnostics.some((item) => item.code === 'field/range' && item.level === 'error')).toBe(true) }) it('导出成功时给出产物与 lock,且两次结果一致', async () => { diff --git a/tests/fixtures/theme.ts b/tests/fixtures/theme.ts index 7b09548..ad2ebe7 100644 --- a/tests/fixtures/theme.ts +++ b/tests/fixtures/theme.ts @@ -46,7 +46,16 @@ export const demoDefinition: ConfiguratorDefinition = defineConfigur defaults: demoDefaults, unknownPolicy: 'reject', fields: [ - { path: '/theme/accent/hue', label: '主题色相', type: 'hue', min: 0, max: 360, step: 1, unit: '°' }, + { + path: '/theme/accent/hue', + label: '主题色相', + type: 'hue', + min: 0, + max: 360, + suggested: { min: 180, max: 240 }, + step: 1, + unit: '°', + }, { path: '/theme/accent/lightness', label: '明度', type: 'slider', min: 0.3, max: 0.9, step: 0.01 }, { path: '/theme/accent/tone', diff --git a/tests/neutral.test.ts b/tests/neutral.test.ts index 645361b..17f9029 100644 --- a/tests/neutral.test.ts +++ b/tests/neutral.test.ts @@ -7,7 +7,7 @@ import { describe, expect, it } from 'vite-plus/test' const ROOT = fileURLToPath(new URL('..', import.meta.url)) const SELF = path.join(ROOT, 'tests/neutral.test.ts') -const DOCS = ['README.md', 'AGENTS.md', 'CONTRIBUTING.md', 'CHANGELOG.md', 'agent.md', 'skills.md', 'llms.txt'] +const DOCS = ['README.md', 'AGENTS.md', 'CONTRIBUTING.md', 'CHANGELOG.md', 'SKILLS.md', 'llms.txt'] /** 本包是上游通用运行时:不出现其它包的名称或领域示例。 */ const FORBIDDEN = [