@epxing/cli 0.5.0-beta.2 → 0.5.0-beta.3

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.2`。导出名、子路径和签名从当前源码、package.json 与类型声明生成。
5
+ 本页对应包版本 `0.5.0-beta.3`。导出名、子路径和签名从当前源码、package.json 与类型声明生成。
6
6
 
7
7
  ## 安装与使用
8
8
 
9
9
 
10
10
  ```sh
11
- npm install -g @epxing/cli@0.5.0-beta.2
11
+ npm install -g @epxing/cli@0.5.0-beta.3
12
12
  ```
13
13
 
14
14
 
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  独立的工程开发工具,包含交互菜单、开发服务、产品库构建、创建、Vue3 迁移、静态检查和升级技能安装。创建和升级默认使用 `@epxing/*` 独立包,版本留空时查询最新 `beta` 并固定到具体版本,没有 `beta` 时使用 `latest`;可用 `--packages-version` 指定版本或标签。CLI 使用自己的版本号。创建和升级会生成产品使用说明;`@epxing/cli/vite` 提供产品构建插件,不依赖聚合包中的构建工具。
6
6
 
7
- 本批测试版本:`@epxing/cli@0.5.0-beta.2`,平台包 `5.3.0-beta.2`,均使用 npm 公网 `beta` 标签。完整流程见文档站“CLI 创建、升级与产品使用”;各包公开 API 随安装包的 `API.md` 提供。
7
+ 本批测试版本:`@epxing/cli@0.5.0-beta.3`,平台包 `5.3.0-beta.2`,均使用 npm 公网 `beta` 标签。完整流程见文档站“CLI 创建、升级与产品使用”;各包公开 API 随安装包的 `API.md` 提供。
8
8
 
9
9
  平台包从 `5.3.0-beta.2` 起自动加载自身样式,产品无需手动引入各包的 `style.css`。创建和迁移使用此版本时,CLI 不再添加这些导入;指定旧版本时仍保留显式样式以兼容旧包。标签会先解析成具体版本再选择模板。已有显式导入可以保留,产品覆盖样式放在框架导入之后。
10
10
 
@@ -1,16 +1,41 @@
1
1
  /* eslint-disable no-console -- 输出已选择的平台版本 */
2
+ import http from 'node:http'
3
+ import https from 'node:https'
4
+
5
+ // Node 20 的双栈自动连接在部分 Windows 网络超时,查询 npm 时固定使用 IPv4。
6
+ function readMetadata (url) {
7
+ return new Promise((resolve, reject) => {
8
+ const client = url.protocol === 'http:' ? http : https
9
+ const request = client.get(url, {
10
+ family: 4,
11
+ headers: { accept: 'application/vnd.npm.install-v1+json', 'cache-control': 'no-cache' },
12
+ timeout: 15000
13
+ }, response => {
14
+ if (response.statusCode !== 200) {
15
+ response.resume()
16
+ reject(new Error(`npm 返回 HTTP ${response.statusCode}`))
17
+ return
18
+ }
19
+ let body = ''
20
+ response.setEncoding('utf8')
21
+ response.on('data', chunk => { body += chunk })
22
+ response.on('error', reject)
23
+ response.on('end', () => {
24
+ try { resolve(JSON.parse(body)) } catch (error) { reject(error) }
25
+ })
26
+ })
27
+ request.on('timeout', () => request.destroy(new Error('npm 请求超时')))
28
+ request.on('error', reject)
29
+ })
30
+ }
31
+
2
32
  // 测试阶段默认使用 beta;显式版本不访问网络,标签解析后固定到具体版本。
3
33
  export async function resolvePlatformVersion (spec, registry = process.env.npm_config_registry || 'https://registry.npmjs.org/') {
4
34
  if (spec && !/^(?:[~^]?\d+\.\d+\.\d+(?:-[\w.-]+)?|[a-z][\w.-]*)$/.test(spec)) throw new Error('--packages-version 需要 npm 版本、版本范围或标签')
5
35
  if (spec && /^[~^]?\d/.test(spec)) return spec
6
36
  const tag = spec || 'beta'
7
37
  try {
8
- const response = await globalThis.fetch(new URL('@epxing%2fcore', registry.endsWith('/') ? registry : registry + '/'), {
9
- headers: { accept: 'application/vnd.npm.install-v1+json', 'cache-control': 'no-cache' },
10
- signal: globalThis.AbortSignal.timeout(15000)
11
- })
12
- if (!response.ok) throw new Error(`npm 返回 HTTP ${response.status}`)
13
- const metadata = await response.json()
38
+ const metadata = await readMetadata(new URL('@epxing%2fcore', registry.endsWith('/') ? registry : registry + '/'))
14
39
  const tags = metadata['dist-tags'] || {}
15
40
  const selectedTag = tags[tag] ? tag : !spec ? 'latest' : tag
16
41
  const version = tags[selectedTag]
@@ -448,7 +448,7 @@ dist/
448
448
  *.tgz
449
449
  .DS_Store
450
450
  .env*.local
451
- `;r["README.md"]='# __NAME__\n\nepx-frame \u4EA7\u54C1\u8FDC\u7A0B\u5E93\u9879\u76EE\uFF08Vite \u5F62\u6001\uFF09\u3002\u5F00\u53D1\u6307\u5357\u89C1 epx-frame \u4ED3\u5E93 `docs/PROJECT-GUIDE.md`\u3002\n\n```bash\nnpm i # \u88C5\u4F9D\u8D56\nnpm run dev # \u672C\u5730\u5F00\u53D1\uFF08:8080\uFF0C\u8D77\u5B8C\u6574\u5E73\u53F0\uFF0C\u7528\u5E73\u53F0\u8D26\u53F7\u767B\u5F55\uFF09\nnpm run build:lib # \u6784\u5EFA\u8FDC\u7A0B\u5E93 lib/index.js + index.css\n```\n\n\u90E8\u7F72\uFF1Alib \u4EA7\u7269\u53D1\u5230\u6587\u4EF6\u670D\u52A1\uFF0C\u5E73\u53F0 FM_SYSTEM_WEBPACK \u7ED9\u672C\u7CFB\u7EDF\u914D js/css \u4E24\u6761 url\u3002\n`lib/index.deps.json`\uFF08\u4F9D\u8D56\u6E05\u5355\uFF09**\u8981\u548C index.js \u540C\u76EE\u5F55\u540C\u540D\u4E00\u8D77\u4F20**\uFF0C\u4F46**\u4E0D\u7528**\u5355\u72EC\u914D url\u2014\u2014\n\u5E73\u53F0\u6309 js url \u63A8\u5BFC\u5B83\uFF0C\u52A0\u8F7D\u672C\u5E93\u524D\u5148\u5907\u597D\u7528\u5230\u7684\u61D2\u52A0\u8F7D\u5E73\u53F0\u7EC4\u4EF6\uFF1B\u6F0F\u4F20\u53EA\u4F1A\u9759\u9ED8\u9000\u5316\u4E3A\u300C\u5907\u5168\u90E8\u300D\uFF08\u591A\u4E0B\u70B9 chunk\uFF09\u3002\n\u7EC4\u4EF6\u547D\u540D\uFF1A`epx-__NAME__-<\u57DF>-<\u540D>`\uFF08\u5168\u5E73\u53F0\u552F\u4E00\uFF09\uFF1B\u65B0\u589E .vue \u5373\u81EA\u52A8\u6CE8\u518C\u3002\n\n\u6846\u67B6\u5F15\u7528\u662F**\u6309\u9700\u5B50\u8DEF\u5F84**\u5F62\u6001\uFF08`epx-frame/core` + `epx-frame/components`\uFF0C\u89C1 src/main.js \u6CE8\u91CA\uFF09\uFF1A\nbusiness/designer/dashboard \u4E0D\u88C5\u4E5F\u4F1A\u5728\u8FD0\u884C\u65F6\u6309\u9700\u61D2\u52A0\u8F7D\uFF1B\u7EC4\u4EF6\u6E90\u7801\u91CC\u4E5F\u4ECE `epx-frame/components`\n\u5BFC\u5165\u7EE7\u627F\uFF08\u522B\u548C\u805A\u5408\u5165\u53E3 `epx-frame` \u6DF7\u7528\u2014\u2014\u4F1A\u51FA\u73B0\u4E24\u5957\u8FD0\u884C\u65F6\uFF09\u3002\n\n## \u56FE\u6807\n\n**461 \u4E2A\u5E73\u53F0\u56FE\u6807\u76F4\u63A5\u5199\u5C31\u884C\uFF0C\u96F6\u914D\u7F6E**\u2014\u2014\u5B83\u4EEC\u968F epx-frame \u53D1\u5E03\uFF0C\u62FF\u5230\u5373\u7528\uFF1A\n\n```vue\n<i class="el-icon-search"></i>\n<i class="epx-icon-shezhi"></i>\n```\n\n`font-size` \u63A7\u5236\u5927\u5C0F\u3001`color` \u63A7\u5236\u989C\u8272\uFF08\u5E95\u5C42\u662F CSS mask + currentColor\uFF09\u3002\n\n\u60F3\u7528\u5E73\u53F0\u6CA1\u6709\u7684\u56FE\u6807\uFF0C\u76F4\u63A5\u5199 [Remix Icon](https://remixicon.com) \u7684\u540D\u5B57\uFF1A\n\n```vue\n<i class="ri-rocket-line"></i>\n```\n\n**\u8981\u5148 `npm i -D @iconify-json/ri`**\uFF083229 \u4E2A\u56FE\u6807\u7684\u6570\u636E\u6E90\uFF0C\u53EA\u5728\u6784\u5EFA\u671F\u8BFB\u4E00\u6B21\uFF0C\u4E0D\u8FDB\u4EA7\u7269\uFF09\u3002\n`vite.config.mjs` \u91CC\u7684 `epxIcons()` \u4F1A\u626B\u6E90\u7801\u3001\u53EA\u4E3A**\u4F60\u5B9E\u9645\u7528\u5230\u7684**\u90A3\u51E0\u4E2A\u751F\u6210\u89C4\u5219\u2014\u2014\n\u5199 5 \u4E2A\u5C31\u662F 5 \u4E2A\u7684\u4F53\u79EF\uFF0C\u4E0D\u4F1A\u628A 3229 \u4E2A\u90FD\u6253\u8FDB\u53BB\u3002\u540D\u5B57\u62FC\u9519\u4E86\u4F1A\u5728\u6784\u5EFA\u65F6\u62A5\u51FA\u6765\uFF0C\u4E0D\u4F1A\u9759\u9ED8\u53D8\u7A7A\u767D\u3002\n\n\u56FE\u6807\u540D\u5B58\u5728**\u6570\u636E\u5E93**\u91CC\uFF08\u83DC\u5355\u56FE\u6807\u3001\u6309\u94AE iconCls\u3001\u9875\u9762\u914D\u7F6E\uFF09\u7684\u90A3\u4E9B\uFF0C\u6784\u5EFA\u671F\u626B\u4E0D\u5230\u2014\u2014\n\u4F46\u5E73\u53F0\u8FD0\u884C\u65F6\u4F1A\u6309\u9700\u8865\u9F50\uFF0C\u4F60\u4E0D\u7528\u505A\u4EFB\u4F55\u4E8B\u3002\u5B8C\u6574\u8BF4\u660E\u89C1 epx-frame \u4ED3\u5E93 `docs/guide/tools/icon.md`\u3002\n\n\u540E\u7AEF\u5730\u5740\u7B49\u73AF\u5883\u914D\u7F6E\u5728 `.env.development`\uFF1B\u672C\u673A\u60F3\u8FDE\u522B\u7684\u540E\u7AEF\uFF0C\u65B0\u5EFA `.env.development.local`\n\uFF08\u4E0D\u8FDB git\uFF09\u8986\u76D6\u5BF9\u5E94\u884C\uFF08\u5982 `IP=https://test.epxing.com:88/`\uFF09\uFF0C\u91CD\u542F dev \u751F\u6548\u3002\n\n\u521B\u5EFA\u547D\u4EE4\u5DF2\u5728 package.json \u5199\u5165 `runtime: "vue3"`\uFF0C\u5E76\u7531 src/index.js \u9ED8\u8BA4\u5BFC\u51FA\u540C\u540D\u6807\u8BC6\u3002\n\u6784\u5EFA\u90E8\u7F72\u540E\u5E73\u53F0\u6309\u5305\u9009\u62E9\u5B89\u88C5\u65B9\u5F0F\uFF1A`vue3` \u8D70\u539F\u751F\u5B89\u88C5\uFF0C`vue2` \u6216\u672A\u6807\u8BC6\u7684\u5176\u5B83\u5E93\u7EE7\u7EED\u4F7F\u7528\u517C\u5BB9\u6865\u3002\n';function j({name:i,dir:t,epxFrameSpec:o,packagesVersion:n,cliVersion:p="0.5.0-beta.2"}){let a=i.toLowerCase(),s=i;if(!/^[a-z][a-z0-9-]*$/i.test(i))throw new Error(`\u4EA7\u54C1\u540D\u300C${i}\u300D\u9700\u4EE5\u5B57\u6BCD\u5F00\u5934\uFF0C\u4EC5\u542B\u5B57\u6BCD/\u6570\u5B57/-`);let e=m.resolve(t);if(n&&o)throw new Error("--packages-version \u4E0E --epx-frame \u4E0D\u80FD\u540C\u65F6\u6307\u5B9A");if(n&&!/^(?:[~^]?\d+\.\d+\.\d+(?:-[\w.-]+)?|[a-z][\w.-]*)$/.test(n))throw new Error("--packages-version \u9700\u8981 npm \u7248\u672C\u3001\u7248\u672C\u8303\u56F4\u6216\u6807\u7B7E");if(l.existsSync(e)&&l.readdirSync(e).length)throw new Error(`\u76EE\u6807\u76EE\u5F55\u975E\u7A7A\uFF1A${e}`);let c=o;if(l.mkdirSync(e,{recursive:!0}),!c&&!n)if(l.existsSync(m.join(_,"vite.config.mjs"))){if(!l.existsSync(m.join(_,"lib/epx-frame.common.js")))throw new Error("frame \u4ED3\u5E93 lib/ \u672A\u6784\u5EFA\u2014\u2014\u5148\u5728 frame-vue3 \u8DD1 pnpm build:component\uFF0C\u6216\u7528 --epx-frame \u6307\u5B9A\u6765\u6E90");console.log(" \u6253\u5305 epx-frame tarball\uFF08npm pack\uFF09\u2026");let u=v("npm pack --pack-destination "+JSON.stringify(e),{cwd:_,encoding:"utf8"}).trim().split(`
451
+ `;r["README.md"]='# __NAME__\n\nepx-frame \u4EA7\u54C1\u8FDC\u7A0B\u5E93\u9879\u76EE\uFF08Vite \u5F62\u6001\uFF09\u3002\u5F00\u53D1\u6307\u5357\u89C1 epx-frame \u4ED3\u5E93 `docs/PROJECT-GUIDE.md`\u3002\n\n```bash\nnpm i # \u88C5\u4F9D\u8D56\nnpm run dev # \u672C\u5730\u5F00\u53D1\uFF08:8080\uFF0C\u8D77\u5B8C\u6574\u5E73\u53F0\uFF0C\u7528\u5E73\u53F0\u8D26\u53F7\u767B\u5F55\uFF09\nnpm run build:lib # \u6784\u5EFA\u8FDC\u7A0B\u5E93 lib/index.js + index.css\n```\n\n\u90E8\u7F72\uFF1Alib \u4EA7\u7269\u53D1\u5230\u6587\u4EF6\u670D\u52A1\uFF0C\u5E73\u53F0 FM_SYSTEM_WEBPACK \u7ED9\u672C\u7CFB\u7EDF\u914D js/css \u4E24\u6761 url\u3002\n`lib/index.deps.json`\uFF08\u4F9D\u8D56\u6E05\u5355\uFF09**\u8981\u548C index.js \u540C\u76EE\u5F55\u540C\u540D\u4E00\u8D77\u4F20**\uFF0C\u4F46**\u4E0D\u7528**\u5355\u72EC\u914D url\u2014\u2014\n\u5E73\u53F0\u6309 js url \u63A8\u5BFC\u5B83\uFF0C\u52A0\u8F7D\u672C\u5E93\u524D\u5148\u5907\u597D\u7528\u5230\u7684\u61D2\u52A0\u8F7D\u5E73\u53F0\u7EC4\u4EF6\uFF1B\u6F0F\u4F20\u53EA\u4F1A\u9759\u9ED8\u9000\u5316\u4E3A\u300C\u5907\u5168\u90E8\u300D\uFF08\u591A\u4E0B\u70B9 chunk\uFF09\u3002\n\u7EC4\u4EF6\u547D\u540D\uFF1A`epx-__NAME__-<\u57DF>-<\u540D>`\uFF08\u5168\u5E73\u53F0\u552F\u4E00\uFF09\uFF1B\u65B0\u589E .vue \u5373\u81EA\u52A8\u6CE8\u518C\u3002\n\n\u6846\u67B6\u5F15\u7528\u662F**\u6309\u9700\u5B50\u8DEF\u5F84**\u5F62\u6001\uFF08`epx-frame/core` + `epx-frame/components`\uFF0C\u89C1 src/main.js \u6CE8\u91CA\uFF09\uFF1A\nbusiness/designer/dashboard \u4E0D\u88C5\u4E5F\u4F1A\u5728\u8FD0\u884C\u65F6\u6309\u9700\u61D2\u52A0\u8F7D\uFF1B\u7EC4\u4EF6\u6E90\u7801\u91CC\u4E5F\u4ECE `epx-frame/components`\n\u5BFC\u5165\u7EE7\u627F\uFF08\u522B\u548C\u805A\u5408\u5165\u53E3 `epx-frame` \u6DF7\u7528\u2014\u2014\u4F1A\u51FA\u73B0\u4E24\u5957\u8FD0\u884C\u65F6\uFF09\u3002\n\n## \u56FE\u6807\n\n**461 \u4E2A\u5E73\u53F0\u56FE\u6807\u76F4\u63A5\u5199\u5C31\u884C\uFF0C\u96F6\u914D\u7F6E**\u2014\u2014\u5B83\u4EEC\u968F epx-frame \u53D1\u5E03\uFF0C\u62FF\u5230\u5373\u7528\uFF1A\n\n```vue\n<i class="el-icon-search"></i>\n<i class="epx-icon-shezhi"></i>\n```\n\n`font-size` \u63A7\u5236\u5927\u5C0F\u3001`color` \u63A7\u5236\u989C\u8272\uFF08\u5E95\u5C42\u662F CSS mask + currentColor\uFF09\u3002\n\n\u60F3\u7528\u5E73\u53F0\u6CA1\u6709\u7684\u56FE\u6807\uFF0C\u76F4\u63A5\u5199 [Remix Icon](https://remixicon.com) \u7684\u540D\u5B57\uFF1A\n\n```vue\n<i class="ri-rocket-line"></i>\n```\n\n**\u8981\u5148 `npm i -D @iconify-json/ri`**\uFF083229 \u4E2A\u56FE\u6807\u7684\u6570\u636E\u6E90\uFF0C\u53EA\u5728\u6784\u5EFA\u671F\u8BFB\u4E00\u6B21\uFF0C\u4E0D\u8FDB\u4EA7\u7269\uFF09\u3002\n`vite.config.mjs` \u91CC\u7684 `epxIcons()` \u4F1A\u626B\u6E90\u7801\u3001\u53EA\u4E3A**\u4F60\u5B9E\u9645\u7528\u5230\u7684**\u90A3\u51E0\u4E2A\u751F\u6210\u89C4\u5219\u2014\u2014\n\u5199 5 \u4E2A\u5C31\u662F 5 \u4E2A\u7684\u4F53\u79EF\uFF0C\u4E0D\u4F1A\u628A 3229 \u4E2A\u90FD\u6253\u8FDB\u53BB\u3002\u540D\u5B57\u62FC\u9519\u4E86\u4F1A\u5728\u6784\u5EFA\u65F6\u62A5\u51FA\u6765\uFF0C\u4E0D\u4F1A\u9759\u9ED8\u53D8\u7A7A\u767D\u3002\n\n\u56FE\u6807\u540D\u5B58\u5728**\u6570\u636E\u5E93**\u91CC\uFF08\u83DC\u5355\u56FE\u6807\u3001\u6309\u94AE iconCls\u3001\u9875\u9762\u914D\u7F6E\uFF09\u7684\u90A3\u4E9B\uFF0C\u6784\u5EFA\u671F\u626B\u4E0D\u5230\u2014\u2014\n\u4F46\u5E73\u53F0\u8FD0\u884C\u65F6\u4F1A\u6309\u9700\u8865\u9F50\uFF0C\u4F60\u4E0D\u7528\u505A\u4EFB\u4F55\u4E8B\u3002\u5B8C\u6574\u8BF4\u660E\u89C1 epx-frame \u4ED3\u5E93 `docs/guide/tools/icon.md`\u3002\n\n\u540E\u7AEF\u5730\u5740\u7B49\u73AF\u5883\u914D\u7F6E\u5728 `.env.development`\uFF1B\u672C\u673A\u60F3\u8FDE\u522B\u7684\u540E\u7AEF\uFF0C\u65B0\u5EFA `.env.development.local`\n\uFF08\u4E0D\u8FDB git\uFF09\u8986\u76D6\u5BF9\u5E94\u884C\uFF08\u5982 `IP=https://test.epxing.com:88/`\uFF09\uFF0C\u91CD\u542F dev \u751F\u6548\u3002\n\n\u521B\u5EFA\u547D\u4EE4\u5DF2\u5728 package.json \u5199\u5165 `runtime: "vue3"`\uFF0C\u5E76\u7531 src/index.js \u9ED8\u8BA4\u5BFC\u51FA\u540C\u540D\u6807\u8BC6\u3002\n\u6784\u5EFA\u90E8\u7F72\u540E\u5E73\u53F0\u6309\u5305\u9009\u62E9\u5B89\u88C5\u65B9\u5F0F\uFF1A`vue3` \u8D70\u539F\u751F\u5B89\u88C5\uFF0C`vue2` \u6216\u672A\u6807\u8BC6\u7684\u5176\u5B83\u5E93\u7EE7\u7EED\u4F7F\u7528\u517C\u5BB9\u6865\u3002\n';function j({name:i,dir:t,epxFrameSpec:o,packagesVersion:n,cliVersion:p="0.5.0-beta.3"}){let a=i.toLowerCase(),s=i;if(!/^[a-z][a-z0-9-]*$/i.test(i))throw new Error(`\u4EA7\u54C1\u540D\u300C${i}\u300D\u9700\u4EE5\u5B57\u6BCD\u5F00\u5934\uFF0C\u4EC5\u542B\u5B57\u6BCD/\u6570\u5B57/-`);let e=m.resolve(t);if(n&&o)throw new Error("--packages-version \u4E0E --epx-frame \u4E0D\u80FD\u540C\u65F6\u6307\u5B9A");if(n&&!/^(?:[~^]?\d+\.\d+\.\d+(?:-[\w.-]+)?|[a-z][\w.-]*)$/.test(n))throw new Error("--packages-version \u9700\u8981 npm \u7248\u672C\u3001\u7248\u672C\u8303\u56F4\u6216\u6807\u7B7E");if(l.existsSync(e)&&l.readdirSync(e).length)throw new Error(`\u76EE\u6807\u76EE\u5F55\u975E\u7A7A\uFF1A${e}`);let c=o;if(l.mkdirSync(e,{recursive:!0}),!c&&!n)if(l.existsSync(m.join(_,"vite.config.mjs"))){if(!l.existsSync(m.join(_,"lib/epx-frame.common.js")))throw new Error("frame \u4ED3\u5E93 lib/ \u672A\u6784\u5EFA\u2014\u2014\u5148\u5728 frame-vue3 \u8DD1 pnpm build:component\uFF0C\u6216\u7528 --epx-frame \u6307\u5B9A\u6765\u6E90");console.log(" \u6253\u5305 epx-frame tarball\uFF08npm pack\uFF09\u2026");let u=v("npm pack --pack-destination "+JSON.stringify(e),{cwd:_,encoding:"utf8"}).trim().split(`
452
452
  `).pop();c="file:./"+u,console.log(" \u2713 "+u)}else c="^"+JSON.parse(l.readFileSync(m.join(_,"package.json"),"utf8")).version,console.log(` epx-frame \u4F9D\u8D56 \u2192 ${c}\uFF08\u5168\u5C40\u5B89\u88C5\u6A21\u5F0F\uFF1Bnpm i \u65F6\u9700 --registry \u516C\u53F8\u6E90\uFF09`);let E=n?g(r,n):r;for(let[f,u]of Object.entries(E)){let x=m.join(e,f.replace("__DIRNAME__",s));l.mkdirSync(m.dirname(x),{recursive:!0}),l.writeFileSync(x,u.replaceAll("__NAME__",a).replaceAll("__DIRNAME__",s).replaceAll("__EPX_FRAME__",c||"").replaceAll("__PACKAGES_VERSION__",n||"").replaceAll("__CLI_VERSION__",p))}return v('git init -q && git add -A && git commit -qm "epx-create: \u9879\u76EE\u521D\u59CB\u5316\uFF08Vite \u5F62\u6001\u811A\u624B\u67B6\uFF09"',{cwd:e}),console.log(`
453
453
  \u2713 \u9879\u76EE\u5DF2\u751F\u6210\uFF1A${e}`),n?(console.log(` npm install --prefix "${e}" --registry https://registry.npmjs.org/
454
454
  cd "${e}"
@@ -230,9 +230,9 @@ ${f}.use(${k})
230
230
  ${f}.use(${E})
231
231
  `}),x=!0}}),x||i.push(`${t}\uFF1A\u672A\u8BC6\u522B const app = createApp(...) \u542F\u52A8\u8BED\u53E5\uFF0C\u9700\u4EBA\u5DE5\u5B89\u88C5\u7EC4\u4EF6\u548C\u4E1A\u52A1\u63D2\u4EF6\u3002`),N(p,(c,g)=>{c.type==="Identifier"&&u.has(c.name)&&c.start<h&&g?.type==="MemberExpression"&&g.object===c&&i.push(`${t}\uFF1A${c.name} \u5728 createApp \u524D\u4F7F\u7528\uFF1B\u5148\u521B\u5EFA\u4EA7\u54C1 store/router \u5E76\u663E\u5F0F\u4F20\u5165 core\uFF0C\u518D\u5207\u6362\u72EC\u7ACB\u5305\u3002`)})}if(i.length)return{source:e,manual:i,blocked:!0};s.sort((x,h)=>h.start-x.start||h.end-x.end);let j=e;for(let x of s)j=j.slice(0,x.start)+x.text+j.slice(x.end);r.size&&(j=[...r].join(`
232
232
  `)+`
233
- `+j);try{(0,X.parse)(j,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","importAttributes"]})}catch(x){return{source:e,manual:[`${t}\uFF1A\u8F6C\u6362\u540E\u8BED\u6CD5\u9A8C\u8BC1\u5931\u8D25\uFF0C\u4FDD\u7559\u539F\u6587\uFF1A${x.message}`],blocked:!0}}return{source:j,manual:i,blocked:!1}}l(st,"transformScript");function Gt(e,t={}){if(t.filename?.endsWith(".vue")){let n=[],o=!1,i=e.replace(/(<script\b[^>]*>)([\s\S]*?)(<\/script>)/g,(s,r,a,u)=>{let p=st(a,t);return n.push(...p.manual),o||=p.blocked,r+p.source+u});return{source:o?e:i,manual:n,blocked:o}}return st(e,t)}l(Gt,"rewritePackageImports");function it({read:e,files:t,packagesVersion:n,cliVersion:o="0.5.0-beta.2",templates:i,newVite:s=!1}){let r=[],a=[];if(!/^(?:[~^]?\d+\.\d+\.\d+(?:-[\w.-]+)?|[a-z][\w.-]*)$/.test(n))throw new Error("--packages-version \u9700\u8981 npm \u7248\u672C\u3001\u7248\u672C\u8303\u56F4\u6216\u6807\u7B7E");let u=nt(i,n),p=JSON.parse(e("package.json")),d=(e("src/index.js")||"").match(/import\.meta\.glob\(\s*['"]\.\/([^/'"]+)\//)?.[1]||p.name||"product",y=l(c=>c.replaceAll("__NAME__",p.name||"product").replaceAll("__DIRNAME__",d).replaceAll("__PACKAGES_VERSION__",n).replaceAll("__CLI_VERSION__",o),"render"),S=["vite.config.mjs","vite.config.js","vite.config.ts"].find(c=>e(c)!=null);if(!S&&e("webpack.config.js")!=null)return{changes:[],manual:["\u72EC\u7ACB\u5305\u8FDC\u7A0B\u5171\u4EAB\u9700\u8981 Vite\uFF1B\u8BF7\u52A0 --to-vite \u6216\u5148\u624B\u5DE5\u8FC1\u79FB\u6784\u5EFA\u914D\u7F6E\u3002"],blocked:!0};let A=S&&!s?[S]:[],j=new Set;for(let c of[...t,...A]){let g=e(c);if(!g||!/epx-frame|@epx(?:ing)?\//.test(g))continue;let b=Gt(g,{filename:c,packagesVersion:n,bootstrap:/(?:^|\/)main\.[jt]s$/.test(c)});a.push(...b.manual);let f=b.source;if(c===S&&!b.blocked&&!f.includes("epxShared(")){let E=(0,X.parse)(f,{sourceType:"module",plugins:["typescript","jsx","importAttributes"]}),$;N(E,R=>{!$&&R.type==="ObjectProperty"&&Bt(R)==="plugins"&&R.value.type==="ArrayExpression"&&($=R.value)}),$?f=`import { epxShared as __epxShared } from '@epxing/cli/vite'
233
+ `+j);try{(0,X.parse)(j,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","importAttributes"]})}catch(x){return{source:e,manual:[`${t}\uFF1A\u8F6C\u6362\u540E\u8BED\u6CD5\u9A8C\u8BC1\u5931\u8D25\uFF0C\u4FDD\u7559\u539F\u6587\uFF1A${x.message}`],blocked:!0}}return{source:j,manual:i,blocked:!1}}l(st,"transformScript");function Gt(e,t={}){if(t.filename?.endsWith(".vue")){let n=[],o=!1,i=e.replace(/(<script\b[^>]*>)([\s\S]*?)(<\/script>)/g,(s,r,a,u)=>{let p=st(a,t);return n.push(...p.manual),o||=p.blocked,r+p.source+u});return{source:o?e:i,manual:n,blocked:o}}return st(e,t)}l(Gt,"rewritePackageImports");function it({read:e,files:t,packagesVersion:n,cliVersion:o="0.5.0-beta.3",templates:i,newVite:s=!1}){let r=[],a=[];if(!/^(?:[~^]?\d+\.\d+\.\d+(?:-[\w.-]+)?|[a-z][\w.-]*)$/.test(n))throw new Error("--packages-version \u9700\u8981 npm \u7248\u672C\u3001\u7248\u672C\u8303\u56F4\u6216\u6807\u7B7E");let u=nt(i,n),p=JSON.parse(e("package.json")),d=(e("src/index.js")||"").match(/import\.meta\.glob\(\s*['"]\.\/([^/'"]+)\//)?.[1]||p.name||"product",y=l(c=>c.replaceAll("__NAME__",p.name||"product").replaceAll("__DIRNAME__",d).replaceAll("__PACKAGES_VERSION__",n).replaceAll("__CLI_VERSION__",o),"render"),S=["vite.config.mjs","vite.config.js","vite.config.ts"].find(c=>e(c)!=null);if(!S&&e("webpack.config.js")!=null)return{changes:[],manual:["\u72EC\u7ACB\u5305\u8FDC\u7A0B\u5171\u4EAB\u9700\u8981 Vite\uFF1B\u8BF7\u52A0 --to-vite \u6216\u5148\u624B\u5DE5\u8FC1\u79FB\u6784\u5EFA\u914D\u7F6E\u3002"],blocked:!0};let A=S&&!s?[S]:[],j=new Set;for(let c of[...t,...A]){let g=e(c);if(!g||!/epx-frame|@epx(?:ing)?\//.test(g))continue;let b=Gt(g,{filename:c,packagesVersion:n,bootstrap:/(?:^|\/)main\.[jt]s$/.test(c)});a.push(...b.manual);let f=b.source;if(c===S&&!b.blocked&&!f.includes("epxShared(")){let E=(0,X.parse)(f,{sourceType:"module",plugins:["typescript","jsx","importAttributes"]}),$;N(E,R=>{!$&&R.type==="ObjectProperty"&&Bt(R)==="plugins"&&R.value.type==="ArrayExpression"&&($=R.value)}),$?f=`import { epxShared as __epxShared } from '@epxing/cli/vite'
234
234
  `+f.slice(0,$.start+1)+"__epxShared(), "+f.slice($.start+1):a.push(`${c}\uFF1Aplugins \u6570\u7EC4\u65E0\u6CD5\u786E\u5B9A\uFF0C\u9700\u4EBA\u5DE5\u63A5\u5165 @epxing/cli/vite \u7684 epxShared\u3002`)}let k=c.endsWith(".vue")?[...f.matchAll(/<script\b[^>]*>([\s\S]*?)<\/script>/g)].map(E=>E[1]):[f];for(let E of k){let $=(0,X.parse)(E,{sourceType:"unambiguous",plugins:["typescript","jsx","decorators-legacy","importAttributes"]});N($,(R,Q)=>{if(R.type!=="StringLiteral"||!/^(?:ImportDeclaration|ExportNamedDeclaration|ExportAllDeclaration)$/.test(Q?.type||"")&&!(Q?.type==="CallExpression"&&(Q.callee.type==="Import"||Q.callee.name==="require")))return;let ke=R.value.match(/^(@epxing\/[\w-]+)/)?.[1];ke&&j.add(ke)})}f!==g&&r.push({file:c,after:f})}if(a.length)return{changes:[],manual:a,blocked:!0};if(s){r.push({file:S||"vite.config.mjs",after:y(u["vite.config.mjs"])});for(let c of["@epxing/cli","@epxing/icons","@epxing/theme"])j.add(c)}p.dependencies||={},p.devDependencies||={};for(let[c,g]of Object.entries(JSON.parse(y(u["package.json"])).dependencies))c.startsWith("@epxing/")&&!j.has(c)&&!["@epxing/core","@epxing/components","@epxing/utils"].includes(c)||(p.dependencies[c]=g);for(let c of["dependencies","devDependencies","peerDependencies"])for(let g of Object.keys(p[c]||{}))if(g.startsWith("@epx/")||U(g)!==g){let b=U(g);p[c][b]=n,delete p[c][g]}else g.startsWith("@epxing/")&&g!=="@epxing/cli"&&(p[c][g]=n);for(let c of j){let g=["@epxing/cli","@epxing/icons"].includes(c),b=g?"devDependencies":"dependencies";p[b][c]=c==="@epxing/cli"?o:n,delete p[g?"dependencies":"devDependencies"][c]}let x=S&&/node_modules\/epx-frame\/lib/.test(e(S)||"")&&!s;x?(p.devDependencies["epx-frame"]=p.dependencies["epx-frame"]||p.devDependencies["epx-frame"],delete p.dependencies["epx-frame"]):(delete p.dependencies["epx-frame"],delete p.devDependencies["epx-frame"]),p.runtime="vue3",r.push({file:"package.json",after:JSON.stringify(p,null,2)+`
235
- `});let h=e("PRODUCT-GUIDE.md")==null||e("PRODUCT-GUIDE.md").includes("<!-- epxing-generated-product-guide -->")?"PRODUCT-GUIDE.md":"EPXING-PACKAGES-GUIDE.md";return e(h)!=null&&!e(h).includes("<!-- epxing-generated-product-guide -->")?{changes:[],manual:[`${h} \u5DF2\u6709\u81EA\u5B9A\u4E49\u5185\u5BB9\uFF0C\u5148\u6307\u5B9A\u6216\u817E\u51FA\u72EC\u7ACB\u5305\u4F7F\u7528\u8BF4\u660E\u8DEF\u5F84\u540E\u91CD\u8BD5\u3002`],blocked:!0}:(r.push({file:h,after:y(u["PRODUCT-GUIDE.md"])}),{changes:r,manual:x?["\u73B0\u6709 Vite \u9759\u6001\u8D44\u6E90\u4EE3\u7406\u4ECD\u8BFB\u53D6 epx-frame/lib\uFF0C\u6682\u4FDD\u7559\u4E3A\u5F00\u53D1\u4F9D\u8D56\uFF1B\u8FD0\u884C\u65F6\u6E90\u7801\u5DF2\u6539\u4E3A\u72EC\u7ACB\u5305\u3002"]:[],blocked:!1})}l(it,"planIndependentPackages");import{TEMPLATES as Ht}from"../epx-create/scaffold.mjs";var D=process.argv.slice(2),ie=D.indexOf("--epx-frame"),re=ie!==-1?D[ie+1]:null;ie!==-1&&D.splice(ie,2);var fe=D.indexOf("--packages-version"),O=fe===-1?null:D.splice(fe,2)[1],rt=D.indexOf("--cli-version"),pt=rt===-1?"0.5.0-beta.2":D.splice(rt,2)[1];if(re&&O)throw new Error("--packages-version \u4E0E --epx-frame \u4E0D\u80FD\u540C\u65F6\u6307\u5B9A");if(fe!==-1&&(!O||O.startsWith("--")))throw new Error("--packages-version \u7F3A\u5C11\u503C");var _=D.find(e=>!e.startsWith("--")),W=D.includes("--apply"),xe=D.includes("--transform-vue"),ge=D.includes("--report-only"),ct=D.includes("--to-vite"),m=l((...e)=>console.log(...e),"log");re&&(ee["epx-frame"].target=re);(!_||!v.existsSync(_))&&(console.error("\u7528\u6CD5\uFF1Anode tools/epx-migrate/migrate.mjs <\u8001\u9879\u76EE\u76EE\u5F55> [--apply] [--transform-vue] [--to-vite] [--report-only] [--epx-frame <spec>]"),process.exit(1));var V=l(e=>P.join(_,e),"rel"),F=l(e=>v.existsSync(V(e))?v.readFileSync(V(e),"utf8"):null,"read"),I=[],C=[],he=!1,L=l(e=>m(`
235
+ `});let h=e("PRODUCT-GUIDE.md")==null||e("PRODUCT-GUIDE.md").includes("<!-- epxing-generated-product-guide -->")?"PRODUCT-GUIDE.md":"EPXING-PACKAGES-GUIDE.md";return e(h)!=null&&!e(h).includes("<!-- epxing-generated-product-guide -->")?{changes:[],manual:[`${h} \u5DF2\u6709\u81EA\u5B9A\u4E49\u5185\u5BB9\uFF0C\u5148\u6307\u5B9A\u6216\u817E\u51FA\u72EC\u7ACB\u5305\u4F7F\u7528\u8BF4\u660E\u8DEF\u5F84\u540E\u91CD\u8BD5\u3002`],blocked:!0}:(r.push({file:h,after:y(u["PRODUCT-GUIDE.md"])}),{changes:r,manual:x?["\u73B0\u6709 Vite \u9759\u6001\u8D44\u6E90\u4EE3\u7406\u4ECD\u8BFB\u53D6 epx-frame/lib\uFF0C\u6682\u4FDD\u7559\u4E3A\u5F00\u53D1\u4F9D\u8D56\uFF1B\u8FD0\u884C\u65F6\u6E90\u7801\u5DF2\u6539\u4E3A\u72EC\u7ACB\u5305\u3002"]:[],blocked:!1})}l(it,"planIndependentPackages");import{TEMPLATES as Ht}from"../epx-create/scaffold.mjs";var D=process.argv.slice(2),ie=D.indexOf("--epx-frame"),re=ie!==-1?D[ie+1]:null;ie!==-1&&D.splice(ie,2);var fe=D.indexOf("--packages-version"),O=fe===-1?null:D.splice(fe,2)[1],rt=D.indexOf("--cli-version"),pt=rt===-1?"0.5.0-beta.3":D.splice(rt,2)[1];if(re&&O)throw new Error("--packages-version \u4E0E --epx-frame \u4E0D\u80FD\u540C\u65F6\u6307\u5B9A");if(fe!==-1&&(!O||O.startsWith("--")))throw new Error("--packages-version \u7F3A\u5C11\u503C");var _=D.find(e=>!e.startsWith("--")),W=D.includes("--apply"),xe=D.includes("--transform-vue"),ge=D.includes("--report-only"),ct=D.includes("--to-vite"),m=l((...e)=>console.log(...e),"log");re&&(ee["epx-frame"].target=re);(!_||!v.existsSync(_))&&(console.error("\u7528\u6CD5\uFF1Anode tools/epx-migrate/migrate.mjs <\u8001\u9879\u76EE\u76EE\u5F55> [--apply] [--transform-vue] [--to-vite] [--report-only] [--epx-frame <spec>]"),process.exit(1));var V=l(e=>P.join(_,e),"rel"),F=l(e=>v.existsSync(V(e))?v.readFileSync(V(e),"utf8"):null,"read"),I=[],C=[],he=!1,L=l(e=>m(`
236
236
  ${"\u2501".repeat(60)}
237
237
  \u258D ${e}
238
238
  ${"\u2501".repeat(60)}`),"stage"),Wt=l(e=>{let t=String(e),n=/(^|[^\d.])3(\.|x|\b)/.test(t);return/(^|[^\d.])2(\.|x|\b)/.test(t)&&!n},"wantsVue2Only");if(W)try{de("git status --porcelain",{cwd:_,encoding:"utf8"}).trim()&&(console.error("\u2717 \u9879\u76EE\u5DE5\u4F5C\u6811\u4E0D\u5E72\u51C0\uFF0C--apply \u524D\u8BF7\u5148 commit/stash\uFF08\u4FBF\u4E8E git diff \u5BA1\u67E5\u4E0E\u56DE\u6EDA\uFF09\u3002"),process.exit(1))}catch{console.error("\u2717 \u76EE\u6807\u4E0D\u662F git \u4ED3\u5E93\uFF1B--apply \u9700\u8981 git \u4EE5\u4FBF\u5BA1\u67E5\u56DE\u6EDA\u3002\u5148 git init \u6216\u53BB\u6389 --apply \u8D70 dry-run\u3002"),process.exit(1)}var T=[],M=[],lt=[],ut=l(e=>{for(let t of v.readdirSync(e,{withFileTypes:!0})){let n=P.join(e,t.name);t.isDirectory()&&!/node_modules|\.git|^lib$|^dist$/.test(t.name)?ut(n):t.name.endsWith(".vue")?(T.push(n),M.push(n)):/\.(?:[cm]?js|jsx|ts|tsx)$/.test(t.name)?M.push(n):/\.(?:css|scss|less|sass|styl|stylus)$/.test(t.name)&&lt.push(n)}},"walk");v.existsSync(V("src"))&&ut(V("src"));var Se=new Set;for(let e of M){let t=v.readFileSync(e,"utf8");for(let n of t.matchAll(/(?:from\s+|require\()\s*['"]([^'"./][^'"]*)['"]/g)){let o=n[1];o.startsWith("@/")||Se.add(o.startsWith("@")?o.split("/").slice(0,2).join("/"):o.split("/")[0])}}var mt=l(e=>{let t=e.match(/<script(\s[^>]*)?>([\s\S]*?)<\/script>/);return t?{attrs:t[1]||"",body:t[2]}:null},"scriptOf"),gt=l(e=>/[(=,]\s*\n?\s*<[A-Za-z][\w-]*[\s>/]/.test(e),"hasJsx"),B=T.filter(e=>{let t=mt(v.readFileSync(e,"utf8"));return t&&gt(t.body)});L("\u2460 \u4F9D\u8D56\u8FC1\u79FB\uFF08package.json\uFF09");var ne=F("package.json"),dt=F("webpack.config.js")!=null;if(ne){let e=JSON.parse(ne),t=e.runtime!=="vue3";e.runtime="vue3",t&&m(" [\u6539] runtime \u2192 vue3\uFF08\u521B\u5EFA/\u8FC1\u79FB\u540E\u7684\u8FD0\u884C\u65F6\u6807\u8BC6\uFF09");let n=[],o=l((s,r,a,u)=>{let p=a?"devDependencies":"dependencies";e[p]=e[p]||{},e[p][s]!==r&&(n.push([e[p][s]!=null?"\u6539":"\u52A0",s,e[p][s]||"\u2014",r,u||""]),e[p][s]=r)},"setDep");for(let[s,r]of Object.entries(ee))for(let a of["dependencies","devDependencies"]){let u=e[a];u&&u[s]!=null&&(r.target===null?(n.push(["\u5220",s,u[s],"\u2014",r.note||""]),delete u[s]):u[s]!==r.target&&(n.push(["\u6539",s,u[s],r.target,r.note||""]),u[s]=r.target))}if(dt)for(let[s,r]of Object.entries(Ae))o(s,r,!0,"lib \u6784\u5EFA\u95ED\u5305");if(B.length)for(let[s,r]of Object.entries(Pe))o(s,r,!0,`.vue \u5185 JSX\uFF08${B.length} \u6587\u4EF6\uFF09`);if(T.length)for(let[s,r]of Object.entries(Fe))o(s,r,!1,"element-plus \u56FE\u6807\uFF08gogocode \u8F6C\u6362\u4EA7\u7269\u9700\u8981\uFF09");(ne.includes("@vue/eslint-config-standard")||ne.includes("babel-eslint"))&&C.push("lint \u914D\u7F6E\uFF1A\u8001 eslint6+standard5 \u6808\u5DF2\u9000\u5F79\uFF08ERESOLVE \u51B2\u7A81\uFF09\u2014\u2014\u6309\u5E73\u53F0 .eslintrc \u91CD\u5EFA\u89C4\u5219\uFF08eslint8 + plugin-vue9\uFF09");let i={...e.dependencies||{},...e.devDependencies||{}};for(let s of[...Se].sort())i[s]||s==="epx-frame"||s==="vue"||(pe[s]?o(s,pe[s],!1,"\u9690\u5F0F\u4F9D\u8D56\u8865\u58F0\u660E\uFF08\u539F\u9760 hoist\uFF09"):C.push(`src \u91CC import \u4E86 \`${s}\` \u4F46 package.json \u672A\u58F0\u660E\u4E14\u4E0D\u5728\u5DF2\u77E5\u7248\u672C\u8868\u2014\u2014\u4EBA\u5DE5\u8865\u7248\u672C`));n.length||t?(n.forEach(([s,r,a,u,p])=>m(` [${s}] ${r.padEnd(26)} ${String(a).padEnd(12)} \u2192 ${String(u).padEnd(12)} ${p}`)),I.push({file:"package.json",after:JSON.stringify(e,null,2)+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epxing/cli",
3
- "version": "0.5.0-beta.2",
3
+ "version": "0.5.0-beta.3",
4
4
  "description": "EPX 交互式工程开发、服务启动、构建、Vue3 迁移及技能安装工具",
5
5
  "type": "module",
6
6
  "bin": {