pangu-vis-cli 1.1.0 → 1.2.1

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.
Files changed (3) hide show
  1. package/README.md +56 -256
  2. package/dist/index.js +53 -164
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,28 +1,25 @@
1
1
  # pangu-vis-cli
2
2
 
3
- > 盘古可视化图表开发工具链 - 一站式图表创建、开发、打包、上传解决方案
3
+ > 盘古可视化平台的图表包脚手架与开发辅助工具
4
4
 
5
5
  ## 简介
6
6
 
7
- `pangu-vis-cli` 是一个专为盘古可视化平台设计的命令行工具,提供图表包的创建、开发调试、打包构建、上传发布等完整工作流支持。通过简洁的命令,开发者可以快速创建标准化的图表项目,进行本地开发调试,并一键打包上传至泰合社区。
7
+ `pangu-vis-cli` 是一个专为盘古可视化平台设计的图表包脚手架与开发辅助工具,覆盖图表包创建、本地开发调试与打包构建。通过简洁的命令,开发者可以快速创建标准化的图表项目,进行本地开发调试,并一键打包为 tar.gz 发布产物。1.1.0 起本工具聚焦脚手架与开发辅助,tar.gz 发布产物面向盘古可视化平台使用。
8
8
 
9
9
  **核心价值**:
10
10
 
11
11
  - 🚀 **快速初始化** - 一键创建标准化图表项目模板
12
- - 🔧 **开发友好** - 本地开发环境自动配置
13
- - 📦 **智能打包** - 版本管理、自动压缩、依赖优化
14
- - 📤 **便捷发布** - 认证上传至图表社区
12
+ - 🔧 **开发友好** - 一键启动图表包本地开发调试
13
+ - 📦 **智能打包** - 版本同步、自动压缩、一键生成 tar.gz 发布产物
15
14
  - ⚙️ **灵活配置** - 自动化行为可自定义
16
15
 
17
16
  ## 特性
18
17
 
19
- - ✅ 支持 8 种图表类型(折线图、柱状图、饼图、表格、地图、文本、指标、交互)
18
+ - ✅ 支持 9 种图表类型(折线图、柱状图、饼图、表格、地图、文本、指标、交互、其他)
20
19
  - ✅ 可选 TypeScript 支持
21
20
  - ✅ 交互式命令行提示
22
- - ✅ 自动版本同步(base.json ↔ package.json)
23
- - ✅ 并发打包优化
24
- - ✅ tar.gz 压缩包生成
25
- - ✅ 用户认证与 token 管理
21
+ - ✅ 自动版本同步(public/base.json ↔ package.json)
22
+ - ✅ 单图表一键打包为 tar.gz
26
23
  - ✅ 自动更新检测
27
24
  - ✅ 跨平台支持(macOS / Windows / Linux)
28
25
 
@@ -88,18 +85,14 @@ pnpm dev
88
85
  # 1. 创建图表包
89
86
  pv create my-chart
90
87
 
91
- # 2. 开发调试
88
+ # 2. 进入图表包目录
92
89
  cd packages/components/my-chart
90
+
91
+ # 3. 启动开发环境
93
92
  pnpm dev
94
93
 
95
- # 3. 打包构建(在图表包目录)
94
+ # 4. 打包构建(在图表包目录)
96
95
  pv build
97
-
98
- # 4. 用户认证
99
- pv auth
100
-
101
- # 5. 上传发布
102
- pv upload my-chart_v1.0.0.tar.gz
103
96
  ```
104
97
 
105
98
  ## 命令详解
@@ -128,7 +121,7 @@ pv c <project-name>
128
121
  - `text` - 文本
129
122
  - `indicator` - 指标
130
123
  - `interaction` - 交互
131
- - `other` - 其他
124
+ - `other` - 其他(默认选中,推荐)
132
125
 
133
126
  2. **TypeScript 支持**:
134
127
  - `yes` - 启用 TypeScript
@@ -137,6 +130,7 @@ pv c <project-name>
137
130
  3. **图表命名规则**:
138
131
  - 必须以小写字母开头
139
132
  - 仅允许小写字母、数字、下划线
133
+ - 长度 1-100 字符
140
134
  - 推荐添加自定义前缀防止冲突
141
135
 
142
136
  **示例**:
@@ -154,15 +148,13 @@ pv create custom_bar_chart
154
148
 
155
149
  图表创建位置取决于当前工作目录:
156
150
 
157
- - **图表库根目录运行**(有 `package.json` + `packages/components` + `packages/tailored`):
158
- - 默认:`packages/components/<project-name>/`
159
- - 当前目录包含 "tailored":`packages/tailored/<project-name>/`
151
+ - **当前目录或其上级目录(最多向上 10 层)具备图表库特征**(`package.json` 包名含 `pangu` + `packages/components` + `packages/tailored`):
152
+ - 在特征目录下归位:`packages/components/<project-name>/`
153
+ - 运行路径包含 "tailored" 时:`packages/tailored/<project-name>/`
160
154
 
161
- - **其他目录运行**(如子目录、临时目录、独立项目):
155
+ - **其他目录**:
162
156
  - 当前目录下创建:`./<project-name>/`
163
157
 
164
- > 💡 **提示**:在子目录运行时,图表会在当前目录创建,不会跳转到根目录 `packages/`。
165
-
166
158
  **自动执行**:
167
159
 
168
160
  - 复制模板文件
@@ -201,14 +193,13 @@ pv build packages/components/my-chart
201
193
 
202
194
  **打包流程**:
203
195
 
204
- 1. 版本同步(`base.json` ↔ `package.json`)
196
+ 1. 版本同步(`public/base.json` ↔ `package.json`)
205
197
  2. 执行 `pnpm build`
206
198
  3. 生成产物目录:`<chart-name>_v<version>/`
207
199
  4. 可选删除 `es/` 目录(根据配置)
208
200
  5. 过滤无用文件(`.git`, `.vscode`, `.DS_Store`, `.idea`)
209
201
  6. 打包为 tar.gz:`<chart-name>_v<version>.tar.gz`
210
202
  7. 可选删除打包目录(根据配置 `autoRemove`)
211
- 8. 可选自动上传(根据配置 `autoUpload`)
212
203
 
213
204
  **产物文件**:
214
205
 
@@ -228,12 +219,9 @@ my-chart_v1.0.0.tar.gz
228
219
 
229
220
  ```bash
230
221
  pv dev # 启动当前目录开发环境
231
- pv dev <path> # 启动指定路径开发环境
232
222
  ```
233
223
 
234
- **参数**:
235
-
236
- - `<path>` - 图表包路径
224
+ 需先 cd 到图表包目录再执行。
237
225
 
238
226
  **示例**:
239
227
 
@@ -241,146 +229,16 @@ pv dev <path> # 启动指定路径开发环境
241
229
  # 在图表包目录下执行
242
230
  cd packages/components/my-chart
243
231
  pv dev
244
-
245
- # 指定路径启动
246
- pv dev packages/components/my-chart
247
232
  ```
248
233
 
249
234
  **自动检测**:
250
235
 
251
- - 查找 `package.json` 中的 `dev` 或 `serve` 脚本
252
- - 执行 `pnpm dev` 或 `pnpm serve`
236
+ - 查找 `package.json` 中的 `dev` 脚本
237
+ - 执行 `<探测到的包管理器> run dev`
253
238
  - 实时预览图表开发效果
254
239
 
255
240
  ---
256
241
 
257
- ### pv upload - 上传图表包
258
-
259
- 上传打包后的 tar.gz 文件至泰合社区服务器。
260
-
261
- **别名**:`pv u`
262
-
263
- **前置条件**:需先通过 `pv auth` 进行用户认证。
264
-
265
- **用法**:
266
-
267
- ```bash
268
- pv upload # 上传当前目录所有 .tar.gz 文件
269
- pv upload <file.tar.gz> # 上传指定 tar.gz 文件
270
- pv upload <path> # 上传指定目录下的所有 .tar.gz 文件
271
- ```
272
-
273
- **参数**:
274
-
275
- - `<file.tar.gz>` - tar.gz 文件路径
276
- - `<path>` - 目录路径
277
-
278
- **示例**:
279
-
280
- ```bash
281
- # 用户认证(首次)
282
- pv auth
283
-
284
- # 上传当前目录所有 tar.gz
285
- pv upload
286
-
287
- # 上传指定文件
288
- pv upload my-chart_v1.0.0.tar.gz
289
-
290
- # 上传指定目录下的所有 tar.gz
291
- pv upload dist/
292
- ```
293
-
294
- **认证要求**:
295
-
296
- - 未登录时自动触发认证流程
297
- - 需输入泰合社区用户名和密码
298
- - token 自动保存,后续无需重复登录
299
-
300
- ---
301
-
302
- ### pv auth - 用户认证
303
-
304
- 登录泰合社区,获取上传权限。
305
-
306
- **别名**:`pv a`
307
-
308
- **用法**:
309
-
310
- ```bash
311
- pv auth # 交互式登录
312
- pv auth <user> <password> # 命令行登录
313
- ```
314
-
315
- **参数**:
316
-
317
- - `<user>` - 泰合社区用户名
318
- - `<password>` - 泰合社区密码
319
-
320
- **示例**:
321
-
322
- ```bash
323
- # 交互式登录(推荐)
324
- pv auth
325
- # 按提示输入用户名和密码
326
-
327
- # 命令行登录
328
- pv auth myuser mypassword
329
- ```
330
-
331
- **认证流程**:
332
-
333
- 1. 输入用户名和密码(密码经 MD5 加密)
334
- 2. 请求服务器 token
335
- 3. 保存认证信息至本地配置文件
336
-
337
- **认证信息存储位置**:
338
-
339
- ```
340
- ~/.pangu-vis-store/.cli_store
341
- ```
342
-
343
- **认证失败处理**:
344
-
345
- - 失败后可重试(最多 3 次)
346
- - 失败 3 次后提示稍后尝试
347
-
348
- ---
349
-
350
- ### pv tar - tar 打包工具
351
-
352
- 通用的 tar.gz 打包命令,可打包任意目录或文件。
353
-
354
- **别名**:`pv t`
355
-
356
- **用法**:
357
-
358
- ```bash
359
- pv tar <targetDir> <name> [distDir] [distName]
360
- ```
361
-
362
- **参数**:
363
-
364
- - `<targetDir>` - 目标目录(必需)
365
- - `<name>` - 打包文件名(必需)
366
- - `<distDir>` - 输出目录(可选,默认为 targetDir)
367
- - `<distName>` - 输出文件名(可选,默认为 name)
368
-
369
- **示例**:
370
-
371
- ```bash
372
- # 打包当前目录下的 dist 为 dist.tar.gz
373
- pv tar ./dist dist
374
-
375
- # 打包并指定输出目录
376
- pv tar ./dist dist ./output
377
-
378
- # 打包并指定输出文件名
379
- pv tar ./dist dist ./output my-dist
380
- ```
381
-
382
- ---
383
-
384
242
  ### pv config - 配置管理
385
243
 
386
244
  配置 CLI 工具的自动化行为。
@@ -395,11 +253,10 @@ pv config
395
253
 
396
254
  **交互式配置项**:
397
255
 
398
- | 配置项 | 说明 | 默认值 |
399
- | -------------- | ------------------------------ | ------------ |
400
- | `autoUpload` | 图表打包后是否自动上传泰合社区 | `no` (false) |
401
- | `autoRemove` | 打包后是否自动删除打包目录 | `yes` (true) |
402
- | `autoRemoveEs` | 打包后是否移除 es 目录 | `yes` (true) |
256
+ | 配置项 | 说明 | 默认值 |
257
+ | -------------- | -------------------------- | ------------ |
258
+ | `autoRemove` | 打包后是否自动删除打包目录 | `yes` (true) |
259
+ | `autoRemoveEs` | 打包后是否移除 es 目录 | `yes` (true) |
403
260
 
404
261
  **示例**:
405
262
 
@@ -418,12 +275,10 @@ pv config
418
275
 
419
276
  ```json
420
277
  {
421
- "user": "your-username",
422
- "password": "your-password",
423
- "token": "your-token",
424
- "autoUpload": false,
425
278
  "autoRemove": true,
426
- "autoRemoveEs": true
279
+ "autoRemoveEs": true,
280
+ "lastUpdateCheck": 1788480000000,
281
+ "privateRegistry": "http://192.168.12.88:10000"
427
282
  }
428
283
  ```
429
284
 
@@ -443,10 +298,9 @@ pv update
443
298
 
444
299
  **更新流程**:
445
300
 
446
- 1. 检查 npm 是否有新版本
447
- 2. 提示是否更新
448
- 3. 执行全局安装:`npm i -g pangu-vis-cli`
449
- 4. macOS/Linux 自动启用 sudo(如需)
301
+ 1. 检查 npm 源最新版本
302
+ 2. 安装前确认提示「是否安装 <版本>?」(默认 yes,可跳过;跳过后提示稍后可再运行 `pvis update`)
303
+ 3. 优先用探测到的 pnpm(不可用时回退 npm)执行 `install -g pangu-vis-cli@latest`
450
304
 
451
305
  **示例**:
452
306
 
@@ -455,10 +309,11 @@ pv update
455
309
  pv update
456
310
 
457
311
  # 已是最新版本提示
458
- 当前版本已是最新!
312
+ 当前已是最新版本 1.1.0
459
313
 
460
314
  # 有新版本时提示
461
- 是否更新Cli工具? yes/no
315
+ 发现新版本 1.2.0,当前版本 1.1.0
316
+ 是否安装 1.2.0?
462
317
  ```
463
318
 
464
319
  **自动检查**:
@@ -478,16 +333,16 @@ CLI 配置信息存储在用户主目录:
478
333
  ~/.pangu-vis-store/.cli_store
479
334
  ```
480
335
 
336
+ 可通过环境变量 `PANGU_CONFIG_DIR` 覆盖配置目录位置。
337
+
481
338
  ### 配置项说明
482
339
 
483
- | 配置项 | 类型 | 说明 | 默认值 |
484
- | -------------- | ------- | ----------------------- | ------- |
485
- | `user` | string | 泰合社区用户名 | `''` |
486
- | `password` | string | 泰合社区密码(MD5加密) | `''` |
487
- | `token` | string | 认证 token | `''` |
488
- | `autoUpload` | boolean | 打包后自动上传 | `false` |
489
- | `autoRemove` | boolean | 打包后删除打包目录 | `true` |
490
- | `autoRemoveEs` | boolean | 打包后删除 es 目录 | `true` |
340
+ | 配置项 | 类型 | 说明 | 默认值 |
341
+ | ----------------- | ------- | ------------------------------------------------------------------------------ | ---------- |
342
+ | `autoRemove` | boolean | 打包后是否自动删除打包目录 | `true` |
343
+ | `autoRemoveEs` | boolean | 打包后是否自动删除 es 目录 | `true` |
344
+ | `lastUpdateCheck` | number | 更新检查节流时间戳(可选) | |
345
+ | `privateRegistry` | string | 私有 npm 源(可选,优先级:`PANGU_REGISTRY` 环境变量 > 配置文件 > 内网默认源) | 内网默认源 |
491
346
 
492
347
  ### 修改配置
493
348
 
@@ -500,18 +355,6 @@ pv config
500
355
  **方法 2:手动编辑**
501
356
  编辑 `~/.pangu-vis-store/.cli_store` 文件。
502
357
 
503
- ### 清除认证
504
-
505
- 如需重新登录,删除配置文件中的 `token` 字段:
506
-
507
- ```bash
508
- # 编辑配置文件
509
- vi ~/.pangu-vis-store/.cli_store
510
-
511
- # 删除 token 行后重新认证
512
- pv auth
513
- ```
514
-
515
358
  ## 使用示例
516
359
 
517
360
  ### 示例:创建并打包折线图
@@ -537,16 +380,13 @@ pv build
537
380
 
538
381
  ## 命令速查表
539
382
 
540
- | 命令 | 别名 | 说明 | 是否需要认证 |
541
- | ----------- | -------- | ------------ | ------------------------ |
542
- | `pv create` | `pv c` | 创建图表包 | 可选(登录可注册图表ID) |
543
- | `pv build` | `pv b` | 单个图表打包 | ❌ |
544
- | `pv dev` | `pv d` | 启动开发环境 | ❌ |
545
- | `pv upload` | `pv u` | 上传图表包 | |
546
- | `pv auth` | `pv a` | 用户认证 | ❌ |
547
- | `pv tar` | `pv t` | tar 打包工具 | ❌ |
548
- | `pv config` | `pv set` | 配置管理 | ❌ |
549
- | `pv update` | `pv up` | CLI 更新 | ❌ |
383
+ | 命令 | 别名 | 说明 |
384
+ | ----------- | -------- | ------------ |
385
+ | `pv create` | `pv c` | 创建图表包 |
386
+ | `pv build` | `pv b` | 单个图表打包 |
387
+ | `pv dev` | `pv d` | 启动开发环境 |
388
+ | `pv config` | `pv set` | 配置管理 |
389
+ | `pv update` | `pv up` | CLI 更新 |
550
390
 
551
391
  ## 常见问题
552
392
 
@@ -561,63 +401,28 @@ sudo npm install -g pangu-vis-cli
561
401
  **Windows**:
562
402
  以管理员身份运行终端,再执行安装命令。
563
403
 
564
- ### 2. 登录认证失败
565
-
566
- - 检查用户名和密码是否正确
567
- - 确认泰合社区账号已激活
568
- - 失败 3 次后需稍后再试
569
-
570
- ### 3. 图表包名称重复
404
+ ### 2. 图表包名称重复
571
405
 
572
406
  - 使用自定义前缀避免冲突
573
- - 遵循命名规则:小写字母开头,仅允许字母、数字、下划线
407
+ - 遵循命名规则:小写字母开头,仅允许小写字母、数字、下划线
574
408
 
575
- ### 4. 打包产物找不到
409
+ ### 3. 打包产物找不到
576
410
 
577
411
  - 检查配置 `autoRemove` 是否为 `yes`
578
412
  - 打包产物默认在图表包目录下
579
- - 使用 `pv tar` 手动指定输出目录
580
-
581
- ### 5. 上传失败
582
-
583
- - 确认已通过 `pv auth` 认证
584
- - 检查网络连接(泰合社区服务器)
585
- - 确认 tar.gz 文件格式正确
586
413
 
587
- ### 6. 版本号不同步
414
+ ### 4. 版本号不同步
588
415
 
589
- - CLI 自动同步 `base.json` 和 `package.json` 版本
416
+ - CLI 自动同步 `public/base.json` 和 `package.json` 版本
590
417
  - 手动修改版本时需同时更新两个文件
591
418
  - 或使用 `pv build` 自动同步
592
419
 
593
- ### 7. 开发环境启动失败
420
+ ### 5. 开发环境启动失败
594
421
 
595
422
  - 确认已安装 `pnpm`
596
- - 检查 `package.json` 中是否有 `dev` 或 `serve` 脚本
423
+ - 检查 `package.json` 中是否有 `dev` 脚本
597
424
  - 安装依赖:`pnpm install`
598
425
 
599
- ## 开发环境(本仓库)
600
-
601
- | 项 | 要求/工具 |
602
- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
603
- | Node.js | `>=20.19.0`(engines 强制) |
604
- | TypeScript | `7.0.2`(原生编译器线,仅类型检查,esbuild 出产物;编辑器语言服务走 VS Code 内置 TS 扩展,原生 LSP 可选装 "TypeScript (Native Preview)" 扩展) |
605
- | 代码检查 | `oxlint`(配置 `.oxlintrc.json`) |
606
- | 代码格式化 | `oxfmt`(配置 `.oxfmtrc.json`,tab 缩进、行宽 100、双引号、分号、ES5 尾逗号) |
607
- | 单元测试 | `vitest`(302 用例) |
608
- | 包管理 | `nub`(兼容 pnpm 参数) |
609
-
610
- 常用开发命令(本仓库统一 `nub`,禁用 npm/pnpm/yarn/npx):
611
-
612
- ```bash
613
- nub install # 安装依赖
614
- nub run typecheck # tsc 7.0.2 类型检查
615
- nub run test:run # vitest 全量测试
616
- nub run lint # oxlint 检查
617
- nub run format:check # oxfmt 格式检查
618
- nub run build # esbuild 构建
619
- ```
620
-
621
426
  ## 许可证
622
427
 
623
428
  [MIT License](./LICENSE)
@@ -629,8 +434,3 @@ Copyright (c) 2023 Jaxon
629
434
  **Jaxon**
630
435
 
631
436
  如有问题或建议,请联系作者或在项目仓库提交 Issue。
632
-
633
- ---
634
-
635
- **最后更新**:2026-06-17
636
- **版本**:1.0.0
package/dist/index.js CHANGED
@@ -1,36 +1,13 @@
1
1
  #!/usr/bin/env node
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
4
  var __esm = (fn, res) => function __init() {
9
5
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
6
  };
11
- var __commonJS = (cb, mod) => function __require() {
12
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
- };
14
7
  var __export = (target, all) => {
15
8
  for (var name in all)
16
9
  __defProp(target, name, { get: all[name], enumerable: true });
17
10
  };
18
- var __copyProps = (to4, from, except, desc) => {
19
- if (from && typeof from === "object" || typeof from === "function") {
20
- for (let key of __getOwnPropNames(from))
21
- if (!__hasOwnProp.call(to4, key) && key !== except)
22
- __defProp(to4, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
- }
24
- return to4;
25
- };
26
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
27
- // If the importer is in node compatibility mode or this is not an ESM
28
- // file that has been converted to a CommonJS file using a Babel-
29
- // compatible transform (i.e. "__esModule" has not been set), then set
30
- // "default" to the CommonJS "module.exports" for node compatibility.
31
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
32
- mod
33
- ));
34
11
 
35
12
  // src/types/cli.ts
36
13
  var DEFAULT_CLI_CONFIG;
@@ -148,84 +125,12 @@ var init_config = __esm({
148
125
  }
149
126
  });
150
127
 
151
- // node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js
152
- var require_picocolors = __commonJS({
153
- "node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js"(exports, module) {
154
- var p2 = process || {};
155
- var argv = p2.argv || [];
156
- var env = p2.env || {};
157
- var isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p2.platform === "win32" || (p2.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
158
- var formatter = (open, close, replace = open) => (input) => {
159
- let string = "" + input, index = string.indexOf(close, open.length);
160
- return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
161
- };
162
- var replaceClose = (string, close, replace, index) => {
163
- let result = "", cursor = 0;
164
- do {
165
- result += string.substring(cursor, index) + replace;
166
- cursor = index + close.length;
167
- index = string.indexOf(close, cursor);
168
- } while (~index);
169
- return result + string.substring(cursor);
170
- };
171
- var createColors = (enabled = isColorSupported) => {
172
- let f = enabled ? formatter : () => String;
173
- return {
174
- isColorSupported: enabled,
175
- reset: f("\x1B[0m", "\x1B[0m"),
176
- bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
177
- dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
178
- italic: f("\x1B[3m", "\x1B[23m"),
179
- underline: f("\x1B[4m", "\x1B[24m"),
180
- inverse: f("\x1B[7m", "\x1B[27m"),
181
- hidden: f("\x1B[8m", "\x1B[28m"),
182
- strikethrough: f("\x1B[9m", "\x1B[29m"),
183
- black: f("\x1B[30m", "\x1B[39m"),
184
- red: f("\x1B[31m", "\x1B[39m"),
185
- green: f("\x1B[32m", "\x1B[39m"),
186
- yellow: f("\x1B[33m", "\x1B[39m"),
187
- blue: f("\x1B[34m", "\x1B[39m"),
188
- magenta: f("\x1B[35m", "\x1B[39m"),
189
- cyan: f("\x1B[36m", "\x1B[39m"),
190
- white: f("\x1B[37m", "\x1B[39m"),
191
- gray: f("\x1B[90m", "\x1B[39m"),
192
- bgBlack: f("\x1B[40m", "\x1B[49m"),
193
- bgRed: f("\x1B[41m", "\x1B[49m"),
194
- bgGreen: f("\x1B[42m", "\x1B[49m"),
195
- bgYellow: f("\x1B[43m", "\x1B[49m"),
196
- bgBlue: f("\x1B[44m", "\x1B[49m"),
197
- bgMagenta: f("\x1B[45m", "\x1B[49m"),
198
- bgCyan: f("\x1B[46m", "\x1B[49m"),
199
- bgWhite: f("\x1B[47m", "\x1B[49m"),
200
- blackBright: f("\x1B[90m", "\x1B[39m"),
201
- redBright: f("\x1B[91m", "\x1B[39m"),
202
- greenBright: f("\x1B[92m", "\x1B[39m"),
203
- yellowBright: f("\x1B[93m", "\x1B[39m"),
204
- blueBright: f("\x1B[94m", "\x1B[39m"),
205
- magentaBright: f("\x1B[95m", "\x1B[39m"),
206
- cyanBright: f("\x1B[96m", "\x1B[39m"),
207
- whiteBright: f("\x1B[97m", "\x1B[39m"),
208
- bgBlackBright: f("\x1B[100m", "\x1B[49m"),
209
- bgRedBright: f("\x1B[101m", "\x1B[49m"),
210
- bgGreenBright: f("\x1B[102m", "\x1B[49m"),
211
- bgYellowBright: f("\x1B[103m", "\x1B[49m"),
212
- bgBlueBright: f("\x1B[104m", "\x1B[49m"),
213
- bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
214
- bgCyanBright: f("\x1B[106m", "\x1B[49m"),
215
- bgWhiteBright: f("\x1B[107m", "\x1B[49m")
216
- };
217
- };
218
- module.exports = createColors();
219
- module.exports.createColors = createColors;
220
- }
221
- });
222
-
223
128
  // src/utils/log.ts
224
- var import_picocolors, log, exit;
129
+ import pc from "picocolors";
130
+ var log, exit;
225
131
  var init_log = __esm({
226
132
  "src/utils/log.ts"() {
227
133
  "use strict";
228
- import_picocolors = __toESM(require_picocolors(), 1);
229
134
  log = {
230
135
  /**
231
136
  * 输出成功消息(绿色)
@@ -233,7 +138,7 @@ var init_log = __esm({
233
138
  * @returns 无返回值
234
139
  */
235
140
  success(message) {
236
- process.stdout.write(`${import_picocolors.default.green(message)}
141
+ process.stdout.write(`${pc.green(message)}
237
142
  `);
238
143
  },
239
144
  /**
@@ -242,7 +147,7 @@ var init_log = __esm({
242
147
  * @returns 无返回值
243
148
  */
244
149
  err(message) {
245
- process.stderr.write(`${import_picocolors.default.bold(import_picocolors.default.red(message))}
150
+ process.stderr.write(`${pc.bold(pc.red(message))}
246
151
  `);
247
152
  },
248
153
  /**
@@ -251,7 +156,7 @@ var init_log = __esm({
251
156
  * @returns 无返回值
252
157
  */
253
158
  info(message) {
254
- process.stdout.write(`${import_picocolors.default.blue(message)}
159
+ process.stdout.write(`${pc.blue(message)}
255
160
  `);
256
161
  },
257
162
  /**
@@ -260,7 +165,7 @@ var init_log = __esm({
260
165
  * @returns 无返回值
261
166
  */
262
167
  warn(message) {
263
- process.stdout.write(`${import_picocolors.default.yellow(message)}
168
+ process.stdout.write(`${pc.yellow(message)}
264
169
  `);
265
170
  },
266
171
  /**
@@ -300,8 +205,6 @@ __export(process_exports, {
300
205
  getCdRelativePath: () => getCdRelativePath,
301
206
  getGitUser: () => getGitUser,
302
207
  getPackageName: () => getPackageName,
303
- get_plugin_latest_version: () => get_plugin_latest_version,
304
- get_plugin_version: () => get_plugin_version,
305
208
  runAsyncCmd: () => runAsyncCmd,
306
209
  userInfo: () => userInfo,
307
210
  wait: () => wait,
@@ -312,18 +215,13 @@ import { promisify } from "node:util";
312
215
  import { $ } from "execa";
313
216
  import figlet from "figlet";
314
217
  import _ from "lodash";
315
- var camelCase, upperFirst, detectPackageManager, userInfo, getPackageName, wait, welcomeCli, compareVersion, getCdRelativePath, runAsyncCmd, getGitUser, get_plugin_version, get_plugin_latest_version;
218
+ var camelCase, upperFirst, detectPackageManager, userInfo, getPackageName, wait, welcomeCli, compareVersion, getCdRelativePath, runAsyncCmd, getGitUser;
316
219
  var init_process = __esm({
317
220
  "src/utils/process.ts"() {
318
221
  "use strict";
319
222
  init_log();
320
223
  ({ camelCase, upperFirst } = _);
321
224
  detectPackageManager = async () => {
322
- try {
323
- await $`nub --version`;
324
- return "nub";
325
- } catch {
326
- }
327
225
  try {
328
226
  await $`pnpm --version`;
329
227
  return "pnpm";
@@ -394,21 +292,6 @@ var init_process = __esm({
394
292
  return "";
395
293
  }
396
294
  };
397
- get_plugin_version = async (pluginName) => {
398
- if (!pluginName) return "";
399
- try {
400
- const args = ["view", pluginName, "version"];
401
- const result = await $`npm ${args}`;
402
- return result.stdout.trim();
403
- } catch {
404
- return "";
405
- }
406
- };
407
- get_plugin_latest_version = async (pluginName, defaultVersion = "") => {
408
- if (!pluginName) return {};
409
- const version2 = await get_plugin_version(pluginName) || defaultVersion;
410
- return { [pluginName]: `^${version2}` };
411
- };
412
295
  }
413
296
  });
414
297
 
@@ -422,7 +305,7 @@ var init_package = __esm({
422
305
  "package.json"() {
423
306
  package_default = {
424
307
  name: "pangu-vis-cli",
425
- version: "1.1.0",
308
+ version: "1.2.1",
426
309
  description: "vis-cli",
427
310
  keywords: [
428
311
  "pangu-vis",
@@ -573,7 +456,6 @@ async function getLatestVersion(packageName, defaultValue) {
573
456
  signal: AbortSignal.timeout(5e3)
574
457
  });
575
458
  if (!response.ok) {
576
- latestVersionCache.set(cacheKey, defaultValue);
577
459
  return defaultValue;
578
460
  }
579
461
  const data = await response.json();
@@ -582,13 +464,10 @@ async function getLatestVersion(packageName, defaultValue) {
582
464
  latestVersionCache.set(cacheKey, result);
583
465
  return result;
584
466
  } catch (_error) {
585
- if (packageName) {
586
- latestVersionCache.set(`${packageName}\0${defaultValue ?? ""}`, defaultValue);
587
- }
588
467
  return defaultValue;
589
468
  }
590
469
  }
591
- async function get_plugin_latest_version2(packageName, defaultValue) {
470
+ async function get_plugin_latest_version(packageName, defaultValue) {
592
471
  if (!packageName) {
593
472
  return {};
594
473
  }
@@ -889,7 +768,7 @@ import { to as to2 } from "await-to-js";
889
768
  import fs4 from "fs-extra";
890
769
  import _2 from "lodash";
891
770
  import tar from "tar";
892
- var mergeWith, isArray, getPath, buildTarHandler, filterFile, scanDirHandle, updatePackageJson, outputVueName, isChartModuleRoot, scanFileFindChart, cachedScanResult, cachedScanRoot, scanAllDirectories, clearScanCache;
771
+ var mergeWith, isArray, getPath, buildTarHandler, filterFileWorker, filterFile, scanDirHandle, updatePackageJson, outputVueName, isChartModuleRoot, scanFileFindChart, cachedScanResult, cachedScanRoot, scanAllDirectories, clearScanCache;
893
772
  var init_fs = __esm({
894
773
  "src/utils/fs.ts"() {
895
774
  "use strict";
@@ -924,24 +803,36 @@ var init_fs = __esm({
924
803
  writeStream.on("error", reject);
925
804
  });
926
805
  };
806
+ filterFileWorker = async (dir, ignoreFiles) => {
807
+ const [err, resDir] = await to2(fs4.readdir(dir));
808
+ if (err) {
809
+ return exit(err.message);
810
+ }
811
+ await Promise.all(
812
+ resDir.map(async (v) => {
813
+ const itemPath = path4.resolve(dir, v);
814
+ if (ignoreFiles.includes(v)) {
815
+ await fs4.remove(itemPath);
816
+ return;
817
+ }
818
+ const itemStats = await fs4.stat(itemPath);
819
+ if (itemStats.isDirectory()) {
820
+ await filterFileWorker(itemPath, ignoreFiles);
821
+ }
822
+ })
823
+ );
824
+ };
927
825
  filterFile = async (dirPath, ignoreFiles = [".git", ".vscode", ".DS_Store", ".idea"]) => {
928
826
  const dir = dirPath || process.cwd();
929
827
  const res = await fs4.pathExists(dir);
930
828
  if (res) {
829
+ const rootSegments = dir.split(path4.sep);
830
+ if (ignoreFiles.some((ignoreFile) => rootSegments.includes(ignoreFile))) {
831
+ return;
832
+ }
931
833
  const isDir = await fs4.stat(dir);
932
834
  if (isDir.isDirectory()) {
933
- const [err, resDir] = await to2(fs4.readdir(dir));
934
- if (err) {
935
- return exit(err.message);
936
- }
937
- await Promise.all(resDir.map((v) => filterFile(path4.resolve(dir, v), ignoreFiles)));
938
- } else {
939
- for (const ignoreFile of ignoreFiles) {
940
- if (dir.includes(ignoreFile)) {
941
- await fs4.remove(dir);
942
- return;
943
- }
944
- }
835
+ await filterFileWorker(dir, ignoreFiles);
945
836
  }
946
837
  }
947
838
  };
@@ -1019,7 +910,7 @@ var init_fs = __esm({
1019
910
  ]);
1020
911
  return componentsExists && tailoredExists;
1021
912
  };
1022
- scanFileFindChart = async (maxDepth = 1) => {
913
+ scanFileFindChart = async (maxDepth = 10) => {
1023
914
  try {
1024
915
  const gitHit = await detectChartModuleByGit();
1025
916
  if (gitHit) {
@@ -1027,18 +918,14 @@ var init_fs = __esm({
1027
918
  }
1028
919
  } catch {
1029
920
  }
921
+ let dir = process.cwd();
1030
922
  for (let i = 0; i < maxDepth; i++) {
1031
- let relativePath = "./";
1032
- if (i > 0) {
1033
- relativePath += "../".repeat(i);
1034
- }
1035
- const cwd = path4.resolve(process.cwd(), relativePath);
1036
- const packageJsonPath = path4.resolve(cwd, "package.json");
923
+ const packageJsonPath = path4.join(dir, "package.json");
1037
924
  if (await fs4.pathExists(packageJsonPath)) {
1038
925
  try {
1039
926
  const pkg = await fs4.readJson(packageJsonPath);
1040
- if (await isChartModuleRoot(cwd, pkg.name)) {
1041
- return { root: cwd };
927
+ if (await isChartModuleRoot(dir, pkg.name)) {
928
+ return { root: dir };
1042
929
  }
1043
930
  } catch (error) {
1044
931
  if (process.env.DEBUG === "true") {
@@ -1049,6 +936,10 @@ var init_fs = __esm({
1049
936
  }
1050
937
  }
1051
938
  }
939
+ if (dir === path4.parse(dir).root) {
940
+ break;
941
+ }
942
+ dir = path4.dirname(dir);
1052
943
  }
1053
944
  return false;
1054
945
  };
@@ -1103,7 +994,7 @@ __export(utils_exports, {
1103
994
  getPath: () => getPath,
1104
995
  getPrivateSource: () => getPrivateSource,
1105
996
  get_cli_config: () => get_cli_config,
1106
- get_plugin_latest_version: () => get_plugin_latest_version2,
997
+ get_plugin_latest_version: () => get_plugin_latest_version,
1107
998
  get_update_log: () => get_update_log,
1108
999
  groupPrompts: () => groupPrompts,
1109
1000
  handleCancel: () => handleCancel,
@@ -1137,6 +1028,7 @@ __export(utils_exports, {
1137
1028
  wrapAsyncOperation: () => wrapAsyncOperation
1138
1029
  });
1139
1030
  import * as p from "@clack/prompts";
1031
+ import pc2 from "picocolors";
1140
1032
  async function textPrompt(options) {
1141
1033
  return promptUntilValid("text", options);
1142
1034
  }
@@ -1226,7 +1118,7 @@ async function progress(items, handler, options) {
1226
1118
  }
1227
1119
  }
1228
1120
  }
1229
- var import_picocolors2, spinner2, intro2, outro2, note2, handleCancel, normalizeValidationResult, validatePromptValue, promptUntilValid, promptHandlers, checkUpdate;
1121
+ var spinner2, intro2, outro2, note2, handleCancel, normalizeValidationResult, validatePromptValue, promptUntilValid, promptHandlers, checkUpdate;
1230
1122
  var init_utils = __esm({
1231
1123
  "src/utils/index.ts"() {
1232
1124
  "use strict";
@@ -1236,7 +1128,6 @@ var init_utils = __esm({
1236
1128
  init_error();
1237
1129
  init_fs();
1238
1130
  init_log();
1239
- import_picocolors2 = __toESM(require_picocolors(), 1);
1240
1131
  init_api();
1241
1132
  init_config();
1242
1133
  init_log();
@@ -1253,9 +1144,9 @@ var init_utils = __esm({
1253
1144
  message: (msg) => s.message(msg)
1254
1145
  };
1255
1146
  };
1256
- intro2 = (title) => p.intro(import_picocolors2.default.bgCyan(import_picocolors2.default.black(` ${title} `)));
1147
+ intro2 = (title) => p.intro(pc2.bgCyan(pc2.black(` ${title} `)));
1257
1148
  outro2 = (message) => {
1258
- if (message) p.outro(import_picocolors2.default.green(message));
1149
+ if (message) p.outro(pc2.green(message));
1259
1150
  else p.outro();
1260
1151
  };
1261
1152
  note2 = (message, title) => p.note(message, title);
@@ -1536,7 +1427,7 @@ async function getStandaloneDependencyVersion(packageName, defaultVersion, shoul
1536
1427
  [packageName]: `^${defaultVersion}`
1537
1428
  };
1538
1429
  }
1539
- return get_plugin_latest_version2(packageName, defaultVersion);
1430
+ return get_plugin_latest_version(packageName, defaultVersion);
1540
1431
  }
1541
1432
  async function handleChartTemplate(options) {
1542
1433
  const { projectName, projectPath, chartModule, author, chartType, chartId, isTs } = options;
@@ -1712,6 +1603,7 @@ import { fileURLToPath } from "node:url";
1712
1603
  import clear from "clear";
1713
1604
  import { $ as $3 } from "execa";
1714
1605
  import fs6 from "fs-extra";
1606
+ import pc3 from "picocolors";
1715
1607
  async function resolveTemplatePath(templateName, baseDir = __dirname) {
1716
1608
  const candidates = Array.from(new Set(getTemplatePathCandidates(templateName, baseDir)));
1717
1609
  for (const candidate of candidates) {
@@ -1824,19 +1716,18 @@ async function create(commandList = []) {
1824
1716
  installSpinner.stop();
1825
1717
  clear();
1826
1718
  await welcomeCli();
1827
- log.message(import_picocolors3.default.cyan("\n\u5B8C\u6210. \u73B0\u5728\u53EF\u4EE5\u6267\u884C:\n"));
1719
+ log.message(pc3.cyan("\n\u5B8C\u6210. \u73B0\u5728\u53EF\u4EE5\u6267\u884C:\n"));
1828
1720
  const cdPath = getCdRelativePath(process.cwd(), projectPath);
1829
1721
  log.success(` cd ${cdPath}`);
1830
1722
  log.success(` pnpm dev`);
1831
1723
  log.message("");
1832
1724
  clearScanCache();
1833
- outro2(import_picocolors3.default.green(`\u56FE\u8868 "${projectName}" \u521B\u5EFA\u6210\u529F!`));
1725
+ outro2(pc3.green(`\u56FE\u8868 "${projectName}" \u521B\u5EFA\u6210\u529F!`));
1834
1726
  }
1835
- var import_picocolors3, __filename, __dirname, getTemplatePathCandidates, CHART_TYPES;
1727
+ var __filename, __dirname, getTemplatePathCandidates, CHART_TYPES;
1836
1728
  var init_create = __esm({
1837
1729
  "src/create/index.ts"() {
1838
1730
  "use strict";
1839
- import_picocolors3 = __toESM(require_picocolors(), 1);
1840
1731
  init_schemas();
1841
1732
  init_utils();
1842
1733
  init_chart();
@@ -1881,7 +1772,6 @@ async function dev() {
1881
1772
  const packageJsonPath = join(cwd, "package.json");
1882
1773
  if (!await fs7.pathExists(packageJsonPath)) {
1883
1774
  exit("\u672A\u627E\u5230 package.json \u6587\u4EF6\uFF0C\u8BF7\u786E\u4FDD\u5728\u9879\u76EE\u6839\u76EE\u5F55\u6267\u884C\u6B64\u547D\u4EE4");
1884
- return;
1885
1775
  }
1886
1776
  let packageJson;
1887
1777
  try {
@@ -1893,7 +1783,6 @@ async function dev() {
1893
1783
  if (!packageJson.scripts?.dev) {
1894
1784
  log.info('\u793A\u4F8B\uFF1A{"scripts": {"dev": "vite"}}');
1895
1785
  exit("package.json \u4E2D\u672A\u5B9A\u4E49 dev \u811A\u672C\uFF0C\u8BF7\u5148\u6DFB\u52A0 dev \u811A\u672C");
1896
- return;
1897
1786
  }
1898
1787
  log.info(`\u6B63\u5728\u6267\u884C dev \u811A\u672C\uFF1A${packageJson.scripts.dev}`);
1899
1788
  let interrupted = false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pangu-vis-cli",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "vis-cli",
5
5
  "keywords": [
6
6
  "pangu-vis",