neo-cmp-cli 1.12.11 → 1.13.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.
Files changed (81) hide show
  1. package/README.md +28 -13
  2. package/dist/index2.js +1 -1
  3. package/dist/module/neoInitByCopy.js +1 -1
  4. package/dist/package.json.js +1 -1
  5. package/docs/H5/347/253/257 NeoEntityList /344/275/277/347/224/250/350/257/264/346/230/216.md" +293 -0
  6. package/package.json +1 -1
  7. package/template/antd-custom-cmp-template/package.json +3 -3
  8. package/template/asset-manage-template/package.json +1 -1
  9. package/template/echarts-custom-cmp-template/package.json +3 -3
  10. package/template/empty-custom-cmp-template/package.json +1 -1
  11. package/template/map-custom-cmp-template/.prettierrc.js +12 -0
  12. package/template/map-custom-cmp-template/README.md +99 -0
  13. package/template/map-custom-cmp-template/commitlint.config.js +59 -0
  14. package/template/map-custom-cmp-template/neo.config.js +115 -0
  15. package/template/map-custom-cmp-template/package.json +59 -0
  16. package/template/map-custom-cmp-template/public/css/base.css +283 -0
  17. package/template/map-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  18. package/template/map-custom-cmp-template/public/template.html +13 -0
  19. package/template/map-custom-cmp-template/src/assets/css/common.scss +127 -0
  20. package/template/map-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  21. package/template/map-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  22. package/template/map-custom-cmp-template/src/assets/img/chart.svg +1 -0
  23. package/template/map-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  24. package/template/map-custom-cmp-template/src/assets/img/favicon.png +0 -0
  25. package/template/map-custom-cmp-template/src/utils/url.ts +82 -0
  26. package/template/map-custom-cmp-template/tsconfig.json +68 -0
  27. package/template/neo-bi-cmps/.prettierrc.js +12 -0
  28. package/template/neo-bi-cmps/@types/neo-ui-common.d.ts +36 -0
  29. package/template/neo-bi-cmps/README.md +99 -0
  30. package/template/neo-bi-cmps/commitlint.config.js +59 -0
  31. package/template/neo-bi-cmps/neo.config.js +124 -0
  32. package/template/neo-bi-cmps/package.json +62 -0
  33. package/template/neo-bi-cmps/public/css/base.css +283 -0
  34. package/template/neo-bi-cmps/public/scripts/app/bluebird.js +6679 -0
  35. package/template/neo-bi-cmps/public/template.html +13 -0
  36. package/template/neo-bi-cmps/src/assets/css/common.scss +127 -0
  37. package/template/neo-bi-cmps/src/assets/css/mixin.scss +47 -0
  38. package/template/neo-bi-cmps/src/assets/img/AIBtn.gif +0 -0
  39. package/template/neo-bi-cmps/src/assets/img/NeoCRM.jpg +0 -0
  40. package/template/neo-bi-cmps/src/assets/img/aiLogo.png +0 -0
  41. package/template/neo-bi-cmps/src/assets/img/card-list.svg +1 -0
  42. package/template/neo-bi-cmps/src/assets/img/contact-form.svg +1 -0
  43. package/template/neo-bi-cmps/src/assets/img/custom-form.svg +1 -0
  44. package/template/neo-bi-cmps/src/assets/img/custom-widget.svg +1 -0
  45. package/template/neo-bi-cmps/src/assets/img/data-list.svg +1 -0
  46. package/template/neo-bi-cmps/src/assets/img/detail.svg +1 -0
  47. package/template/neo-bi-cmps/src/assets/img/favicon.png +0 -0
  48. package/template/neo-bi-cmps/src/assets/img/map.svg +1 -0
  49. package/template/neo-bi-cmps/src/assets/img/search.svg +1 -0
  50. package/template/neo-bi-cmps/src/assets/img/table.svg +1 -0
  51. package/template/neo-bi-cmps/src/components/targetNumber__c/README.md +100 -0
  52. package/template/neo-bi-cmps/src/components/targetNumber__c/customStyleConfig/configSchema.ts +253 -0
  53. package/template/neo-bi-cmps/src/components/targetNumber__c/customStyleConfig/index.scss +76 -0
  54. package/template/neo-bi-cmps/src/components/targetNumber__c/customStyleConfig/index.tsx +148 -0
  55. package/template/neo-bi-cmps/src/components/targetNumber__c/index.tsx +440 -0
  56. package/template/neo-bi-cmps/src/components/targetNumber__c/model.ts +128 -0
  57. package/template/neo-bi-cmps/src/components/targetNumber__c/style.scss +173 -0
  58. package/template/neo-bi-cmps/src/utils/axiosFetcher.ts +37 -0
  59. package/template/neo-bi-cmps/src/utils/queryObjectData.ts +76 -0
  60. package/template/neo-bi-cmps/src/utils/xobjects.ts +162 -0
  61. package/template/neo-bi-cmps/tsconfig.json +40 -0
  62. package/template/neo-custom-cmp-template/package.json +3 -3
  63. package/template/neo-h5-cmps/package.json +2 -2
  64. package/template/neo-h5-cmps/src/components/entityList__c/index.tsx +2 -2
  65. package/template/neo-order-cmps/package.json +1 -1
  66. package/template/neo-web-cmps/package.json +3 -3
  67. package/template/neo-web-cmps/src/components/entityGrid2__c/index.tsx +16 -4
  68. package/template/neo-web-cmps/src/components/entityGrid2__c/style.scss +1 -3
  69. package/template/neo-web-cmps/src/components/entityGrid3__c/index.tsx +1 -1
  70. package/template/neo-web-cmps/src/components/entityGrid3__c/style.scss +2 -4
  71. package/template/neo-web-cmps/src/components/entityGrid4__c/index.tsx +8 -6
  72. package/template/neo-web-cmps/src/components/entityGrid__c/model.ts +2 -1
  73. package/template/react-custom-cmp-template/package.json +1 -1
  74. package/template/react-ts-custom-cmp-template/package.json +1 -1
  75. package/template/vue2-custom-cmp-template/package.json +3 -3
  76. package/template/echarts-custom-cmp-template/src/components/mapWidget__c/README.md +0 -125
  77. /package/docs/{NeoEntityGrid → Web/347/253/257 NeoEntityGrid }/344/275/277/347/224/250/350/257/264/346/230/216.md" +0 -0
  78. /package/template/{echarts-custom-cmp-template → map-custom-cmp-template}/src/components/mapWidget__c/index.tsx +0 -0
  79. /package/template/{echarts-custom-cmp-template → map-custom-cmp-template}/src/components/mapWidget__c/model.ts +0 -0
  80. /package/template/{echarts-custom-cmp-template → map-custom-cmp-template}/src/components/mapWidget__c/style.scss +0 -0
  81. /package/template/{echarts-custom-cmp-template/src/components/mapWidget__c/USAGE.md → map-custom-cmp-template/src/components/mapWidget__c//345/234/260/345/233/276/347/273/204/344/273/266/345/277/253/351/200/237/344/275/277/347/224/250/346/214/207/345/215/227.md"} +0 -0
package/README.md CHANGED
@@ -25,17 +25,32 @@ neo-cmp-cli 是 Neo 自定义组件开发工具,基于 [AKFun](https://github.
25
25
 
26
26
  ## 📦 内置模板
27
27
 
28
- 创建自定义组件时(执行初始化命令 `neo init`)可选用以下模板:
29
-
30
- | 模板名称 | 说明 | 链接 |
31
- |---------|------|------|
32
- | **React + TS** | 内置信息卡片列表展示组件示例 | [react-ts-custom-cmp-template](https://github.com/wibetter/react-ts-custom-cmp-template) |
33
- | **React** | React 模板(非 TS) | [react-custom-cmp-template](https://github.com/wibetter/react-custom-cmp-template) |
34
- | **Antd** | 内置 Antd UI 组件实现的数据仪表板展示组件示例 | [antd-custom-cmp-template](https://github.com/wibetter/antd-custom-cmp-template) |
35
- | **Neo** | Neo 自定义业务组件(内置平台实体数据对象的增删改查示例组件) | [neo-custom-cmp-template](https://github.com/wibetter/neo-custom-cmp-template) |
36
- | **Neo H5** | Neo H5 自定义业务组件(内置平台实体数据对象的增删改查示例组件) | [neo-h5-cmps](https://github.com/wibetter/neo-h5-cmps) |
37
- | **Echarts** | Echarts 图表自定义组件(含高德地图展示组件示例) | [echarts-custom-cmp-template](https://github.com/wibetter/echarts-custom-cmp-template) |
38
- | **Vue2** | Vue2.0 自定义组件 | [vue2-custom-cmp-template](https://github.com/wibetter/vue2-custom-cmp-template) |
28
+ 执行 `neo init` 时,CLI 会以列表展示可选模板;也可同时传入 `-t`(模板类型)与 `-n`(项目名称)跳过交互,直接从本仓库内置的 `template/` 目录初始化相应组件模板工程。
29
+
30
+ | 模板类型 | 说明 | 参考仓库 |
31
+ |-------------|------|----------|
32
+ | `neo-web-cmps` | Web 端列表组件模板:含基础大列表、Picker 列表等示例组件 | (随 CLI 内置) |
33
+ | `neo-h5-cmps` | H5 端业务组件模板:含全局搜索、数据列表、数据 Tabs、打开 AI 对话页等示例组件 | [neo-h5-cmps](https://github.com/wibetter/neo-h5-cmps) |
34
+ | `neo` | 自定义业务组件模板:含实体表单、实体数据详情、实体数据表格等示例组件 | [neo-custom-cmp-template](https://github.com/wibetter/neo-custom-cmp-template) |
35
+ | `neo-bi-cmps` | 数值指标组件模板: 可配置展示实体数据源中关键数值指标 | [neo-bi-cmps](https://github.com/xsy-neoui/neo-bi-cmps) |
36
+ | `echarts` | ECharts 组件模板:含基于 ECharts 的图表示例组件(地图场景请使用 `amap` 模板) | [echarts-custom-cmp-template](https://github.com/wibetter/echarts-custom-cmp-template) |
37
+ | `antd` | Ant Design 组件模板:含数据仪表板、搜索组件等示例 | [antd-custom-cmp-template](https://github.com/wibetter/antd-custom-cmp-template) |
38
+ | `amap` | 地图组件模板:含基于高德地图 API 的示例组件 | [map-custom-cmp-template](https://github.com/wibetter/map-custom-cmp-template) |
39
+ | `vue2` | Vue2 组件模板:含基于 Vue2 的示例组件 | [vue2-custom-cmp-template](https://github.com/wibetter/vue2-custom-cmp-template) |
40
+
41
+ **非交互创建示例**(需同时提供 `-t` 与 `-n`):
42
+
43
+ ```bash
44
+ neo init -t neo-web-cmps -n myWebListCmp
45
+ neo init -t neo-h5-cmps -n myH5Cmp
46
+ neo init -t neo -n myNeoBizCmp
47
+ neo init -t antd -n myAntdCmp
48
+ neo init -t echarts -n myChartCmp
49
+ neo init -t amap -n myMapCmp
50
+ neo init -t vue2 -n myVue2Cmp
51
+ ```
52
+
53
+ > **说明**:本地拷贝模式(默认)下,`templateList` 中仍保留 `react-ts`、`react` 等目录时,可通过 `neo init -t react-ts -n xxx` 等方式创建,但已不再出现在上述交互列表中;`react`(非 TS)模板在 CLI 侧已标记为废弃,建议优先选用上表中的模板。
39
54
 
40
55
  ---
41
56
 
@@ -55,7 +70,7 @@ npm i -g neo-cmp-cli
55
70
  # 方式一:创建空的自定义组件项目
56
71
  neo create project
57
72
 
58
- # 方式二:根据模板创建自定义组件项目(默认 React+TS,可用 -t 指定模板,-n 指定自定义组件名称)
73
+ # 方式二:根据模板创建自定义组件项目(交互选择模板;或 neo init -t <类型> -n <项目名称> 非交互)
59
74
  neo init
60
75
  ```
61
76
 
@@ -108,7 +123,7 @@ neo push cmp
108
123
 
109
124
  | 命令 | 说明 | 参数 |
110
125
  |------|------|------|
111
- | `neo init` | 交互式创建自定义组件 | `-t` 指定模板,`--name` 指定组件名称 |
126
+ | `neo init` | 根据模板创建自定义组件项目 | `-t` / `--type` 模板类型(见 [内置模板](#内置模板)),`-n` / `--name` 项目名称;两者同时传入时为非交互 |
112
127
  | `neo create project` | 创建自定义组件空项目(不含任何自定义组件) | `--name` 指定项目名称 |
113
128
  | `neo create cmp` | 在当前项目中创建一个自定义组件 | `--name` 指定组件名称 |
114
129
  | `neo login` | 登录 NeoCRM 平台(OAuth2 授权模式) | - |
package/dist/index2.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./_virtual/index.js"),s=require("figlet"),o=require("yargs"),a=require("chalk"),n=require("inquirer"),t=require("ora"),c=require("./main2.js"),i=require("./utils/common.js"),p=require("./neo/env.js"),m=require("./package.json.js");var l;exports.__require=function(){if(l)return e.__exports;l=1;const r=s,u=o,g=a,d=n,h=t,{neoInit:y,neoInitByCopy:v,inspect:b,neoConfigInit:f,validateProjectName:C,getCmpTypeByDir:$,NeoService:x,NeoLoginService:T,hasNeoProject:w,consoleTag:j}=c.__require(),{errorLog:U,successLog:D,warningLog:L}=i.__require(),N=c.__require(),{getNeoCrmAPI:_}=p.__require(),q=m.default,M=r.textSync("neo",{font:"Lean"}),S=N.projectConfig,R=function(e){return g.green(g.bold(e))},A={"config init":"初始化配置文件",config:"初始化配置文件",dev:"开启本地调试模式",build:"构建生产环境代码",build2lib:"构建 UMD 模块",build2esm:"构建 ESM 模块",publish2oss:"发布到 OSS",inspect:"输出配置文件",open:"打开项目"},k={...A,init:"初始化自定义组件项目",login:"登录 NeoCRM 平台",logout:"登出 NeoCRM 平台","create project":"创建自定义组件项目","create cmp":"创建自定义组件",linkDebug:"开启外链调试模式",preview:"预览自定义组件","pull cmp":"拉取线上自定义组件","push cmp":"发布自定义组件到平台","delete cmp":"删除线上自定义组件",pull:"拉取线上自定义组件",push:"发布自定义组件到平台",delete:"删除线上自定义组件"};return u.middleware(function(e){if(e.help||e.version)return;const s=function(e){if(!e._||0===e._.length)return"";const s=e._.join(" ");if(k[s])return s;const o=e._[0];return k[o]?o:s||o}(e);if(!s)return;const o=k[s]||s;A[s]&&(console.log(g.green(M)),console.log(g.green(`当前版本:v${q.version}.\n`))),console.log(""),console.log(g.cyan(`执行命令: ${o}`)),console.log("")}).command("init [options]","根据模板创建一个自定义组件",e=>{e.usage(R("Usage")+": $0 init [options]").option("type",{alias:"t",describe:"自定义组件类型(react ts 技术栈/ vue2.0 技术栈/ react 技术栈)"}).option("name",{alias:"n",describe:"自定义组件项目名称"}).alias("h","help")},e=>{if(e.type&&e.name)w()&&(U(`${j}创建自定义组件失败,当前目录(${process.cwd()})已经是一个自定义组件项目,请勿重复创建。`),process.exit(1)),"github"===e.mode?y(e.type,e.name):v(e.type,e.name);else{const s=[],o=[{name:"react&ts 自定义组件",value:"react-ts",short:"react-ts"},{name:"Neo 自定义业务组件",value:"neo",short:"neo"},{name:"Neo Web 自定义业务组件",value:"neo-web-cmps",short:"neo-web-cmps"},{name:"Neo H5 自定义业务组件",value:"neo-h5-cmps",short:"neo-h5-cmps"},{name:"antd 自定义组件",value:"antd",short:"antd"},{name:"echarts 自定义组件",value:"echarts",short:"echarts"},{name:"vue2 自定义组件",value:"vue2",short:"vue2"}];e.type||s.push({name:"type",type:"list",message:"请选择您要创建的自定义组件类型: ",default:"react-ts",choices:o}),e.name||s.push({name:"name",type:"input",message:"请设置自定义组件项目名称(默认 neoCustomCmp):",default:"neoCustomCmp"}),d.prompt(s).then(s=>{const{isValid:o,errors:a}=C(s.name);o||(U(a.join("\n")),process.exit(1)),"github"===e.mode?y(s.type,s.name):v(s.type,s.name)})}}).command("config init","创建 neo.config.js 配置文件",e=>{e.usage(R("Usage")+": $0 config init").alias("h","help")},()=>{f("neo.config.js")}).command("login","登录 NeoCRM 平台(OAuth2 授权)",e=>{e.usage(R("Usage")+": $0 login").alias("h","help")},()=>{const e=[{name:"env",type:"list",message:"请选择您要登录的环境:",default:"cd",choices:[{name:"线上生产环境(crm.xiaoshouyi.com)",value:"production"},{name:"灰度环境(crm-gray.xiaoshouyi.com)",value:"gray"},{name:"沙盒环境(crm-sandbox.xiaoshouyi.com)",value:"sandbox"},{name:"开发环境(crm-cd.xiaoshouyi.com)",value:"cd"},{name:"tencentuat环境(crm-tencentuat.xiaoshouyi.com)",value:"tencentuat"},{name:"自定义环境(在neo.config.js / neoConfig 中自行配置)",value:"custom"}]}];d.prompt(e).then(async e=>{const s=_(e.env,S.neoConfig);try{const e=new T(s);await e.login(),process.exit(0)}catch(e){U(`\n登录失败: ${e.message||e.msg}`),process.exit(1)}})}).command("logout","登出 NeoCRM 平台",e=>{e.usage(R("Usage")+": $0 logout").alias("h","help")},async()=>{try{const e=new T;await e.logout(),process.exit(0)}catch(e){U(`\n登出失败: ${e.message||e.msg}`),process.exit(1)}}).command("create","创建项目或者组件",e=>e.command("project [options]","创建自定义组件项目(含工程代码)",e=>{e.usage(R("Usage")+": $0 project [options]").option("name",{alias:"n",describe:"自定义组件项目名称"}).alias("h","help")},e=>{if(e.name)N.createCmpProjectByTemplate(e.name);else{const e=[{name:"name",type:"input",message:"请设置自定义组件项目名称:"}];d.prompt(e).then(e=>{const{isValid:s,errors:o}=C(e.name);s||(U(o.join("\n")),process.exit(1)),e.name?N.createCmpProjectByTemplate(e.name):(U("自定义组件项目名称不能为空。"),process.exit(1))})}}).command("cmp [options]","创建自定义组件",e=>{e.usage(R("Usage")+": $0 cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).option("targetDevice",{alias:"d",describe:"终端类型(all: 所有端, web: 网页端, mobile: 移动端),不指定则交互选择",choices:["all","web","mobile"]}).alias("h","help")},e=>{const s=[{name:"所有端(all)",value:"all"},{name:"网页端(web)",value:"web"},{name:"移动端(mobile)",value:"mobile"}];if(e.name&&void 0!==e.targetDevice)N.createCmpByTemplate(e.name,{targetDevice:e.targetDevice});else if(e.name){const o=[{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:s}];d.prompt(o).then(s=>{N.createCmpByTemplate(e.name,{targetDevice:s.targetDevice})})}else{const e=[{name:"name",type:"input",message:"请设置自定义组件名称:"},{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:s}];d.prompt(e).then(e=>{e.name?N.createCmpByTemplate(e.name,{targetDevice:e.targetDevice}):(U("自定义组件名称不能为空。"),process.exit(1))})}})).command("pull cmp [options]","拉取线上自定义组件",e=>{e.usage(R("Usage")+": $0 pull cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},async e=>{if(e.name){L(`[neo pull cmp] 即将拉取自定义组件:${e.name},如本地已存在同名组件目录,将可能被覆盖,请提前备份本地修改。`);try{await N.pullCmp(e.name)}catch(e){U(e.message||e.msg||"拉取线上自定义组件失败"),process.exit(1)}}else{const e=new x,s=h("正在拉取线上自定义组件列表...").start(),o=await e.getCustomCmpList();0===o.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),s.stop("线上自定义组件列表拉取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要拉取的自定义组件:",choices:[{name:"拉取所有组件(ALL)",value:"ALL"},...o.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))]}];try{const s=await d.prompt(a);if(s.cmpType)if("ALL"===s.cmpType){L(`[neo pull cmp] 即将拉取当前租户下的所有自定义组件(共 ${o.length} 个),如本地存在同名组件目录,将可能被覆盖,请提前备份本地修改。`);for(let s=0,a=o.length;s<a;s++){const n=o[s];console.log(g.gray(`[neo pull cmp] 正在拉取第 ${s+1}/${a} 个组件: ${n.cmpType}`)),await N.pullCmp(n.cmpType,e)}D("[neo pull cmp]拉取所有组件命令已执行完成。")}else L(`[neo pull cmp] 即将拉取自定义组件:${s.cmpType},如本地已存在同名组件目录,将可能被覆盖,请提前备份本地修改。`),await N.pullCmp(s.cmpType,e);else U("请选择要拉取的自定义组件。"),process.exit(1)}catch(e){U(e.message||e.msg||"拉取线上自定义组件失败"),process.exit(1)}}}).command("delete cmp [options]","删除线上自定义组件",e=>{e.usage(R("Usage")+": $0 delete cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},async e=>{if(e.name)N.deleteCmp(e.name);else{const e=new x,s=h("正在获取线上自定义组件列表...").start(),o=await e.getCustomCmpList();0===o.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),s.stop("线上自定义组件列表获取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要删除的自定义组件:",choices:o.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))}];d.prompt(a).then(s=>{s.cmpType?N.deleteCmp(s.cmpType,e):(U("自定义组件名称不能为空。"),process.exit(1))})}}).command("preview [options]","预览指定自定义组件(仅预览组件本身内容)",e=>{e.usage(R("Usage")+": $0 preview [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},e=>{if(e.name)N.previewCmp(e.name);else{const e=$(S.componentsDir);0===e.length&&(U("当前自定义组件目录中未找到自定义组件。(./src/components 目录下)"),process.exit(1));const s=[{name:"cmpType",type:"list",message:"请选择要预览的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(s).then(e=>{e.cmpType||(U("未选择要预览的自定义组件。"),process.exit(1)),N.previewCmp(e.cmpType)})}}).command("dev","开启本地调试模式",e=>{e.usage(R("Usage")+": $0 dev").alias("h","help")},()=>{N.dev()}).command("linkDebug","开启外链调试模式(在线上页面设计器端调试)",e=>{e.usage(R("Usage")+": $0 linkDebug").alias("h","help")},e=>{N.linkDebug()}).command("build","构建生产环境代码",e=>{e.usage(R("Usage")+": $0 build").alias("h","help")},e=>{N.build()}).command("build2lib","构建 UMD 模块",e=>{e.usage(R("Usage")+": $0 build2lib").alias("h","help")},e=>{N.build2lib()}).command("publish2oss [options]","发布到oss",e=>{e.usage(R("Usage")+": $0 publish2oss [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},e=>{if(e.name)N.publish2oss(e.name);else{const e=$(S.componentsDir);0===e.length&&(U("当前自定义组件目录中未找到自定义组件。(./src/components 目录下)"),process.exit(1));const s=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(s).then(e=>{e.cmpType||(U("未选择要发布的自定义组件。"),process.exit(1)),N.publish2oss(e.cmpType)})}}).command("push cmp [options]","构建并发布自定义组件到 NeoCRM 平台",e=>{e.usage(R("Usage")+": $0 push cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},async e=>{if(e.name){L(`[neo push cmp] 即将构建并发布自定义组件:${e.name} 到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`);try{await N.pushCmp(e.name)}catch(e){U(e.message||e.msg||"发布自定义组件失败"),process.exit(1)}}else{const e=$(S.componentsDir);0===e.length&&(U("当前自定义组件目录中未找到自定义组件。(./src/components 目录下)"),process.exit(1));const s=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:[{name:"发布所有组件(ALL)",value:"ALL"},...e.map(e=>({name:e,value:e}))]}];d.prompt(s).then(async s=>{s.cmpType||(U("请选择要发布的自定义组件。"),process.exit(1));try{if("ALL"===s.cmpType){L(`[neo push cmp] 即将构建并发布当前目录下的所有自定义组件(共 ${e.length} 个)到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`);for(let s=0,o=e.length;s<o;s++){const a=e[s];console.log(g.gray(`[neo push cmp] 正在拉取第 ${s+1}/${o} 个组件: ${a}`)),await N.pushCmp(a,!0)}D("[neo push cmp]发布所有组件命令已执行完成。")}else L(`[neo push cmp] 即将构建并发布自定义组件:${s.cmpType} 到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`),await N.pushCmp(s.cmpType)}catch(e){U(e.message||e.msg||"发布失败"),process.exit(1)}})}}).command("build2esm","构建 ESM 模块",e=>{e.usage(R("Usage")+": $0 build2esm").alias("h","help")},()=>{N.build2esm()}).command("inspect","输出当前配置文件",e=>{e.usage(R("Usage")+": $0 inspect").option("type",{alias:"t",describe:"环境类型(本地调试环境/生产环境/library构建环境)",default:"build"}).alias("h","help")},e=>{b(e.type)}).command("open [options]","使用 Cursor 或 VSCode 打开项目",e=>{e.usage(R("Usage")+": $0 open [options]").option("editor",{alias:"e",describe:"编辑器类型(cursor/vscode/auto),默认为 auto(自动检测)",default:"auto",choices:["cursor","vscode","code","auto"]}).option("name",{alias:"n",describe:"要打开的项目名称,默认为当前目录"}).alias("h","help")},e=>{N.openEditor(e.editor,e.name)}).alias("h","help").alias("v","version").strict().fail((e,s,o)=>{U(`\n运行命令时发生错误: ${e}。\n`),console.log(R("当前可用命令列表:")),console.log("");[{cmd:"init [options]",desc:"根据模板创建一个自定义组件"},{cmd:"create project [options]",desc:"创建自定义组件项目(含工程代码)"},{cmd:"create cmp [options]",desc:"创建自定义组件"},{cmd:"preview [options]",desc:"预览指定自定义组件(仅预览组件本身内容)"},{cmd:"linkDebug",desc:"开启外链调试模式(在线上页面设计器端调试)"},{cmd:"login",desc:"登录 NeoCRM 平台(OAuth2 授权)"},{cmd:"logout",desc:"登出 NeoCRM 平台"},{cmd:"pull cmp [options]",desc:"拉取线上自定义组件"},{cmd:"delete cmp [options]",desc:"删除线上自定义组件"},{cmd:"push cmp [options]",desc:"构建并发布自定义组件到 NeoCRM 平台"},{cmd:"open [options]",desc:"使用 Cursor 或 VSCode 打开项目"}].forEach(({cmd:e,desc:s})=>{console.log(` ${g.cyan(e.padEnd(25))} ${s}`)}),console.log(""),console.log(`使用 ${g.cyan("neo <command> --help")} 查看具体命令的帮助信息。`),console.log(""),process.exit(1)}).help().updateStrings({"Usage:":R("Usage:"),"Commands:":R("Commands:"),"Options:":R("Options:")}).parseAsync().catch(e=>{e&&(U(`\n运行命令时发生错误: ${e.message||e}。\n`),process.exit(1))}),e.__exports};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./_virtual/index.js"),s=require("figlet"),o=require("yargs"),a=require("chalk"),n=require("inquirer"),t=require("ora"),c=require("./main2.js"),i=require("./utils/common.js"),p=require("./neo/env.js"),m=require("./package.json.js");var l;exports.__require=function(){if(l)return e.__exports;l=1;const r=s,u=o,g=a,d=n,h=t,{neoInit:y,neoInitByCopy:v,inspect:b,neoConfigInit:C,validateProjectName:f,getCmpTypeByDir:$,NeoService:x,NeoLoginService:T,hasNeoProject:w,consoleTag:j}=c.__require(),{errorLog:U,successLog:D,warningLog:L}=i.__require(),_=c.__require(),{getNeoCrmAPI:q}=p.__require(),M=m.default,N=r.textSync("neo",{font:"Lean"}),A=_.projectConfig,S=function(e){return g.green(g.bold(e))},R={"config init":"初始化配置文件",config:"初始化配置文件",dev:"开启本地调试模式",build:"构建生产环境代码",build2lib:"构建 UMD 模块",build2esm:"构建 ESM 模块",publish2oss:"发布到 OSS",inspect:"输出配置文件",open:"打开项目"},k={...R,init:"初始化自定义组件项目",login:"登录 NeoCRM 平台",logout:"登出 NeoCRM 平台","create project":"创建自定义组件项目","create cmp":"创建自定义组件",linkDebug:"开启外链调试模式",preview:"预览自定义组件","pull cmp":"拉取线上自定义组件","push cmp":"发布自定义组件到平台","delete cmp":"删除线上自定义组件",pull:"拉取线上自定义组件",push:"发布自定义组件到平台",delete:"删除线上自定义组件"};return u.middleware(function(e){if(e.help||e.version)return;const s=function(e){if(!e._||0===e._.length)return"";const s=e._.join(" ");if(k[s])return s;const o=e._[0];return k[o]?o:s||o}(e);if(!s)return;const o=k[s]||s;R[s]&&(console.log(g.green(N)),console.log(g.green(`当前版本:v${M.version}.\n`))),console.log(""),console.log(g.cyan(`执行命令: ${o}`)),console.log("")}).command("init [options]","根据模板创建一个自定义组件",e=>{e.usage(S("Usage")+": $0 init [options]").option("type",{alias:"t",describe:"自定义组件类型(react ts 技术栈/ vue2.0 技术栈/ react 技术栈)"}).option("name",{alias:"n",describe:"自定义组件项目名称"}).alias("h","help")},e=>{if(e.type&&e.name)w()&&(U(`${j}创建自定义组件失败,当前目录(${process.cwd()})已经是一个自定义组件项目,请勿重复创建。`),process.exit(1)),"github"===e.mode?y(e.type,e.name):v(e.type,e.name);else{const s=[],o=[{name:"Web端列表组件模板: 含基础大列表、Picker 列表等示例组件",value:"neo-web-cmps",short:"neo-web-cmps"},{name:"H5端业务组件模板: 含全局搜索、数据列表、数据Tabs、打开AI对话页等示例组件",value:"neo-h5-cmps",short:"neo-h5-cmps"},{name:"自定义业务组件模板: 含实体表单、实体数据详情、实体数据表格等示例组件",value:"neo",short:"neo"},{name:'"数值指标组件模板: 可配置展示实体数据源中关键数值指标',value:"neo-bi-cmps",short:"neo-bi-cmps"},{name:"antd 组件模板: 含基于 Antd 实现的数据仪表板、搜索组件等示例组件",value:"antd",short:"antd"},{name:"echarts 组件模板: 含基于 ECharts 实现的图表示例组件",value:"echarts",short:"echarts"},{name:"地图组件模板: 含基于 高德地图API 实现的示例组件",value:"amap",short:"amap"},{name:"vue2 组件模板: 含基于 Vue2 实现的示例组件",value:"vue2",short:"vue2"}];e.type||s.push({name:"type",type:"list",message:"请选择您要创建的自定义组件类型: ",default:"react-ts",choices:o}),e.name||s.push({name:"name",type:"input",message:"请设置自定义组件项目名称(默认 neoCustomCmp):",default:"neoCustomCmp"}),d.prompt(s).then(s=>{const{isValid:o,errors:a}=f(s.name);o||(U(a.join("\n")),process.exit(1)),"github"===e.mode?y(s.type,s.name):v(s.type,s.name)})}}).command("config init","创建 neo.config.js 配置文件",e=>{e.usage(S("Usage")+": $0 config init").alias("h","help")},()=>{C("neo.config.js")}).command("login","登录 NeoCRM 平台(OAuth2 授权)",e=>{e.usage(S("Usage")+": $0 login").alias("h","help")},()=>{const e=[{name:"env",type:"list",message:"请选择您要登录的环境:",default:"cd",choices:[{name:"线上生产环境(crm.xiaoshouyi.com)",value:"production"},{name:"灰度环境(crm-gray.xiaoshouyi.com)",value:"gray"},{name:"沙盒环境(crm-sandbox.xiaoshouyi.com)",value:"sandbox"},{name:"开发环境(crm-cd.xiaoshouyi.com)",value:"cd"},{name:"tencentuat环境(crm-tencentuat.xiaoshouyi.com)",value:"tencentuat"},{name:"自定义环境(在neo.config.js / neoConfig 中自行配置)",value:"custom"}]}];d.prompt(e).then(async e=>{const s=q(e.env,A.neoConfig);try{const e=new T(s);await e.login(),process.exit(0)}catch(e){U(`\n登录失败: ${e.message||e.msg}`),process.exit(1)}})}).command("logout","登出 NeoCRM 平台",e=>{e.usage(S("Usage")+": $0 logout").alias("h","help")},async()=>{try{const e=new T;await e.logout(),process.exit(0)}catch(e){U(`\n登出失败: ${e.message||e.msg}`),process.exit(1)}}).command("create","创建项目或者组件",e=>e.command("project [options]","创建自定义组件项目(含工程代码)",e=>{e.usage(S("Usage")+": $0 project [options]").option("name",{alias:"n",describe:"自定义组件项目名称"}).alias("h","help")},e=>{if(e.name)_.createCmpProjectByTemplate(e.name);else{const e=[{name:"name",type:"input",message:"请设置自定义组件项目名称:"}];d.prompt(e).then(e=>{const{isValid:s,errors:o}=f(e.name);s||(U(o.join("\n")),process.exit(1)),e.name?_.createCmpProjectByTemplate(e.name):(U("自定义组件项目名称不能为空。"),process.exit(1))})}}).command("cmp [options]","创建自定义组件",e=>{e.usage(S("Usage")+": $0 cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).option("targetDevice",{alias:"d",describe:"终端类型(all: 所有端, web: 网页端, mobile: 移动端),不指定则交互选择",choices:["all","web","mobile"]}).alias("h","help")},e=>{const s=[{name:"所有端(all)",value:"all"},{name:"网页端(web)",value:"web"},{name:"移动端(mobile)",value:"mobile"}];if(e.name&&void 0!==e.targetDevice)_.createCmpByTemplate(e.name,{targetDevice:e.targetDevice});else if(e.name){const o=[{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:s}];d.prompt(o).then(s=>{_.createCmpByTemplate(e.name,{targetDevice:s.targetDevice})})}else{const e=[{name:"name",type:"input",message:"请设置自定义组件名称:"},{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:s}];d.prompt(e).then(e=>{e.name?_.createCmpByTemplate(e.name,{targetDevice:e.targetDevice}):(U("自定义组件名称不能为空。"),process.exit(1))})}})).command("pull cmp [options]","拉取线上自定义组件",e=>{e.usage(S("Usage")+": $0 pull cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},async e=>{if(e.name){L(`[neo pull cmp] 即将拉取自定义组件:${e.name},如本地已存在同名组件目录,将可能被覆盖,请提前备份本地修改。`);try{await _.pullCmp(e.name)}catch(e){U(e.message||e.msg||"拉取线上自定义组件失败"),process.exit(1)}}else{const e=new x,s=h("正在拉取线上自定义组件列表...").start(),o=await e.getCustomCmpList();0===o.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),s.stop("线上自定义组件列表拉取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要拉取的自定义组件:",choices:[{name:"拉取所有组件(ALL)",value:"ALL"},...o.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))]}];try{const s=await d.prompt(a);if(s.cmpType)if("ALL"===s.cmpType){L(`[neo pull cmp] 即将拉取当前租户下的所有自定义组件(共 ${o.length} 个),如本地存在同名组件目录,将可能被覆盖,请提前备份本地修改。`);for(let s=0,a=o.length;s<a;s++){const n=o[s];console.log(g.gray(`[neo pull cmp] 正在拉取第 ${s+1}/${a} 个组件: ${n.cmpType}`)),await _.pullCmp(n.cmpType,e)}D("[neo pull cmp]拉取所有组件命令已执行完成。")}else L(`[neo pull cmp] 即将拉取自定义组件:${s.cmpType},如本地已存在同名组件目录,将可能被覆盖,请提前备份本地修改。`),await _.pullCmp(s.cmpType,e);else U("请选择要拉取的自定义组件。"),process.exit(1)}catch(e){U(e.message||e.msg||"拉取线上自定义组件失败"),process.exit(1)}}}).command("delete cmp [options]","删除线上自定义组件",e=>{e.usage(S("Usage")+": $0 delete cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},async e=>{if(e.name)_.deleteCmp(e.name);else{const e=new x,s=h("正在获取线上自定义组件列表...").start(),o=await e.getCustomCmpList();0===o.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),s.stop("线上自定义组件列表获取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要删除的自定义组件:",choices:o.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))}];d.prompt(a).then(s=>{s.cmpType?_.deleteCmp(s.cmpType,e):(U("自定义组件名称不能为空。"),process.exit(1))})}}).command("preview [options]","预览指定自定义组件(仅预览组件本身内容)",e=>{e.usage(S("Usage")+": $0 preview [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},e=>{if(e.name)_.previewCmp(e.name);else{const e=$(A.componentsDir);0===e.length&&(U("当前自定义组件目录中未找到自定义组件。(./src/components 目录下)"),process.exit(1));const s=[{name:"cmpType",type:"list",message:"请选择要预览的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(s).then(e=>{e.cmpType||(U("未选择要预览的自定义组件。"),process.exit(1)),_.previewCmp(e.cmpType)})}}).command("dev","开启本地调试模式",e=>{e.usage(S("Usage")+": $0 dev").alias("h","help")},()=>{_.dev()}).command("linkDebug","开启外链调试模式(在线上页面设计器端调试)",e=>{e.usage(S("Usage")+": $0 linkDebug").alias("h","help")},e=>{_.linkDebug()}).command("build","构建生产环境代码",e=>{e.usage(S("Usage")+": $0 build").alias("h","help")},e=>{_.build()}).command("build2lib","构建 UMD 模块",e=>{e.usage(S("Usage")+": $0 build2lib").alias("h","help")},e=>{_.build2lib()}).command("publish2oss [options]","发布到oss",e=>{e.usage(S("Usage")+": $0 publish2oss [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},e=>{if(e.name)_.publish2oss(e.name);else{const e=$(A.componentsDir);0===e.length&&(U("当前自定义组件目录中未找到自定义组件。(./src/components 目录下)"),process.exit(1));const s=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(s).then(e=>{e.cmpType||(U("未选择要发布的自定义组件。"),process.exit(1)),_.publish2oss(e.cmpType)})}}).command("push cmp [options]","构建并发布自定义组件到 NeoCRM 平台",e=>{e.usage(S("Usage")+": $0 push cmp [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},async e=>{if(e.name){L(`[neo push cmp] 即将构建并发布自定义组件:${e.name} 到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`);try{await _.pushCmp(e.name)}catch(e){U(e.message||e.msg||"发布自定义组件失败"),process.exit(1)}}else{const e=$(A.componentsDir);0===e.length&&(U("当前自定义组件目录中未找到自定义组件。(./src/components 目录下)"),process.exit(1));const s=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:[{name:"发布所有组件(ALL)",value:"ALL"},...e.map(e=>({name:e,value:e}))]}];d.prompt(s).then(async s=>{s.cmpType||(U("请选择要发布的自定义组件。"),process.exit(1));try{if("ALL"===s.cmpType){L(`[neo push cmp] 即将构建并发布当前目录下的所有自定义组件(共 ${e.length} 个)到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`);for(let s=0,o=e.length;s<o;s++){const a=e[s];console.log(g.gray(`[neo push cmp] 正在拉取第 ${s+1}/${o} 个组件: ${a}`)),await _.pushCmp(a,!0)}D("[neo push cmp]发布所有组件命令已执行完成。")}else L(`[neo push cmp] 即将构建并发布自定义组件:${s.cmpType} 到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`),await _.pushCmp(s.cmpType)}catch(e){U(e.message||e.msg||"发布失败"),process.exit(1)}})}}).command("build2esm","构建 ESM 模块",e=>{e.usage(S("Usage")+": $0 build2esm").alias("h","help")},()=>{_.build2esm()}).command("inspect","输出当前配置文件",e=>{e.usage(S("Usage")+": $0 inspect").option("type",{alias:"t",describe:"环境类型(本地调试环境/生产环境/library构建环境)",default:"build"}).alias("h","help")},e=>{b(e.type)}).command("open [options]","使用 Cursor 或 VSCode 打开项目",e=>{e.usage(S("Usage")+": $0 open [options]").option("editor",{alias:"e",describe:"编辑器类型(cursor/vscode/auto),默认为 auto(自动检测)",default:"auto",choices:["cursor","vscode","code","auto"]}).option("name",{alias:"n",describe:"要打开的项目名称,默认为当前目录"}).alias("h","help")},e=>{_.openEditor(e.editor,e.name)}).alias("h","help").alias("v","version").strict().fail((e,s,o)=>{U(`\n运行命令时发生错误: ${e}。\n`),console.log(S("当前可用命令列表:")),console.log("");[{cmd:"init [options]",desc:"根据模板创建一个自定义组件"},{cmd:"create project [options]",desc:"创建自定义组件项目(含工程代码)"},{cmd:"create cmp [options]",desc:"创建自定义组件"},{cmd:"preview [options]",desc:"预览指定自定义组件(仅预览组件本身内容)"},{cmd:"linkDebug",desc:"开启外链调试模式(在线上页面设计器端调试)"},{cmd:"login",desc:"登录 NeoCRM 平台(OAuth2 授权)"},{cmd:"logout",desc:"登出 NeoCRM 平台"},{cmd:"pull cmp [options]",desc:"拉取线上自定义组件"},{cmd:"delete cmp [options]",desc:"删除线上自定义组件"},{cmd:"push cmp [options]",desc:"构建并发布自定义组件到 NeoCRM 平台"},{cmd:"open [options]",desc:"使用 Cursor 或 VSCode 打开项目"}].forEach(({cmd:e,desc:s})=>{console.log(` ${g.cyan(e.padEnd(25))} ${s}`)}),console.log(""),console.log(`使用 ${g.cyan("neo <command> --help")} 查看具体命令的帮助信息。`),console.log(""),process.exit(1)}).help().updateStrings({"Usage:":S("Usage:"),"Commands:":S("Commands:"),"Options:":S("Options:")}).parseAsync().catch(e=>{e&&(U(`\n运行命令时发生错误: ${e.message||e}。\n`),process.exit(1))}),e.__exports};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("fs-extra"),t=require("node:path"),r=require("../utils/neoParams.js"),m=require("../utils/replaceInPackage.js"),o=require("../utils/resetPackageVersion.js"),a=require("../utils/autoEntryRootDir.js"),c=require("../utils/common.js");var s,p;exports.__require=function(){if(p)return s;p=1;const n=e,i=t,{consoleTag:l}=r.__require(),{replaceInPackage:u}=m.__require(),{resetPackageVersion:_}=o.__require(),d=a.__require(),{errorLog:j}=c.__require(),v={react:{projectName:"react-custom-cmp-template",dir:i.resolve(__dirname,"../../template/react-custom-cmp-template")},"react-ts":{projectName:"react-ts-custom-cmp-template",dir:i.resolve(__dirname,"../../template/react-ts-custom-cmp-template")},antd:{projectName:"antd-custom-cmp-template",dir:i.resolve(__dirname,"../../template/antd-custom-cmp-template")},echarts:{projectName:"echarts-custom-cmp-template",dir:i.resolve(__dirname,"../../template/echarts-custom-cmp-template")},neo:{projectName:"neo-custom-cmp-template",dir:i.resolve(__dirname,"../../template/neo-custom-cmp-template")},"neo-web-cmps":{projectName:"neo-web-cmps",dir:i.resolve(__dirname,"../../template/neo-web-cmps")},"neo-h5-cmps":{projectName:"neo-h5-cmps",dir:i.resolve(__dirname,"../../template/neo-h5-cmps")},vue2:{projectName:"vue2-custom-cmp-template",dir:i.resolve(__dirname,"../../template/vue2-custom-cmp-template")}};return s=function(e,t){const r=v[e||"react"],m=r.dir,o=t||"neoCustomCmp",a=i.resolve(process.cwd(),o);n.copy(m,a).then(()=>{u(a,r.projectName,o),u(a,"neo自定义组件模板","neo自定义组件"),_(a),console.log(`${l}已创建自定义组件(${o})!`),d(a)}).catch(e=>j(`${l}自定义组件模板下载失败:`,e))}};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("fs-extra"),t=require("node:path"),r=require("../utils/neoParams.js"),m=require("../utils/replaceInPackage.js"),a=require("../utils/resetPackageVersion.js"),o=require("../utils/autoEntryRootDir.js"),c=require("../utils/common.js");var p,s;exports.__require=function(){if(s)return p;s=1;const i=e,n=t,{consoleTag:l}=r.__require(),{replaceInPackage:u}=m.__require(),{resetPackageVersion:_}=a.__require(),d=o.__require(),{errorLog:j}=c.__require(),v={"neo-web-cmps":{projectName:"neo-web-cmps",dir:n.resolve(__dirname,"../../template/neo-web-cmps")},"neo-h5-cmps":{projectName:"neo-h5-cmps",dir:n.resolve(__dirname,"../../template/neo-h5-cmps")},neo:{projectName:"neo-custom-cmp-template",dir:n.resolve(__dirname,"../../template/neo-custom-cmp-template")},antd:{projectName:"antd-custom-cmp-template",dir:n.resolve(__dirname,"../../template/antd-custom-cmp-template")},"neo-bi-cmps":{projectName:"neo-bi-cmps",dir:n.resolve(__dirname,"../../template/neo-bi-cmps")},echarts:{projectName:"echarts-custom-cmp-template",dir:n.resolve(__dirname,"../../template/echarts-custom-cmp-template")},amap:{projectName:"map-custom-cmp-template",dir:n.resolve(__dirname,"../../template/map-custom-cmp-template")},react:{projectName:"react-custom-cmp-template",dir:n.resolve(__dirname,"../../template/react-custom-cmp-template")},"react-ts":{projectName:"react-ts-custom-cmp-template",dir:n.resolve(__dirname,"../../template/react-ts-custom-cmp-template")},vue2:{projectName:"vue2-custom-cmp-template",dir:n.resolve(__dirname,"../../template/vue2-custom-cmp-template")}};return p=function(e,t){const r=v[e||"react"],m=r.dir,a=t||"neoCustomCmp",o=n.resolve(process.cwd(),a);i.copy(m,o).then(()=>{u(o,r.projectName,a),u(o,"neo自定义组件模板","neo自定义组件"),_(o),console.log(`${l}已创建自定义组件(${a})!`),d(o)}).catch(e=>j(`${l}自定义组件模板下载失败:`,e))}};
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e="1.12.11";const o={version:e};exports.default=o,exports.version=e;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e="1.13.0";const o={version:e};exports.default=o,exports.version=e;
@@ -0,0 +1,293 @@
1
+ # H5 端 NeoEntityList 使用说明
2
+
3
+ ## 目录
4
+
5
+ - [一、组件概述](#一组件概述)
6
+ - [技术栈](#技术栈)
7
+ - [二、核心功能](#二核心功能)
8
+ - [1. 列表类型与展示](#1-列表类型与展示)
9
+ - [2. 数据与分页](#2-数据与分页)
10
+ - [3. SmartView、搜索、筛选与排序](#3-smartview搜索筛选与排序)
11
+ - [4. 批量操作与按钮区](#4-批量操作与按钮区)
12
+ - [5. 列表项交互与详情](#5-列表项交互与详情)
13
+ - [三、组件属性说明](#三组件属性说明)
14
+ - [NeoEntityList 封装层属性](#neoentitylist-封装层属性)
15
+ - [额外透传至 EntityList 的属性](#额外透传至-entitylist-的属性)
16
+ - [透传范围说明](#透传范围说明)
17
+ - [四、核心回调说明](#四核心回调说明)
18
+ - [onItemClickIntercept — 列表项点击拦截](#onitemclickintercept--列表项点击拦截)
19
+ - [onSearchDataComplete — 列表数据请求完成](#onsearchdatacomplete--列表数据请求完成)
20
+ - [五、完整使用示例](#五完整使用示例)
21
+ - [示例 1:基础实体列表](#示例-1基础实体列表)
22
+ - [示例 2:精简展示(无标题区、无视图切换)](#示例-2精简展示无标题区无视图切换)
23
+ - [示例 3:关闭搜索 / 排序 / 筛选与下拉刷新](#示例-3关闭搜索--排序--筛选与下拉刷新)
24
+ - [示例 4:拦截列表项点击(不打开详情)](#示例-4拦截列表项点击不打开详情)
25
+ - [六、注意事项](#六注意事项)
26
+ - [1. render 必传](#1-render-必传)
27
+ - [2. Store 与注册](#2-store-与注册)
28
+ - [3. skipExt 与 Nex](#3-skipext-与-nex)
29
+ - [4. 高度与滚动(autoHeight)](#4-高度与滚动autoheight)
30
+ - [5. 需要完整 EntityList 能力时](#5-需要完整-entitylist-能力时)
31
+ - [七、常见问题](#七常见问题)
32
+ - [Q1: 点击列表项如何阻止默认打开详情?](#q1-点击列表项如何阻止默认打开详情)
33
+ - [Q2: 如何监听每次列表数据加载完成?](#q2-如何监听每次列表数据加载完成)
34
+ - [Q3: 为什么传入的部分 props 未生效?](#q3-为什么传入的部分-props-未生效)
35
+ - [Q4: 与直接使用 type: 'EntityList' 的 Schema 有何区别?](#q4-与直接使用-type-entitylist-的-schema-有何区别)
36
+ - [八、总结](#八总结)
37
+
38
+ ## 一、组件概述
39
+
40
+ `NeoEntityList`是对 H5 业务组件 **`EntityList`** 的二次封装,支持在「自定义组件」中通过 **import 代码方式**使用。
41
+
42
+ 底层 `EntityList` 使用 **卡片式列表** 展示列表数据,支持 SmartView 切换、搜索、筛选、排序、批量操作、下拉刷新与上拉加载等能力。
43
+
44
+ ### 技术栈
45
+
46
+ - **React**:类组件封装(继承 `BaseCmp`)
47
+ - **MobX / MST**:底层 `EntityList` 与 `EntityListStore` 状态管理
48
+ - **amis**:通过 `props.render` 渲染 `EntityList` Schema
49
+ - **TypeScript**:与 `RendererProps` 等类型配合使用
50
+
51
+ ## 二、核心功能
52
+
53
+ ### 1. 列表类型与展示
54
+
55
+ - 固定为 **大列表** 场景(`tableType: 'list'`),列表项为 **卡片** 形态。
56
+ - 可通过 `disableTitleView`、`isShowTitlePicker` 控制 **标题区** 与 **视图切换(Picker)** 是否展示(封装内默认:隐藏标题区、不展示视图 Picker,详情见属性表)。
57
+
58
+ ### 2. 数据与分页
59
+
60
+ - 数据通过 **`EntityListStore`** 拉取布局与列表数据,支持分页。
61
+ - `pageSize` 对应请求中的每页条数(内部默认 20)。
62
+ - `isNoRefresh` 为 `true` 时 **禁用下拉刷新与上拉加载**。
63
+
64
+ ### 3. SmartView、搜索、筛选与排序
65
+
66
+ - 支持 **SmartView** 及对应的数据范围与列配置(是否展示视图切换受 `disableTitleView` / `isShowTitlePicker` 等影响)。
67
+ - `disableSearch`:隐藏顶部搜索相关能力。
68
+ - `disabledSort` / `disabledFilter`:隐藏列表上的 **排序** / **筛选** 控件(与《详细分析文档》中「筛选和排序」章节一致)。
69
+
70
+ ### 4. 批量操作与按钮区
71
+
72
+ - `disabledOperationBtn`:为 `true` 时隐藏 **操作按钮区域**(如新建、批量操作等,具体以产品实现为准)。
73
+ - `disabledShortcutBtn`:为 `true` 时隐藏 **快捷按钮区域**。
74
+
75
+ ### 5. 列表项交互与详情
76
+
77
+ - 默认点击列表项会通过 `NeoNavigator.openEntityDetail` 打开实体详情。
78
+ - 可通过 **`onItemClickIntercept`** 拦截:返回真值时 **不执行**默认打开详情逻辑(见下文)。
79
+
80
+ ## 三、组件属性说明
81
+
82
+ ### 基础配置属性
83
+
84
+ | 属性名 | 类型 | 默认值 | 说明 |
85
+ |--------|------|--------|------|
86
+ | `entityApiKey` | `string` | (必填) | 实体 ApiKey;同时作为 `objectApiKey` 传入 `EntityList` |
87
+ | `render` | `Function` | (必填) | amis 注入的渲染函数,**必传**,通常为 `this.props.render` 或 `props.render` |
88
+ | `disableTitleView` | `boolean` | `true` | 为 `true` 时隐藏 **标题区域**(封装默认隐藏,需标题时可传 `false`) |
89
+ | `isShowTitlePicker` | `boolean` | `false` | 为 `true` 时展示 **切换视图的 Picker** |
90
+ | `disableSearch` | `boolean` | `false` | 为 `true` 时不展示搜索框 |
91
+ | `disabledSort` | `boolean` | `false` | 为 `true` 时不展示列表 **排序** 组件 |
92
+ | `disabledFilter` | `boolean` | `false` | 为 `true` 时不展示列表 **筛选** 组件 |
93
+ | `disabledOperationBtn` | `boolean` | `false` | 为 `true` 时隐藏 **操作按钮区**(含新建、批量操作等) |
94
+ | `disabledShortcutBtn` | `boolean` | `false` | 为 `true` 时隐藏 **快捷按钮区** |
95
+ | `pageSize` | `number` | 未传则走内部默认 | 每页加载条数(search 接口 `page.pageSize`) |
96
+ | `isNoRefresh` | `boolean` | `false` | 为 `true` 时禁用 **下拉刷新** 与 **上拉加载** |
97
+ | `autoHeight` | `boolean` | `false` | 为 `true` 时外层高度为 `auto`,列表区域使用 **body 滚动**(与 `EntityList` 一致) |
98
+
99
+ ### 其他可用属性
100
+
101
+ | 属性名 | 类型 | 说明 |
102
+ |--------|------|------|
103
+ | `onItemClickIntercept` | `Function` | 列表项点击拦截,见 [四、核心回调说明](#四核心回调说明) |
104
+ | `onSearchDataComplete` | `Function` | 列表数据请求完成回调,见 [四、核心回调说明](#四核心回调说明) |
105
+ | `style` | `object` | 自定义样式对象,传入 `EntityList` |
106
+
107
+ ## 四、核心回调说明
108
+
109
+ ### onItemClickIntercept — 列表项点击拦截
110
+
111
+ **作用**:在用户点击列表项准备打开详情 **之前** 调用;若返回 **真值**(truthy),则 **不会** 执行默认的 `NeoNavigator.openEntityDetail`。
112
+
113
+ **函数签名(典型用法)**:
114
+
115
+ ```typescript
116
+ onItemClickIntercept?: (data: any, entity: any, context?: any) => any
117
+ ```
118
+
119
+ **参数说明**:
120
+
121
+ - `data`:当前行 / 卡片对应的数据(含 `id`、`entityType` 等)。
122
+ - `entity`:实体元数据相关信息(含 `apiKey` 等)。
123
+ - `context`:部分调用路径会传入 amis `context`(与 `EntityList` 内 `listItemClick` 实现一致)。
124
+
125
+ **实现逻辑(与 EntityList 一致)**:
126
+
127
+ ```text
128
+ result = onItemClickIntercept?.(data, entity, context)
129
+ 若 result 为真 → 不打开详情
130
+ 否则 → NeoNavigator.openEntityDetail(...)
131
+ ```
132
+
133
+ **使用示例**见 [示例 4](#示例-4拦截列表项点击不打开详情)。
134
+
135
+ ---
136
+
137
+ ### onSearchDataComplete — 列表数据请求完成
138
+
139
+ **作用**:在列表数据请求流程中作为回调传入 Store,用于在 **数据刷新、加载** 等完成后执行自定义逻辑(例如刷新汇总、埋点等)。具体调用链与 `EntityList` / `EntityListStore` 内 `getListData`、`refreshListData` 一致,详见《EntityList H5 组件的详细分析文档》。
140
+
141
+ **函数签名(示意)**:
142
+
143
+ ```typescript
144
+ onSearchDataComplete?: (data?: any) => void
145
+ ```
146
+
147
+ ## 五、完整使用示例
148
+
149
+ 以下示例均在自定义组件中挂载 **`NeoEntityList`**,并从 **`neo-ui-component-h5`** 引用。
150
+
151
+ > **说明**:`render` 必须为框架注入的 `this.props.render`(类组件)或 `props.render`(函数组件),否则子 Schema 无法渲染。
152
+
153
+ ### 示例 1:基础实体列表
154
+
155
+ ```tsx
156
+ import * as React from 'react'
157
+ import { NeoEntityList } from 'neo-ui-component-h5'
158
+
159
+ interface Props {
160
+ render: (name: string, schema: object) => React.ReactNode
161
+ }
162
+
163
+ export default class AccountNeoEntityListBasic extends React.Component<Props> {
164
+ render() {
165
+ return (
166
+ <NeoEntityList
167
+ render={this.props.render}
168
+ entityApiKey="account"
169
+ disableTitleView={false}
170
+ isShowTitlePicker
171
+ />
172
+ )
173
+ }
174
+ }
175
+ ```
176
+
177
+ ### 示例 2:精简展示(无标题区、无视图切换)
178
+
179
+ ```tsx
180
+ import * as React from 'react'
181
+ import { NeoEntityList } from 'neo-ui-component-h5'
182
+
183
+ export default class ContactNeoEntityListMinimal extends React.Component<{ render: any }> {
184
+ render() {
185
+ return (
186
+ <NeoEntityList
187
+ render={this.props.render}
188
+ entityApiKey="contact"
189
+ disableTitleView
190
+ isShowTitlePicker={false}
191
+ style={{ minHeight: 200 }}
192
+ />
193
+ )
194
+ }
195
+ }
196
+ ```
197
+
198
+ ### 示例 3:关闭搜索 / 排序 / 筛选与下拉刷新
199
+
200
+ ```tsx
201
+ import * as React from 'react'
202
+ import { NeoEntityList } from 'neo-ui-component-h5'
203
+
204
+ export default class LeadNeoEntityListNoChrome extends React.Component<{ render: any }> {
205
+ render() {
206
+ return (
207
+ <NeoEntityList
208
+ render={this.props.render}
209
+ entityApiKey="lead"
210
+ disableSearch
211
+ disabledSort
212
+ disabledFilter
213
+ isNoRefresh
214
+ pageSize={15}
215
+ />
216
+ )
217
+ }
218
+ }
219
+ ```
220
+
221
+ ### 示例 4:拦截列表项点击(不打开详情)
222
+
223
+ ```tsx
224
+ import * as React from 'react'
225
+ import { NeoEntityList } from 'neo-ui-component-h5'
226
+
227
+ export default class OpportunityNeoEntityListIntercept extends React.Component<{ render: any }> {
228
+ render() {
229
+ return (
230
+ <NeoEntityList
231
+ render={this.props.render}
232
+ entityApiKey="opportunity"
233
+ onItemClickIntercept={(data, entity) => {
234
+ console.log('点击列表项', data, entity)
235
+ // 返回 true 拦截默认打开详情
236
+ return true
237
+ }}
238
+ onSearchDataComplete={(payload) => {
239
+ console.log('列表数据请求完成', payload)
240
+ }}
241
+ />
242
+ )
243
+ }
244
+ }
245
+ ```
246
+
247
+ ## 六、注意事项
248
+
249
+ ### 1. render 必传
250
+
251
+ 在 Neo 自定义组件内使用 `NeoEntityList` 时,**必须**传入 `render={this.props.render}`(或函数组件的 `props.render`),用于渲染 `EntityList` 及其内部 amis 子节点。
252
+
253
+ ### 2. Store 与注册
254
+
255
+ 底层使用 `NeoRegister` 注册的 **`EntityList`**,且 `storeType` 为 **`EntityListStore`**;由 amis / Neo 运行时按规则创建与注入,**无需**在业务侧手动 `EntityListStore.create`。
256
+
257
+ ### 3. skipExt 与 Nex
258
+
259
+ `NeoEntityList` 生成的 Schema 含 **`skipExt: true`**:实体类 HOC 在 `skipExt` 为真时 **不再合并** 页面级 Nex 扩展配置,直接渲染组件(见 `neo-ui-common` 中 `EntityHoc` 的 `render` 分支)。本文档 **不包含** Nex 扩展点与脚本侧 API 说明。
260
+
261
+ ### 4. 高度与滚动(autoHeight)
262
+
263
+ - `autoHeight={false}`(默认):列表区域在组件内部滚动(具体以 `EntityList` 布局为准)。
264
+ - `autoHeight={true}`:外层高度随内容变化,列表使用 **body 滚动**,适用于嵌入长页面等场景。
265
+
266
+ ### 5. 需要完整 EntityList 能力时
267
+
268
+ 若需使用 `requestParams`、`referConditions`、`ListItemSchema`、`expandSchemas` 等 **未在 NeoEntityList 中透传** 的属性,请优先在页面 Schema 中配置完整 **`EntityList`**,或扩展封装组件。
269
+
270
+ ## 七、常见问题
271
+
272
+ ### Q1: 点击列表项如何阻止默认打开详情?
273
+
274
+ **A**:在 `onItemClickIntercept` 中返回 **真值**(例如 `true`)。返回假值或不返回时,仍会走默认 `NeoNavigator.openEntityDetail`。
275
+
276
+ ### Q2: 如何监听每次列表数据加载完成?
277
+
278
+ **A**:使用 **`onSearchDataComplete`**,其会随 Store 的数据请求流程被调用(与《详细分析文档》中 Store 行为一致)。若需更细粒度事件,需在页面侧使用完整 `EntityList` 或扩展封装。
279
+
280
+ ### Q3: 为什么传入的部分 props 未生效?
281
+
282
+ **A**:当前 `NeoEntityList` 只对 [封装层属性](#neoentitylist-封装层属性) 与 **`onItemClickIntercept` / `onSearchDataComplete` / `style`** 进行合并,其余属性会被忽略。
283
+
284
+ ### Q4: 与直接使用 type: 'EntityList' 的 Schema 有何区别?
285
+
286
+ **A**:`NeoEntityList` 适合 **代码 import**、固定 **大列表** 且希望 **跳过 Nex 合并**、且只需要 **少量开关与回调** 的场景;完整 Schema 方式可配置 **全部** `EntityList` 属性与事件。
287
+
288
+ ## 八、总结
289
+
290
+ - **`NeoEntityList`** 是 H5 **`EntityList`** 的轻量封装,固定 **`tableType: 'list'`**,并设置 **`skipExt: true`**,便于在自定义组件中快速挂载实体卡片列表。
291
+ - 使用前务必传入 **`render`** 与 **`entityApiKey`**,并按需配置 **标题区、搜索、排序、筛选、操作区、刷新与分页** 等开关。
292
+ - **点击拦截** 与 **数据完成回调** 请使用 **`onItemClickIntercept`**、**`onSearchDataComplete`**。
293
+ - 需要 **完整列表能力** 或 **更多透传字段** 时,请使用 **`type: 'EntityList'`** 或扩展 **`NeoEntityList`** 实现。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo-cmp-cli",
3
- "version": "1.12.11",
3
+ "version": "1.13.0",
4
4
  "description": "Neo 自定义组件开发工具,支持react 和 vue2.0技术栈。",
5
5
  "keywords": [
6
6
  "neo-cli",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "antd-custom-cmp-template",
3
3
  "version": "1.1.9",
4
- "description": "neo自定义组件模板(react&ts技术栈)",
4
+ "description": "antd 组件模板: 含基于 Antd 实现的数据仪表板、搜索组件等示例组件。",
5
5
  "framework": "react-ts",
6
6
  "keywords": [
7
7
  "自定义组件模板",
8
8
  "react&ts技术栈",
9
- "neo自定义组件"
9
+ "antd 组件模板"
10
10
  ],
11
11
  "author": "wibetter",
12
12
  "license": "MIT",
@@ -48,7 +48,7 @@
48
48
  "@commitlint/config-conventional": "^18.0.0",
49
49
  "@types/react": "^16.9.11",
50
50
  "@types/react-dom": "^16.9.15",
51
- "neo-cmp-cli": "^1.12.11",
51
+ "neo-cmp-cli": "^1.13.0",
52
52
  "husky": "^4.2.5",
53
53
  "lint-staged": "^10.2.9",
54
54
  "prettier": "^2.0.5"
@@ -52,7 +52,7 @@
52
52
  "@types/react": "^16.9.11",
53
53
  "@types/react-dom": "^16.9.15",
54
54
  "@types/axios": "^0.14.0",
55
- "neo-cmp-cli": "^1.12.11",
55
+ "neo-cmp-cli": "^1.13.0",
56
56
  "husky": "^4.2.5",
57
57
  "lint-staged": "^10.2.9",
58
58
  "prettier": "^2.0.5",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "echarts-custom-cmp-template",
3
3
  "version": "1.1.19",
4
- "description": "neo自定义组件模板(react&ts技术栈)",
4
+ "description": "echarts 组件模板: 含基于 ECharts 实现的图表示例组件。",
5
5
  "framework": "react-ts",
6
6
  "keywords": [
7
7
  "自定义组件模板",
8
8
  "react&ts技术栈",
9
- "neo自定义组件"
9
+ "echarts 组件模"
10
10
  ],
11
11
  "author": "wibetter",
12
12
  "license": "MIT",
@@ -48,7 +48,7 @@
48
48
  "@commitlint/config-conventional": "^18.0.0",
49
49
  "@types/react": "^16.9.11",
50
50
  "@types/react-dom": "^16.9.15",
51
- "neo-cmp-cli": "^1.12.11",
51
+ "neo-cmp-cli": "^1.13.0",
52
52
  "husky": "^4.2.5",
53
53
  "lint-staged": "^10.2.9",
54
54
  "prettier": "^2.0.5",
@@ -41,7 +41,7 @@
41
41
  "@commitlint/config-conventional": "^18.0.0",
42
42
  "@types/react": "^16.9.11",
43
43
  "@types/react-dom": "^16.9.15",
44
- "neo-cmp-cli": "^1.12.11",
44
+ "neo-cmp-cli": "^1.13.0",
45
45
  "husky": "^4.2.5",
46
46
  "lint-staged": "^10.2.9",
47
47
  "prettier": "^2.0.5"
@@ -0,0 +1,12 @@
1
+ /*
2
+ prettier 配置文件
3
+ 更多配置信息:https://prettier.io/docs/en/options.html
4
+ */
5
+ module.exports = {
6
+ semi: true, // Semicolons 分号,默认需要分号
7
+ tabWidth: 2, // 空格,默认 2,
8
+ useTabs: false,
9
+ singleQuote: true, // 单引号还是双引号,默认为false 双引号
10
+ trailingComma: 'all', // 逗号
11
+ jsxBracketSameLine: false, // 默认为false,Put the > of a multi-line JSX element at the end of the last line instead of being alone on the next line (does not apply to self closing elements).
12
+ };