neo-cmp-cli 1.13.15 → 1.13.17

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 (180) hide show
  1. package/README.md +2 -1
  2. package/dist/index2.js +1 -1
  3. package/dist/main2.js +1 -1
  4. package/dist/neo/neoLogin.js +1 -1
  5. package/dist/package.json.js +1 -1
  6. package/docs//351/200/232/347/224/250/344/273/243/347/220/206/346/216/245/345/217/243/forward.zip +0 -0
  7. package/docs//351/200/232/347/224/250/344/273/243/347/220/206/346/216/245/345/217/243//350/207/252/345/256/232/344/271/211API:/351/200/232/347/224/250/344/273/243/347/220/206/346/216/245/345/217/243/344/275/277/347/224/250/350/257/264/346/230/216.md +13 -0
  8. package/package.json +1 -1
  9. package/template/antd-custom-cmp-template/package.json +1 -1
  10. package/template/asset-manage-template/package.json +2 -2
  11. package/template/echarts-custom-cmp-template/package.json +1 -1
  12. package/template/empty-custom-cmp-template/package.json +2 -2
  13. package/template/map-custom-cmp-template/package.json +1 -1
  14. package/template/neo-bi-cmps/neo.config.js +7 -1
  15. package/template/neo-bi-cmps/package.json +8 -7
  16. package/template/neo-bi-cmps/public/403.html +77 -0
  17. package/template/neo-bi-cmps/src/assets/icon/barChart.svg +1 -0
  18. package/template/neo-bi-cmps/src/assets/icon/card.svg +1 -0
  19. package/template/neo-bi-cmps/src/assets/icon/filter.svg +1 -0
  20. package/template/neo-bi-cmps/src/assets/icon/funnel.svg +1 -0
  21. package/template/neo-bi-cmps/src/assets/icon/tab.svg +1 -0
  22. package/template/neo-bi-cmps/src/components/filterBar__c/README.md +3 -14
  23. package/template/neo-bi-cmps/src/components/filterBar__c/common.scss +29 -0
  24. package/template/neo-bi-cmps/src/components/filterBar__c/index.tsx +668 -146
  25. package/template/neo-bi-cmps/src/components/filterBar__c/model.ts +26 -48
  26. package/template/neo-bi-cmps/src/components/filterBar__c/style.scss +46 -139
  27. package/template/neo-bi-cmps/src/components/targetNumber__c/customStyleConfig/index.tsx +11 -10
  28. package/template/neo-bi-cmps/src/components/targetNumber__c/index.tsx +9 -16
  29. package/template/neo-bi-cmps/src/utils/common.ts +231 -0
  30. package/template/neo-bi-cmps/src/utils/filter2chartFilter.ts +268 -0
  31. package/template/neo-bi-cmps/src/utils/filterBar.ts +140 -0
  32. package/template/neo-bi-cmps/src/utils/pipelineFunnel.ts +341 -0
  33. package/template/neo-bi-cmps/src/utils/queryByCustomSQL.ts +117 -0
  34. package/template/neo-bi-cmps/src/utils/requestDebounce.ts +22 -0
  35. package/template/neo-bi-cmps/src/utils/simpleTable.tsx +344 -0
  36. package/template/neo-bi-cmps/src/utils/stageSwitch.ts +15 -0
  37. package/template/neo-bi-cmps/src/utils/stageTimeChart.ts +90 -0
  38. package/template/neo-bi-cmps/src/utils/targetNumber.ts +12 -0
  39. package/template/neo-custom-cmp-template/package.json +2 -2
  40. package/template/neo-h5-cmps/package.json +2 -2
  41. package/template/neo-order-cmps/package.json +2 -2
  42. package/template/neo-pipeline-cmps/.prettierrc.js +12 -0
  43. package/template/neo-pipeline-cmps/@types/neo-ui-common.d.ts +36 -0
  44. package/template/neo-pipeline-cmps/README.md +99 -0
  45. package/template/neo-pipeline-cmps/commitlint.config.js +59 -0
  46. package/template/neo-pipeline-cmps/neo.config.js +124 -0
  47. package/template/neo-pipeline-cmps/package.json +66 -0
  48. package/template/neo-pipeline-cmps/public/403.html +77 -0
  49. package/template/neo-pipeline-cmps/public/css/base.css +283 -0
  50. package/template/neo-pipeline-cmps/public/demo.html +2453 -0
  51. package/template/neo-pipeline-cmps/public/scripts/app/bluebird.js +6679 -0
  52. package/template/neo-pipeline-cmps/public/template.html +13 -0
  53. package/template/neo-pipeline-cmps/src/assets/css/common.scss +127 -0
  54. package/template/neo-pipeline-cmps/src/assets/css/mixin.scss +47 -0
  55. package/template/neo-pipeline-cmps/src/assets/icon/barChart.svg +1 -0
  56. package/template/neo-pipeline-cmps/src/assets/icon/card.svg +1 -0
  57. package/template/neo-pipeline-cmps/src/assets/icon/filter.svg +1 -0
  58. package/template/neo-pipeline-cmps/src/assets/icon/funnel.svg +1 -0
  59. package/template/neo-pipeline-cmps/src/assets/icon/tab.svg +1 -0
  60. package/template/neo-pipeline-cmps/src/assets/img/AIBtn.gif +0 -0
  61. package/template/neo-pipeline-cmps/src/assets/img/NeoCRM.jpg +0 -0
  62. package/template/neo-pipeline-cmps/src/assets/img/aiLogo.png +0 -0
  63. package/template/neo-pipeline-cmps/src/assets/img/card-list.svg +1 -0
  64. package/template/neo-pipeline-cmps/src/assets/img/contact-form.svg +1 -0
  65. package/template/neo-pipeline-cmps/src/assets/img/custom-form.svg +1 -0
  66. package/template/neo-pipeline-cmps/src/assets/img/custom-widget.svg +1 -0
  67. package/template/neo-pipeline-cmps/src/assets/img/data-list.svg +1 -0
  68. package/template/neo-pipeline-cmps/src/assets/img/detail.svg +1 -0
  69. package/template/neo-pipeline-cmps/src/assets/img/favicon.png +0 -0
  70. package/template/neo-pipeline-cmps/src/assets/img/map.svg +1 -0
  71. package/template/neo-pipeline-cmps/src/assets/img/search.svg +1 -0
  72. package/template/neo-pipeline-cmps/src/assets/img/table.svg +1 -0
  73. package/template/neo-pipeline-cmps/src/components/filterBar__c/README.md +24 -0
  74. package/template/neo-pipeline-cmps/src/components/filterBar__c/common.scss +29 -0
  75. package/template/neo-pipeline-cmps/src/components/filterBar__c/index.tsx +730 -0
  76. package/template/neo-pipeline-cmps/src/components/filterBar__c/model.ts +50 -0
  77. package/template/neo-pipeline-cmps/src/components/filterBar__c/style.scss +119 -0
  78. package/template/neo-pipeline-cmps/src/components/pipelineFunnel__c/index.tsx +415 -0
  79. package/template/neo-pipeline-cmps/src/components/pipelineFunnel__c/model.ts +79 -0
  80. package/template/neo-pipeline-cmps/src/components/pipelineFunnel__c/style.scss +83 -0
  81. package/template/neo-pipeline-cmps/src/components/showHealthResult__c/index.tsx +463 -0
  82. package/template/neo-pipeline-cmps/src/components/showHealthResult__c/model.ts +45 -0
  83. package/template/neo-pipeline-cmps/src/components/showHealthResult__c/style.scss +137 -0
  84. package/template/neo-pipeline-cmps/src/components/simpleTable__c/README.md +90 -0
  85. package/template/neo-pipeline-cmps/src/components/simpleTable__c/common.scss +195 -0
  86. package/template/neo-pipeline-cmps/src/components/simpleTable__c/index.tsx +665 -0
  87. package/template/neo-pipeline-cmps/src/components/simpleTable__c/model.ts +124 -0
  88. package/template/neo-pipeline-cmps/src/components/simpleTable__c/style.scss +193 -0
  89. package/template/neo-pipeline-cmps/src/components/stageSwitch__c/index.tsx +511 -0
  90. package/template/neo-pipeline-cmps/src/components/stageSwitch__c/model.ts +70 -0
  91. package/template/{neo-bi-cmps → neo-pipeline-cmps}/src/components/stageSwitch__c/style.scss +4 -2
  92. package/template/neo-pipeline-cmps/src/components/stageTimeChart__c/index.tsx +455 -0
  93. package/template/neo-pipeline-cmps/src/components/stageTimeChart__c/model.ts +103 -0
  94. package/template/{neo-bi-cmps → neo-pipeline-cmps}/src/components/stageTimeChart__c/style.scss +3 -2
  95. package/template/neo-pipeline-cmps/src/utils/common.ts +229 -0
  96. package/template/neo-pipeline-cmps/src/utils/filter2chartFilter.ts +268 -0
  97. package/template/neo-pipeline-cmps/src/utils/filterBar.ts +140 -0
  98. package/template/neo-pipeline-cmps/src/utils/pipelineFunnel.ts +343 -0
  99. package/template/neo-pipeline-cmps/src/utils/queryByCustomSQL.ts +117 -0
  100. package/template/neo-pipeline-cmps/src/utils/requestDebounce.ts +22 -0
  101. package/template/neo-pipeline-cmps/src/utils/simpleTable.tsx +344 -0
  102. package/template/neo-pipeline-cmps/src/utils/stageSwitch.ts +15 -0
  103. package/template/neo-pipeline-cmps/src/utils/stageTimeChart.ts +90 -0
  104. package/template/neo-pipeline-cmps/src/utils/targetNumber.ts +12 -0
  105. package/template/neo-pipeline-cmps/tsconfig.json +40 -0
  106. package/template/neo-web-entity-grid/package.json +2 -2
  107. package/template/neo-web-form/package.json +2 -2
  108. package/template/react-custom-cmp-template/package.json +1 -1
  109. package/template/react-ts-custom-cmp-template/package.json +1 -1
  110. package/template/vue2-custom-cmp-template/package.json +1 -1
  111. package/template/neo-bi-cmps/.npmrc copy +0 -1
  112. package/template/neo-bi-cmps/docs/gartner-pipeline-apis.md +0 -251
  113. package/template/neo-bi-cmps/docs/gartner-pipeline-prd.md +0 -389
  114. package/template/neo-bi-cmps/docs/neo-backend-dev/SKILL.md +0 -188
  115. package/template/neo-bi-cmps/docs/neo-backend-dev/references/01-Trigger/345/274/200/345/217/221.md +0 -183
  116. package/template/neo-bi-cmps/docs/neo-backend-dev/references/02-/350/207/252/345/256/232/344/271/211API/345/274/200/345/217/221.md +0 -196
  117. package/template/neo-bi-cmps/docs/neo-backend-dev/references/03-SDK/345/267/245/345/205/267/347/261/273/346/216/245/345/217/243.md +0 -346
  118. package/template/neo-bi-cmps/docs/neo-backend-dev/references/04-/350/256/241/345/210/222/344/275/234/344/270/232/345/274/200/345/217/221.md +0 -188
  119. package/template/neo-bi-cmps/docs/neo-backend-dev/references/05-/351/241/265/351/235/242/345/274/200/345/217/221.md +0 -293
  120. package/template/neo-bi-cmps/docs/neo-backend-dev/references/06-/346/265/201/347/250/213/346/211/251/345/261/225/345/274/200/345/217/221.md +0 -175
  121. package/template/neo-bi-cmps/docs/neo-backend-dev/references/PaaS/345/271/263/345/217/260/345/274/200/345/217/221/346/211/213/345/206/214/350/247/243/350/257/273.md +0 -313
  122. package/template/neo-bi-cmps/docs/neo-backend-dev/references/auth-config.md +0 -77
  123. package/template/neo-bi-cmps/docs/neo-backend-dev/scripts/deploy_server_script.py +0 -118
  124. package/template/neo-bi-cmps/docs/neo-backend-dev/scripts/download_server_script.py +0 -74
  125. package/template/neo-bi-cmps/docs/neo-backend-dev/scripts/gen_entity_desc.py +0 -69
  126. package/template/neo-bi-cmps/docs/neo-backend-dev/scripts/gen_entitylist.py +0 -87
  127. package/template/neo-bi-cmps/docs/neo-backend-dev/scripts/query_crm.py +0 -65
  128. package/template/neo-bi-cmps/docs/neo-backend-dev/scripts/uninstall_server_script.py +0 -48
  129. package/template/neo-bi-cmps/docs/neo-backend-dev/scripts/update_model_jar.py +0 -49
  130. package/template/neo-bi-cmps/docs/neo-frontend-dev/SKILL.md +0 -138
  131. package/template/neo-bi-cmps/docs/neo-frontend-dev/references/auth-config.md +0 -77
  132. package/template/neo-bi-cmps/docs/neo-frontend-dev/references/component-dev.md +0 -205
  133. package/template/neo-bi-cmps/docs/neo-frontend-dev/references/entityTable-example.md +0 -167
  134. package/template/neo-bi-cmps/docs/neo-frontend-dev/references/templates.md +0 -38
  135. package/template/neo-bi-cmps/docs/neo-frontend-dev/scripts/gen_entity_desc.py +0 -69
  136. package/template/neo-bi-cmps/docs/neo-frontend-dev/scripts/gen_entitylist.py +0 -87
  137. package/template/neo-bi-cmps/docs/neo-frontend-dev/scripts/query_crm.py +0 -65
  138. package/template/neo-bi-cmps/docs//350/264/246/345/217/267/347/233/270/345/205/263/344/277/241/346/201/257.md +0 -10
  139. package/template/neo-bi-cmps/src/components/aiCommitDrawer__c/README.md +0 -52
  140. package/template/neo-bi-cmps/src/components/aiCommitDrawer__c/index.tsx +0 -183
  141. package/template/neo-bi-cmps/src/components/aiCommitDrawer__c/model.ts +0 -90
  142. package/template/neo-bi-cmps/src/components/aiCommitDrawer__c/style.scss +0 -218
  143. package/template/neo-bi-cmps/src/components/forecastChart__c/README.md +0 -31
  144. package/template/neo-bi-cmps/src/components/forecastChart__c/index.tsx +0 -158
  145. package/template/neo-bi-cmps/src/components/forecastChart__c/model.ts +0 -40
  146. package/template/neo-bi-cmps/src/components/forecastChart__c/style.scss +0 -154
  147. package/template/neo-bi-cmps/src/components/forecastGrid__c/README.md +0 -36
  148. package/template/neo-bi-cmps/src/components/forecastGrid__c/index.tsx +0 -86
  149. package/template/neo-bi-cmps/src/components/forecastGrid__c/model.ts +0 -62
  150. package/template/neo-bi-cmps/src/components/forecastGrid__c/style.scss +0 -48
  151. package/template/neo-bi-cmps/src/components/gapCloser__c/README.md +0 -24
  152. package/template/neo-bi-cmps/src/components/gapCloser__c/index.tsx +0 -100
  153. package/template/neo-bi-cmps/src/components/gapCloser__c/model.ts +0 -46
  154. package/template/neo-bi-cmps/src/components/gapCloser__c/style.scss +0 -60
  155. package/template/neo-bi-cmps/src/components/kpiCards__c/README.md +0 -35
  156. package/template/neo-bi-cmps/src/components/kpiCards__c/index.tsx +0 -70
  157. package/template/neo-bi-cmps/src/components/kpiCards__c/model.ts +0 -50
  158. package/template/neo-bi-cmps/src/components/kpiCards__c/style.scss +0 -33
  159. package/template/neo-bi-cmps/src/components/oppList__c/README.md +0 -52
  160. package/template/neo-bi-cmps/src/components/oppList__c/index.tsx +0 -285
  161. package/template/neo-bi-cmps/src/components/oppList__c/model.ts +0 -86
  162. package/template/neo-bi-cmps/src/components/oppList__c/style.scss +0 -133
  163. package/template/neo-bi-cmps/src/components/pipelineFunnel__c/index.tsx +0 -130
  164. package/template/neo-bi-cmps/src/components/pipelineFunnel__c/model.ts +0 -66
  165. package/template/neo-bi-cmps/src/components/pipelineFunnel__c/style.scss +0 -133
  166. package/template/neo-bi-cmps/src/components/stageSwitch__c/index.tsx +0 -118
  167. package/template/neo-bi-cmps/src/components/stageSwitch__c/model.ts +0 -92
  168. package/template/neo-bi-cmps/src/components/stageTimeChart__c/index.tsx +0 -126
  169. package/template/neo-bi-cmps/src/components/stageTimeChart__c/model.ts +0 -57
  170. package/template/neo-bi-cmps/src/components/tabSwitch__c/README.md +0 -37
  171. package/template/neo-bi-cmps/src/components/tabSwitch__c/index.tsx +0 -80
  172. package/template/neo-bi-cmps/src/components/tabSwitch__c/model.ts +0 -45
  173. package/template/neo-bi-cmps/src/components/tabSwitch__c/style.scss +0 -37
  174. package/template/neo-bi-cmps/src/utils/axiosFetcher.ts +0 -37
  175. package/template/neo-bi-cmps/src/utils/queryObjectData.ts +0 -76
  176. package/template/neo-bi-cmps/src/utils/xobjects.ts +0 -162
  177. /package/template/neo-bi-cmps/{docs/prototype-pipeline-forecasting.html → public/demo.html} +0 -0
  178. /package/template/{neo-bi-cmps → neo-pipeline-cmps}/src/components/pipelineFunnel__c/README.md +0 -0
  179. /package/template/{neo-bi-cmps → neo-pipeline-cmps}/src/components/stageSwitch__c/README.md +0 -0
  180. /package/template/{neo-bi-cmps → neo-pipeline-cmps}/src/components/stageTimeChart__c/README.md +0 -0
package/README.md CHANGED
@@ -125,7 +125,7 @@ neo push cmp
125
125
  |------|------|------|
126
126
  | `neo init` | 根据模板创建自定义组件项目 | `-t` / `--type` 模板类型(见 [内置模板](#内置模板)),`-n` / `--name` 项目名称;两者同时传入时为非交互 |
127
127
  | `neo create project` | 创建自定义组件空项目(不含任何自定义组件) | `--name` 指定项目名称 |
128
- | `neo create cmp` | 在当前项目中创建一个自定义组件 | `--name` 指定组件名称 |
128
+ | `neo create cmp` | 在当前项目中创建一个自定义组件 | `--name` 指定组件名称,`--targetDevice` / `-d` 指定项目类型 |
129
129
  | `neo login` | 登录 NeoCRM 平台(OAuth2 授权模式) | `-e` / `--env` 环境类型 |
130
130
  | `neo logout` | 登出 NeoCRM 平台 | - |
131
131
  | `neo preview` | 本地预览自定义组件内容,默认支持热更新与接口代理。(备注:当自定义组件使用 neo-ui-common 或者 neo-ui-component-web 时则不支持本地预览。) | `--name` 指定组件名称 |
@@ -502,6 +502,7 @@ async loadData(page = 1, pageSize = 10) {
502
502
  }
503
503
  }
504
504
  ```
505
+ 【备注】 如果组件方法中涉及 this 的使用,请在 constructor 构造函数中 将当前组件上下文绑定方法,确保组件方法在外部执行时this不丢失。(比如: this.loadData = this.loadData.bind(this))
505
506
 
506
507
  > 示例中使用了 `xObject.query`,请确保已从 `neo-open-api` 引入 `xObject`,并与实际业务 props 一致。
507
508
 
package/dist/index2.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./_virtual/index.js"),o=require("figlet"),s=require("yargs"),a=require("chalk"),n=require("inquirer"),t=require("ora"),i=require("./main2.js"),p=require("./utils/common.js"),c=require("./neo/env.js"),m=require("./package.json.js");var l;exports.__require=function(){if(l)return e.__exports;l=1;const r=o,u=s,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}=i.__require(),{errorLog:U,successLog:D,warningLog:L}=p.__require(),_=i.__require(),{getNeoCrmAPI:q}=c.__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:"打开项目"},P={...R,init:"初始化自定义组件项目",login:"登录 NeoCRM 平台",logout:"登出 NeoCRM 平台","create project":"创建自定义组件项目","create cmp":"创建自定义组件",linkDebug:"开启外链调试模式",preview:"预览自定义组件","pull cmp":"拉取线上自定义组件","push cmp":"发布自定义组件到平台","delete cmp":"删除线上自定义组件",pull:"拉取线上自定义组件",push:"发布自定义组件到平台",delete:"删除线上自定义组件"},k=[{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"}],B=k.map(e=>e.value);return u.middleware(function(e){if(e.help||e.version)return;const o=function(e){if(!e._||0===e._.length)return"";const o=e._.join(" ");if(P[o])return o;const s=e._[0];return P[s]?s:o||s}(e);if(!o)return;const s=P[o]||o;R[o]&&(console.log(g.green(N)),console.log(g.green(`当前版本:v${M.version}.\n`))),console.log(""),console.log(g.cyan(`执行命令: ${s}`)),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 o=[],s=[{name:"模板1.Web端列表组件: 含基础大列表、Picker 列表等示例组件",value:"neo-web-entity-grid",short:"neo-web-entity-grid"},{name:"模板2.H5端业务组件: 含全局搜索、数据列表、数据Tabs、打开AI对话页等示例组件",value:"neo-h5-cmps",short:"neo-h5-cmps"},{name:"模板3.自定义业务组件: 含实体表单、实体数据详情、实体数据表格等示例组件",value:"neo",short:"neo"},{name:"模板4.数值指标组件: 可配置展示实体数据源中关键数值指标",value:"neo-bi-cmps",short:"neo-bi-cmps"},{name:"模板5.antd 组件: 含基于 Antd 实现的数据仪表板、搜索组件等示例组件",value:"antd",short:"antd"},{name:"模板6.echarts 组件: 含基于 ECharts 实现的图表示例组件",value:"echarts",short:"echarts"},{name:"模板7.地图组件: 含基于 高德地图API 实现的示例组件",value:"amap",short:"amap"},{name:"模板8.vue2 组件: 含基于 Vue2 实现的示例组件",value:"vue2",short:"vue2"}];e.type||o.push({name:"type",type:"list",message:"请选择您要创建的自定义组件类型: ",default:"react-ts",choices:s}),e.name||o.push({name:"name",type:"input",message:"请设置自定义组件项目名称(默认 neoCustomCmp):",default:"neoCustomCmp"}),d.prompt(o).then(o=>{const{isValid:s,errors:a}=C(o.name);s||(U(a.join("\n")),process.exit(1)),"github"===e.mode?y(o.type,o.name):v(o.type,o.name)})}}).command("config init","创建 neo.config.js 配置文件",e=>{e.usage(S("Usage")+": $0 config init").alias("h","help")},()=>{f("neo.config.js")}).command("login","登录 NeoCRM 平台(OAuth2 授权)",e=>{e.usage(S("Usage")+": $0 login [options]").option("env",{alias:"e",describe:"登录环境(可选,不指定则交互选择)。",type:"string",choices:B}).alias("h","help")},async e=>{const o=async e=>{const o=q(e,A.neoConfig);try{const e=new T(o);await e.login(),process.exit(0)}catch(e){U(`\n登录失败: ${e.message||e.msg}`),process.exit(1)}};if(e.env)return void await o(e.env);const s=[{name:"env",type:"list",message:"请选择您要登录的环境:",default:"cd",choices:k}],a=await d.prompt(s);await o(a.env)}).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:o,errors:s}=C(e.name);o||(U(s.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 o=[{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 s=[{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:o}];d.prompt(s).then(o=>{_.createCmpByTemplate(e.name,{targetDevice:o.targetDevice})})}else{const e=[{name:"name",type:"input",message:"请设置自定义组件名称:"},{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:o}];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,o=h("正在拉取线上自定义组件列表...").start(),s=await e.getCustomCmpList();0===s.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),o.stop("线上自定义组件列表拉取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要拉取的自定义组件:",choices:[{name:"拉取所有组件(ALL)",value:"ALL"},...s.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))]}];try{const o=await d.prompt(a);if(o.cmpType)if("ALL"===o.cmpType){L(`[neo pull cmp] 即将拉取当前租户下的所有自定义组件(共 ${s.length} 个),如本地存在同名组件目录,将可能被覆盖,请提前备份本地修改。`);for(let o=0,a=s.length;o<a;o++){const n=s[o];console.log(g.gray(`[neo pull cmp] 正在拉取第 ${o+1}/${a} 个组件: ${n.cmpType}`)),await _.pullCmp(n.cmpType,e)}D("[neo pull cmp]拉取所有组件命令已执行完成。")}else L(`[neo pull cmp] 即将拉取自定义组件:${o.cmpType},如本地已存在同名组件目录,将可能被覆盖,请提前备份本地修改。`),await _.pullCmp(o.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,o=h("正在获取线上自定义组件列表...").start(),s=await e.getCustomCmpList();0===s.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),o.stop("线上自定义组件列表获取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要删除的自定义组件:",choices:s.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))}];d.prompt(a).then(o=>{o.cmpType?_.deleteCmp(o.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 o=[{name:"cmpType",type:"list",message:"请选择要预览的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(o).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 [options]").option("platform",{alias:"p",describe:"调试设备类型:pc(网页端)、h5(移动端),默认 pc",type:"string",choices:["pc","h5"]}).alias("h","help")},e=>{const o=e=>{_.linkDebug({platform:e})};e.platform?o(e.platform):d.prompt([{name:"platform",type:"list",message:"请选择调试设备类型:",default:"pc",choices:[{name:"网页端(PC)",value:"pc",short:"pc"},{name:"移动端(H5)",value:"h5",short:"h5"}]}]).then(e=>{e.platform||(U("未选择调试设备类型。"),process.exit(1)),o(e.platform)})}).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 o=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(o).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 o=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:[{name:"发布所有组件(ALL)",value:"ALL"},...e.map(e=>({name:e,value:e}))]}];d.prompt(o).then(async o=>{o.cmpType||(U("请选择要发布的自定义组件。"),process.exit(1));try{if("ALL"===o.cmpType){L(`[neo push cmp] 即将构建并发布当前目录下的所有自定义组件(共 ${e.length} 个)到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`);for(let o=0,s=e.length;o<s;o++){const a=e[o];console.log(g.gray(`[neo push cmp] 正在拉取第 ${o+1}/${s} 个组件: ${a}`)),await _.pushCmp(a,!0)}D("[neo push cmp]发布所有组件命令已执行完成。")}else L(`[neo push cmp] 即将构建并发布自定义组件:${o.cmpType} 到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`),await _.pushCmp(o.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,o,s)=>{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 [options]",desc:"开启外链调试模式(在线上页面设计器端调试),支持 --platform pc|h5,默认网页端"},{cmd:"login [options]",desc:"登录 NeoCRM 平台(OAuth2 授权),支持 --env cd|uat|cd"},{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:o})=>{console.log(` ${g.cyan(e.padEnd(25))} ${o}`)}),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
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./_virtual/index.js"),o=require("figlet"),s=require("yargs"),a=require("chalk"),n=require("inquirer"),t=require("ora"),i=require("./main2.js"),p=require("./utils/common.js"),c=require("./neo/env.js"),m=require("./package.json.js");var l;exports.__require=function(){if(l)return e.__exports;l=1;const r=o,u=s,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}=i.__require(),{errorLog:U,successLog:D,warningLog:L}=p.__require(),_=i.__require(),{getNeoCrmAPI:q}=c.__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:"打开项目"},P={...R,init:"初始化自定义组件项目",login:"登录 NeoCRM 平台",logout:"登出 NeoCRM 平台","create project":"创建自定义组件项目","create cmp":"创建自定义组件",linkDebug:"开启外链调试模式",preview:"预览自定义组件","pull cmp":"拉取线上自定义组件","push cmp":"发布自定义组件到平台","delete cmp":"删除线上自定义组件",pull:"拉取线上自定义组件",push:"发布自定义组件到平台",delete:"删除线上自定义组件"},k=[{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"}],B=k.map(e=>e.value);return u.middleware(function(e){if(e.help||e.version)return;const o=function(e){if(!e._||0===e._.length)return"";const o=e._.join(" ");if(P[o])return o;const s=e._[0];return P[s]?s:o||s}(e);if(!o)return;const s=P[o]||o;R[o]&&(console.log(g.green(N)),console.log(g.green(`当前版本:v${M.version}.\n`))),console.log(""),console.log(g.cyan(`执行命令: ${s}`)),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 o=[],s=[{name:"模板1.Web端列表组件: 含基础大列表、Picker 列表等示例组件",value:"neo-web-entity-grid",short:"neo-web-entity-grid"},{name:"模板2.H5端业务组件: 含全局搜索、数据列表、数据Tabs、打开AI对话页等示例组件",value:"neo-h5-cmps",short:"neo-h5-cmps"},{name:"模板3.自定义业务组件: 含实体表单、实体数据详情、实体数据表格等示例组件",value:"neo",short:"neo"},{name:"模板4.数值指标组件: 可配置展示实体数据源中关键数值指标",value:"neo-bi-cmps",short:"neo-bi-cmps"},{name:"模板5.antd 组件: 含基于 Antd 实现的数据仪表板、搜索组件等示例组件",value:"antd",short:"antd"},{name:"模板6.echarts 组件: 含基于 ECharts 实现的图表示例组件",value:"echarts",short:"echarts"},{name:"模板7.地图组件: 含基于 高德地图API 实现的示例组件",value:"amap",short:"amap"},{name:"模板8.vue2 组件: 含基于 Vue2 实现的示例组件",value:"vue2",short:"vue2"}];e.type||o.push({name:"type",type:"list",message:"请选择您要创建的自定义组件类型: ",default:"react-ts",choices:s}),e.name||o.push({name:"name",type:"input",message:"请设置自定义组件项目名称(默认 neoCustomCmp):",default:"neoCustomCmp"}),d.prompt(o).then(o=>{const{isValid:s,errors:a}=C(o.name);s||(U(a.join("\n")),process.exit(1)),"github"===e.mode?y(o.type,o.name):v(o.type,o.name)})}}).command("config init","创建 neo.config.js 配置文件",e=>{e.usage(S("Usage")+": $0 config init").alias("h","help")},()=>{f("neo.config.js")}).command("login","登录 NeoCRM 平台(OAuth2 授权)",e=>{e.usage(S("Usage")+": $0 login [options]").option("env",{alias:"e",describe:"登录环境(可选,不指定则交互选择)。",type:"string",choices:B}).alias("h","help")},async e=>{const o=async e=>{const o=q(e,A.neoConfig);try{const e=new T(o);await e.login(),process.exit(0)}catch(e){U(`\n登录失败: ${e.message||e.msg}`),process.exit(1)}};if(e.env)return void await o(e.env);const s=[{name:"env",type:"list",message:"请选择您要登录的环境:",default:"cd",choices:k}],a=await d.prompt(s);await o(a.env)}).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:o,errors:s}=C(e.name);o||(U(s.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 o=[{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 s=[{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:o}];d.prompt(s).then(o=>{_.createCmpByTemplate(e.name,{targetDevice:o.targetDevice})})}else{const e=[{name:"name",type:"input",message:"请设置自定义组件名称:"},{name:"targetDevice",type:"list",message:"请选择终端类型:",default:"all",choices:o}];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,o=h("正在拉取线上自定义组件列表...").start(),s=await e.getCustomCmpList();0===s.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),o.stop("线上自定义组件列表拉取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要拉取的自定义组件:",choices:[{name:"拉取所有组件(ALL)",value:"ALL"},...s.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))]}];try{const o=await d.prompt(a);if(o.cmpType)if("ALL"===o.cmpType){L(`[neo pull cmp] 即将拉取当前租户下的所有自定义组件(共 ${s.length} 个),如本地存在同名组件目录,将可能被覆盖,请提前备份本地修改。`);for(let o=0,a=s.length;o<a;o++){const n=s[o];console.log(g.gray(`[neo pull cmp] 正在拉取第 ${o+1}/${a} 个组件: ${n.cmpType}`)),await _.pullCmp(n.cmpType,e)}D("[neo pull cmp]拉取所有组件命令已执行完成。")}else L(`[neo pull cmp] 即将拉取自定义组件:${o.cmpType},如本地已存在同名组件目录,将可能被覆盖,请提前备份本地修改。`),await _.pullCmp(o.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,o=h("正在获取线上自定义组件列表...").start(),s=await e.getCustomCmpList();0===s.length&&(U("当前租户暂无任何自定义组件。"),process.exit(1)),o.stop("线上自定义组件列表获取成功。");const a=[{name:"cmpType",type:"list",message:"请选择要删除的自定义组件:",choices:s.map(e=>({name:`${e.label}(${e.cmpType})`,value:e.cmpType}))}];d.prompt(a).then(o=>{o.cmpType?_.deleteCmp(o.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 o=[{name:"cmpType",type:"list",message:"请选择要预览的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(o).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 [options]").option("platform",{alias:"p",describe:"调试设备类型:pc(网页端)、h5(移动端),默认 pc",type:"string",choices:["pc","h5"]}).alias("h","help")},e=>{const o=e=>{_.linkDebug({platform:e})};e.platform?o(e.platform):d.prompt([{name:"platform",type:"list",message:"请选择调试设备类型:",default:"pc",choices:[{name:"网页端(PC)",value:"pc",short:"pc"},{name:"移动端(H5)",value:"h5",short:"h5"}]}]).then(e=>{e.platform||(U("未选择调试设备类型。"),process.exit(1)),o(e.platform)})}).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 o=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:e.map(e=>({name:e,value:e}))}];d.prompt(o).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 o=[{name:"cmpType",type:"list",message:"请选择要发布的自定义组件:",choices:[{name:"发布所有组件(ALL)",value:"ALL"},...e.map(e=>({name:e,value:e}))]}];d.prompt(o).then(async o=>{o.cmpType||(U("请选择要发布的自定义组件。"),process.exit(1));try{if("ALL"===o.cmpType){L(`[neo push cmp] 即将构建并发布当前目录下的所有自定义组件(共 ${e.length} 个)到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`);for(let o=0,s=e.length;o<s;o++){const a=e[o];console.log(g.gray(`[neo push cmp] 正在发布第 ${o+1}/${s} 个组件: ${a}`)),await _.pushCmp(a,!0)}D("[neo push cmp]发布所有组件命令已执行完成。")}else L(`[neo push cmp] 即将构建并发布自定义组件:${o.cmpType} 到 NeoCRM 平台,请确保已经通过 neo login 登录到正确的环境。`),await _.pushCmp(o.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,o,s)=>{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 [options]",desc:"开启外链调试模式(在线上页面设计器端调试),支持 --platform pc|h5,默认网页端"},{cmd:"login [options]",desc:"登录 NeoCRM 平台(OAuth2 授权),支持 --env cd|uat|cd"},{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:o})=>{console.log(` ${g.cyan(e.padEnd(25))} ${o}`)}),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};
package/dist/main2.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("akfun");require("lodash");const r=require("open"),i=require("./module/neoInit.js"),s=require("./module/neoInitByCopy.js"),t=require("./module/inspect.js"),o=require("./utils/neoConfigInit.js"),u=require("./utils/neoParams.js"),n=require("./config/index.js"),l=require("./oss/publish2oss.js"),p=require("./neo/pushCmp.js"),c=require("./neo/pullCmp.js"),d=require("./neo/deleteCmp.js"),b=require("./utils/cmpUtils/previewCmp.js"),m=require("./utils/generateEntries.js"),a=require("./utils/cmpUtils/createCmpByTemplate.js"),y=require("./utils/projectUtils/createCmpProjectByTemplate.js"),q=require("./utils/projectUtils/openProject.js"),_=require("./utils/configureNeoBuild.js"),g=require("./utils/common.js"),j=require("./utils/projectNameValidator.js"),v=require("./utils/cmpUtils/getCmpTypeByDir.js"),T=require("./neo/neoService.js"),f=require("./neo/neoLogin.js"),C=require("./neo/neoEnvManager.js"),x=require("./utils/projectUtils/hasNeoProject.js");var h,w;exports.__require=function(){if(w)return h;w=1;const D=e,E=r,N=i.__require(),P=s.__require(),B=t.__require(),k=o.__require(),{consoleTag:M}=u.__require(),U=n.__require(),L=l.__require(),I=p.__require(),$=c.__require(),O=d.__require(),R=b.__require(),S=m.__require(),A=a.__require(),H=y.__require(),K=q.__require(),{configureNeoBuild:V}=_.__require(),{errorLog:z,successLog:F}=g.__require(),{validateProjectName:G}=j.__require(),J=v.__require(),Q=T.__require(),W=f.__require(),X=C.__require(),Y=x.__require();function Z(e,r){const{entryType:i,cmpType:s}=r;let t=[],o={};try{const{entries:r,cmpTypes:u,defaultExports:n}=S({configEntry:e.entry,disableAutoRegister:e.disableAutoRegister,componentsDir:U.componentsDir,entryType:i,cmpType:s});r&&Object.keys(r).length>0&&(e.entry=r,t=u,console.info("已自动生成 entry 入口配置:",r)),o=n}catch(e){z(e.message||e.msg),process.exit(1)}return{cmpTypes:t,defaultExports:o}}function ee(e){return Object.assign(U.build2lib,e)}return h={neoInit:N,neoInitByCopy:P,inspect:B,neoConfigInit:k,projectConfig:U,consoleTag:M,validateProjectName:G,getCmpTypeByDir:J,NeoService:Q,NeoLoginService:W,hasNeoProject:Y,createCmpProjectByTemplate:H,createCmpByTemplate:A,dev:()=>{U.dev||(z("未找到 dev 相关配置。"),process.exit(1)),D.dev(U,M)},previewCmp:e=>{e||(z("请输入要预览的组件名称。"),process.exit(1)),U.preview||(z("未找到 preview 相关配置。"),process.exit(1)),U.dev=Object.assign(U.dev,U.preview),delete U.preview,R(U,e)},linkDebug:(e={})=>{const r="h5"===e.platform?"h5":"pc",i="pc"===r?"web":"h5";U.linkDebug||(z("未找到 debug 相关配置。"),process.exit(1)),U.dev=Object.assign(U.dev,U.linkDebug),delete U.linkDebug,delete U.dev.ignoreNodeModules,U.webpack.ignoreNodeModules=!1;const{cmpTypes:s,defaultExports:t}=Z(U.dev,{entryType:"linkDebug"});V(U,U.dev,{cmpTypes:s,defaultExports:t,verbose:!0,excludeModel:!1});const o=X.getLinKDebugURL(i),u="pc"===r?"网页端(PC)":"移动端(H5)";D.dev(U,M,e=>{if(e&&e.url){const r=`${o}&linkDebug=${e.url}`;console.info(`\n[外链调试] 当前调试设备:${u}\n可打开以下页面设计器地址进行调试:\n${r}\n`),(async e=>{try{await E(e)}catch(r){z(`无法自动打开浏览器: ${r.message||r.msg}`),console.log(`\n请手动访问以下 URL 进行调试:\n${e}\n`)}})(r)}})},build:()=>D.build("build",U,M),build2lib:()=>{Z(U.build2lib,{entryType:"widget"}),U.build2lib.removeNeoCommonModules&&V(U,U.build2lib,{cmpTypes:[],defaultExports:[],verbose:!1,excludeModel:!0}),D.build("lib",U,M)},publish2oss:e=>{const r=U.publish2oss;U.build2lib=ee(r);const{cmpTypes:i,defaultExports:s}=Z(U.build2lib,{entryType:"widget",cmpType:e});V(U,U.build2lib,{cmpTypes:i,defaultExports:s,verbose:!0,excludeModel:!0}),D.build("lib",U,M,()=>{L(r.ossType,r.ossConfig,r.assetsRoot)})},pushCmp:(e,r=!1)=>{const{pushCmp:i}=U;U.build2lib=ee(i),r&&(U.build2lib.entry={});const{cmpTypes:s,defaultExports:t}=Z(U.build2lib,{entryType:"widget",cmpType:e});return V(U,U.build2lib,{cmpTypes:s,defaultExports:t,verbose:!1,excludeModel:!0}),new Promise((r,s)=>{D.build("lib",U,M,async()=>{try{await I({...i,componentsDir:U.componentsDir},e),r()}catch(e){s(e)}})})},pullCmp:$,deleteCmp:(e,r)=>{O(e,r)},build2esm:()=>D.build2esm(U,M),openEditor:K},h};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("akfun");require("lodash");const r=require("open"),i=require("./module/neoInit.js"),s=require("./module/neoInitByCopy.js"),t=require("./module/inspect.js"),o=require("./utils/neoConfigInit.js"),u=require("./utils/neoParams.js"),n=require("./config/index.js"),l=require("./oss/publish2oss.js"),p=require("./neo/pushCmp.js"),c=require("./neo/pullCmp.js"),d=require("./neo/deleteCmp.js"),b=require("./utils/cmpUtils/previewCmp.js"),m=require("./utils/generateEntries.js"),a=require("./utils/cmpUtils/createCmpByTemplate.js"),y=require("./utils/projectUtils/createCmpProjectByTemplate.js"),q=require("./utils/projectUtils/openProject.js"),_=require("./utils/configureNeoBuild.js"),g=require("./utils/common.js"),j=require("./utils/projectNameValidator.js"),v=require("./utils/cmpUtils/getCmpTypeByDir.js"),T=require("./neo/neoService.js"),f=require("./neo/neoLogin.js"),C=require("./neo/neoEnvManager.js"),x=require("./utils/projectUtils/hasNeoProject.js");var h,D;exports.__require=function(){if(D)return h;D=1;const E=e,w=r,N=i.__require(),P=s.__require(),B=t.__require(),k=o.__require(),{consoleTag:M}=u.__require(),U=n.__require(),L=l.__require(),I=p.__require(),$=c.__require(),O=d.__require(),R=b.__require(),S=m.__require(),A=a.__require(),H=y.__require(),K=q.__require(),{configureNeoBuild:V}=_.__require(),{errorLog:z,successLog:F}=g.__require(),{validateProjectName:G}=j.__require(),J=v.__require(),Q=T.__require(),W=f.__require(),X=C.__require(),Y=x.__require();function Z(e,r){const{entryType:i,cmpType:s}=r;let t=[],o={};try{const{entries:r,cmpTypes:u,defaultExports:n}=S({configEntry:e.entry,disableAutoRegister:e.disableAutoRegister,componentsDir:U.componentsDir,entryType:i,cmpType:s});r&&Object.keys(r).length>0&&(e.entry=r,t=u,console.info("已自动生成 entry 入口配置:",r)),o=n}catch(e){z(e.message||e.msg),process.exit(1)}return{cmpTypes:t,defaultExports:o}}function ee(e){return Object.assign(U.build2lib,e)}return h={neoInit:N,neoInitByCopy:P,inspect:B,neoConfigInit:k,projectConfig:U,consoleTag:M,validateProjectName:G,getCmpTypeByDir:J,NeoService:Q,NeoLoginService:W,hasNeoProject:Y,createCmpProjectByTemplate:H,createCmpByTemplate:A,dev:()=>{U.dev||(z("未找到 dev 相关配置。"),process.exit(1)),E.dev(U,M)},previewCmp:e=>{e||(z("请输入要预览的组件名称。"),process.exit(1)),U.dev=Object.assign(U.dev,U.preview),U.dev||(z("未找到预览相关配置。"),process.exit(1)),delete U.preview,R(U,e)},linkDebug:(e={})=>{const r="h5"===e.platform?"h5":"pc",i="pc"===r?"web":"h5";U.linkDebug||(z("未找到 debug 相关配置。"),process.exit(1)),U.dev=Object.assign(U.dev,U.linkDebug),delete U.linkDebug,delete U.dev.ignoreNodeModules,U.webpack.ignoreNodeModules=!1;const{cmpTypes:s,defaultExports:t}=Z(U.dev,{entryType:"linkDebug"});V(U,U.dev,{cmpTypes:s,defaultExports:t,verbose:!0,excludeModel:!1});const o=X.getLinKDebugURL(i),u="pc"===r?"网页端(PC)":"移动端(H5)";E.dev(U,M,e=>{if(e&&e.url){const r=`${o}&linkDebug=${e.url}`;console.info(`\n[外链调试] 当前调试设备:${u}\n可打开以下页面设计器地址进行调试:\n${r}\n`),(async e=>{try{await w(e)}catch(r){z(`无法自动打开浏览器: ${r.message||r.msg}`),console.log(`\n请手动访问以下 URL 进行调试:\n${e}\n`)}})(r)}})},build:()=>E.build("build",U,M),build2lib:()=>{Z(U.build2lib,{entryType:"widget"}),U.build2lib.removeNeoCommonModules&&V(U,U.build2lib,{cmpTypes:[],defaultExports:[],verbose:!1,excludeModel:!0}),E.build("lib",U,M)},publish2oss:e=>{const r=U.publish2oss;U.build2lib=ee(r);const{cmpTypes:i,defaultExports:s}=Z(U.build2lib,{entryType:"widget",cmpType:e});V(U,U.build2lib,{cmpTypes:i,defaultExports:s,verbose:!0,excludeModel:!0}),E.build("lib",U,M,()=>{L(r.ossType,r.ossConfig,r.assetsRoot)})},pushCmp:(e,r=!1)=>{const{pushCmp:i}=U;U.build2lib=ee(i),r&&(U.build2lib.entry={});const{cmpTypes:s,defaultExports:t}=Z(U.build2lib,{entryType:"widget",cmpType:e});return V(U,U.build2lib,{cmpTypes:s,defaultExports:t,verbose:!1,excludeModel:!0}),new Promise((r,s)=>{E.build("lib",U,M,async()=>{try{await I({...i,componentsDir:U.componentsDir},e),r()}catch(e){s(e)}})})},pullCmp:$,deleteCmp:(e,r)=>{O(e,r)},build2esm:()=>E.build2esm(U,M),openEditor:K},h};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("axios"),t=require("node:fs"),n=require("node:path"),s=require("ora"),r=require("node:http"),o=require("node:url"),i=require("open"),a=require("node:net"),c=require("lodash"),l=require("../utils/common.js"),h=require("./neoEnvManager.js");var p,u;exports.__require=function(){if(u)return p;u=1;const d=e,g=t,m=n,y=s,k=r,_=o,f=i,T=a,w=c,{errorLog:U,successLog:R}=l.__require(),$=h.__require();return p=class{constructor(e){if(this.tokenDir=m.join(process.cwd(),".neo-cli"),this.tokenFile=m.join(this.tokenDir,"token.json"),this.pageDir=m.join(__dirname,"../../template/pageHtml"),this.authErrorTemplate=m.join(this.pageDir,"auth-error.html"),this.authSuccessTemplate=m.join(this.pageDir,"auth-success.html"),this.tokenErrorTemplate=m.join(this.pageDir,"token-error.html"),this.authFailedTemplate=m.join(this.pageDir,"auth-failed.html"),!e)return;const{neoBaseURL:t,loginURL:n,tokenURL:s}=e,r=$.getAuthConfig(),{redirectUri:o,authType:i,auth:a}=r;if(!n||!s)throw new Error("neo.config.js 配置不完整,需要包含 loginURL、tokenURL");this.neoBaseURL=t,this.loginURL=n,this.tokenURL=s,this.NeoCrmAPI=r,this.redirectUri=o,this.authType=i||"oauth2",this.response_type=a.response_type||"code",this.client_id=a.client_id,this.client_secret=a.client_secret,this.scope=a.scope||"all",this.oauthType=a.oauthType||"standard",this.access_type=a.access_type||"offline",this.grant_type=a.grant_type||"authorization_code";try{$.setEnvConfig(w.pick(e,["neoBaseURL","loginURL","tokenURL"]))}catch(e){U(`保存环境配置失败: ${e.message||e.msg}`)}}ensureTokenDir(){g.existsSync(this.tokenDir)||g.mkdirSync(this.tokenDir,{recursive:!0})}saveToken(e){this.ensureTokenDir();const t={...e,savedAt:Date.now(),expiresAt:Date.now()+1e3*(e.expires_in||7200)};g.writeFileSync(this.tokenFile,JSON.stringify(t,null,2),"utf-8")}readToken(){if(!g.existsSync(this.tokenFile))return null;try{return JSON.parse(g.readFileSync(this.tokenFile,"utf-8"))}catch(e){return U(`读取 token 文件失败: ${e.message||e.msg}`),null}}isTokenExpired(e){return!e||!e.expiresAt||Date.now()>=e.expiresAt-3e5}clearToken(){g.existsSync(this.tokenFile)&&g.unlinkSync(this.tokenFile)}getRedirectURI(e){return`http://localhost:${e}`}buildAuthUrl(e){const t=new URLSearchParams({response_type:this.response_type,client_id:this.client_id,redirect_uri:e,scope:this.scope,oauthType:this.oauthType,access_type:this.access_type});return`${this.loginURL}?${t.toString()}`}async openBrowser(e){try{await f(e)}catch(t){U(`无法自动打开浏览器: ${t.message||t.msg}`),console.log(`\n请手动访问以下 URL 进行授权:\n${e}\n`)}}getHtmlTemplate(e,t={}){try{let n=g.readFileSync(e,"utf-8");return Object.keys(t).forEach(e=>{const s=`{{${e}}}`;n=n.replace(new RegExp(s,"g"),t[e])}),n}catch(e){return U(`读取 HTML 模板失败: ${e.message||e.msg}`),"<html><body><h1>页面加载失败</h1></body></html>"}}async isPortInUse(e){return new Promise(t=>{const n=T.createServer();n.once("error",e=>{"EADDRINUSE"===e.code?t(!0):t(!1)}),n.once("listening",()=>{n.once("close",()=>{t(!1)}),n.close()}),n.listen(e)})}async startCallbackServer(){let e=this.redirectUri,t=new URL(e),n=parseInt(t.port,10);await this.isPortInUse(n)&&(U(`\n警告: 端口 ${n} 已被占用,请调整 redirectUri 配置项,使其指向一个未被占用的端口。`),process.exit(1));const s=new Promise((s,r)=>{const o=k.createServer(async(n,i)=>{const a=_.parse(n.url,!0);if(a.pathname===t.pathname||"/"===a.pathname){const t=a.query.code,n=a.query.error;if(n){i.writeHead(400,{"Content-Type":"text/html; charset=utf-8"});const e=this.getHtmlTemplate(this.authErrorTemplate,{ERROR:n});return i.end(e),o.close(),void r(new Error(`授权失败: ${n}`))}if(t)try{const n=await this.getTokenByCode(t,e);this.saveToken(n);const r=n.userInfo.tenantName?`${n.userInfo.tenantName}(${n.tenant_id})`:n.tenant_id||"未返回",a=n.instance_uri||"未返回";i.writeHead(200,{"Content-Type":"text/html; charset=utf-8"});const c=this.getHtmlTemplate(this.authSuccessTemplate,{TENANT_ID:r,INSTANCE_URI:a});return i.end(c),o.close(),void s({code:t,tokenData:n})}catch(e){i.writeHead(500,{"Content-Type":"text/html; charset=utf-8"});const t=this.getHtmlTemplate(this.tokenErrorTemplate,{ERROR:e});return i.end(t),o.close(),void r(e)}i.writeHead(400,{"Content-Type":"text/html; charset=utf-8"});const c=this.getHtmlTemplate(this.authFailedTemplate);i.end(c),o.close(),r(new Error("未获取到授权码"))}else i.writeHead(404,{"Content-Type":"text/plain"}),i.end("Not Found")});o.on("error",e=>{"EADDRINUSE"===e.code?r(new Error(`端口 ${n} 已被占用,无法启动回调服务器`)):r(e)}),o.listen(n,()=>{console.log(`\n本地回调服务器已启动,监听端口: ${n}`),console.log(`回调地址: ${e}`)}),setTimeout(()=>{o.close(),r(new Error("授权超时,请重试"))},3e5)});return{redirectUri:e,getCodeAndTokenPromise:s}}async getTokenByCode(e,t){const n=y("正在获取 access token...").start();try{const s=new URLSearchParams;s.append("grant_type",this.grant_type),s.append("client_id",this.client_id),s.append("client_secret",this.client_secret),s.append("code",e),s.append("redirect_uri",t);const r=(await d.post(this.tokenURL,s.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;if(r&&r.access_token){r&&r.instance_uri&&r.instance_uri!==this.neoBaseURL&&(this.neoBaseURL=r.instance_uri,$.setEnvConfig({neoBaseURL:r.instance_uri}));const e=await this.getUserInfo(r.access_token);e&&e.tenantName&&e.name?r.userInfo=e:U("获取用户信息失败:",e)}else U("获取 token 失败:响应中未包含 access_token",n),U(`响应数据: ${JSON.stringify(r)}`),process.exit(1);return R("成功获取 access token",n),r}catch(e){U("获取 token 失败",n),U(`\n获取 token 失败: ${e.message||e.msg}`),e.response&&U(`响应数据: ${JSON.stringify(e.response.data)}`),process.exit(1)}}async refreshToken(e){const t=y("正在刷新授权信息(token)...").start();try{const n=new URLSearchParams;n.append("grant_type","refresh_token"),n.append("client_id",this.client_id),n.append("client_secret",this.client_secret),n.append("refresh_token",e);const s=(await d.post(this.tokenURL,n.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;if(!s||!s.access_token)return U("刷新授权信息失败:响应中未包含 access_token",t),U(`响应数据: ${JSON.stringify(s)}`),null;{const e=await this.getUserInfo(s.access_token);s.userInfo=e}return R("刷新授权信息成功(token)。",t),s}catch(e){return U("刷新授权信息失败",t),U(`\n刷新授权信息失败: ${e.message||e.msg}`),e.response&&U(`响应数据: ${JSON.stringify(e.response.data)}`),null}}async getUserInfo(e){let t={};try{let n=this.buildFullUrl(this.NeoCrmAPI.getUserInfoAPI);const s=await d.get(n,{headers:{Authorization:`Bearer ${e}`,"xsy-inner-source":"bff","Content-Type":"application/json"}}),{code:r,message:o,msg:i}=s.data||{};r&&"200"!==r&&(U(`获取用户信息失败: ${o||i||"未知错误"}`),process.exit(1)),t=s.data.result||s.data.data||{}}catch(e){const t=e.message||e.msg;U(t?`获取用户信息失败: ${t}`:`响应数据: ${JSON.stringify(e)}`),process.exit(1)}return t}async login(){console.log("\n========== NeoCRM 登录授权 ==========\n");try{const{redirectUri:e,getCodeAndTokenPromise:t}=await this.startCallbackServer(),n=this.buildAuthUrl(e);console.log("授权 URL:",n),console.log("\n正在打开浏览器进行授权..."),await this.openBrowser(n);const{code:s,tokenData:r}=await t;return R("\n✓ 已获取授权码"),console.log("\n========== 登录成功 ==========\n"),console.log(`实例地址: ${r.instance_uri||"未返回"}`),console.log(`当前租户信息: ${r.userInfo.tenantName||"未返回租户名称"}(${r.tenant_id||"未返回租户 ID"})`),console.log(`当前登录用户: ${r.userInfo.name||"未返回用户名"}`),r}catch(e){U(`\n登录失败: ${e.message||e.msg}`),process.exit(1)}}async logout(){if(console.log("\n========== NeoCRM 登出 ==========\n"),g.existsSync(this.tokenFile))try{$.clearEnvConfig(),this.clearToken(),R("已清除授权信息,下次登录需要重新授权。"),console.log("\n登出成功!\n")}catch(e){U(`登出失败: ${e.message||e.msg}`),process.exit(1)}else console.log("当前未登录,无需登出。")}async getValidToken(){const e=this.readToken();if(e||(U("未找到授权信息,请先执行 neo login 进行登录。"),process.exit(1)),this.isTokenExpired(e)){console.log("授权信息已过期,正在尝试刷新..."),e.refresh_token||(U("自动刷新授权信息失败,请重新登录(neo login)。"),process.exit(1));const t=await this.refreshToken(e.refresh_token);return t||(U("刷新授权信息失败,请重新登录 (neo login)"),process.exit(1)),this.saveToken(t),t}return e}async getAccessToken(){return await this.getValidToken()}buildFullUrl(e){if(e.startsWith("http://")||e.startsWith("https://"))return e;let t=this.neoBaseURL;return t.endsWith("/")&&(t=t.substring(0,t.length-1)),`${t}${e}`}}};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("axios"),t=require("node:fs"),n=require("node:path"),s=require("ora"),r=require("node:http"),o=require("node:url"),i=require("open"),a=require("node:net"),c=require("lodash"),l=require("../utils/common.js"),h=require("./neoEnvManager.js");var p,u;exports.__require=function(){if(u)return p;u=1;const d=e,g=t,m=n,y=s,k=r,f=o,_=i,T=a,U=c,{errorLog:w,successLog:R}=l.__require(),x=h.__require();return p=class{constructor(e){if(this.tokenDir=m.join(process.cwd(),".neo-cli"),this.tokenFile=m.join(this.tokenDir,"token.json"),this.pageDir=m.join(__dirname,"../../template/pageHtml"),this.authErrorTemplate=m.join(this.pageDir,"auth-error.html"),this.authSuccessTemplate=m.join(this.pageDir,"auth-success.html"),this.tokenErrorTemplate=m.join(this.pageDir,"token-error.html"),this.authFailedTemplate=m.join(this.pageDir,"auth-failed.html"),!e)return;const{neoBaseURL:t,loginURL:n,tokenURL:s}=e,r=x.getAuthConfig(),{redirectUri:o,authType:i,auth:a}=r;if(!n||!s)throw new Error("neo.config.js 配置不完整,需要包含 loginURL、tokenURL");this.neoBaseURL=t,this.loginURL=n,this.tokenURL=s,this.NeoCrmAPI=r,this.redirectUri=o,this.authType=i||"oauth2",this.response_type=a.response_type||"code",this.client_id=a.client_id,this.client_secret=a.client_secret,this.scope=a.scope||"all",this.oauthType=a.oauthType||"standard",this.access_type=a.access_type||"offline",this.grant_type=a.grant_type||"authorization_code";try{x.setEnvConfig(U.pick(e,["neoBaseURL","loginURL","tokenURL"]))}catch(e){w(`保存环境配置失败: ${e.message||e.msg}`)}}ensureTokenDir(){g.existsSync(this.tokenDir)||g.mkdirSync(this.tokenDir,{recursive:!0})}saveToken(e){this.ensureTokenDir();const t={...e,savedAt:Date.now(),expiresAt:Date.now()+1e3*(e.expires_in||7200)};g.writeFileSync(this.tokenFile,JSON.stringify(t,null,2),"utf-8")}readToken(){if(!g.existsSync(this.tokenFile))return null;try{return JSON.parse(g.readFileSync(this.tokenFile,"utf-8"))}catch(e){return w(`读取 token 文件失败: ${e.message||e.msg}`),null}}isTokenExpired(e){return!e||!e.expiresAt||Date.now()>=e.expiresAt-3e5}clearToken(){g.existsSync(this.tokenFile)&&g.unlinkSync(this.tokenFile)}getRedirectURI(e){return`http://localhost:${e}`}buildAuthUrl(e){const t=new URLSearchParams({response_type:this.response_type,client_id:this.client_id,redirect_uri:e,scope:this.scope,oauthType:this.oauthType,access_type:this.access_type});return`${this.loginURL}?${t.toString()}`}async openBrowser(e){try{await _(e)}catch(t){w(`无法自动打开浏览器: ${t.message||t.msg}`),console.log(`\n请手动访问以下 URL 进行授权:\n${e}\n`)}}getHtmlTemplate(e,t={}){try{let n=g.readFileSync(e,"utf-8");return Object.keys(t).forEach(e=>{const s=`{{${e}}}`;n=n.replace(new RegExp(s,"g"),t[e])}),n}catch(e){return w(`读取 HTML 模板失败: ${e.message||e.msg}`),"<html><body><h1>页面加载失败</h1></body></html>"}}async isPortInUse(e){return new Promise(t=>{const n=T.createServer();n.once("error",e=>{"EADDRINUSE"===e.code?t(!0):t(!1)}),n.once("listening",()=>{n.once("close",()=>{t(!1)}),n.close()}),n.listen(e)})}async startCallbackServer(){let e=this.redirectUri,t=new URL(e),n=parseInt(t.port,10);await this.isPortInUse(n)&&(w(`\n警告: 端口 ${n} 已被占用,请调整 redirectUri 配置项,使其指向一个未被占用的端口。`),process.exit(1));const s=new Promise((s,r)=>{const o=k.createServer(async(n,i)=>{const a=f.parse(n.url,!0);if(a.pathname===t.pathname||"/"===a.pathname){const t=a.query.code,n=a.query.error;if(n){i.writeHead(400,{"Content-Type":"text/html; charset=utf-8"});const e=this.getHtmlTemplate(this.authErrorTemplate,{ERROR:n});return i.end(e),o.close(),void r(new Error(`授权失败: ${n}`))}if(t)try{const n=await this.getTokenByCode(t,e);this.saveToken(n);const r=n.userInfo.tenantName?`${n.userInfo.tenantName}(${n.tenant_id})`:n.tenant_id||"未返回",a=n.instance_uri||"未返回";i.writeHead(200,{"Content-Type":"text/html; charset=utf-8"});const c=this.getHtmlTemplate(this.authSuccessTemplate,{TENANT_ID:r,INSTANCE_URI:a});return i.end(c),o.close(),void s({code:t,tokenData:n})}catch(e){i.writeHead(500,{"Content-Type":"text/html; charset=utf-8"});const t=this.getHtmlTemplate(this.tokenErrorTemplate,{ERROR:e});return i.end(t),o.close(),void r(e)}i.writeHead(400,{"Content-Type":"text/html; charset=utf-8"});const c=this.getHtmlTemplate(this.authFailedTemplate);i.end(c),o.close(),r(new Error("未获取到授权码"))}else i.writeHead(404,{"Content-Type":"text/plain"}),i.end("Not Found")});o.on("error",e=>{"EADDRINUSE"===e.code?r(new Error(`端口 ${n} 已被占用,无法启动回调服务器`)):r(e)}),o.listen(n,()=>{console.log(`\n本地回调服务器已启动,监听端口: ${n}`),console.log(`回调地址: ${e}`)}),setTimeout(()=>{o.close(),r(new Error("授权超时,请重试"))},3e5)});return{redirectUri:e,getCodeAndTokenPromise:s}}async getTokenByCode(e,t){const n=y("正在获取 access token...").start();try{const s=new URLSearchParams;s.append("grant_type",this.grant_type),s.append("client_id",this.client_id),s.append("client_secret",this.client_secret),s.append("code",e),s.append("redirect_uri",t);const r=(await d.post(this.tokenURL,s.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;if(r&&r.access_token){if(r&&r.instance_uri){const e=this.extractRootUrlFromUrl(r.instance_uri);e&&e!==this.neoBaseURL&&(this.neoBaseURL=e,x.setEnvConfig({neoBaseURL:e}))}const e=await this.getUserInfo(r.access_token);e&&e.tenantName&&e.name?r.userInfo=e:w("获取用户信息失败:",e)}else w("获取 token 失败:响应中未包含 access_token",n),w(`响应数据: ${JSON.stringify(r)}`),process.exit(1);return R("成功获取 access token",n),r}catch(e){w("获取 token 失败",n),w(`\n获取 token 失败: ${e.message||e.msg}`),e.response&&w(`响应数据: ${JSON.stringify(e.response.data)}`),process.exit(1)}}async refreshToken(e){const t=y("正在刷新授权信息(token)...").start();try{const n=new URLSearchParams;n.append("grant_type","refresh_token"),n.append("client_id",this.client_id),n.append("client_secret",this.client_secret),n.append("refresh_token",e);const s=(await d.post(this.tokenURL,n.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;if(!s||!s.access_token)return w("刷新授权信息失败:响应中未包含 access_token",t),w(`响应数据: ${JSON.stringify(s)}`),null;{const e=await this.getUserInfo(s.access_token);s.userInfo=e}return R("刷新授权信息成功(token)。",t),s}catch(e){return w("刷新授权信息失败",t),w(`\n刷新授权信息失败: ${e.message||e.msg}`),e.response&&w(`响应数据: ${JSON.stringify(e.response.data)}`),null}}async getUserInfo(e){let t={};try{let n=this.buildFullUrl(this.NeoCrmAPI.getUserInfoAPI);const s=await d.get(n,{headers:{Authorization:`Bearer ${e}`,"xsy-inner-source":"bff","Content-Type":"application/json"}}),{code:r,message:o,msg:i}=s.data||{};r&&"200"!==r&&(w(`获取用户信息失败: ${o||i||"未知错误"}`),process.exit(1)),t=s.data.result||s.data.data||{}}catch(e){const t=e.message||e.msg;w(t?`获取用户信息失败: ${t}`:`响应数据: ${JSON.stringify(e)}`),process.exit(1)}return t}async login(){console.log("\n========== NeoCRM 登录授权 ==========\n");try{const{redirectUri:e,getCodeAndTokenPromise:t}=await this.startCallbackServer(),n=this.buildAuthUrl(e);console.log("授权 URL:",n),console.log("\n正在打开浏览器进行授权..."),await this.openBrowser(n);const{code:s,tokenData:r}=await t;return R("\n✓ 已获取授权码"),console.log("\n========== 登录成功 ==========\n"),console.log(`实例地址: ${r.instance_uri||"未返回"}`),console.log(`当前租户信息: ${r.userInfo.tenantName||"未返回租户名称"}(${r.tenant_id||"未返回租户 ID"})`),console.log(`当前登录用户: ${r.userInfo.name||"未返回用户名"}`),r}catch(e){w(`\n登录失败: ${e.message||e.msg}`),process.exit(1)}}async logout(){if(console.log("\n========== NeoCRM 登出 ==========\n"),g.existsSync(this.tokenFile))try{x.clearEnvConfig(),this.clearToken(),R("已清除授权信息,下次登录需要重新授权。"),console.log("\n登出成功!\n")}catch(e){w(`登出失败: ${e.message||e.msg}`),process.exit(1)}else console.log("当前未登录,无需登出。")}async getValidToken(){const e=this.readToken();if(e||(w("未找到授权信息,请先执行 neo login 进行登录。"),process.exit(1)),this.isTokenExpired(e)){console.log("授权信息已过期,正在尝试刷新..."),e.refresh_token||(w("自动刷新授权信息失败,请重新登录(neo login)。"),process.exit(1));const t=await this.refreshToken(e.refresh_token);return t||(w("刷新授权信息失败,请重新登录 (neo login)"),process.exit(1)),this.saveToken(t),t}return e}async getAccessToken(){return await this.getValidToken()}extractRootUrlFromUrl(e){if(!e||"string"!=typeof e)return"";const t=e.trim();if(!t)return"";try{return new URL(t).origin}catch{return t}}buildFullUrl(e){if(e.startsWith("http://")||e.startsWith("https://"))return e;let t=this.neoBaseURL;return t.endsWith("/")&&(t=t.substring(0,t.length-1)),`${t}${e}`}}};
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e="1.13.15";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.16";const o={version:e};exports.default=o,exports.version=e;
@@ -0,0 +1,13 @@
1
+ ## 一、说明
2
+ 这是一个用于实现代理转发第三方接口的自定义API。
3
+
4
+ ## 二、使用方式
5
+
6
+ ### 步骤1
7
+ 在 admin 管理端,打开 开发/业务逻辑代码,并切换到 代码包 tab面板,点击「新建代码包」,按界面提示输入:
8
+ 代码名称: 通用代理接口
9
+ Package: other.xsy.proxy
10
+ 代码描述: 用于代理转发第三方API。
11
+
12
+ ### 步骤2
13
+ 将 forward.zip 到上传到刚创建的「代码包」上。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo-cmp-cli",
3
- "version": "1.13.15",
3
+ "version": "1.13.17",
4
4
  "description": "Neo 自定义组件开发工具,支持react 和 vue2.0技术栈。",
5
5
  "keywords": [
6
6
  "neo-cli",
@@ -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.13.15",
51
+ "neo-cmp-cli": "^1.13.17",
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
  "axios": "^1.7.0",
42
42
  "antd": "4.9.4",
43
43
  "lodash": "^4.17.21",
44
- "neo-open-api": "^1.2.3",
44
+ "neo-open-api": "^1.2.7",
45
45
  "tslib": "2.3.0",
46
46
  "echarts": "^5.5.1",
47
47
  "moment": "^2.30.1"
@@ -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.13.15",
55
+ "neo-cmp-cli": "^1.13.17",
56
56
  "husky": "^4.2.5",
57
57
  "lint-staged": "^10.2.9",
58
58
  "prettier": "^2.0.5",
@@ -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.13.15",
51
+ "neo-cmp-cli": "^1.13.17",
52
52
  "husky": "^4.2.5",
53
53
  "lint-staged": "^10.2.9",
54
54
  "prettier": "^2.0.5",
@@ -34,14 +34,14 @@
34
34
  "react": "^16.9.0",
35
35
  "react-dom": "^16.9.0",
36
36
  "antd": "4.9.4",
37
- "neo-open-api": "^1.2.3"
37
+ "neo-open-api": "^1.2.7"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@commitlint/cli": "^18.0.0",
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.13.15",
44
+ "neo-cmp-cli": "^1.13.17",
45
45
  "husky": "^4.2.5",
46
46
  "lint-staged": "^10.2.9",
47
47
  "prettier": "^2.0.5"
@@ -47,7 +47,7 @@
47
47
  "@commitlint/config-conventional": "^18.0.0",
48
48
  "@types/react": "^16.9.11",
49
49
  "@types/react-dom": "^16.9.15",
50
- "neo-cmp-cli": "^1.13.15",
50
+ "neo-cmp-cli": "^1.13.17",
51
51
  "husky": "^4.2.5",
52
52
  "lint-staged": "^10.2.9",
53
53
  "prettier": "^2.0.5"
@@ -78,12 +78,18 @@ module.exports = {
78
78
  */
79
79
  },
80
80
  // 选择「自定义环境」时需要添加 NeoCRM 平台配置,可自定义对接的任何环境
81
- neoConfig: {
81
+ neoConfig1: {
82
82
  // authType: 'oauth2', // 默认授权模式:OAuth2 授权码模式
83
83
  neoBaseURL: 'https://crm-test.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
84
84
  loginURL: 'https://login-test.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
85
85
  tokenURL: 'https://login-test.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
86
86
  },
87
+ neoConfig: {
88
+ // authType: 'oauth2', // 默认授权模式:OAuth2 授权码模式
89
+ neoBaseURL: 'https://crm-p20.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
90
+ loginURL: 'https://login-p20.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
91
+ tokenURL: 'https://login-p20.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
92
+ },
87
93
  pushCmp: {
88
94
  // 用于构建并发布至 NeoCRM 的相关配置
89
95
  // 备注:pushCmp 会服用量 build2lib 中的配置,执行 neo push cmp 时最好注释掉 build2lib 中的配置。
@@ -33,26 +33,27 @@
33
33
  ]
34
34
  },
35
35
  "dependencies": {
36
+ "antd": "^4.9.4",
37
+ "axios": "^1.7.0",
38
+ "echarts": "^5.6.0",
39
+ "lodash": "^4.17.21",
40
+ "moment": "^2.30.1",
41
+ "neo-open-api": "^1.2.7",
36
42
  "neo-register": "^1.1.3",
37
43
  "react": "^16.9.0",
38
44
  "react-dom": "^16.9.0",
39
- "axios": "^1.7.0",
40
- "antd": "^4.9.4",
41
- "lodash": "^4.17.21",
42
- "neo-open-api": "^1.1.9",
43
- "@wibetter/json-editor": "^6.0.5",
44
45
  "tslib": "2.3.0"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@babel/runtime": "^7.26.0",
48
49
  "@commitlint/cli": "^8.3.5",
49
50
  "@commitlint/config-conventional": "^9.1.1",
51
+ "@types/axios": "^0.14.0",
50
52
  "@types/react": "^16.9.11",
51
53
  "@types/react-dom": "^16.9.15",
52
- "@types/axios": "^0.14.0",
53
- "neo-cmp-cli": "^1.13.15",
54
54
  "husky": "^4.2.5",
55
55
  "lint-staged": "^10.2.9",
56
+ "neo-cmp-cli": "^1.13.17",
56
57
  "prettier": "^2.0.5"
57
58
  },
58
59
  "overrides": {
@@ -0,0 +1,77 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
7
+ <title>WAF拦截页面</title>
8
+ <link rel="stylesheet" text="text/css"
9
+ href="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/403/main.css" />
10
+ <script type="text/javascript"
11
+ src="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/403/main.js"></script>
12
+ </head>
13
+ <script> function submitWafFeedback() { var uuid = document.getElementById("uuid").innerHTML; window.location.href = "https://api.waf.qq.com/waf-attack-feedback/" + uuid; } </script>
14
+
15
+ <body>
16
+ <div class="wrapper">
17
+ <div class="body">
18
+ <div class="top-block"><img class="error-icon"
19
+ src="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/static/403-icon.png"
20
+ alt="403" />
21
+ <div>
22
+ <div class="title-wrapper">
23
+ <p class="title">您的请求已中断</p>
24
+ </div>
25
+ <p class="desc">您提交的请求可能对网站造成威胁,无法访问</p>
26
+ </div>
27
+ </div>
28
+ <div class="content-block">
29
+ <div class="content-item">
30
+ <p class="title">可能原因</p>
31
+ <p class="desc">Web应用防护服务检测您当前访问存在Web安全风险或访问不合规</p><img class="link-img"
32
+ style="margin-top: 20px; margin-bottom: 32px"
33
+ src="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/static/403-link.svg" alt="" />
34
+ </div>
35
+ <div class="mobile-link-block">
36
+ <div class="link-item">
37
+ <div class="left">
38
+ <p class="title">Client</p>
39
+ <p class="desc">浏览器正常</p>
40
+ </div><img
41
+ src="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/static/success-status.svg"
42
+ alt="" />
43
+ </div>
44
+ <div class="link-item-divider"></div>
45
+ <div class="link-item">
46
+ <div class="left">
47
+ <p class="title">腾讯云WAF</p>
48
+ <p class="desc">访问拦截</p>
49
+ </div><img
50
+ src="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/static/error-status.svg"
51
+ alt="" />
52
+ </div>
53
+ <div class="link-item-divider"></div>
54
+ <div class="link-item">
55
+ <div class="left">
56
+ <p class="title">源站服务器</p>
57
+ <p class="desc">无法访问</p>
58
+ </div><img
59
+ src="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/static/check-status.svg"
60
+ alt="" />
61
+ </div>
62
+ </div>
63
+ <div class="content-item">
64
+ <p class="title">您可以做什么?</p>
65
+ <p class="desc">如有疑问,请点击提交反馈或联系网站安全运维中心反馈请求UUID</p>
66
+ <p class="uuid-wrapper"> 请求UUID:<span
67
+ id="uuid">88e031bb136547814ca0bcd2d5abc3d7-d184f4ad21127684d3c87ee4af57230c</span><img class="copy-icon"
68
+ onclick="copyToClipboard()"
69
+ src="https://domain-config-1256704386.cos.accelerate.myqcloud.com/block-pages/static/copy.svg" alt="" />
70
+ </p>
71
+ </div>
72
+ <div class="submit-btn" onclick="submitWafFeedback()">提交反馈</div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </body>
77
+ </html>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1775724558452" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3985" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M640 170.666667v170.666666H85.333333V170.666667zM938.666667 426.688v170.666667H85.333333v-170.666667zM725.333333 682.666667v170.666666H85.333333v-170.666666z" fill="#4352D4" p-id="3986"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1775724746313" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11432" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M928 160H96a32 32 0 0 0-32 32v672a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32z m-32 672H128V224h768v608z" p-id="11433" fill="#0964f5"></path><path d="M230.592 448.096H544a32 32 0 1 0 0-64H230.592a32 32 0 0 0 0 64zM230.592 640.096H544a32 32 0 1 0 0-64H230.592a32 32 0 1 0 0 64zM768 704a32 32 0 0 0 32-32V350.016a32 32 0 1 0-64 0V672a32 32 0 0 0 32 32z" p-id="11434" fill="#0964f5"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1775724402349" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1693" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M558.72 1015.04a32.64 32.64 0 0 1-32.64-32.64V334.08a32.64 32.64 0 0 1 8.32-21.12l213.12-241.28h-640L320 312.32a35.2 35.2 0 0 1 8.32 21.76v374.4l69.76 69.12a32.64 32.64 0 1 1-46.08 46.08l-78.08-78.72a35.2 35.2 0 0 1-9.6-23.04V346.24L11.52 64A33.28 33.28 0 0 1 5.76 25.6 33.92 33.92 0 0 1 35.84 6.4h784.64a33.28 33.28 0 0 1 29.44 19.2 33.28 33.28 0 0 1-5.12 38.4l-256 286.08v635.52a32.64 32.64 0 0 1-30.08 29.44z" fill="#0964f5" p-id="1694"></path><path d="M970.88 504.96h-280.96a32.64 32.64 0 1 1 0-64h280.96a32.64 32.64 0 1 1 0 64zM970.88 709.76h-280.96a32.64 32.64 0 0 1 0-64h280.96a32.64 32.64 0 0 1 0 64zM970.88 914.56h-280.96a32.64 32.64 0 0 1 0-64h280.96a32.64 32.64 0 0 1 0 64z" fill="#0964f5" p-id="1695"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1775724534531" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2791" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M336.704 586.005333h350.592l84.906667-148.010666H251.797333l84.906667 148.010666z m543.402667-432H143.893333c-24.490667 0-39.786667 26.688-27.498666 48l98.602666 171.989334h594.005334l98.688-171.989334c12.202667-21.312-3.093333-48-27.584-48zM348.992 837.973333c0 17.706667 14.208 32 31.808 32h262.4c17.6 0 31.786667-14.293333 31.786667-32V650.026667H349.013333v187.989333z" fill="#0964f5" p-id="2792"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1775724772887" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12481" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M908.8 1005.44H115.2a101.76 101.76 0 0 1-101.12-101.76V110.72A101.76 101.76 0 0 1 115.2 8.96h296.96a32.64 32.64 0 0 1 32 32V262.4a32 32 0 0 1-32 32 32 32 0 0 1-32-32v-192H115.2a37.76 37.76 0 0 0-37.12 37.76v795.52a37.76 37.76 0 0 0 37.12 37.76h793.6a37.76 37.76 0 0 0 37.12-37.76V267.52a32 32 0 0 1 32-32 32 32 0 0 1 32 32v636.16a101.76 101.76 0 0 1-101.12 101.76z" fill="#0964f5" p-id="12482"></path><path d="M977.92 299.52a32.64 32.64 0 0 1-32-32V180.48a37.12 37.12 0 0 0-37.12-37.76H421.12a32 32 0 0 1-32-32 32 32 0 0 1 32-32h487.68a101.76 101.76 0 0 1 101.12 101.76v87.04a32 32 0 0 1-32 32z" fill="#0964f5" p-id="12483"></path><path d="M977.92 299.52H64a32 32 0 0 1-32-32 32 32 0 0 1 32-32h913.92a32 32 0 0 1 32 32 32 32 0 0 1-32 32z" fill="#0964f5" p-id="12484"></path><path d="M699.52 299.52a32 32 0 0 1-32-32V110.72a32 32 0 0 1 64 0v156.8a32 32 0 0 1-32 32z" fill="#0964f5" p-id="12485"></path></svg>
@@ -1,6 +1,6 @@
1
1
  # FilterBar 组件
2
2
 
3
- 筛选栏组件,支持日期范围、负责人、业务类型等多维度筛选。
3
+ 筛选栏组件,支持日期范围、用户和部门、业务类型等多维度筛选。
4
4
 
5
5
  ## 使用方式
6
6
 
@@ -8,10 +8,6 @@
8
8
  import FilterBar from './components/filterBar__c';
9
9
 
10
10
  <FilterBar
11
- filters={[
12
- { name: 'closeDate', label: 'Close Date', type: 'select', options: [...] },
13
- { name: 'owner', label: 'Opportunity Owner', type: 'owner' },
14
- ]}
15
11
  onChange={(key, value) => console.log(key, value)}
16
12
  />
17
13
  ```
@@ -20,16 +16,9 @@ import FilterBar from './components/filterBar__c';
20
16
 
21
17
  | 属性 | 说明 | 类型 | 默认值 |
22
18
  |------|------|------|--------|
23
- | filters | 筛选配置数组 | FilterItem[] | [] |
24
19
  | values | 筛选值 | Record<string, string> | {} |
25
20
  | onChange | 筛选变化回调 | (key: string, value: string) => void | - |
26
- | onSearch | 搜索按钮回调 | () => void | - |
27
21
 
28
- ## FilterItem
29
22
 
30
- | 属性 | 说明 | 类型 |
31
- |------|------|------|
32
- | name | 字段标识 | string |
33
- | label | 显示标签 | string |
34
- | type | 类型 | 'select' \| 'date' \| 'owner' \| 'custom' |
35
- | options | 下拉选项 | FilterOption[] |
23
+ ## 说明
24
+ 1、获取 相对时间的接口:/rest/neobi/v2.0/config/getOption。
@@ -0,0 +1,29 @@
1
+ // css变量
2
+ :root {
3
+ --background-color: #f5f6fa;
4
+ }
5
+ // sass变量
6
+ $background-color: #f5f6fa;
7
+ // 自定义公共样式
8
+
9
+ // 自定义页面最外层容器背景色
10
+ body {
11
+ // background-color: var(--background-color);
12
+ background-color: $background-color;
13
+ }
14
+
15
+ .neo-page-container {
16
+ max-width: 1400px;
17
+ margin: 0 auto;
18
+ padding: 20px;
19
+ // background-color: var(--background-color);
20
+ background-color: $background-color;
21
+
22
+ .flex-gap-8px {
23
+ gap: 8px 20px;
24
+ }
25
+ }
26
+
27
+ .single-slot-layout .content-section {
28
+ background-color: $background-color !important;
29
+ }