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.
Files changed (48) hide show
  1. package/README.md +62 -47
  2. package/package.json +1 -1
  3. package/src/module/index.js +74 -19
  4. package/src/module/main.js +167 -267
  5. package/src/module/neoInit.js +1 -0
  6. package/src/neo/NeoUMDContent.js +6 -5
  7. package/src/neo/neoService.js +154 -43
  8. package/src/oss/publish2oss.js +174 -71
  9. package/src/template/antd-custom-cmp-template/README.md +26 -2
  10. package/src/template/antd-custom-cmp-template/neo.config.js +7 -4
  11. package/src/template/antd-custom-cmp-template/package.json +1 -0
  12. package/src/template/echarts-custom-cmp-template/README.md +26 -2
  13. package/src/template/echarts-custom-cmp-template/neo.config.js +9 -5
  14. package/src/template/echarts-custom-cmp-template/package.json +1 -0
  15. package/src/template/empty-custom-cmp-template/README.md +26 -0
  16. package/src/template/empty-custom-cmp-template/neo.config.js +7 -4
  17. package/src/template/empty-custom-cmp-template/package.json +1 -0
  18. package/src/template/neo-custom-cmp-template/README.md +26 -2
  19. package/src/template/neo-custom-cmp-template/neo.config.js +12 -9
  20. package/src/template/neo-custom-cmp-template/package.json +2 -1
  21. package/src/template/react-custom-cmp-template/README.md +26 -2
  22. package/src/template/react-custom-cmp-template/neo.config.js +7 -4
  23. package/src/template/react-custom-cmp-template/package.json +1 -0
  24. package/src/template/react-ts-custom-cmp-template/README.md +26 -2
  25. package/src/template/react-ts-custom-cmp-template/neo.config.js +7 -4
  26. package/src/template/react-ts-custom-cmp-template/package.json +1 -0
  27. package/src/template/vue2-custom-cmp-template/README.md +26 -2
  28. package/src/template/vue2-custom-cmp-template/neo.config.js +7 -4
  29. package/src/template/vue2-custom-cmp-template/package.json +1 -0
  30. package/src/{cmpUtils → utils/cmpUtils}/createCmpByTemplate.js +9 -7
  31. package/src/utils/cmpUtils/createCmpByZip.js +87 -0
  32. package/src/{cmpUtils → utils/cmpUtils}/createCommonModulesCode.js +2 -2
  33. package/src/{cmpUtils → utils/cmpUtils}/getCmpModelRegisterCode.js +1 -1
  34. package/src/{cmpUtils → utils/cmpUtils}/getCmpPreviewCode.js +1 -1
  35. package/src/{cmpUtils → utils/cmpUtils}/getCmpRegisterCode.js +1 -1
  36. package/src/{cmpUtils → utils/cmpUtils}/getCmpTypeByDir.js +2 -2
  37. package/src/{cmpUtils → utils/cmpUtils}/hasCmpTypeByDir.js +1 -1
  38. package/src/{cmpUtils → utils/cmpUtils}/previewCmp.js +3 -3
  39. package/src/utils/cmpUtils/pullCmp.js +95 -0
  40. package/src/{cmpUtils → utils/cmpUtils}/pushCmp.js +83 -73
  41. package/src/utils/common.js +48 -0
  42. package/src/utils/generateEntries.js +73 -0
  43. package/src/{projectUtils → utils/projectUtils}/createCmpProjectByTemplate.js +11 -7
  44. package/src/{projectUtils → utils/projectUtils}/createCmpProjectZip.js +18 -20
  45. package/src/{projectUtils → utils/projectUtils}/getEntries.js +2 -2
  46. package/src/{projectUtils → utils/projectUtils}/getEntriesWithAutoRegister.js +2 -2
  47. package/src/{projectUtils → utils/projectUtils}/hasNeoProject.js +2 -2
  48. 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
- ##### 2) 创建自定义组件(默认 React+TS,可用 -t 指定模板,-n 指定自定义组件名称)
32
- ```bash
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
- yarn add neo-cmp-cli --dev
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
- ##### 3) 初始化配置文件
63
+ 需在NeoCRM / 页面设计器端启动 debug 模式,并添加控制台输出的外链脚本地址,方可在页面设计器端使用当前自定义组件。
64
+
65
+ #### 7) 构建并发布到 NeoCRM
73
66
  ```bash
74
- neo config init
67
+ neo pushCmp
75
68
  ```
76
- ##### 4) 开发调试和发布
77
- ```bash
78
- npm run preview
79
- npm run linkDebug
80
- npm run pushCmp
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
- pushCmp: {
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
- authConfig: {
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo-cmp-cli",
3
- "version": "1.5.6",
3
+ "version": "1.6.0-beta.10",
4
4
  "description": "前端脚手架:自定义组件开发工具,支持react 和 vue2.0技术栈。",
5
5
  "keywords": [
6
6
  "neo-cli",
@@ -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
- name: 'name',
174
- type: 'input',
175
- message: '请设置自定义组件项目名称:',
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(errors.join('\n'));
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
- name: 'name',
215
- type: 'input',
216
- message: '请设置自定义组件名称:',
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
  '预览指定自定义组件(仅预览组件本身内容)',