@epxing/cli 0.5.0-beta.12 → 0.5.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API.md +2 -2
- package/README.md +5 -1
- package/dist/cli.mjs +0 -0
- package/dist/skills/epxing-frontend-vue3-migrate/SKILL.md +6 -0
- package/dist/skills/epxing-frontend-vue3-migrate/pitfalls.md +28 -0
- package/dist/skills/epxing-frontend-vue3-migrate/references/upgrade-review.md +4 -1
- package/dist/skills/epxing-frontend-vue3-migrate/scripts/check-list-slots.cjs +24 -2
- package/package.json +6 -8
package/API.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
独立工程命令行工具,终端命令名为 epxing。/vite 提供产品构建插件,根入口不提供业务运行时。
|
|
4
4
|
|
|
5
|
-
本页对应包版本 `0.5.0-beta.
|
|
5
|
+
本页对应包版本 `0.5.0-beta.14`。导出名、子路径和签名从当前源码、package.json 与类型声明生成。
|
|
6
6
|
|
|
7
7
|
## 安装与使用
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
```sh
|
|
11
|
-
npm install -g @epxing/cli@0.5.0-beta.
|
|
11
|
+
npm install -g @epxing/cli@0.5.0-beta.14
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
|
package/README.md
CHANGED
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
独立的工程开发工具,包含交互菜单、开发服务、产品库构建、创建、Vue3 迁移、静态检查和升级技能安装。创建和升级默认使用 `@epxing/*` 独立包,版本留空时查询最新 `beta` 并固定到具体版本,没有 `beta` 时使用 `latest`;可用 `--packages-version` 指定版本或标签。CLI 使用自己的版本号。创建和升级会生成产品使用说明;`@epxing/cli/vite` 提供产品构建插件,不依赖聚合包中的构建工具。
|
|
6
6
|
|
|
7
|
-
本批测试版本:`@epxing/cli@0.5.0-beta.
|
|
7
|
+
本批测试版本:`@epxing/cli@0.5.0-beta.14`,平台包 `6.1.0-beta`,均使用 npm 公网 `beta` 标签。CLI 与平台独立版本。完整流程见文档站“CLI 创建、升级与产品使用”;各包公开 API 随安装包的 `API.md` 提供。
|
|
8
|
+
|
|
9
|
+
`0.5.0-beta.14` 强化 F28 表单上下文透传检查:沿发送端、继承/包装组件、懒加载页签和原生根核对 form prop,补齐逐页签验收与宿主制品核对;保留 class/style、事件和上下文,不自动批量添加 prop 或关闭 attrs 继承。
|
|
10
|
+
|
|
11
|
+
`0.5.0-beta.13` 根据考核迁移报告补充插槽作用域、响应式状态、树刷新、异步依赖与移动布局复核。列表只读扫描新增同层插槽参数条件检测,覆盖解构、别名和局部变量遮蔽;模板解析失败非零退出,不自动改写业务条件。新增 F32–F34,明确历史报告对账和未定位问题的验收边界。
|
|
8
12
|
|
|
9
13
|
`0.5.0-beta.12` 合并考核升级经验,随技能交付跨产品复核清单及列表插槽、拖拽、图标三个只读扫描脚本。模型与样式按组件复核,覆盖模板、JSX/render、包装与继承链;扫描零命中不能替代未覆盖场景验收。CLI 更新不会覆盖已有产品技能,更新前须比较并保留自定义内容;新建目录可运行 epxing skill install 安装完整技能。
|
|
10
14
|
|
package/dist/cli.mjs
CHANGED
|
File without changes
|
|
@@ -31,6 +31,8 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
|
|
|
31
31
|
|
|
32
32
|
## 共性问题复核入口
|
|
33
33
|
|
|
34
|
+
重复故障优先检查 F32–F34:同层插槽条件读取局部参数、树刷新后的旧引用、响应式业务状态误迁、异步依赖未就绪及移动滚动。对状态查询验证不同返回顺序和失败反馈;对报告区分历史扫描候选、已修未验和已验,未定位的业务症状不得归入“已修复”。
|
|
35
|
+
|
|
34
36
|
每次升级先读 [跨产品升级复核](references/upgrade-review.md),在迁移前、源码转换后和交付前执行其中的复核。模型协议与样式是每个组件的必检项,覆盖模板、JSX/render、包装组件及继承链;沿用 E2 台账记录实际协议、来源、结论和证据。修复一处后检查同类结构,不能只修用户点出的页面。只读扫描不覆盖的模型、动态样式和运行分支必须另行核实,构建成功或扫描零命中不能关闭这些检查。
|
|
35
37
|
|
|
36
38
|
## 先判断升级类型
|
|
@@ -111,6 +113,7 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
|
|
|
111
113
|
| `[vuex] duplicate getter key` | 库被装了两次(本地 + 远程) |
|
|
112
114
|
| `[vite:vue] reading 'type'`(无行号,某 .vue) | gogocode 漏转元素上的 `slot="x"`(F1) |
|
|
113
115
|
| `组件注册名冲突:… copy.vue` | 垃圾副本文件撞名(F8,`find src -iname "*copy*"`) |
|
|
116
|
+
| 切换页签或打开详情时报 `Cannot convert object to primitive value`、`setAttribute` 异常 | 按 F28 追踪 `form` 实例的传参链;接收组件未声明 prop 时,Vue3 可能把它透传到原生 DOM。后续 vnode/parentNode 异常先回溯首条错误 |
|
|
114
117
|
| `npm i` 显示成功但 vite/依赖没装上 | `node-sass`/`fibers` 原生编译挂、exit code 被管道吞(F7) |
|
|
115
118
|
| `[loadComponent] 找不到 epx-xxx`(本地新迁的库) | 源码版本落后线上部署、缺组件(`verify-components.mjs --online` 对齐) |
|
|
116
119
|
|
|
@@ -126,6 +129,8 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
|
|
|
126
129
|
|
|
127
130
|
**本地包链接不等于加载源码**:核对安装包 exports 实际指向 src 还是 dist。修改本地链接平台源码后,若消费方读取 dist,应在授权范围重建对应包,并重启/强制刷新消费方 Vite 预构建缓存;记录实际运行参数声明、请求来源与制品时间。区分 main.js 安装产品源码的开发应用与远程 UMD/按需制品宿主,两者验收分别记录,不能互相代替。按 F28 实际切换全部目标页签后再报告本地修复结果。
|
|
128
131
|
|
|
132
|
+
**表单上下文透传必查**:升级后即使默认页无报错,也按 [F28](pitfalls.md#f28-审核详情空白加载遮罩残留与懒加载页签计数) 从 `:form`、JSX/render 的 `form`、`v-bind` 对象及 `$attrs` 展开追踪实际接收端,检查产品组件、平台基类、包装组件和懒加载页签的有效 props。只修已报错组件不算完成;未激活的页签记待验证。对确定接收表单实例的组件声明正确 prop,并保留上下文转发及 class/style 等合法 attrs;不能给所有组件盲加 prop,也不能全局过滤 attrs 掩盖遗漏。
|
|
133
|
+
|
|
129
134
|
**目标宿主共享依赖必查**:用户指定了运行地址时,以该宿主为验收目标,不能用本地新版包代替。按 F26 核对最终 deps 清单和共享 shim 实际使用的包/导出;预加载后应在 `__EPX_PACKAGES__` 对应命名空间拿到同步真身。旧 `window.frame` 有组件不代表独立共享包已发布组件;继承基类缺失时先修共享加载桥并发布宿主,再用新会话复验,不能给 `$component`/`upPage` 填空对象掩盖。
|
|
130
135
|
|
|
131
136
|
**当前角色必须迁移到平台上下文**:按 F27 扫描并修复当前角色 ID/code 的取值和消费点,ID 使用 `$currentRoleId`(或 `$currentRole?.id`),code 使用 `$currentRole?.code`。已继承平台基类或公共组件混入的直接使用;普通自定义组件接入 `@epxing/core` 的 `ComponentMixin`。不自行解析地址、不从 localStorage 恢复当前角色、不额外查询角色列表匹配当前角色;角色管理页的编辑值和业务角色字段须保留各自语义。已授权升级中由 AI 完成可确认的迁移,并验证旧地址、新菜单地址及角色切换。
|
|
@@ -194,6 +199,7 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
|
|
|
194
199
|
7. 按 G 节核对适用的交互、上下文、浮层、表格、设计器和性能问题。区分已检查不适用、已验证通过、已改待验证和阻塞;临时浏览器修正、平台兼容单测或旧会话交付记录,不能作为当前产品新制品已通过的证据。
|
|
195
200
|
8. 使用本地替换库验收时,记录入口、CSS、清单和实际加载分片的响应与磁盘一致、入口加载方式正确,以及详情页实测结果。存在加载语法错误时先修接入;接口返回空列表时记录查询参数与配置依据,不为填充页面写入默认业务数据。
|
|
196
201
|
9. 核对 F27 当前角色迁移:ID/code 与接口及权限判断语义一致;旧含角色地址、新不含角色菜单地址、切换角色及缓存组件复用均取当前应用角色。普通组件已接入公共混入,未引入地址/存储兜底或重复初始化。
|
|
202
|
+
10. 核对 F28 的 form 接收链:已逐个激活方案等业务页签及嵌套页签,检查有效 props、首条异常和真实内容,确认表单实例未落到原生 DOM,样式及上下文仍可用;平台源码修复已核对目标宿主制品,未发布或未激活的项不得标通过。
|
|
197
203
|
|
|
198
204
|
## 常见错误
|
|
199
205
|
|
|
@@ -711,6 +711,12 @@ export default {
|
|
|
711
711
|
|
|
712
712
|
审核列表/卡片已返回数据但详情空白时,先捕获首条异常及实际接收组件。平台表单会下发 `form` 实例;未声明为 prop 的接收组件在 Vue3 自动继承 attrs 时可能将实例写到原生 DOM,报 `setAttribute: Cannot convert object to primitive value`,后续可能连带出现 null vnode/parentNode 异常。工资审核页实证接收端为平台 Card、EntityList(含产品派生列表)。修复接收端声明 `form: Object`,保留 class/style 继承及上下文;不要 stringify 实例、吞渲染异常或批量关闭 inheritAttrs。扫描同一传参链的其他接收端,以 null 原型对象或真实 Vue 实例验证 form 不落 DOM、外部样式仍落根;平台源码修复须另核对目标宿主发布版本,不能只发布产品包。
|
|
713
713
|
|
|
714
|
+
**按接收链检查,不能只按报错组件补丁**:方案标签页等业务容器同样可能接收平台表单实例,该问题不限定于审核页或列表。升级时先搜索模板 `:form`、JSX/render 的 `form`、`v-bind` 对象与 `$attrs` 展开,沿动态组件、包装层和懒加载子项追踪到实际接收端;检查 `extends`/mixins 合并后的有效 props,不能仅因本文件没有声明就判断遗漏。静态检索只列候选,动态配置与未展开对象仍须查来源,零命中不代表无需运行验证。
|
|
715
|
+
|
|
716
|
+
已确认接收实例的 Options API 组件声明 `props: { form: Object }`,`<script setup>` 在已有 `defineProps` 中补上相同契约;保留原 props 与必要的子组件转发。prop 声明只阻止该层自动落 DOM,若后续显式把 form 放入原生元素的 `v-bind`/属性 spread,仍需在该原生边界移除这一非 DOM 值。不要给所有组件盲加 prop,不修改表单实例为字符串,不用重试、空对象或整体关闭 attrs 继承绕过异常。`inheritAttrs: false` 的组件还须检查显式 `$attrs` 的去向。
|
|
717
|
+
|
|
718
|
+
**回归判据**:用 null 原型对象或真实表单实例作为输入,检查实际接收值身份不变、根 DOM 没有非业务用途的 form 属性、控制台无首条转换异常,并验证外传 class/style、事件及子组件上下文仍正常。逐个激活方案页签、非默认及嵌套页签,再验证切换返回和缓存复用后的真实内容。记录发送端→接收端→原生根、有效 prop 来源、实际加载版本及未测分支;不能用普通 `{}` 恰好可转字符串、构建成功或默认页正常代替该项验收。原生表单控件合法的字符串 form ID 关联需保留,不能全仓删除同名属性。
|
|
719
|
+
|
|
714
720
|
若加载变量已 false 但遮罩仍在,检查实际可见节点、VNode 分支及指令生命周期。JSX/render 在有/无数据分支复用同类型根 div,仅空分支带 v-loading 时可能留下旧遮罩;给互斥分支不同 key 或统一指令绑定,验证加载→内容、空结果及请求失败,不以手动删除遮罩验收。同时检查异步链空结果是否结束加载。模板 v-if 的编译器处理与手写 render 不同,静态命中不等于缺陷;按实际分支检查。
|
|
715
721
|
|
|
716
722
|
页签计数读取子项配置前,核对懒加载实例及 itemConfigs 是否就绪。配置尚未就绪时延后该项统计,不能用空配置发起无范围查询,也不能将计数异常认作后端无数据。已有模板/实例配置来源按当前平台契约保留。
|
|
@@ -748,6 +754,28 @@ vuedraggable 等第三方库升级 major 后,核对模板与 JSX 的实际插
|
|
|
748
754
|
|
|
749
755
|
有升级前 Git 基线时,运行 `node <本技能目录>/scripts/check-icon-migration.cjs <前端工程根目录> <升级前Git引用>`。脚本只读比较模板图标的顺序、指令和参数,接受事件移动到祖先按钮;无法对齐的结构变化列为人工项,不自动恢复旧代码。结果只覆盖模板静态图标,JSX、动态图标、普通属性与 CSS 仍需复核。按原始图标类和按钮状态检查最终选择器,避免图标换成 SVG 后 hover/隐藏样式失效。回归点击入口本身,验证实际打开、选中回显、关闭、原记录 ID、上下文参数及事件冒泡;仅测试方法存在不足以发现失接线。
|
|
750
756
|
|
|
757
|
+
### F32. 同层插槽条件访问尚未声明的局部参数
|
|
758
|
+
|
|
759
|
+
`<template #default="scope" v-if="scope.row.data">` 中,外层条件不能使用该插槽才声明的参数;`#cell="{ row: item }"` 配合 `v-if="item.data"` 同样需要检查,不能只搜索 scope。将依赖局部参数的判断放入插槽内部,保留父行/叶子行、编辑/查看及相邻 if/else-if/else 的完整语义。外层条件只引用组件状态时可以保留,不全局移动所有带插槽的条件。
|
|
760
|
+
|
|
761
|
+
运行 `scripts/check-list-slots.cjs` 检查模板 AST 中同层条件与绑定参数的引用关系。脚本只读,解析不确定项报告复核,不自动改写条件链。修复一处后扫描全部模板,沿同基类和复制组件扩查;验收应从真实表格验证父行、叶子行、空值、编辑模型与原记录 ID,不能加空 scope 或删除业务条件来隐藏错误。
|
|
762
|
+
|
|
763
|
+
命中同名引用仍是候选:若组件外层确有同名状态,先确认条件究竟读取它还是误用了插槽局部参数,不能机械移动后改变条件含义。
|
|
764
|
+
|
|
765
|
+
### F33. 响应式状态、树刷新与异步依赖未形成完整闭环
|
|
766
|
+
|
|
767
|
+
按 F24 区分组件旧 filters 选项和 data.filters 等业务状态;实例所读写的状态须在 data/props/computed 等公开响应式入口声明,不能将数组或对象误迁到 methods。模式切换后清理旧显示分支,按当前模式消费响应;请求可能交错返回时,验证旧请求不会覆盖新上下文,不把所有 watcher 扩大为无差别深度监听。
|
|
768
|
+
|
|
769
|
+
树数据整体刷新后,旧节点引用不再代表新数据。按稳定业务 ID 在新树中恢复有效选中;选中项消失或树为空时,清除关联列表、指标、详情和依赖旧节点的操作入口。核对 rowKey 的真实唯一性、展开/收起和选择回写,不用名称去重或字符串缩进冒充真实树关系。
|
|
770
|
+
|
|
771
|
+
对依赖多次异步初始化的状态查询,列清每个必需参数的来源及就绪条件,分别验证 A 先返回、B 先返回、空结果、失败与上下文切换。失败不能继续展示初始成功/已提交值,也不能强制设为未提交来显示按钮;按实际协议区分未加载、加载成功和加载失败,保留权限及业务筛选。具体业务接口的参数名不可推广成所有请求都必传。
|
|
772
|
+
|
|
773
|
+
### F34. 移动布局与报告结论必须按实际场景验收
|
|
774
|
+
|
|
775
|
+
按 F15/F30 检查继承及 render/插槽链的实际根和 scopeId;移动页尤其核对 flex 收缩、min-width/min-height、横纵滚动、底栏自然高度与安全区。抽屉内部避免用 100vw 假定其等于容器宽度;宽表、长名称与按钮换行应按真实容器验证。只在确认当前作用域失配后修复,保留专属命名空间和外部隔离,不套用其他产品的固定高度、像素或整块删除 scoped。
|
|
776
|
+
|
|
777
|
+
源码、组件/浏览器夹具、最终制品及目标宿主分别记结果。工具初始报告中的未勾选项须与后续修复和验证逐项对账,不能直接把历史清单当作当前缺陷,也不能因本地构建成功整体勾选。报告乱码、缺失请求或未复现入口不构成根因证据;待定位问题保留症状、已知证据、缺少条件与下一步,不能变成共性自动修法。
|
|
778
|
+
|
|
751
779
|
## G. 产品升级的跨会话缺陷回归
|
|
752
780
|
|
|
753
781
|
本节从近期产品故障的提交及交接记录提炼检查场景,补充 E2 的逐组件主题验收。历史记录证明曾出现过这些问题,不证明当前目标环境已发布修复;其中只有临时浏览器实验、单测或尚待现场验证的结论,不能提升为已部署通过。具体来源及证据层次保留在平台仓 `docs/handoff/tasks/` 的原任务中,技能只保留可复用检查方法。
|
|
@@ -15,12 +15,15 @@
|
|
|
15
15
|
| 历史列表翻页异常、分页弃用警告 | 模板事件与 JSX 事件命名不同;当前页/每页数更新;sizes 所需监听 | 翻页及切换页大小改变绑定值与请求参数;目标版本无对应警告 | [F30](../pitfalls.md#f30-布局分页及可选配置的静默回退) |
|
|
16
16
|
| 页面贴边、卡片布局或弹窗对齐丢失 | render 根与 CSS 选择器不符、插槽后代缺 scopeId、选择框默认占满一行、父布局最小尺寸 | 实际继承/插槽链下计算样式正确;普通和窄容器可用;外部同名元素及其他页面不受影响 | F15、F19、F20、F30 |
|
|
17
17
|
| 初次渲染异常,异步筛选或回显不更新 | data/props/computed 声明、普通 filters 字段误当旧过滤器、Vue2 模型、对象/数组监听 | 从空初值加载到结果;保留 0、false;回显、清空、再次读取和请求序列化一致 | F16、F24 |
|
|
18
|
+
| 方案等页签或详情报 setAttribute/对象转字符串异常 | form 实例从发送端经继承、包装和动态组件到实际接收端的有效 props,以及显式 attrs 展开的原生边界 | 逐个激活非默认/嵌套页签;实例不落 DOM,接收值及下传身份正确,class/style 和上下文保留;核对宿主实际制品 | [F28](../pitfalls.md#f28-审核详情空白加载遮罩残留与懒加载页签计数) |
|
|
18
19
|
| 卡片标题错误、关闭图标后白屏、步骤选中混乱 | propsData 等旧结构、可选配置 null、当前项与完成数不同、页面参数类型 | 无图标/无标题分支仍可用;当前步骤可辨;回退和全部完成状态正确 | F22、F29、F30 |
|
|
19
20
|
| 本地修了,目标站仍旧或空白 | 实际加载的宿主/产品版本与 JS、CSS、清单、分片;服务 500 与渲染异常分别取证 | 同批制品、正确 MIME/加载方式、真实页面操作;旧缓存或临时注入不能当发布生效 | D3、F23、G |
|
|
20
21
|
| 库包夹带 index.html/制品不全 | 独立应用与远程库输出混淆、publicDir 复制、并发构建清理、懒加载清单遗漏 | 库入口与 CSS/依赖/分片匹配;应用构建按设计保留 HTML;上传形态完整 | B、C、下文制品检查 |
|
|
21
22
|
|
|
22
23
|
## 模型与样式的逐组件必检项
|
|
23
24
|
|
|
25
|
+
新增重点:按 [F32](../pitfalls.md#f32-同层插槽条件访问尚未声明的局部参数) 检查插槽参数与条件的词法作用域;按 F33 验证树刷新后的选中引用、业务响应式状态及依赖请求的不同返回顺序;按 F34 对账历史报告与实际证据,并检查移动滚动和底栏。以上是共性检查,不复制具体产品的参数、状态默认值或布局尺寸。
|
|
26
|
+
|
|
24
27
|
以下项目并入现有 E2 台账,不另建一份互相脱节的清单。没有发现问题也须留下检查依据;确实没有模型或样式的组件注明原因,不靠组件名称或继承关系免检。
|
|
25
28
|
|
|
26
29
|
| 复核项 | 必须追踪的链路 | 关闭条件 |
|
|
@@ -73,7 +76,7 @@ node <技能目录>/scripts/check-icon-migration.cjs <前端工程根目录> <
|
|
|
73
76
|
|
|
74
77
|
| 脚本 | 覆盖 | 退出码与边界 |
|
|
75
78
|
| --- | --- | --- |
|
|
76
|
-
| check-list-slots | render
|
|
79
|
+
| check-list-slots | 同层 v-slot 与 if/else-if 对插槽参数的引用(含解构和别名);render 旧 scopedSlots、列渲染函数展开、表格旧 props 包装及静态绑定的表格样式回调字符串返回 | 0:无此类候选;1:有候选或插槽表达式需复核。不自动改条件链;对象属性函数、动态别名、h 第三参及运行时元数据继续审阅 |
|
|
77
80
|
| check-draggable-slots | 模板 vuedraggable 导入别名、直接 item 插槽、item-key;纯 JSX 标为复核 | 0:已扫描项无候选;1:明确缺项;2:需人工复核。JSX 和动态插槽继续验证 |
|
|
78
81
|
| check-icon-migration | 对比升级前模板的静态图标顺序、事件/参数/修饰符和条件,接受事件移动到祖先按钮 | 0:未发现保留差异;1:候选或无法对齐。新增图标、结构调整需要人工判断;普通属性、CSS、JSX 另查 |
|
|
79
82
|
|
|
@@ -22,9 +22,31 @@ function hasRenderer(node) {
|
|
|
22
22
|
}
|
|
23
23
|
for (const file of walk(path.join(root, 'src')).filter(f => /\.(vue|[cm]?[jt]sx?)$/.test(f))) {
|
|
24
24
|
const source = fs.readFileSync(file, 'utf8')
|
|
25
|
-
const
|
|
25
|
+
const parsed = file.endsWith('.vue') ? parse(source) : null
|
|
26
|
+
if (parsed?.errors.length) throw new Error(file + ':Vue 文件解析失败:' + parsed.errors.map(error => error.message || error).join('; '))
|
|
27
|
+
const descriptor = parsed?.descriptor || null
|
|
26
28
|
const styleCallbacks = new Set()
|
|
27
29
|
function templateBindings(node) {
|
|
30
|
+
if (node.type === 1) {
|
|
31
|
+
const slot = node.props.find(p => p.type === 7 && p.name === 'slot' && p.exp)
|
|
32
|
+
const condition = node.props.find(p => p.type === 7 && ['if', 'else-if'].includes(p.name) && p.exp)
|
|
33
|
+
if (slot && condition) {
|
|
34
|
+
const location = { file: path.relative(root, file), line: condition.loc.start.line }
|
|
35
|
+
try {
|
|
36
|
+
const options = { configFile: false, babelrc: false, parserOpts: { plugins: ['typescript'] } }
|
|
37
|
+
const parameters = babel.parseSync(`(${slot.exp.content}) => 0`, options).program.body[0].expression.params
|
|
38
|
+
const names = new Set(parameters.flatMap(param => Object.keys(t.getBindingIdentifiers(param))))
|
|
39
|
+
const expression = babel.parseSync(`(${condition.exp.content})`, options)
|
|
40
|
+
const referenced = new Set()
|
|
41
|
+
babel.traverse(expression, { ReferencedIdentifier(p) {
|
|
42
|
+
if (names.has(p.node.name) && !p.scope.hasBinding(p.node.name)) referenced.add(p.node.name)
|
|
43
|
+
} })
|
|
44
|
+
if (referenced.size) findings.push({ ...location, reason: '同层插槽条件与局部参数同名引用:' + [...referenced].join(', ') + ';核对外层同名状态,若依赖插槽参数则将条件移入内部并保留完整 else 链' })
|
|
45
|
+
} catch (error) {
|
|
46
|
+
findings.push({ ...location, reason: '插槽参数或条件无法静态解析,需复核作用域:' + error.message })
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
28
50
|
if (node.type === 1 && node.tag === 'el-table') for (const p of node.props) {
|
|
29
51
|
if (p.type === 7 && p.name === 'bind' && tableStyles.has(p.arg?.content) && /^[\w$]+$/.test(p.exp?.content || '')) styleCallbacks.add(p.exp.content)
|
|
30
52
|
}
|
|
@@ -69,5 +91,5 @@ for (const file of walk(path.join(root, 'src')).filter(f => /\.(vue|[cm]?[jt]sx?
|
|
|
69
91
|
})
|
|
70
92
|
}
|
|
71
93
|
}
|
|
72
|
-
console.log(JSON.stringify({ files, columns, findings, scope: 'script
|
|
94
|
+
console.log(JSON.stringify({ files, columns, findings, scope: '同层插槽参数条件、script 插槽/props、静态绑定的表格样式回调;别名、h() 消费方与运行时元数据仍需复核' }, null, 2))
|
|
73
95
|
process.exitCode = findings.length ? 1 : 0
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epxing/cli",
|
|
3
|
-
"version": "0.5.0-beta.
|
|
3
|
+
"version": "0.5.0-beta.14",
|
|
4
4
|
"description": "EPX 交互式工程开发、服务启动、构建、Vue3 迁移及技能安装工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,12 +13,6 @@
|
|
|
13
13
|
"engines": {
|
|
14
14
|
"node": ">=18"
|
|
15
15
|
},
|
|
16
|
-
"scripts": {
|
|
17
|
-
"build": "node build.mjs",
|
|
18
|
-
"test": "node --test test/cli.test.mjs test/platform-version.test.mjs test/lib-build-template.test.mjs test/library-public-config.test.mjs",
|
|
19
|
-
"prepack": "node build.mjs",
|
|
20
|
-
"prepublishOnly": "node ../../build/guard-publish-registry.mjs"
|
|
21
|
-
},
|
|
22
16
|
"devDependencies": {
|
|
23
17
|
"@babel/parser": "7.29.3",
|
|
24
18
|
"@vue/compiler-dom": "3.5.39",
|
|
@@ -35,5 +29,9 @@
|
|
|
35
29
|
"default": "./dist/vite.mjs"
|
|
36
30
|
},
|
|
37
31
|
"./package.json": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "node build.mjs",
|
|
35
|
+
"test": "node --test test/cli.test.mjs test/platform-version.test.mjs test/lib-build-template.test.mjs test/library-public-config.test.mjs"
|
|
38
36
|
}
|
|
39
|
-
}
|
|
37
|
+
}
|