From 4e59a41fefcaed5b819db1634370cece58e7fb96 Mon Sep 17 00:00:00 2001 From: tiye Date: Fri, 16 Jan 2026 01:34:33 +0800 Subject: [PATCH] upgrade deps; reuse day from last day --- compact.cirru | 56 ++++- deps.cirru | 10 +- llms/Calcit.md | 568 +++++++++++++++++++++++++++++++++++++++---------- llms/Respo.md | 166 +++++++-------- package.json | 4 +- yarn.lock | 322 +++++++++++++++------------- 6 files changed, 761 insertions(+), 365 deletions(-) diff --git a/compact.cirru b/compact.cirru index eb77f39..6de1929 100644 --- a/compact.cirru +++ b/compact.cirru @@ -1,5 +1,5 @@ -{} (:package |app) +{} (:about "|file is generated - never edit directly; learn cr edit/tree workflows before changing") (:package |app) :configs $ {} (:init-fn |app.client/main!) (:reload-fn |app.client/reload!) (:version |0.0.1) :modules $ [] |respo.calcit/ |lilac/ |recollect/ |memof/ |respo-ui.calcit/ |ws-edn.calcit/ |cumulo-util.calcit/ |respo-message.calcit/ |cumulo-reel.calcit/ |respo-feather.calcit/ |alerts.calcit/ :entries $ {} @@ -276,10 +276,18 @@ {} $ :class-name css/row-middle <> "\"Short review" $ {} (:font-size 20) (:font-family ui/font-fancy) :color $ hsl 0 0 80 - =< 20 nil + div + {} $ :class-name css/row-middle + when + and (blank? (:food diary)) (blank? (:pains diary)) + button $ {} (:class-name css/button) (:inner-text "|Like last day") + :style $ {} (:margin-left 16) + :on-click $ fn (e d!) + d! :diary/copy-yesterday $ {} (:date-info date-info) when not= (:text diary) (:text state) button $ {} (:class-name css/button-primary) (:inner-text "\"Save") + :style $ {} (:margin-left 16) :on-click $ fn (e d!) when not $ blank? (:text state) @@ -292,12 +300,13 @@ lost-copy "\"diary-lost-copy" js/localStorage.setItem lost-copy $ :text state js/console.info "\"Latest diary saved to" $ to-lispy-string lost-copy - when - not= (:text diary) (:text state) - a - {} (:class-name css/link) - :on-click $ fn (e d!) (d! cursor nil) - <> "\"Reset" + when + not= (:text diary) (:text state) + a + {} (:class-name css/link) + :style $ {} (:margin-left 16) + :on-click $ fn (e d!) (d! cursor nil) + <> "\"Reset" textarea $ {} :value $ :text state :placeholder "\"Some diary" @@ -1339,6 +1348,7 @@ (:router/change op-data) (router/change db op-data sid op-id op-time) (:diary/add-one op-data) (diary/add-one db op-data sid op-id op-time) (:diary/change op-data) (diary/change db op-data sid op-id op-time) + (:diary/copy-yesterday op-data) (diary/copy-yesterday db op-data sid op-id op-time) (:today op-data) (diary/set-today db op-data sid op-id op-time) _ $ do (eprintln "|Unknown op:" op) db :examples $ [] @@ -1377,6 +1387,35 @@ assoc (:field op-data) (:data op-data) assoc :time op-time :examples $ [] + |copy-yesterday $ %{} :CodeEntry (:doc |) + :code $ quote + defn copy-yesterday (db op-data sid op-id op-time) + let + user-id $ get-in db ([] :sessions sid :user-id) + date-info $ :date-info op-data + today $ format-to-date date-info + yesterday-info $ let + year $ :year date-info + month $ :month date-info + day $ :day date-info + if (> day 1) + assoc date-info :day $ dec day + if (> month 1) + let + prev-month $ dec month + days $ app.util/get-days-by year prev-month + assoc date-info :month prev-month :day days + {} + :year $ dec year + :month 12 + :day 31 + yesterday $ format-to-date yesterday-info + yesterday-diary $ get-in db ([] :users user-id :diaries yesterday) + if (some? yesterday-diary) + assoc-in db ([] :users user-id :diaries today) + merge yesterday-diary $ {} (:date today) (:time op-time) + db + :examples $ [] |set-today $ %{} :CodeEntry (:doc |) :code $ quote defn set-today (db op-data sid op-id op-time) (assoc db :today op-data) @@ -1384,6 +1423,7 @@ :ns $ %{} :CodeEntry (:doc |) :code $ quote ns app.updater.diary $ :require (app.schema :as schema) + app.util :refer $ format-to-date :examples $ [] |app.updater.router $ %{} :FileEntry :defs $ {} diff --git a/deps.cirru b/deps.cirru index 62360e9..7fed182 100644 --- a/deps.cirru +++ b/deps.cirru @@ -1,14 +1,14 @@ -{} (:calcit-version |0.10.4) +{} (:calcit-version |0.10.9) :dependencies $ {} (|Cumulo/cumulo-reel.calcit |main) |Cumulo/cumulo-util.calcit |main - |Respo/alerts.calcit |main + |Respo/alerts.calcit |0.10.4 |Respo/respo-feather.calcit |main - |Respo/respo-message.calcit |main + |Respo/respo-message.calcit |0.0.9 |Respo/respo-ui.calcit |0.6.3 - |Respo/respo.calcit |0.16.22 + |Respo/respo.calcit |0.16.24 |calcit-lang/calcit-wss |0.2.6 - |calcit-lang/calcit.std |main + |calcit-lang/calcit.std |0.2.6 |calcit-lang/lilac |main |calcit-lang/memof |0.0.17 |calcit-lang/recollect |0.0.17 diff --git a/llms/Calcit.md b/llms/Calcit.md index 3940c98..bdb5802 100644 --- a/llms/Calcit.md +++ b/llms/Calcit.md @@ -50,7 +50,10 @@ Calcit 程序使用 `cr` 命令: - 用于 CI/CD 或快速验证代码修改 - `cr js -1` - 检查代码正确性,生成 JavaScript(不进入监听模式) - `cr js --check-only` - 检查代码正确性,不生成 JavaScript -- `cr eval ''` - 执行一段 Calcit 代码片段,用于快速验证写法 +- `cr eval '' [--dep ...]` - 执行一段 Calcit 代码片段,用于快速验证写法 + - `--dep` 参数可以加载 `~/.config/calcit/modules/` 中的模块(直接使用模块名) + - 示例:`cr eval 'echo 1' --dep calcit.std` + - 可多次使用 `--dep` 加载多个模块 ### 查询子命令 (`cr query`) @@ -78,15 +81,17 @@ Calcit 程序使用 `cr` 命令: - `cr query pkg` - 获取项目包名 - `cr query config` - 读取项目配置(init_fn, reload_fn, version) - `cr query error` - 读取 .calcit-error.cirru 错误堆栈文件 -- `cr query modules` - 列出项目模块 +- `cr query modules` - 列出项目依赖的模块(来自 compact.cirru 配置) **渐进式代码探索(Progressive Disclosure):** - `cr query peek ` - 查看定义签名(参数、文档、表达式数量),不返回完整实现体 - 输出:Doc、Form 类型、参数列表、Body 表达式数量、首个表达式预览、Examples 数量 - 用于快速了解函数接口,减少 token 消耗 -- `cr query def ` - 读取定义的完整语法树(JSON 格式) - - 同时显示 Doc 和 Examples 的完整内容 +- `cr query def [-j]` - 读取定义的完整 Cirru 代码 + - 默认输出:Doc、Examples 数量、Cirru 格式代码 + - `-j` / `--json`:同时输出 JSON 格式(用于程序化处理) + - 推荐:LLM 直接读取 Cirru 格式即可,通常不需要 JSON - `cr query examples ` - 读取定义的示例代码 - 输出:每个 example 的 Cirru 格式和 JSON 格式 @@ -103,24 +108,30 @@ Calcit 程序使用 `cr` 命令: **代码模式搜索:** -- `cr query search -p [-l] [-d ]` - 搜索叶子节点(字符串) +- `cr query search [-f ] [-l] [-d ] [-p ]` - 搜索叶子节点(字符串) - - 默认:精确匹配字符串(`-p "div"` 只匹配 `"div"`) - - `-l` / `--loose`:宽松匹配,包含模式(`-p "di"` 匹配所有包含 "di" 的叶子节点) + - `` - 位置参数,要搜索的字符串模式 + - `-f` / `--filter` - 过滤到特定命名空间或定义(可选) + - `-l` / `--loose`:宽松匹配,包含模式(匹配所有包含该模式的叶子节点) - `-d `:限制搜索深度(0 = 无限制) + - `-p` / `--start-path`:从指定路径开始搜索(逗号分隔的索引,如 `"3,2,1"`) + - 不指定时从根节点开始搜索整个定义 + - 指定后只搜索该路径下的子树,适合在大型定义中缩小搜索范围 - 返回:匹配节点的完整路径 + 父级上下文预览 - - 示例:`cr query search app.main/main -p "println" -l` + - 示例: + - `cr query search "println" -f app.main/main -l` - 在 main 函数中搜索包含 "println" 的节点 + - `cr query search "div"` - 全局精确搜索 "div" + - `cr query search "btn" -f app.main/render -p "3,2" -l` - 从路径 [3,2] 开始搜索包含 "btn" 的节点 -- `cr query search-pattern -p [-l] [-j] [-d ]` - 搜索结构模式 - - 模式格式:Cirru one-liner 或 JSON 数组(使用 `-j` 标志) - - 默认:精确结构匹配(整个结构完全相同) +- `cr query search-pattern [-f ] [-l] [-j] [-d ]` - 搜索结构模式 + - `` - 位置参数,Cirru one-liner 或 JSON 数组模式 + - `-f` / `--filter` - 过滤到特定命名空间或定义(可选) - `-l` / `--loose`:宽松匹配,查找包含连续子序列的结构 - - 例如:`-p '["defn", "add"]' -j -l` 匹配任何包含连续 `["defn", "add"]` 的列表 - `-j` / `--json`:将模式解析为 JSON 数组而非 Cirru - 返回:匹配节点的路径 + 父级上下文 - 示例: - - `cr query search-pattern app.util/add -p "(+ a b)"` - 查找精确表达式 - - `cr query search-pattern app.main/main -p '["defn"]' -j -l` - 查找所有函数定义 + - `cr query search-pattern "+ a b" -f app.util/add` - 查找精确表达式 + - `cr query search-pattern '["defn"]' -f app.main/main -j -l` - 查找所有函数定义 **搜索结果格式:** @@ -173,87 +184,82 @@ Calcit 程序使用 `cr` 命令: - `cr libs` - 列出所有官方库 - `cr libs search ` - 按关键词搜索库(搜索名称、描述、分类) -- `cr libs readme ` - 查看指定库的 README 文档(从 GitHub 获取) +- `cr libs readme [-f ]` - 查看库的文档 + - 优先从本地 `~/.config/calcit/modules/` 读取 + - 本地不存在时从 GitHub 仓库获取 + - `-f` 参数可指定其他文档文件(如 `-f Skills.md`) + - 默认读取 `README.md` +- `cr libs scan-md ` - 扫描本地模块目录下的所有 `.md` 文件 + - 递归扫描子目录 + - 显示相对路径列表 - `caps` - 安装/更新依赖 -### 精细代码树操作 (`cr tree`) - -提供对 AST 节点的低级精确操作,适用于需要精细控制的场景: - -**可用操作:** - -- `cr tree show -p ` - 查看指定路径的节点 +**查看已安装模块:** - - `-d ` - 限制显示深度(0=无限,默认 2) +```bash +# 列出 ~/.config/calcit/modules/ 下所有已安装的模块 +ls ~/.config/calcit/modules/ -- `cr tree replace -p ` - 替换指定路径的节点 +# 查看当前项目配置的模块依赖 +cr query modules +``` - - `-e ` - 内联 Cirru 代码(默认单行解析) - - Cirru 输入:仅支持单行表达式(one-liner)。若需 leaf 节点可搭配 `--leaf`,直接写符号或 Cirru 字符串(如 `|text`)。 - - `-f ` - 从文件读取 - - `-j ` - 内联 JSON 字符串 - - `-s` - 从标准输入读取 - - `-J` - JSON 格式输入 - - `--leaf` - 直接作为叶子节点处理(Cirru 符号或 `|text` 字符串,无需 JSON 引号) - - `--refer-original ` - 原节点占位符 - - `--refer-inner-branch ` - 内部分支引用路径 - - `--refer-inner-placeholder ` - 内部分支占位符 +### 精细代码树操作 (`cr tree`) -- `cr tree delete -p ` - 删除指定路径的节点 +⚠️ **关键警告:路径索引动态变化** -- `cr tree insert-before -p ` - 在指定位置前插入节点 +删除或插入节点后,同级后续节点的索引会自动改变。**必须从后往前操作**或**每次修改后重新搜索路径**。 -- `cr tree insert-after -p ` - 在指定位置后插入节点 +**核心概念:** -- `cr tree insert-child -p ` - 插入为第一个子节点 +- 路径格式:逗号分隔的索引(如 `"3,2,1"`),空字符串 `""` 表示根节点 +- 每个命令都有 `--help` 查看详细参数 +- 命令执行后会显示 "Next steps" 提示下一步操作 -- `cr tree append-child -p ` - 追加为最后一个子节点 +**主要操作:** -- `cr tree swap-next -p ` - 与下一个兄弟节点交换 +- `cr tree show -p "" [-j]` - 查看节点 + - 默认输出:节点类型、Cirru 预览、子节点索引列表、操作提示 + - `-j` / `--json`:同时输出 JSON 格式(用于程序化处理) + - 推荐:直接查看 Cirru 格式即可,通常不需要 JSON +- `cr tree replace` - 替换节点 +- `cr tree delete` - 删除节点 +- `cr tree insert-before/after` - 插入相邻节点 +- `cr tree insert-child/append-child` - 插入子节点 +- `cr tree swap-next/prev` - 交换相邻节点 +- `cr tree wrap` - 用新结构包装节点 -- `cr tree swap-prev -p ` - 与上一个兄弟节点交换 +**输入方式(通用):** -- `cr tree wrap -p ` - 用新结构包装节点(使用 refer-original 占位符) +- `-e ''` - 内联代码(自动识别 Cirru/JSON) +- `--leaf` - 强制作为 leaf 节点(符号或字符串) +- `-j ''` / `-f ` / `-s` (stdin) -**使用示例:** +**推荐工作流:** ```bash -# loose 模式快速定位到可能目标叶子节点位置 -cr query search -f app.comp.container/css-search color -l - -# 指定路径查看节点结构 -cr tree show app.main/main! -p "2,1" - -# 替换单个符号(leaf 输入示例,直接 Cirru 语法) -cr tree replace app.main/main! -p "0" --leaf -e 'new-item' -# 注意 Cirru 中字面量也是用前缀的, 比如字符串的前缀可以用 `|` -cr tree replace app.main/main! -p "0" --leaf -e '|new-str' +# 1. 搜索定位 +cr query search "target" -f namespace/def -l -# 替换表达式(one-liner) -cr tree replace app.main/main! -p "2" -e "new-fn new-item" +# 2. 确认节点(命令会显示子节点和路径) +cr tree show namespace/def -p "" -# 删除节点 -cr tree delete app.main/main! -p "1,0" +# 3. 执行修改(命令会显示 Before/After 和验证提示) +cr tree replace namespace/def -p "" --leaf -e '' -# 插入子表达式 -cr tree insert-child app.main/main! -p "2" -e "new-fn new-item" +# 4. 批量修改:从后往前或重新搜索 +cr tree delete namespace/def -p "3,2,3" # 先删大索引 +cr tree delete namespace/def -p "3,2,2" ``` -**⚠️ 重要:精确定位的安全流程** +**关键技巧:** -使用 `cr tree` 前,建议先用 `cr tree show` 确认路径: +- 使用 `cr query search` 快速定位路径 +- `cr tree show` 输出会标注每个子节点的索引 +- 遇到路径错误时,命令会自动显示最长有效路径和可用子节点 +- 所有修改操作都会显示 Preview 和 Verify 命令 -```bash -# 1. 先查看整体结构 -cr tree show app.core/my-fn -p "" -d 1 - -# 2. 逐层确认目标位置 -cr tree show app.core/my-fn -p "2" -d 2 -cr tree show app.core/my-fn -p "2,1,0" - -# 3. 执行修改 -cr tree replace app.core/my-fn -p "2,1,0" -e "new-fn new-item" -``` +详细参数和示例使用 `cr tree --help` 查看。 ### 代码编辑 (`cr edit`) @@ -292,7 +298,7 @@ cr tree replace app.core/my-fn -p "2,1,0" -e "new-fn new-item" **定义操作:** -- `cr edit def ` - 添加或更新定义 +- `cr edit def ` - 添加新定义(若已存在会报错,需用 `cr tree replace` 修改) - `cr edit rm-def ` - 删除定义 - `cr edit doc ''` - 更新定义的文档 - `cr edit examples ` - 设置定义的示例代码(批量替换) @@ -314,12 +320,127 @@ cr tree replace app.core/my-fn -p "2,1,0" -e "new-fn new-item" - `cr edit rm-module ` - 删除模块依赖 - `cr edit config ` - 设置配置(key: init-fn, reload-fn, version) +**增量变更导出:** + +- `cr edit inc` - 记录增量代码变更并导出到 `.compact-inc.cirru`,触发 watcher 热更新 + - `--added ` - 标记新增的定义 + - `--changed ` - 标记修改的定义 + - `--removed ` - 标记删除的定义 + - `--added-ns ` - 标记新增的命名空间 + - `--removed-ns ` - 标记删除的命名空间 + - `--ns-updated ` - 标记命名空间导入变更 + - 配合 watcher 使用实现热更新(详见"开发调试"章节) + 使用 `--help` 参数了解详细的输入方式和参数选项。 --- ## Calcit 语言基础 +### Cirru 语法核心概念 + +**与其他 Lisp 的区别:** + +- **缩进语法**:用缩进代替括号(类似 Python/YAML),单行用空格分隔 +- **字符串前缀**:`|hello` 或 `"hello"` 表示字符串,`|` 前缀更简洁 +- **无方括号花括号**:只用圆括号概念(体现在 JSON 转换中),Cirru 文本层面无括号 + +**常见混淆点:** + +❌ **错误理解:** Calcit 字符串是 `"x"` → JSON 是 `"\"x\""` +✅ **正确理解:** Cirru `|x` → JSON `"x"`,Cirru `"x"` → JSON `"x"` + +**字符串 vs 符号的关键区分:** + +- `|Add` 或 `"Add` → **字符串**(用于显示文本、属性值等, 前缀形式区分字面量类型) +- `Add` → **符号/变量名**(Calcit 会在作用域中查找) +- 常见错误:受其他语言习惯影响,忘记加 `|` 前缀导致 `unknown symbol` 错误 + +**CLI 使用提示:** + +- 替换包含空格的字符串:`--leaf -e '|text with spaces'` 或 `-j '"text"'` +- 避免解析为列表:字符串字面量必须用 `--leaf` 或 `-j` 明确标记 + +**示例对照:** + +| Cirru 代码 | JSON 等价 | JavaScript 等价 | +| ---------------- | -------------------------------- | ------------------------ | +| `\|hello` | `"hello"` | `"hello"` | +| `"world"` | `"world"` | `"world"` | +| `\|a b c` | `"a b c"` | `"a b c"` | +| `fn (x) (+ x 1)` | `["fn", ["x"], ["+", "x", "1"]]` | `fn(x) { return x + 1 }` | + +### 数据结构:Tuple vs Vector + +Calcit 特有的两种序列类型: + +**Tuple (`::`)** - 不可变、用于模式匹配 + +```cirru +; 创建 tuple +:: :event/type data + +; 模式匹配 +tag-match event + (:event/click data) (handle-click data) + (:event/input text) (handle-input text) +``` + +**Vector (`[]`)** - 可变、用于列表操作 + +```cirru +; 创建 vector +[] item1 item2 item3 + +; DOM 列表 +div {} $ [] + button {} |Click + span {} |Text +``` + +**常见错误:** + +```cirru +; ❌ 错误:用 vector 传事件 +send-event! $ [] :clipboard/read text +; 报错:tag-match expected tuple + +; ✅ 正确:用 tuple +send-event! $ :: :clipboard/read text +``` + +### 类型标注与检查 + +Calcit 支持可选的类型标注,用于开发时的类型检查。 + +#### 函数参数类型 (`assert-type`) + +```cirru +defn calculate-total (items discount) + assert-type items :list + assert-type discount :number + ; let 绑定中的变量会自动推断类型 + let + sum $ foldl items 0 &+ + * sum $ - 1 discount +``` + +#### 函数返回类型 (`hint-fn`) + +```cirru +defn add-numbers (a b) + assert-type a :number + assert-type b :number + hint-fn $ return-type :number + &+ a b +``` + +**常见类型:** `:number` `:string` `:bool` `:list` `:map` `:set` `:tuple` `:keyword` `:nil` + +**验证类型:** `cr --check-only` 或 `cr ir -1` 查看 IR 中的类型信息 + +### 其他易错点 + 比较容易犯的错误: - Calcit 中字符串通过前缀区分,`|` 和 `"` 开头表示字符串。`|x` 对应 JavaScript 字符串 `"x"`。产生 JSON 时注意不要重复包裹引号。 @@ -340,20 +461,89 @@ Calcit snapshot 文件中 config 有 `init-fn` 和 `reload-fn` 配置: **典型开发流程:** ```bash -# 1. 检查代码正确性 -cr --check-only +# 1. 启动监听模式(用户自行使用) +cr # 解释执行模式 +cr js # JS 编译模式 + +# 2. 修改代码后触发增量更新(详见"增量触发更新"章节) +cr edit inc --changed ns/def -# 2. 执行程序(一次性) -cr -1 +# 3. 一次性执行/编译(用于简单脚本) +cr -1 # 执行一次 +cr -1 js # 编译一次 +``` -# 3. 编译 JavaScript(一次性) -cr -1 js +### 增量触发更新(推荐)⭐⭐⭐ -# 4. 进入监听模式开发 -cr # 解释执行模式 -cr js # JS 编译模式 +当使用监听模式(`cr` 或 `cr js`)开发时,推荐使用 `cr edit inc` 命令触发增量更新,而非全量重新编译/执行: + +**工作流程:** + +```bash +# 【终端 1】启动 watcher(监听模式) +cr # 或 cr js + +# 【终端 2】修改代码后触发增量更新 +# 修改定义 +cr edit def app.core/my-fn -e 'defn my-fn (x) (+ x 1)' + +# 触发增量更新 +cr edit inc --changed app.core/my-fn + +# 等待 ~300ms 后查看编译结果 +cr query error ``` +**增量更新命令参数:** + +```bash +# 新增定义 +cr edit inc --added namespace/definition + +# 修改定义 +cr edit inc --changed namespace/definition + +# 删除定义 +cr edit inc --removed namespace/definition + +# 新增命名空间 +cr edit inc --added-ns namespace + +# 删除命名空间 +cr edit inc --removed-ns namespace + +# 更新命名空间导入 +cr edit inc --ns-updated namespace + +# 组合使用(批量更新) +cr edit inc \ + --changed app.core/add \ + --changed app.core/multiply \ + --removed app.core/old-fn +``` + +**查看编译结果:** + +```bash +cr query error # 命令会显示详细的错误信息或成功状态 +``` + +**何时使用全量操作:** + +```bash +# 极少数情况:增量更新不符合预期时 +cr -1 js # 重新编译 JavaScript +cr -1 # 重新执行程序 + +# 或重启监听模式(Ctrl+C 停止后重启) +cr # 或 cr js + +# CI/CD 或脚本验证(不启动 watcher) +cr --check-only # 仅语法检查 +``` + +**增量更新优势:** 快速反馈、精确控制变更范围、watcher 保持运行状态 + --- ## 文档支持 @@ -379,50 +569,37 @@ cr js # JS 编译模式 **添加新函数:** -```bash +````bash # Cirru one liner cr edit def app.core/multiply -e 'defn multiply (x y) (* x y)' -# or JSON -cr edit def app.core/multiply -j '["defn", "multiply", ["x", "y"], ["*", "x", "y"]]' -``` - -**更新文档和示例:** +# 基本操作:** ```bash -# 更新文档 -cr edit doc app.core/multiply '乘法函数,返回两个数的积' - -# 设置示例 -cr edit examples app.core/multiply -j '[["multiply", "3", "4"]]' +# 添加新函数(命令会提示 Next steps) +cr edit def 'app.core/multiply' -e 'defn multiply (x y) (* x y)' -# 添加示例 -cr edit add-example app.core/multiply -e 'multiply 5 6' +# 替换整个定义(-p "" 表示根路径) +cr tree replace 'app.core/multiply' -p "" -e 'defn multiply (x y z) (* x y z)' -# 删除示例 -cr edit rm-example app.core/multiply 1 -``` +# 更新文档和示例 +cr edit doc 'app.core/multiply' '乘法函数,返回两个数的积' +cr edit add-example 'app.core/multiply' -e 'multiply 5 6' +```` -**局部修改(推荐流程):** +**修改定义工作流(命令会显示子节点索引和 Next steps):** ```bash -# 1. 读取完整定义 -cr query def app.core/add-numbers - -# 2. 多次查看节点确认目标坐标 -cr tree show app.core/add-numbers -p "" -d 1 -cr tree show app.core/add-numbers -p "2" -d 1 -cr tree show app.core/add-numbers -p "2,0" +# 1. 搜索定位 +cr query search '' -f 'ns/def' -l -# 3. 执行替换 -cr tree replace app.core/add-numbers -p "2,0" -e '*' +# 2. 查看节点(输出会显示索引和操作提示) +cr tree show 'ns/def' -p "" -# 4. 验证 -cr tree show app.core/add-numbers -p "2" -``` +# 3. 执行替换(会显示 diff 和验证命令) +cr tree replace 'ns/def' -p "" --leaf -e '' -**命名空间增量操作:** - -```bash +# 4. 检查结果 +cr query error # 添加命名空间 cr edit add-ns app.util @@ -441,3 +618,166 @@ cr edit config init-fn app.main/main! ```bash cr edit imports app.main -j '[["app.lib", ":as", "lib"], ["app.util", ":refer", ["helper"]]]' ``` + +--- + +## ⚠️ 常见陷阱和最佳实践 + +### 1. 路径索引动态变化问题 ⭐⭐⭐ + +**核心原则:** 删除/插入会改变同级后续节点索引。 + +**批量修改策略:** + +- **从后往前操作**(推荐):先删大索引,再删小索引 +- **单次操作后重新搜索**:每次修改立即用 `cr query search` 更新路径 +- **整体重写**:用 `cr tree replace -p ""` 替换整个定义 + +命令会在路径错误时提示最长有效路径和可用子节点。 + +### 2. 输入格式参数使用速查 ⭐⭐⭐ + +**参数混淆矩阵(已全面支持 `-e` 自动识别):** + +| 场景 | 示例用法 | 解析结果 | 说明 | +| ------------------- | -------------------------------------- | ----------------------------- | --------------------------------- | +| **表达式 (Cirru)** | `-e 'defn add (a b) (+ a b)'` | `["defn", "add", ...]` (List) | 默认按 Cirru one-liner 解析 | +| **原子符号 (Leaf)** | `--leaf -e 'my-symbol'` | `"my-symbol"` (Leaf) | **推荐**,避免被包装成 list | +| **字符串 (Leaf)** | `--leaf -e '\|hello world'` | `"hello world"` (Leaf) | 符号前缀 `\|` 表示字符串 | +| **JSON 数组** | `-e '["+", "x", "1"]'` | `["+", "x", "1"]` (List) | **自动识别** (含 `[` 且有 `"`) | +| **JSON 字符串** | `-e '"my leaf"'` | `"my leaf"` (Leaf) | **自动识别** (含引用的字符串) | +| **内联 JSON** | `-j '["defn", ...]'` | `["defn", ...]` (List) | 显式按 JSON 解析,忽略 Cirru 规则 | +| **外部文件** | `-f code.cirru` (或 `-f code.json -J`) | 根据文件内容解析 | `-J` 用于标记文件内是 JSON | + +**核心规则:** + +1. **智能识别模式**:`-e / --code` 现在会自动识别 JSON。如果你传入 `["a"]` 或 `"a"`,它会直接按 JSON 处理,无需再额外加 `-J` 或 `-j`。 +2. **强制 Leaf 模式**:如果你需要确保输入是一个叶子节点(符号或字符串),请在任何地方使用 `--leaf` 开关。它会将原始输入直接作为内容,不经过任何解析。 +3. **显式 JSON 模式**:如果你想明确告诉工具“这段就是 JSON”,优先用 `-j ''`。 +4. **统一性**:`cr tree` 和 `cr edit` 的所有子命令(replace, def, insert 等)现在共享完全相同的输入解析逻辑。 + +**实战示例:** + +```bash +# ✅ 替换表达式 +cr tree replace app.main/fn -p "2" -e 'println |hello' + +# ✅ 替换 leaf(推荐 --leaf) +cr tree replace app.main/fn -p "2,0" --leaf -e 'new-symbol' + +# ✅ 替换字符串 leaf +cr tree replace app.main/fn -p "2,1" --leaf -e '|new text' + +# ❌ 避免:用 -e 传单个 token(会变成 list) +cr tree replace app.main/fn -p "2,0" -e 'symbol' # 结果:["symbol"] +``` + +### 3. Cirru 字符串和数据类型 ⭐⭐ + +**Cirru 字符串前缀:** + +| Cirru 写法 | JSON 等价 | 使用场景 | +| -------------- | -------------- | ------------ | +| `\|hello` | `"hello"` | 推荐,简洁 | +| `"hello"` | `"hello"` | 也可以 | +| `\|a b c` | `"a b c"` | 包含空格 | +| `\|[tag] text` | `"[tag] text"` | 包含特殊字符 | + +**Tuple vs Vector:** + +```cirru +; ✅ Tuple - 用于事件、模式匹配 +:: :clipboard/read text + +; ✅ Vector - 用于 DOM 列表 +[] (button) (div) + +; ❌ 错误:用 vector 传事件 +send-to-component! $ [] :clipboard/read text +; 报错:tag-match expected tuple + +; ✅ 正确:用 tuple +send-to-component! $ :: :clipboard/read text +``` + +**记忆规则:** + +- **`::` (tuple)**: 事件、模式匹配、不可变数据结构 +- **`[]` (vector)**: DOM 元素列表、动态集合 + +### 4. 推荐工作流程 + +**基本流程(命令会显示子节点索引、Next steps、批量重命名提示):** + +```bash +# 1. 搜索定位 +cr query search '' -f 'ns/def' -l + +# 2. 查看节点(会显示索引和操作提示) +cr tree show 'ns/def' -p "" + +# 3. 执行修改(会显示 diff 和验证命令) +cr tree replace 'ns/def' -p "" --leaf -e '' + +# 4. 增量触发更新(推荐) +cr edit inc --changed ns/def +# 等待 ~300ms 后检查 +cr query error + +# 5. 如果结果不符合预期,使用全量编译 +cr -1 js # 或 cr -1(解释执行模式) +``` + +**批量修改提示:** 命令会自动检测多匹配场景,显示从大到小的路径排序和重要警告。 + +**增量更新优势:** 快速反馈、保持 watcher 运行、精确控制变更范围(详见"增量触发更新"章节) + +### 5. Shell 特殊字符转义 ⭐⭐ + +Calcit 函数名中的 `?`, `->`, `!` 等字符在 bash/zsh 中有特殊含义,需要用单引号包裹: + +```bash +# ❌ 错误 +cr query def app.main/valid? +cr eval -> x (+ 1) (* 2) + +# ✅ 正确 +cr query def 'app.main/valid?' +cr eval 'thread-first x (+ 1) (* 2)' # 用 thread-first 代替 -> +``` + +**建议:** 命令行中优先使用英文名称(`thread-first` 而非 `->`),更清晰且无需转义。 + +--- + +## 💡 Calcit vs Clojure 关键差异 + +**语法层面:** + +- **只用圆括号**:Calcit 的 Cirru 语法不使用方括号 `[]` 和花括号 `{}`,统一用缩进表达结构 +- **函数前缀**:Calcit 用 `&` 区分内置函数(`&+`、`&str`)和用户定义函数 + +**集合函数参数顺序(易错 ⭐⭐⭐):** + +- **Calcit**: 集合在**第一位** → `map data fn` 或 `-> data (map fn)` +- **Clojure**: 函数在第一位 → `(map fn data)` 或 `(->> data (map fn))` +- **症状**:`unknown data for foldl-shortcut` 报错 +- **原因**:误用 `->>` 或参数顺序错误 + +**其他差异:** + +- **宏系统**:Calcit 更简洁,缺少 Clojure 的 reader macro(如 `#()`) +- **数据类型**:Calcit 的 Tuple (`::`) 和 Vector (`[]`) 有特定用途(见"Cirru 字符串和数据类型") + +--- + +## 常见错误排查 + +| 错误信息 | 原因 | 解决方法 | +| ---------------------------- | ----------------------- | --------------------------------- | +| `Path index X out of bounds` | 路径已过期 | 重新运行 `cr query search` | +| `tag-match expected tuple` | 传入 vector 而非 tuple | 改用 `::` | +| 字符串被拆分 | 没有用 `\|` 或 `"` 包裹 | 使用 `\|complete string` | +| `unexpected format` | 语法错误 | 用 `cr cirru parse ''` 验证 | + +**调试命令:** `cr query error`(会显示详细的错误堆栈和提示) diff --git a/llms/Respo.md b/llms/Respo.md index 17e1c7c..244336a 100644 --- a/llms/Respo.md +++ b/llms/Respo.md @@ -44,8 +44,8 @@ The Respo project is a virtual DOM library written in Calcit-js, containing: - `respo.render.dom` - DOM element creation and manipulation - `respo.render.effect` - Component lifecycle effects - `respo.render.patch` - Apply DOM patches -- `respo.controller.client` - Client-side state management (activate-instance!, patch-instance!) -- `respo.controller.resolve` - Event handling and resolution +- `respo.controller.client` - Client-side state management (activate-instance!, patch-instance!, send-to-component!) +- `respo.controller.resolve` - Event handling and resolution (build-deliver-event, wrap-dispatch) **Utilities**: @@ -469,8 +469,35 @@ let extended ``` +**Testing Style to String Conversion:** + +```bash +# Basic example (thread-first pipeline avoids bash escaping issues) +cr eval 'thread-first ({} (:display "|flex") (:color "|red") (:padding "|10px")) .to-list respo.render.dom/style->string println' --dep respo.calcit/ +# Output: padding:10px;color:red;display:flex; +``` + +**Notes:** + +- `--dep respo.calcit/` loads the module from `~/.config/calcit/modules/` +- `thread-first` (or `->`) chains operations: create map → convert to list → style->string → print +- Direct `ns/def` format to reference functions from loaded modules + +**Inline Style Object Format:** + +```cirru +# Map format (key-value pairs) +my-styles $ {} + :display "|flex" + :color "|red" + :padding "|10px" + :font-size "|14px" +``` + ### 6. Event Handling +**DOM Event Handlers:** + ```cirru ; Simple click handler div @@ -495,6 +522,59 @@ div dispatch! [:submit-form] ``` +**Component-Level Event Listeners:** + +Components can define custom listeners that respond to events sent via `send-to-component!`. This is useful for global shortcuts, external triggers, or testing. + +```cirru +; Define a listener function that returns a RespoListener record +defn on-keydown (cursor state) + %{} respo.schema/RespoListener (:name :on-keydown) + :handler $ fn (event dispatch!) + tag-match event $ + :keydown info + when + and + = |m $ :key info + :ctrl info + ; Handle Ctrl+M shortcut + dispatch! $ :: :states cursor + assoc state :message "|Shortcut triggered!" + +; Use listener in component by including it in the component body +defcomp comp-with-listener (states data) + let + cursor $ :cursor states + state $ either (:data states) ({}) + [] (on-keydown cursor state) ; Add listener to component + div $ {} + <> $ :message state +``` + +**Triggering Component Listeners:** + +Use `send-to-component!` (from `respo.controller.client`) to programmatically send events to the component tree: + +```cirru +; Send keyboard event to all listening components +send-to-component! $ :: :keydown + {} $ :key "|m" + :ctrl true + +; Trigger from timer or external source +js/window.setTimeout + fn () + send-to-component! $ :: :custom-event + {} $ :data |some-value + , 1000 + +; Useful for: +; - Global keyboard shortcuts (Ctrl+S, Escape, etc.) +; - WebSocket message handlers +; - Timer-based triggers +; - Testing component event handlers +``` + --- ## Debugging Common Issues @@ -836,85 +916,3 @@ Example from `docs/apis/defcomp.md`: - [API Overview](../api.md) - [Another API](./render!.md) ``` - ---- - -This guide evolves as the project grows. Last updated: 2025-12-22 - -# Calcit & Respo 开发避坑指南 - -本文档总结了在 Calcit 和 Respo 开发过程中遇到的常见问题和最佳实践。 - -## 1. 字符串语法 (String Syntax) - -Calcit 使用 `|` 前缀来表示字符串字面量。 - -- **正确**: `|Hello` (编译为 `"Hello"`) -- **正确**: `"Hello"` (标准 Cirru 字符串,编译为 `"Hello"`) -- **错误**: `Hello` (会被解析为 Symbol) - -**CLI 操作注意**: -在使用 `cr tree replace` 修改字符串时,推荐使用 `|` 前缀或 `--json-leaf` 确保类型正确。 - -```bash -# 推荐:使用 | 前缀 -cr tree replace ... -e "|Get Started" - -# 推荐:使用 --json-leaf 明确指定为叶子节点 -cr tree replace ... -e '"Get Started"' --json-leaf -``` - -如果直接使用 `-e '"Get Started"'` 且不加 `--json-leaf`,可能会被解析为包含引号的字符串 `"\"Get Started\""`,导致显示多余引号。 - -## 2. Respo 文本渲染 (Text Rendering) - -Respo 的 HTML 标签(如 `div`, `span`, `button`)**不能直接接受原始字符串作为子节点**。 - -**错误写法** (会导致 `Invalid data in elements tree`): - -```cirru -div ({}) - |SomeText -``` - -**正确写法 1: 使用 `:inner-text` 属性** (推荐用于纯文本标签) - -```cirru -div $ {} (:inner-text |SomeText) -``` - -**正确写法 2: 使用 `<>` 组件** (推荐用于混合内容) - -```cirru -div ({}) - <> |SomeText - span $ {} (:inner-text |Other) -``` - -## 3. 样式定义 (Styles) - -在 `defstyle` 中定义样式时: - -- **数值属性**: 像 `font-weight` 这样的属性,如果使用数字(如 `700`),确保它是数字类型而不是字符串。 - - 错误: `(:font-weight |bold)` (如果库不支持) - - 正确: `(:font-weight 700)` - -## 4. CLI 调试技巧 - -- **检查代码**: `cr js --check-only` - - - 这是一个非常快速的检查命令,能发现未定义的变量 (Warnings) 和语法错误,而不会生成 JS 文件。 - - **务必关注 Warnings**: 很多运行时错误(如 `unknown head`)都是因为使用了未定义的 Symbol(可能是忘记加 `|` 前缀的字符串)。 - -- **查看节点结构**: `cr tree show -p ` - - - 在修改前,先查看目标节点的结构(是 `list` 还是 `leaf`),确认路径是否正确。 - -- **精确修改**: `cr tree replace` - - 配合 `-p` 路径参数进行精确修改,避免破坏周围结构。 - -## 5. 命名空间 (Namespaces) - -- **修改 Imports**: 使用 `cr edit imports -j '...'` - - 这是修改 `:require` 最安全的方式。 - - 如果遇到 `invalid ns form` 错误,通常是因为 `ns` 定义格式被破坏,可以尝试清空 imports 再重新添加。 diff --git a/package.json b/package.json index 4d280ad..f2bde04 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "author": "jiyinyiyong", "license": "MIT", "dependencies": { - "@calcit/procs": "^0.10.4", + "@calcit/procs": "^0.10.9", "copy-to-clipboard": "^3.3.3", "luxon": "^3.7.2", "shortid": "^2.2.17" @@ -24,6 +24,6 @@ "bottom-tip": "^0.1.5", "feather-icons": "^4.29.2", "url-parse": "^1.5.10", - "vite": "^7.3.0" + "vite": "^7.3.1" } } diff --git a/yarn.lock b/yarn.lock index 61ef8eb..0b70c26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,29 +2,29 @@ # yarn lockfile v1 -"@calcit/procs@^0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@calcit/procs/-/procs-0.10.4.tgz#bcb58256a450b6ec891a64d150c959f229408ae7" - integrity sha512-JljJactqBWQYI3Wcg4a//eRZmry/Pb2gwgHN8OZeMld27krImDoWUYdhtW9wc27lxsBmO0mGW6ubyIwK1c5xhg== +"@calcit/procs@^0.10.9": + version "0.10.9" + resolved "https://registry.yarnpkg.com/@calcit/procs/-/procs-0.10.9.tgz#9d67ac7b42defdbbf7d7212c673bfa793a42a339" + integrity sha512-MEb+mxyUmOAQNEz+n8Wd8Oy7FNaIz2ZcrYgOn/fHez5ZzvjFlJ63dG51qjeGBF6Qki62UN5cENW8MdA+fuytjg== dependencies: "@calcit/ternary-tree" "0.0.25" - "@cirru/parser.ts" "^0.0.6" - "@cirru/writer.ts" "^0.1.5" + "@cirru/parser.ts" "^0.0.7" + "@cirru/writer.ts" "^0.1.7" "@calcit/ternary-tree@0.0.25": version "0.0.25" resolved "https://registry.yarnpkg.com/@calcit/ternary-tree/-/ternary-tree-0.0.25.tgz#d467cbd9a7f89ff1fdb590e5d1551aefa6a03492" integrity sha512-BxAAq6v7dZJDYSMX5kBVQ/eSYX7czjOS1cHM25js4yD+Q2I61RxxhD7iBaGlfNJvmgPmvYJQA5nxNmN2TEXq7A== -"@cirru/parser.ts@^0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/@cirru/parser.ts/-/parser.ts-0.0.6.tgz#b95a84e02273fcbd71ff100925782b6f86410234" - integrity sha512-qpDNPq+IuuwYjQFI+wzpd3ntbF7lwJs90v1XWyLQbL9Ru4ld4aHxVGwW/9F/QOu5mEGCMXtagCoYDf0HtOpDZg== +"@cirru/parser.ts@^0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@cirru/parser.ts/-/parser.ts-0.0.7.tgz#855b46d685e6be421e2ad1386506b9a2858c61de" + integrity sha512-xi27PFJ9ZbnkjUeLkXkkFOvg5ljqexfbGSGaazndCocnaMpwOGlMIdJDeFSGjViqu/XxsvtZT3er9Qx1lF3NHA== -"@cirru/writer.ts@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@cirru/writer.ts/-/writer.ts-0.1.5.tgz#890d96cd4a69609f1682932dad5d2d467abb327e" - integrity sha512-QQVFJAOIdUtVJZwT23THZOzumSDXCLMQ0yFz5DzIGlWGXPNBuB7BwUvGtRuiQrzM2XV7ALOWmNsVC7vEOjObQQ== +"@cirru/writer.ts@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@cirru/writer.ts/-/writer.ts-0.1.7.tgz#a4ef2afcf7642418bf4d17ec0a7d344764f4bb96" + integrity sha512-9RLV5NNT+NtXoDL6DC3LVWfbhEDCOTnEsvp2pnSDOJubKvnwLYYvo1VxY1pGBoFV5iQUNzUkETeNaEFHGTHZdQ== "@esbuild/aix-ppc64@0.27.2": version "0.27.2" @@ -156,115 +156,130 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz#9e585ab6086bef994c6e8a5b3a0481219ada862b" integrity sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ== -"@rollup/rollup-android-arm-eabi@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz#f3ff5dbde305c4fa994d49aeb0a5db5305eff03b" - integrity sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng== - -"@rollup/rollup-android-arm64@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz#c97d6ee47846a7ab1cd38e968adce25444a90a19" - integrity sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw== - -"@rollup/rollup-darwin-arm64@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz#a13fc2d82e01eaf8ac823634a3f5f76fd9d0f938" - integrity sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw== - -"@rollup/rollup-darwin-x64@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz#db4fa8b2b76d86f7e9b68ce4661fafe9767adf9b" - integrity sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A== - -"@rollup/rollup-freebsd-arm64@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz#b2c6039de4b75efd3f29417fcb1a795c75a4e3ee" - integrity sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA== - -"@rollup/rollup-freebsd-x64@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz#9ae2a216c94f87912a596a3b3a2ec5199a689ba5" - integrity sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz#69d5de7f781132f138514f2b900c523e38e2461f" - integrity sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ== - -"@rollup/rollup-linux-arm-musleabihf@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz#b6431e5699747f285306ffe8c1194d7af74f801f" - integrity sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA== - -"@rollup/rollup-linux-arm64-gnu@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz#a32931baec8a0fa7b3288afb72d400ae735112c2" - integrity sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng== - -"@rollup/rollup-linux-arm64-musl@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz#0ad72572b01eb946c0b1a7a6f17ab3be6689a963" - integrity sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg== - -"@rollup/rollup-linux-loong64-gnu@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz#05681f000310906512279944b5bef38c0cd4d326" - integrity sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw== - -"@rollup/rollup-linux-ppc64-gnu@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz#9847a8c9dd76d687c3bdbe38d7f5f32c6b2743c8" - integrity sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA== - -"@rollup/rollup-linux-riscv64-gnu@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz#173f20c278ac770ae3e969663a27d172a4545e87" - integrity sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ== - -"@rollup/rollup-linux-riscv64-musl@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz#db70c2377ae1ef61ef8673354d107ecb3fa7ffed" - integrity sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A== - -"@rollup/rollup-linux-s390x-gnu@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz#b2c461778add1c2ee70ec07d1788611548647962" - integrity sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ== - -"@rollup/rollup-linux-x64-gnu@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz#ab140b356569601f57ab8727bd7306463841894f" - integrity sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ== - -"@rollup/rollup-linux-x64-musl@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz#810134b4a9d0d88576938f2eed38999a653814a1" - integrity sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw== - -"@rollup/rollup-openharmony-arm64@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz#0182bae7a54e748be806acef7a7f726f6949213c" - integrity sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg== - -"@rollup/rollup-win32-arm64-msvc@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz#1f19349bd1c5e454d03e4508a9277b6354985b9d" - integrity sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw== - -"@rollup/rollup-win32-ia32-msvc@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz#234ff739993539f64efac6c2e59704a691a309c2" - integrity sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ== - -"@rollup/rollup-win32-x64-gnu@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz#a4df0507c3be09c152a795cfc0c4f0c225765c5c" - integrity sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ== - -"@rollup/rollup-win32-x64-msvc@4.54.0": - version "4.54.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz#beacb356412eef5dc0164e9edfee51c563732054" - integrity sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg== +"@rollup/rollup-android-arm-eabi@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz#76e0fef6533b3ce313f969879e61e8f21f0eeb28" + integrity sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg== + +"@rollup/rollup-android-arm64@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz#d3cfc675a40bbdec97bda6d7fe3b3b05f0e1cd93" + integrity sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg== + +"@rollup/rollup-darwin-arm64@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz#eb912b8f59dd47c77b3c50a78489013b1d6772b4" + integrity sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg== + +"@rollup/rollup-darwin-x64@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz#e7d0839fdfd1276a1d34bc5ebbbd0dfd7d0b81a0" + integrity sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ== + +"@rollup/rollup-freebsd-arm64@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz#7ff8118760f7351e48fd0cd3717ff80543d6aac8" + integrity sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg== + +"@rollup/rollup-freebsd-x64@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz#49d330dadbda1d4e9b86b4a3951b59928a9489a9" + integrity sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw== + +"@rollup/rollup-linux-arm-gnueabihf@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz#98c5f1f8b9776b4a36e466e2a1c9ed1ba52ef1b6" + integrity sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ== + +"@rollup/rollup-linux-arm-musleabihf@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz#b9acecd3672e742f70b0c8a94075c816a91ff040" + integrity sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg== + +"@rollup/rollup-linux-arm64-gnu@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz#7a6ab06651bc29e18b09a50ed1a02bc972977c9b" + integrity sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ== + +"@rollup/rollup-linux-arm64-musl@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz#3c8c9072ba4a4d4ef1156b85ab9a2cbb57c1fad0" + integrity sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA== + +"@rollup/rollup-linux-loong64-gnu@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz#17a7af13530f4e4a7b12cd26276c54307a84a8b0" + integrity sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g== + +"@rollup/rollup-linux-loong64-musl@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz#5cd7a900fd7b077ecd753e34a9b7ff1157fe70c1" + integrity sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw== + +"@rollup/rollup-linux-ppc64-gnu@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz#03a097e70243ddf1c07b59d3c20f38e6f6800539" + integrity sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw== + +"@rollup/rollup-linux-ppc64-musl@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz#a5389873039d4650f35b4fa060d286392eb21a94" + integrity sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw== + +"@rollup/rollup-linux-riscv64-gnu@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz#789e60e7d6e2b76132d001ffb24ba80007fb17d0" + integrity sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw== + +"@rollup/rollup-linux-riscv64-musl@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz#3556fa88d139282e9a73c337c9a170f3c5fe7aa4" + integrity sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg== + +"@rollup/rollup-linux-s390x-gnu@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz#c085995b10143c16747a67f1a5487512b2ff04b2" + integrity sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg== + +"@rollup/rollup-linux-x64-gnu@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz#9563a5419dd2604841bad31a39ccfdd2891690fb" + integrity sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg== + +"@rollup/rollup-linux-x64-musl@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz#691bb06e6269a8959c13476b0cd2aa7458facb31" + integrity sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w== + +"@rollup/rollup-openbsd-x64@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz#223e71224746a59ce6d955bbc403577bb5a8be9d" + integrity sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg== + +"@rollup/rollup-openharmony-arm64@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz#0817e5d8ecbfeb8b7939bf58f8ce3c9dd67fce77" + integrity sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw== + +"@rollup/rollup-win32-arm64-msvc@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz#de56d8f2013c84570ef5fb917aae034abda93e4a" + integrity sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g== + +"@rollup/rollup-win32-ia32-msvc@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz#659aff5244312475aeea2c9479a6c7d397b517bf" + integrity sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA== + +"@rollup/rollup-win32-x64-gnu@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz#2cb09549cbb66c1b979f9238db6dd454cac14a88" + integrity sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg== + +"@rollup/rollup-win32-x64-msvc@4.55.1": + version "4.55.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz#f79437939020b83057faf07e98365b1fa51c458b" + integrity sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw== "@types/estree@1.0.8": version "1.0.8" @@ -457,34 +472,37 @@ requires-port@^1.0.0: integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== rollup@^4.43.0: - version "4.54.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.54.0.tgz#930f4dfc41ff94d720006f9f62503612a6c319b8" - integrity sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw== + version "4.55.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.55.1.tgz#4ec182828be440648e7ee6520dc35e9f20e05144" + integrity sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A== dependencies: "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.54.0" - "@rollup/rollup-android-arm64" "4.54.0" - "@rollup/rollup-darwin-arm64" "4.54.0" - "@rollup/rollup-darwin-x64" "4.54.0" - "@rollup/rollup-freebsd-arm64" "4.54.0" - "@rollup/rollup-freebsd-x64" "4.54.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.54.0" - "@rollup/rollup-linux-arm-musleabihf" "4.54.0" - "@rollup/rollup-linux-arm64-gnu" "4.54.0" - "@rollup/rollup-linux-arm64-musl" "4.54.0" - "@rollup/rollup-linux-loong64-gnu" "4.54.0" - "@rollup/rollup-linux-ppc64-gnu" "4.54.0" - "@rollup/rollup-linux-riscv64-gnu" "4.54.0" - "@rollup/rollup-linux-riscv64-musl" "4.54.0" - "@rollup/rollup-linux-s390x-gnu" "4.54.0" - "@rollup/rollup-linux-x64-gnu" "4.54.0" - "@rollup/rollup-linux-x64-musl" "4.54.0" - "@rollup/rollup-openharmony-arm64" "4.54.0" - "@rollup/rollup-win32-arm64-msvc" "4.54.0" - "@rollup/rollup-win32-ia32-msvc" "4.54.0" - "@rollup/rollup-win32-x64-gnu" "4.54.0" - "@rollup/rollup-win32-x64-msvc" "4.54.0" + "@rollup/rollup-android-arm-eabi" "4.55.1" + "@rollup/rollup-android-arm64" "4.55.1" + "@rollup/rollup-darwin-arm64" "4.55.1" + "@rollup/rollup-darwin-x64" "4.55.1" + "@rollup/rollup-freebsd-arm64" "4.55.1" + "@rollup/rollup-freebsd-x64" "4.55.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.55.1" + "@rollup/rollup-linux-arm-musleabihf" "4.55.1" + "@rollup/rollup-linux-arm64-gnu" "4.55.1" + "@rollup/rollup-linux-arm64-musl" "4.55.1" + "@rollup/rollup-linux-loong64-gnu" "4.55.1" + "@rollup/rollup-linux-loong64-musl" "4.55.1" + "@rollup/rollup-linux-ppc64-gnu" "4.55.1" + "@rollup/rollup-linux-ppc64-musl" "4.55.1" + "@rollup/rollup-linux-riscv64-gnu" "4.55.1" + "@rollup/rollup-linux-riscv64-musl" "4.55.1" + "@rollup/rollup-linux-s390x-gnu" "4.55.1" + "@rollup/rollup-linux-x64-gnu" "4.55.1" + "@rollup/rollup-linux-x64-musl" "4.55.1" + "@rollup/rollup-openbsd-x64" "4.55.1" + "@rollup/rollup-openharmony-arm64" "4.55.1" + "@rollup/rollup-win32-arm64-msvc" "4.55.1" + "@rollup/rollup-win32-ia32-msvc" "4.55.1" + "@rollup/rollup-win32-x64-gnu" "4.55.1" + "@rollup/rollup-win32-x64-msvc" "4.55.1" fsevents "~2.3.2" shortid@^2.2.17: @@ -539,10 +557,10 @@ virtual-dom@^2.1.1: x-is-array "0.1.0" x-is-string "0.1.0" -vite@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.0.tgz#066c7a835993a66e82004eac3e185d0d157fd658" - integrity sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg== +vite@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.1.tgz#7f6cfe8fb9074138605e822a75d9d30b814d6507" + integrity sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA== dependencies: esbuild "^0.27.0" fdir "^6.5.0"