@epxing/cli 0.5.0-beta.10 → 0.5.0-beta.12

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 CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  独立工程命令行工具,终端命令名为 epxing。/vite 提供产品构建插件,根入口不提供业务运行时。
4
4
 
5
- 本页对应包版本 `0.5.0-beta.10`。导出名、子路径和签名从当前源码、package.json 与类型声明生成。
5
+ 本页对应包版本 `0.5.0-beta.12`。导出名、子路径和签名从当前源码、package.json 与类型声明生成。
6
6
 
7
7
  ## 安装与使用
8
8
 
9
9
 
10
10
  ```sh
11
- npm install -g @epxing/cli@0.5.0-beta.10
11
+ npm install -g @epxing/cli@0.5.0-beta.12
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.10`,平台包 `5.3.0-beta.5`,均使用 npm 公网 `beta` 标签。CLI 与平台独立版本,本次不升级平台包。完整流程见文档站“CLI 创建、升级与产品使用”;各包公开 API 随安装包的 `API.md` 提供。
7
+ 本批测试版本:`@epxing/cli@0.5.0-beta.12`,平台包 `5.3.0-beta.5`,均使用 npm 公网 `beta` 标签。CLI 与平台独立版本,本次不升级平台包。完整流程见文档站“CLI 创建、升级与产品使用”;各包公开 API 随安装包的 `API.md` 提供。
8
+
9
+ `0.5.0-beta.12` 合并考核升级经验,随技能交付跨产品复核清单及列表插槽、拖拽、图标三个只读扫描脚本。模型与样式按组件复核,覆盖模板、JSX/render、包装与继承链;扫描零命中不能替代未覆盖场景验收。CLI 更新不会覆盖已有产品技能,更新前须比较并保留自定义内容;新建目录可运行 epxing skill install 安装完整技能。
10
+
11
+ `0.5.0-beta.11` 将按需库的组件 CSS 放入对应 JS,模块加载完成前同步注入,共享样式去重;index.css 保留空文件兼容已登记 URL,整库兜底自带全部样式。可视化、设计器和预览组件写入预取排除清单,实际使用仍正常加载。新平台选择性预取普通组件;旧平台由新壳关闭后台预取。全量构建仍使用原有整体 CSS。Vite 深层动态导入仍引用的 CSS 文件继续保留并随组件按需加载。
8
12
 
9
13
  `0.5.0-beta.10` 关闭产品库构建的 public 目录复制,避免旧 cmaps 和 index.html 混入 lib。创建模板、已有库配置迁移及 CLI 库构建保持一致;应用构建和源 public 文件保留。动态或展开的库配置仍报告人工核对。修复直接执行 npm 库构建时异步懒加载插件进入自身嵌套构建的问题。
10
14
 
package/dist/cli.mjs CHANGED
@@ -48,7 +48,7 @@ function installSkill (args, cwd) {
48
48
  const unknown = args.filter(arg => arg !== '--force')
49
49
  if (unknown.length) throw new Error(`不支持的参数:${unknown.join(' ')}`)
50
50
  const dest = path.join(custom ? path.resolve(dir, custom) : path.join(dir, '.claude/skills'), skillName)
51
- const files = ['SKILL.md', 'pitfalls.md', 'scripts/fix-eval-paths.cjs']
51
+ const files = ['SKILL.md', 'pitfalls.md', 'references/upgrade-review.md', 'scripts/fix-eval-paths.cjs', 'scripts/check-list-slots.cjs', 'scripts/check-draggable-slots.cjs', 'scripts/check-icon-migration.cjs']
52
52
  if (!force && files.some(file => fs.existsSync(path.join(dest, file)))) {
53
53
  throw new Error(`技能已存在:${dest}。如需替换,核对自定义内容后使用 --force。`)
54
54
  }
package/dist/lazy-lib.mjs CHANGED
@@ -1,28 +1,43 @@
1
- import h from"node:fs";import y from"node:path";import{build as B}from"epxing:project-vite";import j from"node:fs";import v from"node:path";import{parse as T,babelParse as U}from"epxing:project-sfc";function W(e){return j.readFileSync(e,"utf8").split(`\r
1
+ import h from"node:fs";import d from"node:path";import{build as J}from"epxing:project-vite";import O from"node:path";import{createHash as W}from"node:crypto";function K(e,r,t){let n=t==="es"?"import.meta.url":"((document.currentScript && document.currentScript.src) || document.baseURI)",o=W("sha256").update(e).digest("hex").slice(0,16);return`;(function () {
2
+ if (typeof document === 'undefined') return
3
+ var base = new URL(${JSON.stringify(r)}, ${n}).href
4
+ var id = 'epx-lib-css:' + base + ':${o}'
5
+ if (document.getElementById(id)) return
6
+ var style = document.createElement('style')
7
+ style.id = id
8
+ style.textContent = ${JSON.stringify(e)}.replace(/url\\(\\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\\s*\\)/gi, function (match, double, single, raw) {
9
+ var value = (double || single || raw || '').trim()
10
+ if (!value || /^(?:[a-z][a-z\\d+.-]*:|\\/|#|var\\()/i.test(value)) return match
11
+ return 'url(' + JSON.stringify(new URL(value, base).href) + ')'
12
+ })
13
+ document.head.appendChild(style)
14
+ })()
15
+ `}function j(e,r,t=!1){let n=Object.values(e).filter(i=>i.type==="chunk"),o=Object.values(e).filter(i=>i.type==="asset"&&i.fileName.endsWith(".css")),s=new Set(o.filter(i=>n.some(l=>l.code.includes(O.posix.basename(i.fileName)))).map(i=>i.fileName)),u=new Set;for(let i of n){let l=t?o:o.filter(a=>i.viteMetadata?.importedCss?.has(a.fileName));for(let a of l){let m=typeof a.source=="string"?a.source:Buffer.from(a.source).toString("utf8"),b=O.posix.relative(O.posix.dirname(i.fileName),a.fileName);i.code+=`
16
+ `+K(m,b,r),u.add(a.fileName)}}for(let i of u)s.has(i)||delete e[i]}function z(e=!1){return{name:"epx-lazy-inline-css",generateBundle:{order:"post",handler(r,t){j(t,r.format,e)}}}}import N from"node:fs";import v from"node:path";import{parse as G,babelParse as q}from"epxing:project-sfc";function Z(e){return N.readFileSync(e,"utf8").split(`\r
2
17
  `).join(`
3
- `)}function G(e){let s=e.split(`\r
18
+ `)}function X(e){let r=e.split(`\r
4
19
  `).join(`
5
- `),t="";try{let{descriptor:r}=T(s);t=r.script&&r.script.content||r.scriptSetup&&r.scriptSetup.content||""}catch{return null}if(!t)return null;try{let i=U(t,{sourceType:"module",plugins:["jsx","typescript","decorators-legacy"]}).program.body,n=l=>{if(!l||l.type!=="ObjectExpression")return null;for(let u of l.properties){if(u.type!=="ObjectProperty"||u.computed)continue;if((u.key.type==="Identifier"?u.key.name:u.key.type==="StringLiteral"?u.key.value:null)==="name"&&u.value.type==="StringLiteral")return u.value.value}return null},a=i.find(l=>l.type==="ExportDefaultDeclaration");if(!a)return null;let o=n(a.declaration);if(o)return o;if(a.declaration.type==="Identifier"){let l=a.declaration.name;for(let u of i)if(u.type==="VariableDeclaration"){for(let m of u.declarations)if(m.id.type==="Identifier"&&m.id.name===l){let b=n(m.init);if(b)return b}}}if(a.declaration.type==="CallExpression")for(let l of a.declaration.arguments){let u=n(l);if(u)return u}return null}catch{return null}}function K(e){return e.replace(/(\.\/|\.vue|\/)/g,"")}function O(e,s){let t=v.resolve(e,s),r=[],i=n=>{let a=j.readdirSync(n,{withFileTypes:!0}).sort((o,l)=>o.name<l.name?-1:1);for(let o of a){let l=v.join(n,o.name);if(o.isDirectory())i(l);else if(o.name.endsWith(".vue")){let m="./"+v.relative(e,l).split(v.sep).join("/");r.push({globKey:m,file:l,key:G(W(l))||K(m)})}}};return j.existsSync(t)&&i(t),r.sort((n,a)=>n.globKey<a.globKey?-1:1)}function z(e){let s=new Map;for(let t of e){if(s.has(t.key))throw new Error(`[lazy-lib] \u7EC4\u4EF6\u6CE8\u518C\u540D\u51B2\u7A81\uFF1A'${t.key}' \u540C\u65F6\u6765\u81EA
6
- ${s.get(t.key)}
20
+ `),t="";try{let{descriptor:n}=G(r);t=n.script&&n.script.content||n.scriptSetup&&n.scriptSetup.content||""}catch{return null}if(!t)return null;try{let o=q(t,{sourceType:"module",plugins:["jsx","typescript","decorators-legacy"]}).program.body,s=l=>{if(!l||l.type!=="ObjectExpression")return null;for(let a of l.properties){if(a.type!=="ObjectProperty"||a.computed)continue;if((a.key.type==="Identifier"?a.key.name:a.key.type==="StringLiteral"?a.key.value:null)==="name"&&a.value.type==="StringLiteral")return a.value.value}return null},u=o.find(l=>l.type==="ExportDefaultDeclaration");if(!u)return null;let i=s(u.declaration);if(i)return i;if(u.declaration.type==="Identifier"){let l=u.declaration.name;for(let a of o)if(a.type==="VariableDeclaration"){for(let m of a.declarations)if(m.id.type==="Identifier"&&m.id.name===l){let b=s(m.init);if(b)return b}}}if(u.declaration.type==="CallExpression")for(let l of u.declaration.arguments){let a=s(l);if(a)return a}return null}catch{return null}}function H(e){return e.replace(/(\.\/|\.vue|\/)/g,"")}function L(e,r){let t=v.resolve(e,r),n=[],o=s=>{let u=N.readdirSync(s,{withFileTypes:!0}).sort((i,l)=>i.name<l.name?-1:1);for(let i of u){let l=v.join(s,i.name);if(i.isDirectory())o(l);else if(i.name.endsWith(".vue")){let m="./"+v.relative(e,l).split(v.sep).join("/");n.push({globKey:m,file:l,key:X(Z(l))||H(m)})}}};return N.existsSync(t)&&o(t),n.sort((s,u)=>s.globKey<u.globKey?-1:1)}function E(e){let r=new Map;for(let t of e){if(r.has(t.key))throw new Error(`[lazy-lib] \u7EC4\u4EF6\u6CE8\u518C\u540D\u51B2\u7A81\uFF1A'${t.key}' \u540C\u65F6\u6765\u81EA
21
+ ${r.get(t.key)}
7
22
  ${t.file}
8
- \u5355\u4F53\u5F62\u6001\u4E0B\u662F\u540E\u8005\u9759\u9ED8\u8986\u76D6\u524D\u8005\uFF1B\u6309\u9700\u5F62\u6001\u4E0B\u4E24\u4E2A chunk \u62A2\u540C\u4E00\u4E2A\u540D\u5B57\uFF0C\u5FC5\u987B\u5148\u6539\u6389\u5176\u4E2D\u4E00\u4E2A\u7EC4\u4EF6\u7684 name\uFF08\u6216\u6587\u4EF6\u8DEF\u5F84\uFF09\u3002`);s.set(t.key,t.file)}return e}var R=[{test:e=>e==="vue",global:"window.frame && window.frame.Vue"},{test:e=>e==="vuex",global:"window.frame && window.frame.vuex"},{test:e=>e==="vue-router",global:"window.frame && window.frame.router"},{test:e=>e==="epx-frame"||e.startsWith("epx-frame/"),global:"window.epxFrame"}],L=/^[A-Za-z_$][\w$]*$/,q=(e,s)=>{if(!s)return null;let t=typeof s=="function"?s(e):s[e];return typeof t=="string"&&t?t:null};function Z(e,s){let t=R.find(i=>i.test(e));if(t)return t.global;let r=q(e,s);if(r)return`window.${r}`;throw new Error(`[lazy-lib] external '${e}' \u6CA1\u6709\u5BF9\u5E94\u7684\u8FD0\u884C\u65F6\u5168\u5C40\u6620\u5C04\u3002
23
+ \u5355\u4F53\u5F62\u6001\u4E0B\u662F\u540E\u8005\u9759\u9ED8\u8986\u76D6\u524D\u8005\uFF1B\u6309\u9700\u5F62\u6001\u4E0B\u4E24\u4E2A chunk \u62A2\u540C\u4E00\u4E2A\u540D\u5B57\uFF0C\u5FC5\u987B\u5148\u6539\u6389\u5176\u4E2D\u4E00\u4E2A\u7EC4\u4EF6\u7684 name\uFF08\u6216\u6587\u4EF6\u8DEF\u5F84\uFF09\u3002`);r.set(t.key,t.file)}return e}var Y=[{test:e=>e==="vue",global:"window.frame && window.frame.Vue"},{test:e=>e==="vuex",global:"window.frame && window.frame.vuex"},{test:e=>e==="vue-router",global:"window.frame && window.frame.router"},{test:e=>e==="epx-frame"||e.startsWith("epx-frame/"),global:"window.epxFrame"}],F=/^[A-Za-z_$][\w$]*$/,Q=(e,r)=>{if(!r)return null;let t=typeof r=="function"?r(e):r[e];return typeof t=="string"&&t?t:null};function ee(e,r){let t=Y.find(o=>o.test(e));if(t)return t.global;let n=Q(e,r);if(n)return`window.${n}`;throw new Error(`[lazy-lib] external '${e}' \u6CA1\u6709\u5BF9\u5E94\u7684\u8FD0\u884C\u65F6\u5168\u5C40\u6620\u5C04\u3002
9
24
  ESM chunk \u91CC\u7684\u88F8\u8BF4\u660E\u7B26\u6D4F\u89C8\u5668\u89E3\u6790\u4E0D\u4E86\uFF0C\u5FC5\u987B\u7ECF shim \u6865\u5230 window \u4E0A\u7684\u5168\u5C40\u3002
10
25
  \u5E73\u53F0\u5185\u7F6E\u6620\u5C04\uFF1Avue \u2192 window.frame.Vue\uFF1Bvuex \u2192 window.frame.vuex\uFF1B
11
26
  vue-router \u2192 window.frame.router\uFF1Bepx-frame\uFF08\u542B\u5B50\u8DEF\u5F84\uFF09\u2192 window.epxFrame\u3002
12
27
  \u4E09\u6761\u51FA\u8DEF\uFF1A
13
28
  \u2460 \u5B83\u7531**\u4EA7\u54C1\u9879\u76EE**\u77E5\u9053\u5168\u5C40\u540D \u2192 \u5728 vite.config.mjs \u7684 output.globals \u91CC\u7ED9 '${e}' \u914D\u4E0A\uFF08\u63A8\u8350\uFF09\uFF1B
14
29
  \u2461 \u5B83\u7531**\u5E73\u53F0**\u63D0\u4F9B \u2192 \u53BB build/lazy-lib/gen-shims.mjs \u7684 GLOBALS \u8865\u4E00\u6761\u6620\u5C04\uFF1B
15
- \u2462 \u5B83\u4E0D\u8BE5\u88AB external\uFF08\u7EC4\u4EF6\u771F\u7684\u9700\u8981\u628A\u5B83\u6253\u8FDB\u4EA7\u7269\uFF09\u2192 \u4ECE external \u5217\u8868\u91CC\u53BB\u6389\u5B83\u3002`)}function S(e){return"shims/"+e.replace(/[^\w.-]/g,"_")+".js"}function D(e){let s=new Map;for(let t of e){let r=S(t);if(s.has(r)&&s.get(r)!==t)throw new Error(`[lazy-lib] shim \u6587\u4EF6\u540D\u51B2\u7A81\uFF1A'${t}' \u548C '${s.get(r)}' \u90FD\u751F\u6210 '${r}'\u3002
30
+ \u2462 \u5B83\u4E0D\u8BE5\u88AB external\uFF08\u7EC4\u4EF6\u771F\u7684\u9700\u8981\u628A\u5B83\u6253\u8FDB\u4EA7\u7269\uFF09\u2192 \u4ECE external \u5217\u8868\u91CC\u53BB\u6389\u5B83\u3002`)}function S(e){return"shims/"+e.replace(/[^\w.-]/g,"_")+".js"}function D(e){let r=new Map;for(let t of e){let n=S(t);if(r.has(n)&&r.get(n)!==t)throw new Error(`[lazy-lib] shim \u6587\u4EF6\u540D\u51B2\u7A81\uFF1A'${t}' \u548C '${r.get(n)}' \u90FD\u751F\u6210 '${n}'\u3002
16
31
  \u5F53\u524D\u7F16\u7801\u65B9\u6848\uFF08/ \u548C\u975E\u6CD5\u5B57\u7B26\u66FF\u6362\u4E3A _\uFF09\u5728 GLOBALS \u7684\u5C01\u95ED\u96C6\u5185\u662F\u5B89\u5168\u7684\u3002
17
- \u5C06\u6765\u82E5\u771F\u9700\u8981\u652F\u6301\u4F1A\u78B0\u649E\u7684\u8BF4\u660E\u7B26\uFF0C\u518D\u6362\u7F16\u7801\u65B9\u6848\uFF08\u5982 hash \u540E\u7F00\uFF09\u3002`);s.set(r,t)}}function F(e,s,t){let r=Z(e,t),i=[...s],n=i.filter(o=>o!=="default"&&L.test(o)).sort();for(let o of i)if(o!=="default"&&!L.test(o))throw new Error(`[lazy-lib] \u65E0\u6CD5\u4E3A external '${e}' \u751F\u6210 shim\uFF1Aimport binding '${o}' \u4E0D\u662F\u5408\u6CD5 JS \u6807\u8BC6\u7B26\u3002
32
+ \u5C06\u6765\u82E5\u771F\u9700\u8981\u652F\u6301\u4F1A\u78B0\u649E\u7684\u8BF4\u660E\u7B26\uFF0C\u518D\u6362\u7F16\u7801\u65B9\u6848\uFF08\u5982 hash \u540E\u7F00\uFF09\u3002`);r.set(n,t)}}function I(e,r,t){let n=ee(e,t),o=[...r],s=o.filter(i=>i!=="default"&&F.test(i)).sort();for(let i of o)if(i!=="default"&&!F.test(i))throw new Error(`[lazy-lib] \u65E0\u6CD5\u4E3A external '${e}' \u751F\u6210 shim\uFF1Aimport binding '${i}' \u4E0D\u662F\u5408\u6CD5 JS \u6807\u8BC6\u7B26\u3002
18
33
  \u539F\u56E0\uFF1A'*' \u6765\u81EA import * as ns from '...' \u7C7B\u547D\u540D\u7A7A\u95F4\u5BFC\u5165\uFF1Bshim \u65E0\u6CD5\u9759\u6001\u679A\u4E3E\u4F7F\u7528\u65B9\u4F1A\u8BBF\u95EE\u54EA\u4E9B\u540D\u5B57\u3002
19
- \u6539\u6CD5\uFF1A\u6539\u7528\u5177\u540D\u5BFC\u5165\uFF0C\u5982 import { someExport } from ... \u800C\u975E import * as ns from ...`);return[`// \u6784\u5EFA\u671F\u751F\u6210\uFF08epx-frame lazy-lib\uFF09\uFF1A\u8FD0\u884C\u65F6\u4ECE ${r} \u53D6\u5E73\u53F0\u5355\u4F8B\uFF0C\u52FF\u624B\u6539\u3002`,`const S = ${r}`,...n.map(o=>`export const ${o} = S[${JSON.stringify(o)}]`),"export default (S && S.default) || S"].join(`
34
+ \u6539\u6CD5\uFF1A\u6539\u7528\u5177\u540D\u5BFC\u5165\uFF0C\u5982 import { someExport } from ... \u800C\u975E import * as ns from ...`);return[`// \u6784\u5EFA\u671F\u751F\u6210\uFF08epx-frame lazy-lib\uFF09\uFF1A\u8FD0\u884C\u65F6\u4ECE ${n} \u53D6\u5E73\u53F0\u5355\u4F8B\uFF0C\u52FF\u624B\u6539\u3002`,`const S = ${n}`,...s.map(i=>`export const ${i} = S[${JSON.stringify(i)}]`),"export default (S && S.default) || S"].join(`
20
35
  `)+`
21
- `}function N(e){let s=new Map;for(let t in e){let r=e[t];if(r.type==="chunk")for(let i in r.importedBindings||{}){s.has(i)||s.set(i,new Set);for(let n of r.importedBindings[i])s.get(i).add(n)}}return s}import k from"node:path";var X=(e,s)=>{let t=k.resolve(e),r=k.resolve(s);return t===r||t.startsWith(r+k.sep)||t.startsWith(r+"/")},E=e=>k.resolve(String(e).split("?")[0]);function I(e,s,t,r){let i=new Set((r||[]).map(E)),n=[...e()].filter(d=>X(d,t)),a=new Set(n),o=new Map,l=[],u=[],m=d=>{let g=new Set;for(let f of d){let c=E(f);i.has(c)&&g.add(c)}return g.size},b=d=>{let g=o.get(d)||0;if(g===2)return;if(g===1){let c=[...l.slice(l.indexOf(d)),d];m(c)>=2&&u.push(c);return}o.set(d,1),l.push(d);let f=s(d)||{};for(let c of f.importedIds||[])a.has(c)&&b(c);l.pop(),o.set(d,2)};for(let d of n)b(d);return u}var $="\0epx-lazy-glob",A=/import\.meta\.glob\(\s*(['"])([^'"]+)\1\s*,\s*\{\s*(?:import\s*:\s*['"]default['"]\s*,\s*)?eager\s*:\s*true\s*(?:,\s*import\s*:\s*['"]default['"]\s*)?,?\s*\}\s*\)/;async function M(e){let s=(await Promise.all(e)).flat(1/0);return s.some(t=>t&&typeof t.then=="function")?M(s):s.filter(t=>t&&t.name!=="epx-lazy-lib")}function Y(e={}){let{enabled:s=!1,glob:t,eager:r=[],pkgName:i}=e,n=null,a=null,o=[],l=new Set,u="",m="",b="",d="",g=[];return{name:"epx-lazy-lib",apply:"build",enforce:"pre",config(f){return s?(g=(Array.isArray(f.plugins)?f.plugins.flat(1/0):[]).filter(c=>c&&c.name!=="epx-lazy-lib"),{build:{emptyOutDir:!1}}):null},configResolved(f){n=f,m=y.resolve(f.root,f.build.outDir);let c=f.build.lib&&f.build.lib.entry;b=Array.isArray(c)?c[0]:typeof c=="object"?Object.values(c)[0]:c,u=y.dirname(b),d=i||y.basename(f.root)},async buildStart(){if(!s)return;t||this.error("[lazy-lib] \u7F3A\u5C11 glob \u9009\u9879\uFF08\u5F62\u5982 './<\u4EA7\u54C1\u540D>/**/*.vue'\uFF09"),g=await M(g);let f=H(n.root,m);f&&this.error(f);let c=t.replace(/^\.\//,"").split("/")[0];o=z(O(u,c)),o.length||this.error(`[lazy-lib] \u6309 glob \u4E00\u4E2A .vue \u90FD\u6CA1\u626B\u5230\uFF0C\u65E0\u6CD5\u6309\u9700\u62C6\u5305\u3002
36
+ `}function A(e){let r=new Map;for(let t in e){let n=e[t];if(n.type==="chunk")for(let o in n.importedBindings||{}){r.has(o)||r.set(o,new Set);for(let s of n.importedBindings[o])r.get(o).add(s)}}return r}import k from"node:path";var te=(e,r)=>{let t=k.resolve(e),n=k.resolve(r);return t===n||t.startsWith(n+k.sep)||t.startsWith(n+"/")},C=e=>k.resolve(String(e).split("?")[0]);function B(e,r,t,n){let o=new Set((n||[]).map(C)),s=[...e()].filter(y=>te(y,t)),u=new Set(s),i=new Map,l=[],a=[],m=y=>{let g=new Set;for(let f of y){let c=C(f);o.has(c)&&g.add(c)}return g.size},b=y=>{let g=i.get(y)||0;if(g===2)return;if(g===1){let c=[...l.slice(l.indexOf(y)),y];m(c)>=2&&a.push(c);return}i.set(y,1),l.push(y);let f=r(y)||{};for(let c of f.importedIds||[])u.has(c)&&b(c);l.pop(),i.set(y,2)};for(let y of s)b(y);return a}var $="\0epx-lazy-glob",P=/import\.meta\.glob\(\s*(['"])([^'"]+)\1\s*,\s*\{\s*(?:import\s*:\s*['"]default['"]\s*,\s*)?eager\s*:\s*true\s*(?:,\s*import\s*:\s*['"]default['"]\s*)?,?\s*\}\s*\)/;function M(e){return/(?:^|[/_-])(?:visual|previews?|page-designer|designer)(?:[/_.-]|$)/i.test(e.globKey)||/(?:^|[-_])(?:visual|preview)(?:[-_]|$)/i.test(e.key)||/(?:Visual|Preview)(?:[A-Z0-9_-]|$)/.test(e.key)}async function V(e){let r=(await Promise.all(e)).flat(1/0);return r.some(t=>t&&typeof t.then=="function")?V(r):r.filter(t=>t&&t.name!=="epx-lazy-lib")}function ne(e={}){let{enabled:r=!1,glob:t,eager:n=[],pkgName:o}=e,s=null,u=null,i=[],l=new Set,a="",m="",b="",y="",g=[];return{name:"epx-lazy-lib",apply:"build",enforce:"pre",config(f){return r?(g=(Array.isArray(f.plugins)?f.plugins.flat(1/0):[]).filter(c=>c&&c.name!=="epx-lazy-lib"),{build:{emptyOutDir:!1}}):null},configResolved(f){s=f,m=d.resolve(f.root,f.build.outDir);let c=f.build.lib&&f.build.lib.entry;b=Array.isArray(c)?c[0]:typeof c=="object"?Object.values(c)[0]:c,a=d.dirname(b),y=o||d.basename(f.root)},async buildStart(){if(!r)return;t||this.error("[lazy-lib] \u7F3A\u5C11 glob \u9009\u9879\uFF08\u5F62\u5982 './<\u4EA7\u54C1\u540D>/**/*.vue'\uFF09"),g=await V(g);let f=se(s.root,m);f&&this.error(f);let c=t.replace(/^\.\//,"").split("/")[0];i=E(L(a,c)),i.length||this.error(`[lazy-lib] \u6309 glob \u4E00\u4E2A .vue \u90FD\u6CA1\u626B\u5230\uFF0C\u65E0\u6CD5\u6309\u9700\u62C6\u5305\u3002
22
37
  glob \u9009\u9879\uFF1A${t}
23
- \u5B9E\u9645\u626B\u63CF\u76EE\u5F55\uFF1A${y.join(u,c)}\uFF08= \u5165\u53E3\u6240\u5728\u76EE\u5F55 ${u} + glob \u7B2C\u4E00\u6BB5 ${c}\uFF09
38
+ \u5B9E\u9645\u626B\u63CF\u76EE\u5F55\uFF1A${d.join(a,c)}\uFF08= \u5165\u53E3\u6240\u5728\u76EE\u5F55 ${a} + glob \u7B2C\u4E00\u6BB5 ${c}\uFF09
24
39
  \u6700\u53EF\u80FD\u7684\u539F\u56E0\uFF1Aglob \u662F\u76F8\u5BF9**\u5165\u53E3\u6587\u4EF6\u6240\u5728\u76EE\u5F55**\u5199\u7684\uFF0C\u522B\u6309\u4ED3\u5E93\u6839\u591A\u5199\u4E00\u5C42 \`src/\`\u2014\u2014
25
- \u5165\u53E3\u662F src/index.js \u65F6\u5E94\u5199 './<\u4EA7\u54C1\u540D>/**/*.vue'\uFF0C\u4E0D\u662F './src/<\u4EA7\u54C1\u540D>/**/*.vue'\u3002`),l=new Set([...r,...ee(b,u,o)]),h.rmSync(m,{recursive:!0,force:!0}),h.mkdirSync(m,{recursive:!0});let x=o.filter(p=>!l.has(p.key));a=await ne(n,g,x,m,u,o)},resolveId(f){return f===$?$:null},load(f){return f!==$?null:se({pkgName:d,entries:o,eagerKeys:l,manifest:a})},transform(f,c){if(!s||y.resolve(c.split("?")[0])!==y.resolve(b))return null;let x=A.exec(f);return x||this.error(`[lazy-lib] \u5165\u53E3\u91CC\u6CA1\u627E\u5230\u671F\u671B\u5F62\u6001\u7684 import.meta.glob\u3002
40
+ \u5165\u53E3\u662F src/index.js \u65F6\u5E94\u5199 './<\u4EA7\u54C1\u540D>/**/*.vue'\uFF0C\u4E0D\u662F './src/<\u4EA7\u54C1\u540D>/**/*.vue'\u3002`),l=new Set([...n,...oe(b,a,i)]),h.rmSync(m,{recursive:!0,force:!0}),h.mkdirSync(m,{recursive:!0});let x=i.filter(p=>!l.has(p.key));u=await ae(s,g,x,m,a,i)},resolveId(f){return f===$?$:null},load(f){return f!==$?null:ce({pkgName:y,entries:i,eagerKeys:l,manifest:u})},transform(f,c){if(!r||d.resolve(c.split("?")[0])!==d.resolve(b))return null;let x=P.exec(f);return x||this.error(`[lazy-lib] \u5165\u53E3\u91CC\u6CA1\u627E\u5230\u671F\u671B\u5F62\u6001\u7684 import.meta.glob\u3002
26
41
  \u671F\u671B\uFF1Aconst files = import.meta.glob('./<\u4EA7\u54C1\u540D>/**/*.vue', { eager: true })
27
42
  \u6587\u4EF6\uFF1A${b}
28
43
  \uFF08\u4E0D\u505A\u9759\u9ED8\u964D\u7EA7\uFF1A\u90A3\u4F1A\u6084\u6084\u6253\u51FA\u4E00\u4E2A\u5355\u4F53\uFF0C\u800C\u4F60\u4EE5\u4E3A\u81EA\u5DF1\u5F00\u4E86\u6309\u9700\u3002\uFF09`),x[2]!==t&&this.error(`[lazy-lib] \u63D2\u4EF6\u7684 glob \u9009\u9879\u4E0E\u5165\u53E3\u91CC import.meta.glob \u7684\u5B57\u9762\u91CF\u4E0D\u4E00\u81F4\uFF0C\u4E24\u8FB9\u5FC5\u987B\u9010\u5B57\u76F8\u540C\u3002
@@ -30,25 +45,25 @@ import h from"node:fs";import y from"node:path";import{build as B}from"epxing:pr
30
45
  \u5165\u53E3\u5B57\u9762\u91CF\uFF1A${x[2]}
31
46
  \u6587\u4EF6\uFF1A${b}
32
47
  \uFF08\u4E0D\u4E00\u81F4\u65F6\u58F3\u7684\u952E\u96C6\u4F1A\u4E0E\u6574\u4F53\u5355\u4F53\u5206\u53C9\uFF0C\u964D\u7EA7\u515C\u5E95\u4F1A\u627E\u4E0D\u5230\u7EC4\u4EF6\u3002\uFF09`),{code:`import __epxLazyGlob from ${JSON.stringify($)}
33
- `+f.replace(A,/\bimport\s*:/.test(x[0])?"Object.fromEntries(Object.entries(__epxLazyGlob).map(([key, value]) => [key, value.default]))":"__epxLazyGlob"),map:null}},async closeBundle(){if(!s||!a)return;let f={};for(let c of o)f[c.key]=l.has(c.key)?null:a[c.key]||null;h.writeFileSync(y.join(m,"index.manifest.json"),JSON.stringify({v:1,pkgName:d,components:f,eager:[...l].sort()},null,2)+`
34
- `),te(m),P(m,n.build.copyPublicDir===!1?"":n.publicDir||""),await re(n,g,b,m,d),J(m,"index.deps.json"),Q(m,n.build.assetsDir)}}}function H(e,s){let t=y.resolve(e),r=y.resolve(s);return r===t||!r.startsWith(t+y.sep)?`[lazy-lib] build.outDir \u5FC5\u987B\u662F\u9879\u76EE\u6839**\u4E4B\u5185**\u7684\u5B50\u76EE\u5F55\uFF0C\u4E14\u4E0D\u80FD\u5C31\u662F\u9879\u76EE\u6839\u672C\u8EAB\u3002
48
+ `+f.replace(P,/\bimport\s*:/.test(x[0])?"Object.fromEntries(Object.entries(__epxLazyGlob).map(([key, value]) => [key, value.default]))":"__epxLazyGlob"),map:null}},async closeBundle(){if(!r||!u)return;let f={};for(let c of i)f[c.key]=l.has(c.key)?null:u[c.key]||null;h.writeFileSync(d.join(m,"index.manifest.json"),JSON.stringify({v:1,pkgName:y,components:f,eager:[...l].sort(),css:"inline",prefetchExclude:i.filter(M).map(c=>c.key)},null,2)+`
49
+ `),le(m),await ue(s,g,b,m,y),h.existsSync(d.join(m,"index.css"))||h.writeFileSync(d.join(m,"index.css"),""),T(m,"index.deps.json"),ie(m,s.build.assetsDir)},generateBundle:{order:"post",handler(f,c){r&&j(c,f.format,!0)}}}}function se(e,r){let t=d.resolve(e),n=d.resolve(r);return n===t||!n.startsWith(t+d.sep)?`[lazy-lib] build.outDir \u5FC5\u987B\u662F\u9879\u76EE\u6839**\u4E4B\u5185**\u7684\u5B50\u76EE\u5F55\uFF0C\u4E14\u4E0D\u80FD\u5C31\u662F\u9879\u76EE\u6839\u672C\u8EAB\u3002
35
50
  \u9879\u76EE\u6839\uFF1A${t}
36
- outDir\uFF1A${r}
51
+ outDir\uFF1A${n}
37
52
  \u539F\u56E0\uFF1A\u6309\u9700\u62C6\u5305\u7684\u4E09\u8D9F\u4EA7\u7269\u8981\u843D\u8FDB\u540C\u4E00\u4E2A\u76EE\u5F55\uFF0C\u672C\u63D2\u4EF6\u4F1A\u5728\u6784\u5EFA\u5F00\u59CB\u65F6\u628A outDir \u6574\u4E2A\u5220\u6389\u91CD\u5EFA
38
53
  \uFF08\u9012\u5F52\u3001\u5F3A\u5236\uFF09\uFF0C\u8FD9\u4E00\u6B65\u7ED5\u5F00\u4E86 vite \u81EA\u5DF1\u7684 emptyOutDir \u4FDD\u62A4\u3002outDir \u89E3\u6790\u6210\u9879\u76EE\u6839\u65F6\uFF0C
39
- \u8FD9\u4E00\u5220\u4F1A\u628A\u4EA7\u54C1\u7684\u6E90\u7801\u4E00\u8D77\u5220\u6389\u3002\u6539\u6CD5\uFF1A\u7ED9 build.outDir \u4E00\u4E2A\u771F\u6B63\u7684\u5B50\u76EE\u5F55\uFF0C\u5982 'lib'\u3002`:null}function P(e,s,t=""){for(let r of h.readdirSync(e,{withFileTypes:!0})){let i=y.join(e,r.name),n=t?t+"/"+r.name:r.name;if(r.isDirectory())P(i,s,n);else if(r.name.endsWith(".css")){if(s&&h.existsSync(y.join(s,n)))continue;h.rmSync(i,{force:!0})}}}function Q(e,s){let t=y.join(e,s||"assets");if(!h.existsSync(t))return[];let r=h.readdirSync(t,{withFileTypes:!0}).filter(n=>n.isFile()).map(n=>n.name);if(!r.length){try{h.rmdirSync(t)}catch{}return[]}let i=s||"assets";return console.warn(["",`[lazy-lib] \u26A0\uFE0F \u4EA7\u51FA\u4E86 ${r.length} \u4E2A\u6587\u4EF6\u578B\u8D44\u6E90\u5230 ${i}/\uFF1A`,...r.map(n=>" "+n),` \u8FDC\u7A0B\u5E93\u5F62\u6001\u4E0B\u5B83\u4EEC\u4F1A\u88AB\u5F15\u7528\u4E3A**\u7EDD\u5BF9\u8DEF\u5F84**\uFF08/${i}/xxx\uFF09\uFF0C`," \u89E3\u6790\u5230\u5E73\u53F0\u9875\u9762\u7684 origin \u6839\u76EE\u5F55 \u2192 \u8FD0\u884C\u65F6 404\uFF0C\u6784\u5EFA\u671F\u770B\u4E0D\u51FA\u6765\u3002"," \u4FEE\u6CD5\uFF1A\u628A build.assetsInlineLimit \u8C03\u5927\u5230\u8986\u76D6\u5B83\u4EEC\uFF08\u4EA7\u54C1\u9879\u76EE\u666E\u904D\u8BBE 50*1024\uFF09\uFF0C"," \u6216\u628A\u8D85\u5927\u8D44\u6E90\u5355\u72EC\u4F20\u6587\u4EF6\u670D\u52A1\u5668\u3001\u4EE3\u7801\u91CC\u5199\u5B8C\u6574 URL\u3002",""].join(`
40
- `)),r}var C=e=>({assetsInlineLimit:e.assetsInlineLimit,assetsDir:e.assetsDir,target:e.target,cssTarget:e.cssTarget,sourcemap:e.sourcemap,minify:e.minify});function J(e,s,t=""){for(let r of h.readdirSync(e,{withFileTypes:!0})){let i=y.join(e,r.name),n=t?t+"/"+r.name:r.name;r.isDirectory()?J(i,s,n):r.name.endsWith(".deps.json")&&n!==s&&h.rmSync(i,{force:!0})}}function ee(e,s,t){let r=h.readFileSync(e,"utf8").split(`\r
54
+ \u8FD9\u4E00\u5220\u4F1A\u628A\u4EA7\u54C1\u7684\u6E90\u7801\u4E00\u8D77\u5220\u6389\u3002\u6539\u6CD5\uFF1A\u7ED9 build.outDir \u4E00\u4E2A\u771F\u6B63\u7684\u5B50\u76EE\u5F55\uFF0C\u5982 'lib'\u3002`:null}function re(e,r,t=""){for(let n of h.readdirSync(e,{withFileTypes:!0})){let o=d.join(e,n.name),s=t?t+"/"+n.name:n.name;if(n.isDirectory())re(o,r,s);else if(n.name.endsWith(".css")){if(r&&h.existsSync(d.join(r,s)))continue;h.rmSync(o,{force:!0})}}}function ie(e,r){let t=d.join(e,r||"assets");if(!h.existsSync(t))return[];let n=h.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isFile()).map(s=>s.name);if(!n.length){try{h.rmdirSync(t)}catch{}return[]}let o=r||"assets";return console.warn(["",`[lazy-lib] \u26A0\uFE0F \u4EA7\u51FA\u4E86 ${n.length} \u4E2A\u6587\u4EF6\u578B\u8D44\u6E90\u5230 ${o}/\uFF1A`,...n.map(s=>" "+s)," \u8FD9\u4E9B\u8D44\u6E90\u4F7F\u7528\u5E93\u5185\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u90E8\u7F72\u65F6\u987B\u4E00\u5E76\u4E0A\u4F20\uFF0C\u5426\u5219\u8FD0\u884C\u65F6\u4F1A 404\u3002"," \u5982\u9700\u51CF\u5C11\u72EC\u7ACB\u8D44\u6E90\u8BF7\u6C42\uFF0C\u53EF\u8C03\u6574 build.assetsInlineLimit\uFF0C\u6216\u4F7F\u7528\u6587\u4EF6\u670D\u52A1\u5668\u5B8C\u6574 URL\u3002",""].join(`
55
+ `)),n}var U=e=>({assetsInlineLimit:e.assetsInlineLimit,assetsDir:e.assetsDir,target:e.target,cssTarget:e.cssTarget,sourcemap:e.sourcemap,minify:e.minify});function T(e,r,t=""){for(let n of h.readdirSync(e,{withFileTypes:!0})){let o=d.join(e,n.name),s=t?t+"/"+n.name:n.name;n.isDirectory()?T(o,r,s):n.name.endsWith(".deps.json")&&s!==r&&h.rmSync(o,{force:!0})}}function oe(e,r,t){let n=h.readFileSync(e,"utf8").split(`\r
41
56
  `).join(`
42
- `),i=[],n=/^\s*import\s+\w+\s+from\s+['"](\.[^'"]+\.vue)['"]/gm,a;for(;a=n.exec(r);){let o=y.resolve(y.dirname(e),a[1]),l=t.find(u=>y.resolve(u.file)===o);l&&i.push(l.key)}return i}function te(e){let s=y.join(e,"index.deps.json"),t=y.join(e,"index.js");if(!h.existsSync(s)||!h.existsSync(t))return;let r=[],i=!1;try{let a=JSON.parse(h.readFileSync(s,"utf8"));r=Array.isArray(a.components)?a.components:[],i=!!a.all}catch{return}let n=`
43
- /*__EPX_FRAME_DEPS__${JSON.stringify(r)}__*/
44
- `+(i?`/*__EPX_FRAME_DEPS_ALL__*/
45
- `:"");h.appendFileSync(t,n)}async function ne(e,s,t,r,i,n){let a={};for(let p of t)a[p.key]=p.file;let o=new Set,l=(n||t).map(p=>p.file),u=await B({root:e.root,logLevel:"silent",configFile:!1,plugins:[...s,{name:"epx-lazy-lib-cycle-guard",buildEnd(){let p=I(()=>this.getModuleIds(),_=>this.getModuleInfo(_),i,l);p.length&&this.error(`[lazy-lib] \u5165\u53E3\u7EC4\u4EF6\u4E4B\u95F4\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF0C\u6309\u9700\u62C6\u5305\u4F1A\u5728\u8FD0\u884C\u65F6\u89E6\u53D1 TDZ\uFF08Cannot access ... before initialization\uFF09\u5E76\u767D\u5C4F\uFF1A
57
+ `),o=[],s=/^\s*import\s+\w+\s+from\s+['"](\.[^'"]+\.vue)['"]/gm,u;for(;u=s.exec(n);){let i=d.resolve(d.dirname(e),u[1]),l=t.find(a=>d.resolve(a.file)===i);l&&o.push(l.key)}return o}function le(e){let r=d.join(e,"index.deps.json"),t=d.join(e,"index.js");if(!h.existsSync(r)||!h.existsSync(t))return;let n=[],o=!1;try{let u=JSON.parse(h.readFileSync(r,"utf8"));n=Array.isArray(u.components)?u.components:[],o=!!u.all}catch{return}let s=`
58
+ /*__EPX_FRAME_DEPS__${JSON.stringify(n)}__*/
59
+ `+(o?`/*__EPX_FRAME_DEPS_ALL__*/
60
+ `:"");h.appendFileSync(t,s)}async function ae(e,r,t,n,o,s){let u={};for(let p of t)u[p.key]=p.file;let i=new Set,l=(s||t).map(p=>p.file),a=await J({root:e.root,base:"./",logLevel:"silent",configFile:!1,plugins:[...r,z(),{name:"epx-lazy-lib-cycle-guard",buildEnd(){let p=B(()=>this.getModuleIds(),_=>this.getModuleInfo(_),o,l);p.length&&this.error(`[lazy-lib] \u5165\u53E3\u7EC4\u4EF6\u4E4B\u95F4\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF0C\u6309\u9700\u62C6\u5305\u4F1A\u5728\u8FD0\u884C\u65F6\u89E6\u53D1 TDZ\uFF08Cannot access ... before initialization\uFF09\u5E76\u767D\u5C4F\uFF1A
46
61
  `+p.map(_=>" "+_.join(`
47
62
  -> `)).join(`
48
63
  `)+`
49
64
  \u4E00\u4E2A .vue = \u4E00\u4E2A chunk\uFF0C\u6210\u73AF\u7684\u4E24\u4E2A\u7EC4\u4EF6\u8DE8 chunk \u540E\u521D\u59CB\u5316\u987A\u5E8F\u65AD\u88C2\u3002\u4E24\u6761\u51FA\u8DEF\uFF1A
50
65
  \u2460 \u628A\u73AF\u62C6\u6389\uFF1A\u62BD\u51FA\u53CC\u65B9\u90FD\u8981\u7684\u90A3\u90E8\u5206\u5230\u72EC\u7ACB\u6A21\u5757\uFF0C\u6539\u6210\u4E24\u4E2A\u7EC4\u4EF6\u90FD import \u5B83\uFF1B
51
66
  \u2461 \u8FD9\u4E2A\u5E93\u6682\u65F6\u4E0D\u7528\u6309\u9700\u5F62\u6001\uFF0C\u56DE\u5230\u6574\u4F53\u5355\u4F53\uFF08\u4E0D\u8BBE LAZY_LIB / enabled:false\uFF09\u3002
52
- \uFF08eager \u9009\u9879\u5E2E\u4E0D\u4E0A\u5FD9\uFF1A\u5B83\u53EA\u628A .vue \u4ECE\u7B2C\u2460\u8D9F\u7684 input \u91CC\u62FF\u6389\uFF0C\u7EC4\u4EF6\u4ECD\u5728\u6A21\u5757\u56FE\u91CC\uFF0C\u73AF\u8FD8\u5728\u3002\uFF09`)}}],css:e.css,resolve:e.resolve,define:e.define,publicDir:!1,build:{outDir:r,emptyOutDir:!1,cssCodeSplit:!1,...C(e.build),rollupOptions:{input:a,external:e.build.rollupOptions.external,preserveEntrySignatures:"strict",output:{format:"es",entryFileNames:"chunks/[name]-[hash].js",chunkFileNames:"chunks/[name]-[hash].js",paths:p=>(o.add(p),"./"+S(p))}}}}),m=Array.isArray(u)?u[0]:u,b=m.output.reduce((p,_)=>(p[_.fileName]=_,p),{}),d=e.build.rollupOptions.output&&e.build.rollupOptions.output.globals,g=N(b),f=new Map([...o].map(p=>["./"+S(p),p])),c=new Map;for(let[p,_]of g){let w=f.get(p);if(w){c.has(w)||c.set(w,new Set);for(let V of _)c.get(w).add(V)}}D([...o]);for(let[p,_]of c){let w=y.join(r,"chunks",S(p));h.mkdirSync(y.dirname(w),{recursive:!0}),h.writeFileSync(w,F(p,_,d))}let x={};for(let p of m.output)p.type==="chunk"&&p.isEntry&&(x[p.name]=p.fileName);return x}async function re(e,s,t,r,i){await B({root:e.root,logLevel:"silent",configFile:!1,plugins:s,css:e.css,resolve:e.resolve,define:e.define,publicDir:!1,build:{outDir:r,emptyOutDir:!1,cssCodeSplit:!1,...C(e.build),lib:{entry:t,name:`__epxFullLibs__.${i}`,formats:["umd"],fileName:()=>"index.full.js"},rollupOptions:{external:e.build.rollupOptions.external,output:{globals:e.build.rollupOptions.output&&e.build.rollupOptions.output.globals,exports:"default",assetFileNames:n=>(n.names||[n.name]).some(a=>String(a).endsWith(".css"))?"index.css":"assets/[name]-[hash][extname]"}}}})}function se({pkgName:e,entries:s,eagerKeys:t,manifest:r}){let i=s.filter(o=>t.has(o.key)),n=[];i.forEach((o,l)=>{n.push(`import __eager${l} from ${JSON.stringify(o.file.split(y.sep).join("/"))}`)});let a={};for(let o of s)t.has(o.key)||(a[o.key]=r[o.key]);return n.push(""),n.push("// \u6784\u5EFA\u671F\u751F\u6210\uFF08epx-frame lazy-lib\uFF09\uFF1A\u628A import.meta.glob \u7684 eager \u7ED3\u679C\u6362\u6210\u6309\u9700 wrapper\u3002"),n.push(`const __pkg = ${JSON.stringify(e)}`),n.push(`const __manifest = ${JSON.stringify(a,null,2)}`),n.push("const __frame = (typeof window !== 'undefined' && window.frame) || {}"),n.push("const __cur = (typeof document !== 'undefined' && document.currentScript && document.currentScript.src) || ''"),n.push("const __base = __cur ? __cur.slice(0, __cur.lastIndexOf('/') + 1) : ''"),n.push("let __lazy = {}"),n.push("if (typeof __frame.registerLazyLibrary === 'function') {"),n.push(" __lazy = __frame.registerLazyLibrary(__pkg, { base: __base, components: __manifest, full: 'index.full.js' })"),n.push("} else if (__frame.Vue && __frame.Vue.defineAsyncComponent) {"),n.push(" // \u964D\u7EA7\u2461\uFF1A\u5E73\u53F0\u6CA1\u6709\u8BE5 API\uFF08\u65E7\u7248\u5E73\u53F0\uFF09\u65F6\u58F3\u81EA\u5EFA wrapper\uFF0C\u529F\u80FD\u7B49\u4EF7\uFF0C\u65E0\u96C6\u4E2D\u9884\u53D6\u3002"),n.push(" for (const k in __manifest) {"),n.push(" const f = __manifest[k]"),n.push(" const w = __frame.Vue.defineAsyncComponent(() => import(/* @vite-ignore */ __base + f))"),n.push(" w.name = k"),n.push(" __lazy[k] = w"),n.push(" }"),n.push("} else {"),n.push(" console.error('[frame.lazy] \u5E73\u53F0\u65E2\u6CA1\u6709 registerLazyLibrary \u4E5F\u6CA1\u6709 Vue \u2014\u2014 \u8BF7\u5347\u7EA7\u5E73\u53F0\uFF0C\u6216\u6539\u7528\u6574\u4F53\u5355\u4F53\u5F62\u6001\u6784\u5EFA\u672C\u5E93', __pkg)"),n.push("}"),n.push("const __out = {}"),s.forEach(o=>{let l=i.indexOf(o),u=l>=0?`__eager${l}`:`__lazy[${JSON.stringify(o.key)}]`;n.push(`__out[${JSON.stringify(o.globKey)}] = { default: ${u} }`)}),n.push("export default __out"),n.join(`
67
+ \uFF08eager \u9009\u9879\u5E2E\u4E0D\u4E0A\u5FD9\uFF1A\u5B83\u53EA\u628A .vue \u4ECE\u7B2C\u2460\u8D9F\u7684 input \u91CC\u62FF\u6389\uFF0C\u7EC4\u4EF6\u4ECD\u5728\u6A21\u5757\u56FE\u91CC\uFF0C\u73AF\u8FD8\u5728\u3002\uFF09`)}}],css:e.css,resolve:e.resolve,define:e.define,publicDir:!1,build:{outDir:n,emptyOutDir:!1,cssCodeSplit:!0,...U(e.build),rollupOptions:{input:u,external:e.build.rollupOptions.external,preserveEntrySignatures:"strict",output:{format:"es",entryFileNames:"chunks/[name]-[hash].js",chunkFileNames:"chunks/[name]-[hash].js",paths:p=>(i.add(p),"./"+S(p))}}}}),m=Array.isArray(a)?a[0]:a,b=m.output.reduce((p,_)=>(p[_.fileName]=_,p),{}),y=e.build.rollupOptions.output&&e.build.rollupOptions.output.globals,g=A(b),f=new Map([...i].map(p=>["./"+S(p),p])),c=new Map;for(let[p,_]of g){let w=f.get(p);if(w){c.has(w)||c.set(w,new Set);for(let R of _)c.get(w).add(R)}}D([...i]);for(let[p,_]of c){let w=d.join(n,"chunks",S(p));h.mkdirSync(d.dirname(w),{recursive:!0}),h.writeFileSync(w,I(p,_,y))}let x={};for(let p of m.output)p.type==="chunk"&&p.isEntry&&(x[p.name]=p.fileName);return x}async function ue(e,r,t,n,o){await J({root:e.root,logLevel:"silent",configFile:!1,plugins:[...r,z(!0)],css:e.css,resolve:e.resolve,define:e.define,publicDir:!1,build:{outDir:n,emptyOutDir:!1,cssCodeSplit:!1,...U(e.build),lib:{entry:t,name:`__epxFullLibs__.${o}`,formats:["umd"],fileName:()=>"index.full.js"},rollupOptions:{external:e.build.rollupOptions.external,output:{globals:e.build.rollupOptions.output&&e.build.rollupOptions.output.globals,exports:"default",assetFileNames:s=>(s.names||[s.name]).some(u=>String(u).endsWith(".css"))?"index.css":"assets/[name]-[hash][extname]"}}}})}function ce({pkgName:e,entries:r,eagerKeys:t,manifest:n}){let o=r.filter(i=>t.has(i.key)),s=[];o.forEach((i,l)=>{s.push(`import __eager${l} from ${JSON.stringify(i.file.split(d.sep).join("/"))}`)});let u={};for(let i of r)t.has(i.key)||(u[i.key]=n[i.key]);return s.push(""),s.push("// \u6784\u5EFA\u671F\u751F\u6210\uFF08epx-frame lazy-lib\uFF09\uFF1A\u628A import.meta.glob \u7684 eager \u7ED3\u679C\u6362\u6210\u6309\u9700 wrapper\u3002"),s.push(`const __pkg = ${JSON.stringify(e)}`),s.push(`const __manifest = ${JSON.stringify(u,null,2)}`),s.push(`const __prefetchExclude = ${JSON.stringify(r.filter(M).map(i=>i.key))}`),s.push("const __frame = (typeof window !== 'undefined' && window.frame) || {}"),s.push("const __cur = (typeof document !== 'undefined' && document.currentScript && document.currentScript.src) || ''"),s.push("const __base = __cur ? __cur.slice(0, __cur.lastIndexOf('/') + 1) : ''"),s.push("let __lazy = {}"),s.push("if (typeof __frame.registerLazyLibrary === 'function') {"),s.push(" __lazy = __frame.registerLazyLibrary(__pkg, { base: __base, components: __manifest, full: 'index.full.js', prefetchExclude: __prefetchExclude }, __frame.registerLazyLibrary.supportsPrefetchExclude ? undefined : { prefetch: false })"),s.push("} else if (__frame.Vue && __frame.Vue.defineAsyncComponent) {"),s.push(" // \u964D\u7EA7\u2461\uFF1A\u5E73\u53F0\u6CA1\u6709\u8BE5 API\uFF08\u65E7\u7248\u5E73\u53F0\uFF09\u65F6\u58F3\u81EA\u5EFA wrapper\uFF0C\u529F\u80FD\u7B49\u4EF7\uFF0C\u65E0\u96C6\u4E2D\u9884\u53D6\u3002"),s.push(" for (const k in __manifest) {"),s.push(" const f = __manifest[k]"),s.push(" const w = __frame.Vue.defineAsyncComponent(() => import(/* @vite-ignore */ __base + f))"),s.push(" w.name = k"),s.push(" __lazy[k] = w"),s.push(" }"),s.push("} else {"),s.push(" console.error('[frame.lazy] \u5E73\u53F0\u65E2\u6CA1\u6709 registerLazyLibrary \u4E5F\u6CA1\u6709 Vue \u2014\u2014 \u8BF7\u5347\u7EA7\u5E73\u53F0\uFF0C\u6216\u6539\u7528\u6574\u4F53\u5355\u4F53\u5F62\u6001\u6784\u5EFA\u672C\u5E93', __pkg)"),s.push("}"),s.push("const __out = {}"),r.forEach(i=>{let l=o.indexOf(i),a=l>=0?`__eager${l}`:`__lazy[${JSON.stringify(i.key)}]`;s.push(`__out[${JSON.stringify(i.globKey)}] = { default: ${a} }`)}),s.push("export default __out"),s.join(`
53
68
  `)+`
54
- `}export{H as checkOutDir,Y as default,P as rmCssFiles,J as rmStrayDepsJson,Q as warnEmittedAssets,te as writeFrameDepsMarker};
69
+ `}export{se as checkOutDir,ne as default,re as rmCssFiles,T as rmStrayDepsJson,ie as warnEmittedAssets,le as writeFrameDepsMarker};
@@ -27,7 +27,11 @@ epx 的产品/项目远程库(`window.library.<pkg>`,由 `FM_SYSTEM_WEBPACK`
27
27
 
28
28
  审核详情空白、数据已返回但持续加载时,按 [F28](pitfalls.md#f28-审核详情空白加载遮罩残留与懒加载页签计数) 检查上下文参数的 DOM 透传、JSX 分支指令清理及懒加载配置时序,并在授权范围修复确定命中项。
29
29
 
30
- Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,同步本文件、`pitfalls.md` 和 `scripts/`;技能描述供自动匹配,不能保证每次命中。未自动选中时可显式调用 `/epxing-frontend-vue3-migrate`。更新产品已有技能前先比较并保留其自定义内容;仓库修改不会自动更新产品副本或已发布 CLI。
30
+ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,同步本文件、`pitfalls.md`、`references/` 和 `scripts/`;技能描述供自动匹配,不能保证每次命中。未自动选中时可显式调用 `/epxing-frontend-vue3-migrate`。更新产品已有技能前先比较并保留其自定义内容;仓库修改不会自动更新产品副本或已发布 CLI。
31
+
32
+ ## 共性问题复核入口
33
+
34
+ 每次升级先读 [跨产品升级复核](references/upgrade-review.md),在迁移前、源码转换后和交付前执行其中的复核。模型协议与样式是每个组件的必检项,覆盖模板、JSX/render、包装组件及继承链;沿用 E2 台账记录实际协议、来源、结论和证据。修复一处后检查同类结构,不能只修用户点出的页面。只读扫描不覆盖的模型、动态样式和运行分支必须另行核实,构建成功或扫描零命中不能关闭这些检查。
31
35
 
32
36
  ## 先判断升级类型
33
37
 
@@ -160,7 +164,7 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
160
164
  - 样式是否泄漏:涉及 scoped、`:deep()` 或全局样式变更时,用最终懒加载产物记录外部同名元素(如 `.avatar`、`.container`)加载组件前后的计算样式;覆盖组件加载后、离开页面及进入其他页面的状态。组件内有效且组件外不受影响,才能验收(F15);
161
165
  - 工具栏选择框与按钮:核对选择框宽度、父容器布局及 `getBoundingClientRect()` 的纵向中心位置;按 F20 检查升级后不再享有的旧垫片默认值,同时确认表单内整行选择框仍按设计占满可用宽度;
162
166
  - 差异定性:`el-table` 固定列会复制一份 DOM(Vue2 Element UI 行数翻倍、Vue3 Element Plus 不翻)——比对「共 N 条 / 首行文本」而非 DOM 元素数,否则把「翻倍」误当差异;
163
- - **静态 grep 到 Vue2 写法 ≠ 运行时一定失效**:失效与否取决于消费方 / 是否被平台全局样式兜住 / 组件运行时兼容(如 JSX `slot=` 在 el-popover reference 失效、在 el-dropdown 正常),必须运行时实证再判改不改。
167
+ - **静态命中仅列候选**:核对当前消费方、目标宿主和实际插槽内容;旧宿主曾兼容 JSX slot=,不能推断原生 Vue3 制品仍兼容。按 F31 验证具名插槽与真实菜单,按 F24 验证模型与可见内容。
164
168
 
165
169
  ## 按需值不值(实测,别想当然)
166
170
 
@@ -180,9 +184,7 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
180
184
 
181
185
  ## 部署前必查
182
186
 
183
- 1. **平台支不支持按需 ABI**:抓线上平台 bundle `grep registerLazyLibrary`。
184
- 没有就只能走降级②(壳自建 wrapper),没有集中预取、`deps.json` 也没人读——
185
- **平台不先升级,产品这边开按需是白开**。
187
+ 1. **核实目标宿主加载能力**:检查公开加载契约、实际运行时能力及组件加载证据;字符串搜索或注册数量不能证明按需 ABI 完整可用。按当前协议验证降级与预取,不能用产品打包配置代替宿主能力。
186
188
  2. **按需形态必须传整个 `lib/` 目录**,不是 `index.js` + `index.css` 两个文件。
187
189
  `FM_SYSTEM_WEBPACK` 里仍只配那两条 url,其余按相对路径取。
188
190
  3. **`chunks/` 的 `import()` 需要文件服务给 CORS 头**,跨域没配会整库降级。
@@ -204,6 +206,8 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
204
206
 
205
207
  ## 库构建命令约定
206
208
 
209
+ CLI 0.5.0-beta.11 起,按需库 CSS 随各自 JS 同步注入,index.css 保留空文件兼容旧加载 URL;不能再以它包含全部组件样式验收。检查单组件加载前后样式、共享样式去重、资源路径与整库兜底。可视化、设计器与预览组件不后台预取,实际使用仍加载;新壳在旧平台关闭后台预取,平台支持 supportsPrefetchExclude 后普通组件可选择性预取。产品使用本地 CLI 插件,须更新产品依赖并重建整个 lib,不能只更新全局命令。
210
+
207
211
  库构建分支须设置 `build.copyPublicDir: false`,避免旧 `public/cmaps`、`public/index.html` 原样混入 `lib/`;应用构建仍保留所需静态资源,不能删除源 public 目录。验收懒加载和全量库目录均无多余应用入口;若 index.html 不来自 public,继续检查是否误走 app 模式或自定义复制插件。已有动态/展开构建配置由 AI 按实际分支核对,不能跳过报告项。
208
212
 
209
213
  升级收尾必须复查 `package.json`:标准 `build:lib` 应为 `node build-lib.mjs`,不得残留 `--full`;全量参数放在 `build:lib:full`。CLI 0.5.0-beta.9 补齐旧标准入口带 `--full` 的自动迁移。自定义构建或入口文件报告待接入时,由 AI 在已有升级授权内核对并保留必要步骤,不能将“保留原命令”当成默认懒加载已完成。