pangu-vis-cli 1.0.0
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/LICENSE +21 -0
- package/README.md +629 -0
- package/bin/index.js +3 -0
- package/dist/action.js +1 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/select.js +1 -0
- package/dist/build/index.js +1 -0
- package/dist/config/index.js +1 -0
- package/dist/create/chart/index.js +1 -0
- package/dist/create/index.js +1 -0
- package/dist/dev/index.js +1 -0
- package/dist/index.js +1 -0
- package/dist/pack/index.js +1 -0
- package/dist/renew/index.js +1 -0
- package/dist/tar/index.js +1 -0
- package/dist/tidier/index.js +1 -0
- package/dist/update/index.js +1 -0
- package/dist/upload/index.js +1 -0
- package/dist/utils.js +1 -0
- package/dist/vpack/index.js +1 -0
- package/dist/vpack/menu.js +1 -0
- package/package.json +63 -0
- package/template/chart/README.md +1 -0
- package/template/chart/example/App.vue +12 -0
- package/template/chart/example/main.js +4 -0
- package/template/chart/index.html +12 -0
- package/template/chart/index.js +12 -0
- package/template/chart/jsconfig.json +14 -0
- package/template/chart/package.json +15 -0
- package/template/chart/public/images/index.png +0 -0
- package/template/chart/render.js +16 -0
- package/template/chart/src/config.js +1 -0
- package/template/chart/src/data.js +1 -0
- package/template/chart/src/index.vue +3 -0
- package/template/chart/src/style.js +8 -0
- package/template/ts/env.d.ts +1 -0
- package/template/ts/tsconfig.app.json +13 -0
- package/template/ts/tsconfig.json +11 -0
- package/template/ts/tsconfig.node.json +19 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Jaxon
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
# pangu-vis-cli
|
|
2
|
+
|
|
3
|
+
> 盘古可视化图表开发工具链 - 一站式图表创建、开发、打包、上传解决方案
|
|
4
|
+
|
|
5
|
+
## 简介
|
|
6
|
+
|
|
7
|
+
`pangu-vis-cli` 是一个专为盘古可视化平台设计的命令行工具,提供图表包的创建、开发调试、打包构建、上传发布等完整工作流支持。通过简洁的命令,开发者可以快速创建标准化的图表项目,进行本地开发调试,并一键打包上传至泰合社区。
|
|
8
|
+
|
|
9
|
+
**核心价值**:
|
|
10
|
+
|
|
11
|
+
- 🚀 **快速初始化** - 一键创建标准化图表项目模板
|
|
12
|
+
- 🔧 **开发友好** - 本地开发环境自动配置
|
|
13
|
+
- 📦 **智能打包** - 版本管理、自动压缩、依赖优化
|
|
14
|
+
- 📤 **便捷发布** - 认证上传至图表社区
|
|
15
|
+
- ⚙️ **灵活配置** - 自动化行为可自定义
|
|
16
|
+
|
|
17
|
+
## 特性
|
|
18
|
+
|
|
19
|
+
- ✅ 支持 8 种图表类型(折线图、柱状图、饼图、表格、地图、文本、指标、交互)
|
|
20
|
+
- ✅ 可选 TypeScript 支持
|
|
21
|
+
- ✅ 交互式命令行提示
|
|
22
|
+
- ✅ 自动版本同步(base.json ↔ package.json)
|
|
23
|
+
- ✅ 并发打包优化
|
|
24
|
+
- ✅ tar.gz 压缩包生成
|
|
25
|
+
- ✅ 用户认证与 token 管理
|
|
26
|
+
- ✅ 自动更新检测
|
|
27
|
+
- ✅ 跨平台支持(macOS / Windows / Linux)
|
|
28
|
+
|
|
29
|
+
## 安装
|
|
30
|
+
|
|
31
|
+
### macOS
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 全局安装
|
|
35
|
+
sudo npm install -g pangu-vis-cli
|
|
36
|
+
|
|
37
|
+
# 或使用 pnpm
|
|
38
|
+
sudo pnpm install -g pangu-vis-cli
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Windows
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 全局安装(管理员权限)
|
|
45
|
+
npm install -g pangu-vis-cli
|
|
46
|
+
|
|
47
|
+
# 或使用 pnpm
|
|
48
|
+
pnpm install -g pangu-vis-cli
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Linux
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 全局安装
|
|
55
|
+
sudo npm install -g pangu-vis-cli
|
|
56
|
+
|
|
57
|
+
# 或使用 pnpm
|
|
58
|
+
sudo pnpm install -g pangu-vis-cli
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 验证安装
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# 查看版本
|
|
65
|
+
pv -v
|
|
66
|
+
# 或
|
|
67
|
+
pvis -v
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 快速开始
|
|
71
|
+
|
|
72
|
+
创建第一个图表项目:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 创建图表包
|
|
76
|
+
pv create my-line-chart
|
|
77
|
+
|
|
78
|
+
# 进入项目目录(根据提示)
|
|
79
|
+
cd packages/components/my-line-chart
|
|
80
|
+
|
|
81
|
+
# 启动开发环境
|
|
82
|
+
pnpm dev
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
完整工作流:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# 1. 创建图表包
|
|
89
|
+
pv create my-chart
|
|
90
|
+
|
|
91
|
+
# 2. 开发调试
|
|
92
|
+
cd packages/components/my-chart
|
|
93
|
+
pnpm dev
|
|
94
|
+
|
|
95
|
+
# 3. 打包构建(在图表包目录)
|
|
96
|
+
pv build
|
|
97
|
+
|
|
98
|
+
# 4. 用户认证
|
|
99
|
+
pv auth
|
|
100
|
+
|
|
101
|
+
# 5. 上传发布
|
|
102
|
+
pv upload my-chart_v1.0.0.tar.gz
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 命令详解
|
|
106
|
+
|
|
107
|
+
### pv create - 创建图表包
|
|
108
|
+
|
|
109
|
+
创建新的图表项目模板。
|
|
110
|
+
|
|
111
|
+
**别名**:`pv c`
|
|
112
|
+
|
|
113
|
+
**用法**:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
pv create <project-name>
|
|
117
|
+
pv c <project-name>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**交互式选项**:
|
|
121
|
+
|
|
122
|
+
1. **图表类型选择**:
|
|
123
|
+
- `line` - 折线图
|
|
124
|
+
- `bar` - 柱状图
|
|
125
|
+
- `pie` - 饼图
|
|
126
|
+
- `form` - 表格
|
|
127
|
+
- `map` - 地图
|
|
128
|
+
- `text` - 文本
|
|
129
|
+
- `indicator` - 指标
|
|
130
|
+
- `interaction` - 交互
|
|
131
|
+
- `other` - 其他
|
|
132
|
+
|
|
133
|
+
2. **TypeScript 支持**:
|
|
134
|
+
- `yes` - 启用 TypeScript
|
|
135
|
+
- `no` - 使用 JavaScript(默认)
|
|
136
|
+
|
|
137
|
+
3. **图表命名规则**:
|
|
138
|
+
- 必须以小写字母开头
|
|
139
|
+
- 仅允许小写字母、数字、下划线
|
|
140
|
+
- 推荐添加自定义前缀防止冲突
|
|
141
|
+
|
|
142
|
+
**示例**:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# 创建折线图(交互式)
|
|
146
|
+
pv create custom_line_chart
|
|
147
|
+
|
|
148
|
+
# 创建柱状图并启用 TypeScript
|
|
149
|
+
pv create custom_bar_chart
|
|
150
|
+
# 在交互提示中选择 "bar" 类型,启用 TS
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**创建目录结构**:
|
|
154
|
+
|
|
155
|
+
- 在图表库根目录下:`packages/components/<project-name>/`
|
|
156
|
+
- 在 tailored 目录下:`packages/tailored/<project-name>/`
|
|
157
|
+
|
|
158
|
+
**自动执行**:
|
|
159
|
+
|
|
160
|
+
- 复制模板文件
|
|
161
|
+
- 配置图表类型和名称
|
|
162
|
+
- 安装项目依赖(pnpm install)
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
### pv build - 单个图表打包
|
|
167
|
+
|
|
168
|
+
打包单个图表组件为 tar.gz 压缩包,准备上传。
|
|
169
|
+
|
|
170
|
+
**别名**:`pv b`
|
|
171
|
+
|
|
172
|
+
**用法**:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
pv build # 打包当前目录图表
|
|
176
|
+
pv build <path> # 打包指定路径图表
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**参数**:
|
|
180
|
+
|
|
181
|
+
- `<path>` - 图表包路径(相对或绝对)
|
|
182
|
+
|
|
183
|
+
**示例**:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# 在图表包目录下执行
|
|
187
|
+
cd packages/components/my-chart
|
|
188
|
+
pv build
|
|
189
|
+
|
|
190
|
+
# 指定路径打包
|
|
191
|
+
pv build packages/components/my-chart
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**打包流程**:
|
|
195
|
+
|
|
196
|
+
1. 版本同步(`base.json` ↔ `package.json`)
|
|
197
|
+
2. 执行 `pnpm build`
|
|
198
|
+
3. 生成产物目录:`<chart-name>_v<version>/`
|
|
199
|
+
4. 可选删除 `es/` 目录(根据配置)
|
|
200
|
+
5. 过滤无用文件(`.git`, `.vscode`, `.DS_Store`)
|
|
201
|
+
6. 打包为 tar.gz:`<chart-name>_v<version>.tar.gz`
|
|
202
|
+
7. 可选删除打包目录(根据配置 `autoRemove`)
|
|
203
|
+
8. 可选自动上传(根据配置 `autoUpload`)
|
|
204
|
+
|
|
205
|
+
**产物文件**:
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
my-chart_v1.0.0.tar.gz
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
### pv dev - 启动开发环境
|
|
214
|
+
|
|
215
|
+
启动图表包的本地开发服务器。
|
|
216
|
+
|
|
217
|
+
**别名**:`pv d`
|
|
218
|
+
|
|
219
|
+
**用法**:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
pv dev # 启动当前目录开发环境
|
|
223
|
+
pv dev <path> # 启动指定路径开发环境
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**参数**:
|
|
227
|
+
|
|
228
|
+
- `<path>` - 图表包路径
|
|
229
|
+
|
|
230
|
+
**示例**:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# 在图表包目录下执行
|
|
234
|
+
cd packages/components/my-chart
|
|
235
|
+
pv dev
|
|
236
|
+
|
|
237
|
+
# 指定路径启动
|
|
238
|
+
pv dev packages/components/my-chart
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**自动检测**:
|
|
242
|
+
|
|
243
|
+
- 查找 `package.json` 中的 `dev` 或 `serve` 脚本
|
|
244
|
+
- 执行 `pnpm dev` 或 `pnpm serve`
|
|
245
|
+
- 实时预览图表开发效果
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
### pv upload - 上传图表包
|
|
250
|
+
|
|
251
|
+
上传打包后的 tar.gz 文件至泰合社区服务器。
|
|
252
|
+
|
|
253
|
+
**别名**:`pv u`
|
|
254
|
+
|
|
255
|
+
**前置条件**:需先通过 `pv auth` 进行用户认证。
|
|
256
|
+
|
|
257
|
+
**用法**:
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
pv upload # 上传当前目录所有 .tar.gz 文件
|
|
261
|
+
pv upload <file.tar.gz> # 上传指定 tar.gz 文件
|
|
262
|
+
pv upload <path> # 上传指定目录下的所有 .tar.gz 文件
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**参数**:
|
|
266
|
+
|
|
267
|
+
- `<file.tar.gz>` - tar.gz 文件路径
|
|
268
|
+
- `<path>` - 目录路径
|
|
269
|
+
|
|
270
|
+
**示例**:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
# 用户认证(首次)
|
|
274
|
+
pv auth
|
|
275
|
+
|
|
276
|
+
# 上传当前目录所有 tar.gz
|
|
277
|
+
pv upload
|
|
278
|
+
|
|
279
|
+
# 上传指定文件
|
|
280
|
+
pv upload my-chart_v1.0.0.tar.gz
|
|
281
|
+
|
|
282
|
+
# 上传指定目录下的所有 tar.gz
|
|
283
|
+
pv upload dist/
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**认证要求**:
|
|
287
|
+
|
|
288
|
+
- 未登录时自动触发认证流程
|
|
289
|
+
- 需输入泰合社区用户名和密码
|
|
290
|
+
- token 自动保存,后续无需重复登录
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
### pv auth - 用户认证
|
|
295
|
+
|
|
296
|
+
登录泰合社区,获取上传权限。
|
|
297
|
+
|
|
298
|
+
**别名**:`pv a`
|
|
299
|
+
|
|
300
|
+
**用法**:
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
pv auth # 交互式登录
|
|
304
|
+
pv auth <user> <password> # 命令行登录
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**参数**:
|
|
308
|
+
|
|
309
|
+
- `<user>` - 泰合社区用户名
|
|
310
|
+
- `<password>` - 泰合社区密码
|
|
311
|
+
|
|
312
|
+
**示例**:
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
# 交互式登录(推荐)
|
|
316
|
+
pv auth
|
|
317
|
+
# 按提示输入用户名和密码
|
|
318
|
+
|
|
319
|
+
# 命令行登录
|
|
320
|
+
pv auth myuser mypassword
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**认证流程**:
|
|
324
|
+
|
|
325
|
+
1. 输入用户名和密码(密码经 MD5 加密)
|
|
326
|
+
2. 请求服务器 token
|
|
327
|
+
3. 保存认证信息至本地配置文件
|
|
328
|
+
|
|
329
|
+
**认证信息存储位置**:
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
~/.pangu-vis-store/.cli_store
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**认证失败处理**:
|
|
336
|
+
|
|
337
|
+
- 失败后可重试(最多 3 次)
|
|
338
|
+
- 失败 3 次后提示稍后尝试
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
### pv tar - tar 打包工具
|
|
343
|
+
|
|
344
|
+
通用的 tar.gz 打包命令,可打包任意目录或文件。
|
|
345
|
+
|
|
346
|
+
**别名**:`pv t`
|
|
347
|
+
|
|
348
|
+
**用法**:
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
pv tar <targetDir> <name> [distDir] [distName]
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**参数**:
|
|
355
|
+
|
|
356
|
+
- `<targetDir>` - 目标目录(必需)
|
|
357
|
+
- `<name>` - 打包文件名(必需)
|
|
358
|
+
- `<distDir>` - 输出目录(可选,默认为 targetDir)
|
|
359
|
+
- `<distName>` - 输出文件名(可选,默认为 name)
|
|
360
|
+
|
|
361
|
+
**示例**:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
# 打包当前目录下的 dist 为 dist.tar.gz
|
|
365
|
+
pv tar ./dist dist
|
|
366
|
+
|
|
367
|
+
# 打包并指定输出目录
|
|
368
|
+
pv tar ./dist dist ./output
|
|
369
|
+
|
|
370
|
+
# 打包并指定输出文件名
|
|
371
|
+
pv tar ./dist dist ./output my-dist
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
### pv config - 配置管理
|
|
377
|
+
|
|
378
|
+
配置 CLI 工具的自动化行为。
|
|
379
|
+
|
|
380
|
+
**别名**:`pv set`
|
|
381
|
+
|
|
382
|
+
**用法**:
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
pv config
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**交互式配置项**:
|
|
389
|
+
|
|
390
|
+
| 配置项 | 说明 | 默认值 |
|
|
391
|
+
| -------------- | ------------------------------ | ------------ |
|
|
392
|
+
| `autoUpload` | 图表打包后是否自动上传泰合社区 | `no` (false) |
|
|
393
|
+
| `autoRemove` | 打包后是否自动删除打包目录 | `yes` (true) |
|
|
394
|
+
| `autoRemoveEs` | 打包后是否移除 es 目录 | `yes` (true) |
|
|
395
|
+
|
|
396
|
+
**示例**:
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
pv config
|
|
400
|
+
# 按提示选择配置项
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
**配置文件位置**:
|
|
404
|
+
|
|
405
|
+
```
|
|
406
|
+
~/.pangu-vis-store/.cli_store
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**配置文件格式**:
|
|
410
|
+
|
|
411
|
+
```json
|
|
412
|
+
{
|
|
413
|
+
"user": "your-username",
|
|
414
|
+
"password": "your-password",
|
|
415
|
+
"token": "your-token",
|
|
416
|
+
"autoUpload": false,
|
|
417
|
+
"autoRemove": true,
|
|
418
|
+
"autoRemoveEs": true
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
### pv update - CLI 更新
|
|
425
|
+
|
|
426
|
+
检查并更新 CLI 工具至最新版本。
|
|
427
|
+
|
|
428
|
+
**别名**:`pv up`
|
|
429
|
+
|
|
430
|
+
**用法**:
|
|
431
|
+
|
|
432
|
+
```bash
|
|
433
|
+
pv update
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**更新流程**:
|
|
437
|
+
|
|
438
|
+
1. 检查 npm 是否有新版本
|
|
439
|
+
2. 提示是否更新
|
|
440
|
+
3. 执行全局安装:`npm i -g pangu-vis-cli`
|
|
441
|
+
4. macOS/Linux 自动启用 sudo(如需)
|
|
442
|
+
|
|
443
|
+
**示例**:
|
|
444
|
+
|
|
445
|
+
```bash
|
|
446
|
+
# 检查更新
|
|
447
|
+
pv update
|
|
448
|
+
|
|
449
|
+
# 已是最新版本提示
|
|
450
|
+
当前版本已是最新!
|
|
451
|
+
|
|
452
|
+
# 有新版本时提示
|
|
453
|
+
是否更新Cli工具? yes/no
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
**自动检查**:
|
|
457
|
+
|
|
458
|
+
- CLI 每次执行命令时自动检查更新(24小时内只检查一次)
|
|
459
|
+
- 检测到新版本时提示用户更新
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## 配置
|
|
464
|
+
|
|
465
|
+
### 配置文件位置
|
|
466
|
+
|
|
467
|
+
CLI 配置信息存储在用户主目录:
|
|
468
|
+
|
|
469
|
+
```
|
|
470
|
+
~/.pangu-vis-store/.cli_store
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### 配置项说明
|
|
474
|
+
|
|
475
|
+
| 配置项 | 类型 | 说明 | 默认值 |
|
|
476
|
+
| -------------- | ------- | ----------------------- | ------- |
|
|
477
|
+
| `user` | string | 泰合社区用户名 | `''` |
|
|
478
|
+
| `password` | string | 泰合社区密码(MD5加密) | `''` |
|
|
479
|
+
| `token` | string | 认证 token | `''` |
|
|
480
|
+
| `autoUpload` | boolean | 打包后自动上传 | `false` |
|
|
481
|
+
| `autoRemove` | boolean | 打包后删除打包目录 | `true` |
|
|
482
|
+
| `autoRemoveEs` | boolean | 打包后删除 es 目录 | `true` |
|
|
483
|
+
|
|
484
|
+
### 修改配置
|
|
485
|
+
|
|
486
|
+
**方法 1:交互式配置**
|
|
487
|
+
|
|
488
|
+
```bash
|
|
489
|
+
pv config
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
**方法 2:手动编辑**
|
|
493
|
+
编辑 `~/.pangu-vis-store/.cli_store` 文件。
|
|
494
|
+
|
|
495
|
+
### 清除认证
|
|
496
|
+
|
|
497
|
+
如需重新登录,删除配置文件中的 `token` 字段:
|
|
498
|
+
|
|
499
|
+
```bash
|
|
500
|
+
# 编辑配置文件
|
|
501
|
+
vi ~/.pangu-vis-store/.cli_store
|
|
502
|
+
|
|
503
|
+
# 删除 token 行后重新认证
|
|
504
|
+
pv auth
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
## 使用示例
|
|
508
|
+
|
|
509
|
+
### 示例 1:创建并发布折线图
|
|
510
|
+
|
|
511
|
+
完整流程演示:
|
|
512
|
+
|
|
513
|
+
```bash
|
|
514
|
+
# 1. 创建折线图项目
|
|
515
|
+
pv create custom_line_chart
|
|
516
|
+
# 选择:折线图、不使用 TypeScript
|
|
517
|
+
|
|
518
|
+
# 2. 进入项目目录(根据提示)
|
|
519
|
+
cd packages/components/custom_line_chart
|
|
520
|
+
|
|
521
|
+
# 3. 启动开发环境
|
|
522
|
+
pnpm dev
|
|
523
|
+
# 在浏览器中开发调试图表
|
|
524
|
+
|
|
525
|
+
# 4. 开发完成后,打包图表
|
|
526
|
+
pv build
|
|
527
|
+
# 生成:custom_line_chart_v1.0.0.tar.gz
|
|
528
|
+
|
|
529
|
+
# 5. 用户认证
|
|
530
|
+
pv auth
|
|
531
|
+
# 输入泰合社区用户名和密码
|
|
532
|
+
|
|
533
|
+
# 6. 上传发布
|
|
534
|
+
pv upload custom_line_chart_v1.0.0.tar.gz
|
|
535
|
+
# 上传成功提示
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### 示例 2:自动化配置
|
|
539
|
+
|
|
540
|
+
配置打包后自动上传:
|
|
541
|
+
|
|
542
|
+
```bash
|
|
543
|
+
# 配置自动上传
|
|
544
|
+
pv config
|
|
545
|
+
# 选择:autoUpload = yes
|
|
546
|
+
|
|
547
|
+
# 以后打包会自动上传
|
|
548
|
+
pv build my-chart
|
|
549
|
+
# 打包完成后自动上传,无需手动执行 pv upload
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
## 命令速查表
|
|
553
|
+
|
|
554
|
+
| 命令 | 别名 | 说明 | 是否需要认证 |
|
|
555
|
+
| ----------- | -------- | ------------ | ------------------------ |
|
|
556
|
+
| `pv create` | `pv c` | 创建图表包 | 可选(登录可注册图表ID) |
|
|
557
|
+
| `pv pack` | `pv pk` | 图表库打包 | ❌ |
|
|
558
|
+
| `pv build` | `pv b` | 单个图表打包 | ❌ |
|
|
559
|
+
| `pv dev` | `pv d` | 启动开发环境 | ❌ |
|
|
560
|
+
| `pv upload` | `pv u` | 上传图表包 | ✅ |
|
|
561
|
+
| `pv auth` | `pv a` | 用户认证 | ❌ |
|
|
562
|
+
| `pv tar` | `pv t` | tar 打包工具 | ❌ |
|
|
563
|
+
| `pv config` | `pv set` | 配置管理 | ❌ |
|
|
564
|
+
| `pv update` | `pv up` | CLI 更新 | ❌ |
|
|
565
|
+
|
|
566
|
+
## 常见问题
|
|
567
|
+
|
|
568
|
+
### 1. 安装失败或权限不足
|
|
569
|
+
|
|
570
|
+
**macOS/Linux**:
|
|
571
|
+
|
|
572
|
+
```bash
|
|
573
|
+
sudo npm install -g pangu-vis-cli
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
**Windows**:
|
|
577
|
+
以管理员身份运行终端,再执行安装命令。
|
|
578
|
+
|
|
579
|
+
### 2. 登录认证失败
|
|
580
|
+
|
|
581
|
+
- 检查用户名和密码是否正确
|
|
582
|
+
- 确认泰合社区账号已激活
|
|
583
|
+
- 失败 3 次后需稍后再试
|
|
584
|
+
|
|
585
|
+
### 3. 图表包名称重复
|
|
586
|
+
|
|
587
|
+
- 使用自定义前缀避免冲突
|
|
588
|
+
- 遵循命名规则:小写字母开头,仅允许字母、数字、下划线
|
|
589
|
+
|
|
590
|
+
### 4. 打包产物找不到
|
|
591
|
+
|
|
592
|
+
- 检查配置 `autoRemove` 是否为 `yes`
|
|
593
|
+
- 打包产物默认在图表包目录下
|
|
594
|
+
- 使用 `pv tar` 手动指定输出目录
|
|
595
|
+
|
|
596
|
+
### 5. 上传失败
|
|
597
|
+
|
|
598
|
+
- 确认已通过 `pv auth` 认证
|
|
599
|
+
- 检查网络连接(泰合社区服务器)
|
|
600
|
+
- 确认 tar.gz 文件格式正确
|
|
601
|
+
|
|
602
|
+
### 6. 版本号不同步
|
|
603
|
+
|
|
604
|
+
- CLI 自动同步 `base.json` 和 `package.json` 版本
|
|
605
|
+
- 手动修改版本时需同时更新两个文件
|
|
606
|
+
- 或使用 `pv build` 自动同步
|
|
607
|
+
|
|
608
|
+
### 7. 开发环境启动失败
|
|
609
|
+
|
|
610
|
+
- 确认已安装 `pnpm`
|
|
611
|
+
- 检查 `package.json` 中是否有 `dev` 或 `serve` 脚本
|
|
612
|
+
- 安装依赖:`pnpm install`
|
|
613
|
+
|
|
614
|
+
## 许可证
|
|
615
|
+
|
|
616
|
+
[MIT License](./LICENSE)
|
|
617
|
+
|
|
618
|
+
Copyright (c) 2023 Jaxon
|
|
619
|
+
|
|
620
|
+
## 作者
|
|
621
|
+
|
|
622
|
+
**Jaxon**
|
|
623
|
+
|
|
624
|
+
如有问题或建议,请联系作者或在项目仓库提交 Issue。
|
|
625
|
+
|
|
626
|
+
---
|
|
627
|
+
|
|
628
|
+
**最后更新**:2026-06-17
|
|
629
|
+
**版本**:1.0.0
|
package/bin/index.js
ADDED
package/dist/action.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";module.exports=[{command:"create",alias:"c",desc:"创建图表包",examples:["pv create <project-name>"]},{command:"pack",alias:"pk",desc:"图表库打包",examples:["pv pack"],option:["-e","-c"]},{command:"vpack",alias:"vp",desc:"Pack all charts",examples:["pv vpack"]},{command:"build",alias:"b",desc:"单个图表打包",examples:["pv build"]},{command:"dev",alias:"d",desc:"Launch Project",examples:["pv dev"]},{command:"upload",alias:"u",desc:"上传图表包",examples:["pv upload"],isAuth:!0},{command:"auth",alias:"a",desc:"User Information",examples:["pv auth"]},{command:"tar",alias:"t",desc:"tar",examples:["pv tar"]},{command:"config",alias:"set",desc:"配置",examples:["pv config"]},{command:"update",alias:"up",desc:"更新cli",examples:["pv update"]},{command:"tidier",alias:"tid",desc:"整理图表库",examples:["pv tidier"]},{command:"*",alias:"",desc:"command not found",examples:[]}];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const{requestToken:s,prompt:e,exit:r,log:a}=require("../utils"),t=require("js-md5"),o=async u=>{u++;const i=await e([{type:"text",name:"user",message:"请输入用户名: user"},{type:"password",name:"password",message:"请输入密码: password"}]),n=await s(i.user,t(i.password));return console.log(),n?(a.success("登录成功!"),i.user):u<3?(a.err("登录失败,请重新输入:"),await o(u)):void r("请稍后尝试!")};module.exports=async function(e=[]){const r={user:e[0]||"",password:e[1]||""};if(r.password&&r.user){if(await s(r.user,t(r.password)))return r.user}return await o(0)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("opn"),{prompt:i,log:t,wait:s,API_IP:r}=require("../utils");module.exports=async function(){if("register"!==(await i([{type:"select",name:"mode",message:"请选择登录或注册",choices:[{title:"登录",description:"Sign in",value:"SignIn"},{title:"注册",description:"register",value:"register"}]}])).mode){return await require("./index")()}{const i=r;console.log(),t.success(`浏览器如果未正常打开,可以手动打开:${i}`),await e(i),await s(.1),process.exit(0)}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const t=require("path"),e=require("yann-fs").default,{to:a}=require("await-to-js"),{exit:i,buildTarHandler:o,filterFile:r,get_cli_config:s,getPath:n,get_delete_es:l,buildPathHandler:c,versionHandle:u}=require("../utils"),w=async(n,w=null)=>{const d=await u(n);if("string"==typeof d)return i(d);const{name:v,version:p}=d;await c(n);const f=v.split("/").at(-1)+"_v"+p,g=t.resolve(n,f);await l()&&await e.remove(t.resolve(g,"es")),await r(g);const m=(w?`${w}/${f}`:g)+".tar.gz";await e.remove(m),await a(o(n,f,w));const[q]=await s();q.autoRemove&&await e.remove(g),q.autoUpload&&await require("../upload/index")([m])};module.exports=async function(a=[]){const o=process.cwd();if(a[0]){const t=a[0].trim();return void await w(n(t))}const r=t.resolve(o,"package.json"),[s,l]=await e.pathExists(r);s?i("找不到目录"):l&&await w(o)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const{prompt:e,set_cli_config:o,get_cli_config:t,log:a}=require("../utils");module.exports=async function(i=[]){const[s]=await t(),n=(e,o,t)=>o in e?e[o]:t,c=await e([{name:"autoUpload",message:"图表打包后是否自动上传泰合社区?",type:"toggle",initial:n(s,"autoUpload",!1),active:"yes",inactive:"no"},{name:"autoRemove",message:"打包后是否自动删除打包目录?",type:"toggle",initial:n(s,"autoRemove",!0),active:"yes",inactive:"no"},{name:"autoRemoveEs",message:"打包后是否移除es目录?",type:"toggle",initial:n(s,"autoRemoveEs",!0),active:"yes",inactive:"no"}]);await o({autoUpload:c.autoUpload,autoRemove:c.autoRemove,autoRemoveEs:c.autoRemoveEs}),a.success("配置完成!"),console.log()};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const{updatePackageJson:e,getPackageName:a,outputVueName:n,get_plugin_version:t}=require("../../utils"),s=require("yann-fs").default,r=require("path");module.exports=async function(i,o,c,u,l,v,p){await s.outputJson(r.resolve(o,"public","base.json"),{name:i,label:i,desc:"Custom Chart",version:"1.0.0",width:480,height:240,type:l||"other",author:u,id:v},{spaces:2,EOL:"\n"});const d=`\nexport const ${a(i)} = component`;if(await s.appendFile(r.resolve(o,"index.js"),d),await n(r.resolve(o,"src","index.vue"),i),await e(o,{name:i,author:u}),c&&"chart"===c.type?await e(o,{name:i,author:u,devDependencies:{"@chart/utils":"workspace:*"}}):await e(o,{name:i,author:u,devDependencies:{"@vitejs/plugin-vue":"^3.2.0",sass:"^1.69.7",vite:"^4.5.5","yann-snapshot":"^0.1.0","yann-chart-cli":"^"+t("yann-chart-cli")||"1.1.0","vite-plugin-compression":"^0.5.1","vite-plugin-banner":"^0.7.1","pangu-vchart-config":"^"+t("pangu-vchart-config")||"1.1.0"},dependencies:{vue:"~3.3.13","yann-i18n":"1.0.7"}}),!p)return;const h=r.resolve(o,"src"),g=r.resolve(o,"render.js"),m=r.resolve(o,"render.ts"),w=r.resolve(h,"config.js"),y=r.resolve(h,"config.ts"),f=r.resolve(h,"data.js"),j=r.resolve(h,"data.ts"),b=r.resolve(h,"style.js"),x=r.resolve(h,"style.ts");await s.rename(g,m),await s.rename(w,y),await s.rename(f,j),await s.rename(b,x),await s.remove(r.resolve(o,"jsconfig.json"))};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("path"),{getCdRelativePath:t,scanFileFindChart:a,scanDirHandle:i,prompt:s,log:n,oraHandle:o,runAsyncCmd:r,wait:c,welcomeCli:l,get_cli_config:u,getGitUser:d,registerChartId:p,requestToken:m}=require("../utils"),g=require("yann-fs").default;module.exports=async function(w=[]){const v="chart",[y]=await u();let f,h=!1;if(y.user&&y.password&&y.token&&(h=await m(y.user,y.password)),!h){const e=await d(),t=await s([{name:"isLogin",type:"toggle",message:"未登录,是否先登录:",initial:!1,active:"yes",inactive:"no"},{name:"user",type:(e,t)=>t.isLogin?null:"text",initial:e||"",message:"请填写泰合社区的用户名"}]);h=t.isLogin,f=t.isLogin?await require("../auth/index.js")():t.user}const j=await a(),{chartType:_,isTs:k}=await s([{name:"chartType",type:"select",message:"请选择图表类型:",initial:4,choices:[{title:"折线图",value:"line"},{title:"柱状图",value:"bar"},{title:"饼图",value:"pie"},{title:"表格",value:"form"},{title:"其他",value:"other"},{title:"地图",value:"map"},{title:"文本",value:"text"},{title:"指标",value:"indicator"},{title:"交互",value:"interaction"}]},{name:"isTs",type:"toggle",message:"是否使用ts",initial:!1,active:"yes",inactive:"no"}]);n.info("推荐添加自定义前缀以防止和其他图表名重复并且便于后期统一管理");let q=Date.now();const{projectName:x}=await s([{name:"projectName",type:"text",message:"请输入图表名:",initial:w[0]||"custom_chart",validate:async t=>{if(((e="")=>!/^[a-z][a-z0-9_]*$/.test(e))(t))return"包名只允许以小写英文字母开头,只允许使用小写英文字母、数字和下划线";if(await(async t=>{if(j){const[a,s,n]=await Promise.all([i(j.root),i(e.join(j.root,"packages")),i(e.join(j.root,"packages","components")),i(e.join(j.root,"packages","tailored"))]);if(a.includes(t)||s.includes(t)||n.includes(t))return!0}else if((await i(process.cwd())).includes(t))return!0;return!1})(t))return"包名重复";if(h){const[e,a]=await p(t,_);if("ECONNABORTED"===e?.code)return console.log(),console.log("暂时无法连接到服务器!"),!0;if(e||!a||!a.data||!a.data.data)return e?.data?.msg||"请重新填写";q=a.data.data}return!0}}]),C=o("创建项目..."),T=process.cwd(),D=j?T.includes("tailored")?e.join(j.root,"packages","tailored",x):e.join(j.root,"packages","components",x):e.join(T,x);await g.ensureDir(D),await g.copy(e.resolve(__dirname,"../../template",v),D),k&&await g.copy(e.resolve(__dirname,"../../template","ts"),D),await require(e.resolve(__dirname,v,"index.js"))(x,D,j,f,_,q,k),C.succeed("项目创建完成."),await c(.1),C.start("安装依赖.."),await r("pnpm",["install"],{cwd:D,stdio:"inherit"}),C.succeed("依赖安装完成."),await c(.1),C.clear();require("clear")(),await l(),console.log("\n完成. 现在可以执行:\n");const L=t(process.cwd(),D);n.success(` cd ${L}`),n.success(" pnpm dev"),console.log()};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("path"),s=require("yann-fs").default,{exit:r,getPath:i}=require("../utils");module.exports=async function(t=[]){let n=process.cwd();t.length>0&&(n=i(t[0]));const c=n.includes("package.json")?n:e.resolve(n,"package.json");n=e.dirname(c);const[o,a]=await s.readJson(c);if(o)r(o?.message);else{if(a.scripts){const e=require("cross-spawn");if(process.chdir(n),a.scripts.dev)return void e.sync("pnpm",["dev"],{stdio:"inherit"});if(a.scripts.serve)return void e.sync("pnpm",["serve"],{stdio:"inherit"})}r("找不到执行命令!")}};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const{checkUpdate:e}=require("./renew"),r=require("./action"),{program:o}=require("commander"),{version:s}=require("../package.json"),i=require("chalk"),c=require("path"),{log:a,get_cli_config:n,exit:t}=require("./utils"),d=(e,r=[])=>{try{require(c.resolve(__dirname,e,"index.js"))(r,{})}catch(e){t(e?.message)}};r.forEach(r=>{(r.option?r.option.reduce((e,r)=>e.option(r),o):o).command(r.command).alias(r.alias).description(r.desc).action(async()=>{const o=process.argv.slice(3);if(await e(),"*"===r.command)a.err(r.desc);else if(r.isAuth){const[e]=await n();if(e.user)d(r.command,o);else{await require("./auth/index.js")()&&d(r.command,o)}}else d(r.command,o)})}),"-v"===process.argv[2]&&(console.log(s),t()),o.version(s).parse(process.argv),process.on("uncaughtException",function(e){console.log(i.bold.red("err:"),i.bold.red(e?.message||"异常错误!")),process.exit(1)});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("path"),t=require("yann-fs").default,{to:s}=require("await-to-js"),{getPackageInfo:r,scanFileFindChart:n,getPackageName:i,buildPathHandler:o,exit:a,versionHandle:c,compareVersion:l,runAsyncCmd:p,log:d}=require("../utils"),u=require("p-limit"),m=require("dayjs"),f="src/components",w="src/charts",v=async s=>{try{const r=await t.readdir(s,{withFileTypes:!0});for(const n of r){const r=e.join(s,n.name);n.isDirectory()?await v(r):n.isFile()&&n.name.endsWith(".gz")&&await t.unlink(r)}}catch(e){throw console.error(`处理目录 ${s} 时出错:`,e.message),e}},h=async(n,a,p,u,m)=>{if(n.startsWith("."))return;const h=e.resolve(a,n),[$,g]=await t.readJson(e.resolve(h,"package.json"));if($||!g)return;const[x,y]=await t.readJson(e.resolve(h,"public","base.json"));if(x||!y)return;const{isDev:F}=y;if(F)return;if(!m.includes(n)){if(!await t.exists(e.resolve(p,w,n,"index.ts")))return;return void u.add(n)}const P=await c(h);if("string"==typeof P)return;const{name:C,outDir:E}=r(P),j=`V${C}`;d.info(`开始打图表包,图表名:“${n}”,版本号:“v${P.version}”.`),await o(h);const D=e.resolve(p,w,n),L=e.resolve(D,P.version);await t.remove(L);const O=e.resolve(L,"es");await t.copy(e.resolve(h,E,"es"),O),await v(L),await t.writeFile(e.resolve(L,"index.ts"),`import Component from "./es/index";\nexport const ${j} = Component;`),await(async(r,n)=>{try{const i=await t.readdir(n,{withFileTypes:!0}),o=[];for(const e of i)e.isFile()&&e.name.endsWith(".css")&&o.push(e.name);if(o.length>0){const n=e.resolve(r,"index.ts"),[i,a]=await s(t.readFile(n,"utf-8"));if(i||!a)return;let c="";for(const e of o)c+=`import './es/${e}'\n`;c+=a,await t.writeFile(n,c)}}catch(e){throw console.error(`处理目录 ${dir} 时出错:`,e.message),e}})(L,O);const k=e.resolve(D,"index.ts");await t.ensureFile(k),u.add(n);const[q,J]=await s(t.readFile(k,"utf-8"));if(q)return;const T=`V${i(n)}`,b=`import { ${j} } from './${P.version}/index'\nexport { ${j} }\n`;if(J.includes("export")){const e=/\.\/([\d.]+)\/index/g,s=[];let r;for(;null!==(r=e.exec(J));)s.push(r[1]);if(s.includes(P.version))return;const n=`${b}\n${J}`,i=s.sort((e,t)=>l(t,e))[0];if(l(i,P.version)>0)return void await t.writeFile(k,n);const o=new RegExp(`(export\\s*\\{)\\s*(\\w+)(\\s+)(as)(\\s+)(${T})(\\s*)(\\})`,"g"),a=n.replace(o,(e,t,s,r,n,i,o,a,c)=>`${t}${j}${r}${n}${i}${o}${a}${c}`);await t.writeFile(k,a)}else await t.appendFile(k,`${b}\nexport { ${j} as ${T} }`);await t.remove(e.resolve(h,E));const A=e.resolve(p,f,n);if(await t.exists(e.resolve(A,"index.ts")))return;await Promise.all([t.ensureFile(e.resolve(A,"index.ts")),t.ensureFile(e.resolve(A,"index.vue"))]);const H=[];H.push(t.writeFile(e.resolve(A,"index.ts"),`export { default as PgChart${T} } from './index.vue'`)),H.push(t.writeFile(e.resolve(A,"index.vue"),`<template>\n <v-chart :chart="${T}" v-bind="$attrs" :data="data" :styled="styled" :option="option" :events="events" @message="emit('message', $event)"></v-chart>\n</template>\n<script setup lang="ts">\nimport { VChart } from '@/core'\nimport { ${T} } from "@/charts/${n}";\nimport { useAttrs, defineEmits, defineProps, defineOptions } from "vue";\nimport type { ChartPropsType, ChartEvents, EmitMessage, ScreenLayerOption } from "@/types";\n\nconst $attrs = useAttrs();\nconst props = defineProps<{\n styled?: ChartPropsType<typeof ${T},'style'>\n option?: Partial<ScreenLayerOption>\n data?: ChartPropsType<typeof ${T},'data'>\n events?: ChartEvents[]\n}>();\nconst emit = defineEmits<{\n (e: "message", option: EmitMessage): void;\n}>();\n \ndefineOptions({\n name: 'pg-chart-v-${n}',\n inheritAttrs: false\n})\n<\/script>`)),await Promise.all(H)};async function $(e){const[s,r]=await t.readJson(e);return s?(d.err(s?.message),!1):("sideEffects"in r&&(delete r.sideEffects,await t.outputJson(e,r,{spaces:2,EOL:"\n"})),!0)}module.exports=async function(){const r=Date.now(),i=await n();if(!i)return a("非图表库");const c=e.resolve(i.root,"../pangu-chart"),l=e.resolve(i.root,"packages"),v=e.resolve(l,"components"),[g,x]=await s(t.readdir(v));if(g)return a(g?.message);const y=new Set,F=u(3);let P=x||[];const C=new Set(process.argv.slice(3));if(await t.exists(e.resolve(c,w,"index.ts")))if(C.has("-c"))await Promise.all([t.remove(e.resolve(c,w)),t.remove(e.resolve(c,f))]);else{const e=C.has("-e");if(C.delete("-e"),C.size){const t=[...C];P=e?x.filter(e=>!t.includes(e)):t}}await Promise.allSettled(x.map(e=>F(()=>h(e,v,c,y,P))));const E=[],j=[...y].sort((e,t)=>e.toLowerCase().localeCompare(t.toLowerCase()));for(const e of j)E.push(`export * from './${e}'\n`);const D=E.join("");await Promise.all([t.writeFile(e.resolve(c,w,"index.ts"),D),t.writeFile(e.resolve(c,f,"index.ts"),D)]);const L=`图表库打包完成:${m().format("YYYY-MM-DD HH:mm")},总耗时: ${(Date.now()-r)/1e3}s.`;d.success(L),console.log(),d.info("开始打pangu-v-chart.");const O=e.resolve(c,"package.json");await $(O),await o(c),d.success("pangu-v-chart打包完成,正在准备执行CHANGELOG和发布"),await p("npm",["run","release"],{cwd:c,stdio:"inherit"});const[k,q]=await t.readJson(O);if(k)return void d.err(k?.message);q.sideEffects=!1,await t.outputJson(O,q,{spaces:2,EOL:"\n"});const J=await Promise.race([p("npm",["publish"],{cwd:c,stdio:"inherit"}),new Promise(e=>setTimeout(()=>e({success:!1,message:"执行超时"}),6e4))]);J.success?d.success("发布成功"):d.err(J.message),await $(O),d.success("pangu-v-chart 全部执行完成.")};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const{log:e,prompt:t,exit:a,welcomeCli:i,get_update_log:s,set_update_log:n,runAsyncCmd:c}=require("../utils"),o=(()=>{let e;return()=>{if(""===e||e)return e;const{execSync:t}=require("child_process");try{e=t("npm config get registry",{encoding:"utf8"}).trim()}catch(t){e=""}return e}})(),r=(()=>{let t=!1,a=!1;return async()=>(t||(a=await(async()=>{const t=o(),a=["outdated","pangu-vis-cli","-g"];t&&a.push(`--registry=${t}`);const i=await c("npm",a,{disableColor:!0,stdio:"pipe"});return i.success?!!i.stdout.replace(/\s+/g,""):(e.err(i.message),!1)})(),t=!0),a)})(),u=async()=>{const s=await t([{name:"updateFlag",message:"是否更新Cli工具?",type:"toggle",initial:!0,active:"yes",inactive:"no"}]),{updateFlag:r}=s;r?(await(async()=>{const t=["i","-g","pangu-vis-cli"],i=o();i&&t.push(`--registry=${i}`);const s=await c("npm",t,{enableSudo:!0,stdio:"inherit",disableColor:!0});s.success?(console.log(),e.success("Cli工具更新成功!")):a("异常错误,请手动执行命令更新Cli工具:“npm i -g pangu-vis-cli”"+(s.message?",错误信息:"+s.message:""))})(),await n(),await i(),a()):await n()};async function l(t){await r()?await u():(await n(),t&&e.success("当前版本已是最新!"))}module.exports={renew:l,checkUpdate:async function(){const{time:e,isExpired:t=!1}=await s();if(t)await l();else if(e<=Date.now()){await r()&&await l()}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const{buildTarHandler:t,exit:e}=require("../utils"),{to:i}=require("await-to-js");module.exports=async function(s=[]){if(s.length>0){const[a,r,n,o]=s,[u]=await i(t(a,r,n,o));u&&e(u?.message)}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("path"),t=require("yann-fs").default,{scanFileFindChart:a,exit:n,runAsyncCmd:i}=require("../utils"),s=require("p-limit");module.exports=async function(){const l=await a();if(!l)return n("非图表库");const c=l.root,d=e.resolve(c,"packages"),r=e.resolve(d,"components"),o=e.resolve(d,"tailored"),p=s(3);async function v(a){const n=await t.readdir(a);await Promise.all(n.map(n=>p(()=>(async(a,n)=>{if(a.startsWith("."))return;const[i,s]=await t.readJson(e.resolve(n,"package.json"));if(!i&&s){if(delete s.scripts["dev:example"],delete s.devDependencies["yann-chart-cli"],delete s.devDependencies["vite-plugin-compression"],delete s.devDependencies["vite-plugin-banner"],delete s.devDependencies.vite,delete s.devDependencies.vite,delete s.devDependencies.sass,delete s.devDependencies["@vitejs/plugin-vue"],delete s.devDependencies["yann-snapshot"],delete s.dependencies.vue,delete s.dependencies["yann-i18n"],s.scripts.dev="vcc dev","elementNamespace"in s){const e=s.elementNamespace;delete s.elementNamespace,s.elementConfig=e}if(await t.outputJson(e.resolve(n,"package.json"),s,{spaces:2,EOL:"\n"}),await t.remove(e.resolve(n,"example/package.json")),await t.exists(e.resolve(n,"example/index.html"))){await t.copy(e.resolve(n,"example/index.html"),e.resolve(n,"index.html"));const[a,i]=await t.readFile(e.resolve(n,"index.html"),"utf-8"),s=async()=>{await t.writeFile(e.resolve(n,"index.html"),'<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title>fea-chart</title>\n </head>\n <body>\n <div id="app"></div>\n <script type="module" src="./example/src/main.js"><\/script>\n </body>\n</html>\n',"utf8"),await t.remove(e.resolve(n,"example/index.html"));const[a,i]=await t.readJson(e.resolve(n,"example/package.json"));!a&&i&&(i.scripts.dev="vcc dev",i.scripts.build="vcc build",await t.outputJson(e.resolve(n,"example/package.json"),i,{spaces:2,EOL:"\n"}))},l=async()=>{await t.remove(e.resolve(n,"example/index.html"));const a=i.replace(/src="\/src\/main\.js"/g,'src="./example/src/main.js"');await t.writeFile(e.resolve(n,"index.html"),a,"utf8")};a||!i?await s():await l(),await t.remove(e.resolve(n,"example/vite.config.js"))}}})(n,e.resolve(a,n)))))}await v(r),await v(o),await i("pnpm",["i"],{cwd:c,stdio:"inherit"})};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const{renew:e}=require("../renew");module.exports=async function(){await e(!0)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("path"),t=require("yann-fs").default,{axios:a,exit:s,log:i,getPath:r,get_cli_config:o,requestToken:n}=require("../utils"),{to:u}=require("await-to-js"),c=require("form-data"),l=require("p-limit")(1),d=async(e,r)=>{const o=r;console.log(`准备上传 ${o} ...`);const n=new c,u=t.createReadStream(e);n.append("file",u,{filename:o});const[l,d]=await a({url:"/chart/version/upload_pkg",method:"post",data:n,headers:{"Content-Type":"multipart/form-data"},timeout:3e4});l?s(l?.message||l?.data?.msg||"异常错误"):(console.log(),i.success(`${o} 组件上传成功!`),console.log())};module.exports=async function(a=[]){const[i]=await o();if(i.user){if(i.user&&i.password&&i.token){await n(i.user,i.password)||await require("../auth/index.js")()}}else await require("../auth/index.js")();let c=process.cwd();if(a[0]){const t=a[0].trim();if(t.includes(".tar.gz")){const a=r(t);return void await u(d(a,e.basename(a)))}c=r(t)}const[m,f]=await u(t.readdir(c));if(m)return void s(m?.message);const p=f.filter(e=>e.includes(".tar.gz"));await Promise.all(p.map(t=>l(()=>u(d(e.resolve(c,"./",t),t)))))};
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("yann-fs").default,t=require("path"),s=require("chalk"),r=require("axios").default,{to:n}=require("await-to-js"),{camelCase:o,upperFirst:a,mergeWith:i,isArray:c}=require("lodash"),u=require("os").homedir(),l={success(e){console.log(s.green(e))},err(e){console.log(s.bold.red(e))},info(e){console.log(s.blue(e))}},d=e=>{e&&(console.log(),l.err(e)),process.exit(1)},p=t.resolve(u,".pangu-vis-store");let g={};const m=async t=>{const[s,r]=await w();g={...s,...t},await e.outputJson(r,g)},w=async()=>{const s=t.resolve(p,".cli_store");if(Object.keys(g).length>0)return[g,s];const[r,n]=await e.readJson(s);return r?[{user:"",password:"",token:"",autoUpload:!1,autoRemove:!1,autoRemoveEs:!0},s]:(g=n,[n,s])};const f="http://10.11.11.100",h=`${f}/thpower/api`,v=r.create({baseURL:h,headers:{"Content-Type":"application/json;charset=UTF-8"},timeout:1e4});async function y(e){return n(v(e))}v.interceptors.request.use(async e=>{const[t]=await w();return t.token&&(e.headers.Authorization=`${t.token}`),e},e=>Promise.reject(e)),v.interceptors.response.use(async e=>e.data?.code&&200!==e.data?.code?Promise.reject(e):e,e=>(function(e){r.isCancel(e)||(e&&e.response,e?.message?.includes("timeout"))}(e),Promise.reject(e)));const _=e=>{const s=process.cwd();return e.includes(s)?e:t.resolve(s,e)};function k(e,t){0===e.indexOf("v")&&(e=e.slice(1)),0===t.indexOf("v")&&(t=t.slice(1)),e=e.split("."),t=t.split(".");const s=Math.max(e.length,t.length);for(;e.length<s;)e.push("0");for(;t.length<s;)t.push("0");for(let r=0;r<s;r++){const s=parseInt(e[r]),n=parseInt(t[r]);if(s>n)return 1;if(s<n)return-1}return 0}const P=async(s,r=[".git",".vscode",".DS_Store",".idea"])=>{const o=s||process.cwd();if(await e.isDir(o)){const[s,r]=await n(e.readdir(o));if(s)return d(s?.message);await Promise.all(r.map(e=>P(t.resolve(o,e))))}else for(let t=0;t<r.length;t++)if(o.includes(r[t]))return void e.remove(o)},j=(e,t=[],s={})=>new Promise(r=>{const n="win32"===process.platform,{enableSudo:o=!1,disableColor:a=!1,cwd:i=process.cwd(),stdio:c="inherit",shell:u=!1,...d}=s;let p=e,g=[...t];a&&n&&!g.includes("--no-color")&&g.push("--no-color"),!n&&o&&(p="sudo",g=[e,...g]);const m={cwd:i,stdio:c,shell:u,...d},w=require("cross-spawn")(p,g,m),f=[],h=[];w.stdout?.on("data",e=>{f.push(e.toString())}),w.stderr?.on("data",e=>{h.push(e.toString())}),w.on("error",t=>{const s=t.message||"命令启动失败";let o="";o="ENOENT"===t.code?`未找到命令 "${e}",请先安装 ${e}`:"EACCES"===t.code?n?"权限不足!请以管理员身份运行终端":"权限不足!请确认当前用户有执行权限(可尝试 sudo)":`命令启动失败:${s}`,l.err(o),r({success:!1,stdout:"",stderr:s,status:null,message:o,error:t.stack||s})}),w.on("close",t=>{const s=f.join("").trim(),o=h.join("").trim(),a=0===t;let i="";a?i=`命令执行成功:${e} ${g.join(" ")}`:(i=o.includes("not found")||o.includes("Package")?`未找到目标资源:${o.split("\n")[0]}`:o.includes("EAI_AGAIN")||o.includes("network")||o.includes("ENOTFOUND")?"网络错误:无法连接到服务或镜像源,请检查网络配置":o.includes("EACCES")?n?"权限不足!请以管理员身份运行终端":"权限不足!可尝试启用 sudo":`命令执行失败(退出码:${t}):${o||"无详细错误信息"}`,l.err(i)),r({success:a,stdout:s,stderr:o,status:t,message:i,error:a?null:o||`退出码:${t}`})})}),E=async s=>{const r=process.cwd(),n=t.resolve(r,s),o=t.resolve(s,"package.json"),[a,i]=await e.readJson(o);if(i){const{name:s}=i;if("chart"===s){const[s,o]=await e.readJson(t.resolve(n,".pv_store"));if(o&&"chart"===o.name)return{type:"chart",root:n,cwd:r}}}return!1},b={user:""};module.exports={getCdRelativePath:function(e,s){const r=t.resolve(e),n=t.resolve(s);let o=t.relative(r,n);return""===o?"./":o},versionHandle:async s=>{const r=t.resolve(s,"public","base.json"),[n,o]=await e.readJson(r);if(n)return"找不到 base.json 文件";const a=o.version,i=t.resolve(s,"package.json"),[c,u]=await e.readJson(i);if(c)return"找不到 package.json 文件";const l=u.version,d=k(a,l);let p=a;return 1===d?(p=a,u.version=p,await e.outputJson(i,u,{spaces:2,EOL:"\n"})):-1===d&&(p=l,o.version=p,await e.outputJson(r,o,{spaces:2,EOL:"\n"})),{name:o.name,version:p}},getPackageInfo:e=>{const t=e.name.split("/").at(-1);return{name:t.replace(/^\S/,e=>e.toUpperCase())+"_v"+e.version.replaceAll(".","_"),outDir:`${t}_v${e.version}`}},buildPathHandler:async e=>{await j("pnpm",["build"],{cwd:e,stdio:"inherit"})},get_delete_es:async()=>{const[e]=await w();return!("autoRemoveEs"in e)||e.autoRemoveEs},userInfo:b,getGitUser:async()=>{const e=require("cross-spawn").sync("git",["config","user.name"]);return b.user=e.stdout.toString().replace(/[\n]/g,""),b.user},scanFileFindChart:async(e=10)=>{for(let t=0;t<e;t++){let e="./";t>0&&(e+="../".repeat(t));const s=await E(e);if(s)return s}return!1},outputVueName:async(t,s)=>{const r=`\n<script setup>\n import { defineProps, defineEmits, defineOptions } from 'vue';\n defineProps({\n styled: Object,\n data: Object,\n width: Number,\n height: Number,\n events: Array,\n option: Object\n });\n defineEmits(['message']);\n defineOptions({\n name: '${s}'\n })\n<\/script>`;await e.appendFile(t,r)},updatePackageJson:async(s,r)=>{const n=t.join(s,"package.json"),[o,a]=await e.readJson(n);o?d(o?.message):a&&(i(a,r,(e,t)=>{if(c(e))return e.concat(t)}),await e.outputJson(n,a,{spaces:2,EOL:"\n"}))},registerChartId:async(e,t)=>y({url:"/chart/register",method:"post",data:{enName:e,typeId:t}}),prompt:async e=>{const t=require("prompts");return await t(e,{onCancel:()=>{d("✖ 操作已取消")}})},requestToken:async(e,t)=>{const[s,r]=await y({url:"/auth/login",method:"post",data:{account:e,password:t}});return r&&r.data&&r.data.data.token?(await m({user:e,password:t,token:r.data.data.token}),!0):(await m({user:e,password:t,token:""}),!1)},axios:y,get_cli_config:w,set_cli_config:m,packagePath:p,exit:d,log:l,welcomeCli:async()=>{const{promisify:e}=require("util"),t=e(require("figlet")),s=await t("Welcome to VisCli");console.log(),l.success(s)},wait:e=>new Promise(t=>{setTimeout(()=>{t()},1e3*e)}),buildTarHandler:async(t,s,r=null,n=null)=>(t=_(t),r&&(r=_(r),await e.ensureDir(r)),new Promise(o=>{const a={gzip:!0,cwd:t,sync:!0},i="string"==typeof s?[s]:s,c=n||"string"==typeof s?s:"tar_"+Date.now();require("tar").c(a,i).pipe(e.createWriteStream(`${r||t}/${c}.tar.gz`)).on("finish",o)})),getPath:_,compareVersion:k,filterFile:P,oraHandle:e=>{const t=require("ora")(e);return t.start(),console.log(),t},getPackageName:e=>{const t=o(e);return a(t)},scanDirHandle:async s=>{const r=[];if(await e.isDir(s)){const[o,a]=await n(e.readdir(s));if(o)return d(o?.message);(await Promise.all(a.map(r=>n(e.isDir(t.resolve(s,r)))))).forEach((e,t)=>{e[1]&&r.push(a[t])})}return r},get_update_log:async()=>{const[s,r]=await e.readJson(t.resolve(p,".update_log"));return s?{isExpired:!0,time:0}:r},set_update_log:async(s=!1)=>{const r=Date.now()+864e5;await e.outputJson(t.resolve(p,".update_log"),{time:r,isExpired:s})},API_IP:f,get_plugin_version:e=>{if(!e)return;return require("cross-spawn").sync("npm",["view",e,"version"]).stdout.toString().replace(/[\n]/g,"")},runAsyncCmd:j};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("path"),a=require("yann-fs").default,{to:t}=require("await-to-js"),{runAsyncCmd:s,scanFileFindChart:i,wait:r}=require("../utils"),{menu:o}=require("./menu"),n=require("p-limit")(2),c=o;module.exports=async function(o=[]){const l=await i();if(l){const i=e.resolve(l.root,"packages"),p=e.resolve(i,"components"),[u,v]=await t(a.readdir(p));if(v){const l=[],u=e.resolve(i,"charts");if(await a.emptyDir(u),await Promise.all(v.map(t=>(async(t,s,i)=>{if(0!==t.indexOf(".")){const r=e.resolve(s,t);if(await a.isDir(r)){const[s,o]=await a.readJson(e.resolve(r,"package.json"));if(o){const[s,n]=await a.pathExists(e.resolve(r,"index.js"));if(n){const[s,n]=await a.readJson(e.resolve(r,"public","base.json"));if(n){const{name:e,label:a,version:t,width:s,height:i,type:r}=n,o={layerType:"chart",chartType:e,name:a,version:`v${t}`,width:s,height:i},h=c.find(e=>e.type===r);h?h.children.push(o):c.find(e=>"other"===e.type).children.push(o)}i.push([t,o.version])}}}}})(t,p,l))),await a.outputJson(e.resolve(u,"menu.json"),c,{spaces:2,EOL:"\n"}),"false"===o[0])return;await Promise.all([l.map(a=>n(()=>(async({v:a,chartsPath:i,comPath:o})=>{await t(s("pnpm",["build"],{cwd:e.resolve(o,a[0]),stdio:"inherit"})),await r(.005),await h({v:a,chartsPath:i,comPath:o})})({v:a,chartsPath:u,comPath:p})))])}}};const h=async({v:t,chartsPath:s,comPath:i})=>{const r=`${t[0]}_v${t[1]}`,o=e.resolve(s,t[0]),n=e.resolve(i,t[0],r);await a.move(n,o)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";module.exports={menu:[{type:"line",name:"折线图",children:[]},{type:"bar",name:"柱状图",children:[]},{type:"pie",name:"饼图",children:[]},{type:"form",name:"表格",children:[]},{type:"other",name:"其他",children:[]},{type:"map",name:"地图",children:[]},{type:"text",name:"文本",children:[]},{type:"indicator",name:"指标",children:[]},{type:"interaction",name:"交互",children:[]}]};
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pangu-vis-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "vis-cli",
|
|
5
|
+
"bin": {
|
|
6
|
+
"pvis": "bin/index.js",
|
|
7
|
+
"pv": "bin/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "rollup --config",
|
|
11
|
+
"release": "standard-version",
|
|
12
|
+
"release:patch": "standard-version --release-as patch",
|
|
13
|
+
"release:minor": "standard-version --release-as minor",
|
|
14
|
+
"release:major": "standard-version --release-as major",
|
|
15
|
+
"release:beta": "standard-version --prerelease beta"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [],
|
|
18
|
+
"author": "Jaxon",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"registry": "https://registry.npmjs.org/"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"await-to-js": "^3.0.0",
|
|
26
|
+
"axios": "^1.18.0",
|
|
27
|
+
"chalk": "^4.1.2",
|
|
28
|
+
"clear": "^0.1.0",
|
|
29
|
+
"commander": "^10.0.1",
|
|
30
|
+
"cross-spawn": "^7.0.6",
|
|
31
|
+
"dayjs": "^1.11.19",
|
|
32
|
+
"figlet": "^1.9.3",
|
|
33
|
+
"form-data": "^4.0.4",
|
|
34
|
+
"fs-extra": "^11.3.2",
|
|
35
|
+
"js-md5": "^0.8.3",
|
|
36
|
+
"lodash": "^4.17.21",
|
|
37
|
+
"opn": "^6.0.0",
|
|
38
|
+
"ora": "^5.4.1",
|
|
39
|
+
"p-limit": "^3.1.0",
|
|
40
|
+
"prompts": "^2.4.2",
|
|
41
|
+
"semver": "^7.7.3",
|
|
42
|
+
"tar": "^6.2.1",
|
|
43
|
+
"yann-fs": "^1.6.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@rollup/plugin-commonjs": "^18.1.0",
|
|
47
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
48
|
+
"@types/fs-extra": "^11.0.4",
|
|
49
|
+
"glob": "^13.0.0",
|
|
50
|
+
"prettier": "^3.6.2",
|
|
51
|
+
"rollup": "^2.79.2",
|
|
52
|
+
"rollup-plugin-babel": "^4.4.0",
|
|
53
|
+
"rollup-plugin-node-resolve": "^5.2.0",
|
|
54
|
+
"rollup-plugin-terser": "^7.0.2",
|
|
55
|
+
"standard-version": "^9.5.0"
|
|
56
|
+
},
|
|
57
|
+
"files": [
|
|
58
|
+
"dist",
|
|
59
|
+
"bin",
|
|
60
|
+
"template"
|
|
61
|
+
],
|
|
62
|
+
"type": "commonjs"
|
|
63
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Fea Custom Chart
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref } from "vue";
|
|
3
|
+
import ChartInfo from "../index";
|
|
4
|
+
import "pangu-vchart-config/style.css";
|
|
5
|
+
import { VChartConfig } from "pangu-vchart-config";
|
|
6
|
+
|
|
7
|
+
const isShow = ref(false);
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<VChartConfig v-model:is-show="isShow" :v-chart="ChartInfo" />
|
|
12
|
+
</template>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>fea-chart</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="app"></div>
|
|
10
|
+
<script type="module" src="./example/main.js"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"paths": {
|
|
4
|
+
"@/*": ["src/*"]
|
|
5
|
+
},
|
|
6
|
+
"baseUrl": ".",
|
|
7
|
+
"target": "es2016",
|
|
8
|
+
"module": "esnext",
|
|
9
|
+
"jsx": "preserve",
|
|
10
|
+
"lib": ["esnext", "dom"],
|
|
11
|
+
"rootDir": "."
|
|
12
|
+
},
|
|
13
|
+
"exclude": ["dist", "node_modules", "**/*_v*", "example", "**/node_modules/*"]
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "demo_chart",
|
|
3
|
+
"description": "Custom Chart",
|
|
4
|
+
"private": true,
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"main": "./index.js",
|
|
7
|
+
"module": "./index.js",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "vcc build",
|
|
10
|
+
"dev": "vcc dev"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {},
|
|
13
|
+
"devDependencies": {},
|
|
14
|
+
"author": ""
|
|
15
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import style from "./src/style";
|
|
2
|
+
import component from "./src/index.vue";
|
|
3
|
+
import data from "./src/data";
|
|
4
|
+
|
|
5
|
+
// 额外配置
|
|
6
|
+
const option = {
|
|
7
|
+
// 插件是否要超出盒子显示,默认 ‘hidden’不允许超出, 'hidden' | 'visible'
|
|
8
|
+
overflow: "hidden",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default {
|
|
12
|
+
data,
|
|
13
|
+
style,
|
|
14
|
+
option,
|
|
15
|
+
component,
|
|
16
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default [];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
|
3
|
+
"exclude": ["src/**/__tests__/*"],
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"composite": true,
|
|
6
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
7
|
+
"baseUrl": ".",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"paths": {
|
|
10
|
+
"@/*": ["./src/*"]
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"include": [
|
|
3
|
+
"vite.config.*",
|
|
4
|
+
"vitest.config.*",
|
|
5
|
+
"cypress.config.*",
|
|
6
|
+
"nightwatch.conf.*",
|
|
7
|
+
"playwright.config.*"
|
|
8
|
+
],
|
|
9
|
+
"compilerOptions": {
|
|
10
|
+
"composite": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
13
|
+
"module": "ESNext",
|
|
14
|
+
"moduleResolution": "Bundler",
|
|
15
|
+
"types": [
|
|
16
|
+
"node"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
}
|