neo-cmp-cli 1.5.6 → 1.6.0-beta.10
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/README.md +62 -47
- package/package.json +1 -1
- package/src/module/index.js +74 -19
- package/src/module/main.js +167 -267
- package/src/module/neoInit.js +1 -0
- package/src/neo/NeoUMDContent.js +6 -5
- package/src/neo/neoService.js +154 -43
- package/src/oss/publish2oss.js +174 -71
- package/src/template/antd-custom-cmp-template/README.md +26 -2
- package/src/template/antd-custom-cmp-template/neo.config.js +7 -4
- package/src/template/antd-custom-cmp-template/package.json +1 -0
- package/src/template/echarts-custom-cmp-template/README.md +26 -2
- package/src/template/echarts-custom-cmp-template/neo.config.js +9 -5
- package/src/template/echarts-custom-cmp-template/package.json +1 -0
- package/src/template/empty-custom-cmp-template/README.md +26 -0
- package/src/template/empty-custom-cmp-template/neo.config.js +7 -4
- package/src/template/empty-custom-cmp-template/package.json +1 -0
- package/src/template/neo-custom-cmp-template/README.md +26 -2
- package/src/template/neo-custom-cmp-template/neo.config.js +12 -9
- package/src/template/neo-custom-cmp-template/package.json +2 -1
- package/src/template/react-custom-cmp-template/README.md +26 -2
- package/src/template/react-custom-cmp-template/neo.config.js +7 -4
- package/src/template/react-custom-cmp-template/package.json +1 -0
- package/src/template/react-ts-custom-cmp-template/README.md +26 -2
- package/src/template/react-ts-custom-cmp-template/neo.config.js +7 -4
- package/src/template/react-ts-custom-cmp-template/package.json +1 -0
- package/src/template/vue2-custom-cmp-template/README.md +26 -2
- package/src/template/vue2-custom-cmp-template/neo.config.js +7 -4
- package/src/template/vue2-custom-cmp-template/package.json +1 -0
- package/src/{cmpUtils → utils/cmpUtils}/createCmpByTemplate.js +9 -7
- package/src/utils/cmpUtils/createCmpByZip.js +87 -0
- package/src/{cmpUtils → utils/cmpUtils}/createCommonModulesCode.js +2 -2
- package/src/{cmpUtils → utils/cmpUtils}/getCmpModelRegisterCode.js +1 -1
- package/src/{cmpUtils → utils/cmpUtils}/getCmpPreviewCode.js +1 -1
- package/src/{cmpUtils → utils/cmpUtils}/getCmpRegisterCode.js +1 -1
- package/src/{cmpUtils → utils/cmpUtils}/getCmpTypeByDir.js +2 -2
- package/src/{cmpUtils → utils/cmpUtils}/hasCmpTypeByDir.js +1 -1
- package/src/{cmpUtils → utils/cmpUtils}/previewCmp.js +3 -3
- package/src/utils/cmpUtils/pullCmp.js +95 -0
- package/src/{cmpUtils → utils/cmpUtils}/pushCmp.js +83 -73
- package/src/utils/common.js +48 -0
- package/src/utils/generateEntries.js +73 -0
- package/src/{projectUtils → utils/projectUtils}/createCmpProjectByTemplate.js +11 -7
- package/src/{projectUtils → utils/projectUtils}/createCmpProjectZip.js +18 -20
- package/src/{projectUtils → utils/projectUtils}/getEntries.js +2 -2
- package/src/{projectUtils → utils/projectUtils}/getEntriesWithAutoRegister.js +2 -2
- package/src/{projectUtils → utils/projectUtils}/hasNeoProject.js +2 -2
- package/src/{projectUtils → utils/projectUtils}/updatePublishLog.js +1 -1
package/README.md
CHANGED
|
@@ -21,72 +21,82 @@ neo-cmp-cli 是 Neo 自定义组件开发工具,基于 [AKFun](https://github.
|
|
|
21
21
|
|
|
22
22
|
## 快速开始
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
##### 1) 全局安装
|
|
24
|
+
#### 1) 全局安装自定义组件开发工具
|
|
26
25
|
```bash
|
|
27
26
|
yarn global add neo-cmp-cli
|
|
28
27
|
# 或
|
|
29
28
|
npm i -g neo-cmp-cli
|
|
30
29
|
```
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
neo init -t=react-ts
|
|
34
|
-
```
|
|
35
|
-
##### 3) 进入自定义组件项目根目录,安装依赖并运行
|
|
30
|
+
|
|
31
|
+
#### 2) 创建自定义组件项目
|
|
36
32
|
```bash
|
|
37
|
-
#
|
|
33
|
+
# 方式一:创建空的自定义组件项目
|
|
38
34
|
neo createProject
|
|
39
35
|
|
|
40
|
-
#
|
|
36
|
+
# 方式二:根据模板创建自定义组件项目(默认 React+TS,可用 -t 指定模板,-n 指定自定义组件名称)
|
|
41
37
|
neo init
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
#### 3) 进入自定义组件项目根目录,安装依赖并运行
|
|
41
|
+
```bash
|
|
42
|
+
cd xxCmpProject
|
|
43
|
+
```
|
|
42
44
|
|
|
45
|
+
#### 4) 创建自定义组件
|
|
46
|
+
```bash
|
|
43
47
|
# 在当前项目中创建一个自定义组件
|
|
44
48
|
neo createCmp
|
|
49
|
+
```
|
|
50
|
+
默认在当前项目 src/components/ 目录下新增自定义组件。
|
|
45
51
|
|
|
52
|
+
#### 5) 本地预览自定义组件内容
|
|
53
|
+
```bash
|
|
46
54
|
# 预览自定义组件内容
|
|
47
55
|
neo preview
|
|
48
|
-
|
|
49
|
-
# 外链调试(在平台线上预览与调试)
|
|
50
|
-
neo linkDebug
|
|
51
|
-
|
|
52
|
-
# 构建并发布到 NeoCRM(需自行添加授权配置,并确保 package.json 的 name 唯一、version 不重复)
|
|
53
|
-
neo pushCmp
|
|
54
56
|
```
|
|
57
|
+
执行成功后,默认自动打开本地浏览器预览自定义组件内容。
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
此方式可用于将现有业务组件发布成平台可用自定义组件。
|
|
58
|
-
|
|
59
|
-
##### 1) 安装到当前项目,并添加开发依赖
|
|
60
|
-
使用以下安装命令时会自动将 neo-cmp-cli 添加成当前项目开发依赖
|
|
59
|
+
#### 6) 外链调试(在 NeoCRM 端预览与调试)
|
|
61
60
|
```bash
|
|
62
|
-
|
|
63
|
-
# 或
|
|
64
|
-
npm i neo-cmp-cli --save-dev
|
|
65
|
-
```
|
|
66
|
-
##### 2) 在 package.json 添加可用执行脚本
|
|
67
|
-
```bash
|
|
68
|
-
"preview": "neo preview",
|
|
69
|
-
"linkDebug": "neo linkDebug",
|
|
70
|
-
"pushCmp": "neo pushCmp"
|
|
61
|
+
neo linkDebug
|
|
71
62
|
```
|
|
72
|
-
|
|
63
|
+
需在NeoCRM / 页面设计器端启动 debug 模式,并添加控制台输出的外链脚本地址,方可在页面设计器端使用当前自定义组件。
|
|
64
|
+
|
|
65
|
+
#### 7) 构建并发布到 NeoCRM
|
|
73
66
|
```bash
|
|
74
|
-
neo
|
|
67
|
+
neo pushCmp
|
|
75
68
|
```
|
|
76
|
-
#####
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
69
|
+
##### 需自行添加授权配置,并确保 package.json 的 name 唯一、version 不重复。
|
|
70
|
+
```javascript
|
|
71
|
+
module.exports = {
|
|
72
|
+
neoConfig: {
|
|
73
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
74
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
75
|
+
// NeoCRM 授权配置
|
|
76
|
+
auth: {
|
|
77
|
+
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
78
|
+
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
79
|
+
username: 'xx', // 用户在销售易系统中的用户名
|
|
80
|
+
/**
|
|
81
|
+
* password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
82
|
+
* 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
83
|
+
*/
|
|
84
|
+
password: 'xx xx' // 用户账户密码 + 8 位安全令牌
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
}
|
|
81
88
|
```
|
|
89
|
+
1、客户端 ID 和 客户端秘钥 需通过 创建连接器 获取,获取方式见:[https://doc.xiaoshouyi.com](https://doc.xiaoshouyi.com) / 创建连接器;
|
|
90
|
+
2、如何获取 安全令牌 见:[https://doc.xiaoshouyi.com](https://doc.xiaoshouyi.com) / OAuth安全认证 / 密码模式 / 获取令牌;
|
|
91
|
+
3、发布成功后即可在 NeoCRM 对应租户环境的页面设计器和表单设计器中使用此自定义组件。
|
|
82
92
|
|
|
83
93
|
## 常用命令说明
|
|
84
|
-
- **neo init**: 交互式创建自定义组件(支持 -t、--name
|
|
85
|
-
- **neo createProject**: 创建自定义组件项目(支持 --name
|
|
86
|
-
- **neo createCmp**: 在当前项目中创建一个自定义组件(支持 --name
|
|
87
|
-
- **neo preview**: 本地预览自定义组件内容(支持 --name
|
|
88
|
-
- **neo linkDebug**:
|
|
89
|
-
- **neo publish2oss**: 构建并上传到对象存储(支持 --name
|
|
94
|
+
- **neo init**: 交互式创建自定义组件(支持 -t、--name);
|
|
95
|
+
- **neo createProject**: 创建自定义组件项目(支持 --name);
|
|
96
|
+
- **neo createCmp**: 在当前项目中创建一个自定义组件(支持 --name);
|
|
97
|
+
- **neo preview**: 本地预览自定义组件内容(支持 --name),默认支持热更新与接口代理;
|
|
98
|
+
- **neo linkDebug**: 外链调试模式,在平台端页面设计器中调试自定义组件;
|
|
99
|
+
- **neo publish2oss**: 构建并上传到对象存储(支持 --name,可自定义配置对象存储);
|
|
90
100
|
- **neo pushCmp**: 构建并发布到NeoCRM平台(支持 --name,需自行添加授权配置)。
|
|
91
101
|
|
|
92
102
|
## 开发须知
|
|
@@ -150,14 +160,13 @@ neo linkDebug
|
|
|
150
160
|
##### 需自行添加授权配置
|
|
151
161
|
```javascript
|
|
152
162
|
module.exports = {
|
|
153
|
-
|
|
163
|
+
neoConfig: {
|
|
154
164
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
155
165
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
156
166
|
// NeoCRM 授权配置
|
|
157
|
-
|
|
167
|
+
auth: {
|
|
158
168
|
/**
|
|
159
|
-
* 客户端 ID 和 客户端秘钥 需通过 创建连接器
|
|
160
|
-
* 详细见:https://doc.xiaoshouyi.com / 创建连接器。
|
|
169
|
+
* 客户端 ID 和 客户端秘钥 需通过 创建连接器 获取
|
|
161
170
|
*/
|
|
162
171
|
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
163
172
|
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
@@ -165,7 +174,6 @@ module.exports = {
|
|
|
165
174
|
/**
|
|
166
175
|
* password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
167
176
|
* 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
168
|
-
* 如何获取 安全令牌请见:https://doc.xiaoshouyi.com / OAuth安全认证 / 密码模式 / 获取令牌。
|
|
169
177
|
*/
|
|
170
178
|
password: 'xx xx' // 用户账户密码 + 8 位安全令牌
|
|
171
179
|
},
|
|
@@ -176,8 +184,12 @@ module.exports = {
|
|
|
176
184
|
##### 支持发布指定自定义组件
|
|
177
185
|
执行 `neo pushCmp --name=xxCmp`
|
|
178
186
|
|
|
187
|
+
##### 线上 NeoCRM 端使用
|
|
188
|
+
发布成功后,即可在对应租户环境下的页面设计器和表单设计器中使用此自定义组件。
|
|
189
|
+
|
|
179
190
|
#### 7)发布自定义组件至CDN
|
|
180
191
|
执行 `neo publish2oss` 即可构建对应自定义组件,并自动将构建后资源上传到对象存储(OSS)中。
|
|
192
|
+
备注:请优先使用 neo pushCmp。
|
|
181
193
|
|
|
182
194
|
##### 发布前请确保
|
|
183
195
|
- **package.json 的 name 唯一**
|
|
@@ -207,6 +219,9 @@ module.exports = {
|
|
|
207
219
|
##### 支持发布指定自定义组件
|
|
208
220
|
执行 `neo publish2oss --name=xxCmp`
|
|
209
221
|
|
|
222
|
+
##### 特别说明
|
|
223
|
+
此发布方式只是将自定义组件构建产物发布到 CDN 上,如要使用自定义组件还需要手动添加到指定租户上(NeoCRM 管理端 / 自定义组件管理页)。
|
|
224
|
+
|
|
210
225
|
## 项目工程配置说明(neo.config.js)
|
|
211
226
|
neo-cmp-cli 默认提供完整配置;
|
|
212
227
|
如需自定义,使用 `neo config init` 生成 `neo.config.js` 并按需修改。
|
package/package.json
CHANGED
package/src/module/index.js
CHANGED
|
@@ -2,14 +2,16 @@ const figlet = require('figlet'); // 用于输出图形文字
|
|
|
2
2
|
const yargs = require('yargs'); // 命令行工具
|
|
3
3
|
const chalk = require('chalk'); // 带样式的log输出
|
|
4
4
|
const inquirer = require('inquirer'); // 问答式交互
|
|
5
|
-
|
|
5
|
+
const ora = require('ora');
|
|
6
6
|
const neoInit = require('./neoInit.js');
|
|
7
7
|
const neoInitByCopy = require('./neoInitByCopy.js');
|
|
8
8
|
const inspect = require('./inspect.js'); // 输出当前项目配置文件
|
|
9
9
|
const neoConfigInit = require('../utils/neoConfigInit.js');
|
|
10
10
|
const { validateProjectName } = require('../utils/projectNameValidator.js');
|
|
11
11
|
const mainAction = require('./main.js'); // 入口文件
|
|
12
|
-
const getCmpTypeByDir = require('../cmpUtils/getCmpTypeByDir.js');
|
|
12
|
+
const getCmpTypeByDir = require('../utils/cmpUtils/getCmpTypeByDir.js');
|
|
13
|
+
const NeoService = require('../neo/neoService.js');
|
|
14
|
+
const curConfig = require('../config/index'); // 获取当前项目根目录下的配置文件
|
|
13
15
|
|
|
14
16
|
// neo 的 package 文件
|
|
15
17
|
const neoPackage = require('../../package.json');
|
|
@@ -67,6 +69,11 @@ yargs
|
|
|
67
69
|
value: 'react-ts',
|
|
68
70
|
short: 'react-ts'
|
|
69
71
|
},
|
|
72
|
+
{
|
|
73
|
+
name: 'Neo 自定义组件(使用平台实体数据源)',
|
|
74
|
+
value: 'neo',
|
|
75
|
+
short: 'neo'
|
|
76
|
+
},
|
|
70
77
|
{
|
|
71
78
|
name: 'antd 自定义组件',
|
|
72
79
|
value: 'antd',
|
|
@@ -77,11 +84,6 @@ yargs
|
|
|
77
84
|
value: 'echarts',
|
|
78
85
|
short: 'echarts'
|
|
79
86
|
},
|
|
80
|
-
{
|
|
81
|
-
name: 'Neo 自定义组件',
|
|
82
|
-
value: 'neo',
|
|
83
|
-
short: 'neo'
|
|
84
|
-
},
|
|
85
87
|
/*
|
|
86
88
|
// 暂不提供 react js 模板(react js 模板已废弃)
|
|
87
89
|
{
|
|
@@ -169,11 +171,13 @@ yargs
|
|
|
169
171
|
if (argv.name) {
|
|
170
172
|
mainAction.createCmpProjectByTemplate(argv.name);
|
|
171
173
|
} else {
|
|
172
|
-
const questions = [
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
174
|
+
const questions = [
|
|
175
|
+
{
|
|
176
|
+
name: 'name',
|
|
177
|
+
type: 'input',
|
|
178
|
+
message: '请设置自定义组件项目名称:'
|
|
179
|
+
}
|
|
180
|
+
];
|
|
177
181
|
|
|
178
182
|
inquirer.prompt(questions).then((ans) => {
|
|
179
183
|
// 验证项目名称是否合法
|
|
@@ -182,9 +186,9 @@ yargs
|
|
|
182
186
|
console.error(errors.join('\n'));
|
|
183
187
|
process.exit(1);
|
|
184
188
|
}
|
|
185
|
-
|
|
189
|
+
|
|
186
190
|
if (!ans.name) {
|
|
187
|
-
console.error(
|
|
191
|
+
console.error('自定义组件项目名称不能为空。');
|
|
188
192
|
process.exit(1);
|
|
189
193
|
} else {
|
|
190
194
|
mainAction.createCmpProjectByTemplate(ans.name);
|
|
@@ -210,11 +214,13 @@ yargs
|
|
|
210
214
|
if (argv.name) {
|
|
211
215
|
mainAction.createCmpByTemplate(argv.name);
|
|
212
216
|
} else {
|
|
213
|
-
const questions = [
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
217
|
+
const questions = [
|
|
218
|
+
{
|
|
219
|
+
name: 'name',
|
|
220
|
+
type: 'input',
|
|
221
|
+
message: '请设置自定义组件名称:'
|
|
222
|
+
}
|
|
223
|
+
];
|
|
218
224
|
|
|
219
225
|
inquirer.prompt(questions).then((ans) => {
|
|
220
226
|
if (!ans.name) {
|
|
@@ -227,6 +233,55 @@ yargs
|
|
|
227
233
|
}
|
|
228
234
|
}
|
|
229
235
|
)
|
|
236
|
+
.command(
|
|
237
|
+
'pullCmp [options]',
|
|
238
|
+
'拉取线上自定义组件',
|
|
239
|
+
(yargs) => {
|
|
240
|
+
yargs
|
|
241
|
+
.reset()
|
|
242
|
+
.usage(titleTip('Usage') + ': $0 preview [options]')
|
|
243
|
+
.option('name', {
|
|
244
|
+
alias: 'n',
|
|
245
|
+
describe: '自定义组件名称'
|
|
246
|
+
})
|
|
247
|
+
.alias('h', 'help');
|
|
248
|
+
},
|
|
249
|
+
async (argv) => {
|
|
250
|
+
if (argv.name) {
|
|
251
|
+
mainAction.pullCmp(argv.name);
|
|
252
|
+
} else {
|
|
253
|
+
// 创建 neoService 实例
|
|
254
|
+
const neoService = new NeoService(curConfig.neoConfig);
|
|
255
|
+
const spinner = ora('正在获取自定义组件列表...').start();
|
|
256
|
+
const cmpList = await neoService.getCustomCmpList();
|
|
257
|
+
if (cmpList.length === 0) {
|
|
258
|
+
console.error('当前租户暂无任何自定义组件。');
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
spinner.succeed('自定义组件列表获取成功。');
|
|
262
|
+
const cmpTypeChoices = cmpList.map((cmpItem) => ({
|
|
263
|
+
name: cmpItem.label,
|
|
264
|
+
value: cmpItem.cmpType
|
|
265
|
+
}));
|
|
266
|
+
const questions = [
|
|
267
|
+
{
|
|
268
|
+
name: 'cmpType',
|
|
269
|
+
type: 'list',
|
|
270
|
+
message: '请选择要拉取的自定义组件:',
|
|
271
|
+
choices: cmpTypeChoices
|
|
272
|
+
}
|
|
273
|
+
];
|
|
274
|
+
inquirer.prompt(questions).then((ans) => {
|
|
275
|
+
if (!ans.cmpType) {
|
|
276
|
+
console.error('自定义组件名称不能为空。');
|
|
277
|
+
process.exit(1);
|
|
278
|
+
} else {
|
|
279
|
+
mainAction.pullCmp(ans.cmpType, neoService);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
)
|
|
230
285
|
.command(
|
|
231
286
|
'preview [options]',
|
|
232
287
|
'预览指定自定义组件(仅预览组件本身内容)',
|