neo-cmp-cli 1.12.9 → 1.12.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index2.js +1 -1
- package/dist/module/neoInitByCopy.js +1 -1
- package/dist/package.json.js +1 -1
- package/package.json +4 -1
- package/template/antd-custom-cmp-template/package.json +1 -1
- package/template/asset-manage-template/package.json +1 -1
- package/template/asset-manage-template/src/utils/queryObjectData.ts +36 -0
- package/template/echarts-custom-cmp-template/package.json +1 -1
- package/template/empty-custom-cmp-template/package.json +1 -1
- package/template/neo-custom-cmp-template/package.json +4 -1
- package/template/neo-custom-cmp-template/src/utils/queryObjectData.ts +36 -0
- package/template/neo-custom-cmp-template/tsconfig.json +1 -2
- package/template/neo-h5-cmps/neo.config.js +1 -6
- package/template/neo-h5-cmps/package.json +6 -3
- package/template/neo-h5-cmps/src/utils/queryObjectData.ts +36 -0
- package/template/neo-h5-cmps/tsconfig.json +3 -4
- package/template/neo-order-cmps/package.json +1 -1
- package/template/neo-order-cmps/src/utils/queryObjectData.ts +36 -0
- package/template/neo-web-cmps/.prettierrc.js +12 -0
- package/template/neo-web-cmps/@types/neo-ui-common.d.ts +36 -0
- package/template/neo-web-cmps/README.md +99 -0
- package/template/neo-web-cmps/commitlint.config.js +59 -0
- package/template/neo-web-cmps/neo.config.js +53 -0
- package/template/neo-web-cmps/package.json +65 -0
- package/template/neo-web-cmps/public/css/base.css +283 -0
- package/template/neo-web-cmps/public/scripts/app/bluebird.js +6679 -0
- package/template/neo-web-cmps/public/template.html +13 -0
- package/template/neo-web-cmps/src/assets/css/common.scss +127 -0
- package/template/neo-web-cmps/src/assets/css/mixin.scss +47 -0
- package/template/neo-web-cmps/src/assets/img/AIBtn.gif +0 -0
- package/template/neo-web-cmps/src/assets/img/NeoCRM.jpg +0 -0
- package/template/neo-web-cmps/src/assets/img/aiLogo.png +0 -0
- package/template/neo-web-cmps/src/assets/img/card-list.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/contact-form.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/custom-form.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/custom-widget.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/data-list.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/detail.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/favicon.png +0 -0
- package/template/neo-web-cmps/src/assets/img/map.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/search.svg +1 -0
- package/template/neo-web-cmps/src/assets/img/table.svg +1 -0
- package/template/neo-web-cmps/src/components/entityGrid2__c/index.tsx +72 -0
- package/template/neo-web-cmps/src/components/entityGrid2__c/model.ts +195 -0
- package/template/neo-web-cmps/src/components/entityGrid2__c/style.scss +13 -0
- package/template/neo-web-cmps/src/components/entityGrid__c/index.tsx +52 -0
- package/template/neo-web-cmps/src/components/entityGrid__c/model.ts +195 -0
- package/template/neo-web-cmps/src/components/entityGrid__c/style.scss +13 -0
- package/template/neo-web-cmps/src/utils/axiosFetcher.ts +37 -0
- package/template/neo-web-cmps/src/utils/queryObjectData.ts +112 -0
- package/template/neo-web-cmps/src/utils/xobjects.ts +167 -0
- package/template/neo-web-cmps/tsconfig.json +39 -0
- package/template/react-custom-cmp-template/package.json +1 -1
- package/template/react-ts-custom-cmp-template/package.json +1 -1
- package/template/vue2-custom-cmp-template/package.json +1 -1
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(),_=c.__require(),{getNeoCrmAPI:N}=p.__require(),q=m.default,M=r.textSync("neo",{font:"Lean"}),S=_.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 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=N(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)_.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?_.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)_.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(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 _.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(R("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(R("Usage")+": $0 preview [options]").option("name",{alias:"n",describe:"自定义组件名称"}).alias("h","help")},e=>{if(e.name)_.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)),_.previewCmp(e.cmpType)})}}).command("dev","开启本地调试模式",e=>{e.usage(R("Usage")+": $0 dev").alias("h","help")},()=>{_.dev()}).command("linkDebug","开启外链调试模式(在线上页面设计器端调试)",e=>{e.usage(R("Usage")+": $0 linkDebug").alias("h","help")},e=>{_.linkDebug()}).command("build","构建生产环境代码",e=>{e.usage(R("Usage")+": $0 build").alias("h","help")},e=>{_.build()}).command("build2lib","构建 UMD 模块",e=>{e.usage(R("Usage")+": $0 build2lib").alias("h","help")},e=>{_.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)_.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)),_.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 _.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 _.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(R("Usage")+": $0 build2esm").alias("h","help")},()=>{_.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=>{_.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: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 +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"),
|
|
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 i=e,n=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: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")},antd:{projectName:"antd-custom-cmp-template",dir:n.resolve(__dirname,"../../template/antd-custom-cmp-template")},echarts:{projectName:"echarts-custom-cmp-template",dir:n.resolve(__dirname,"../../template/echarts-custom-cmp-template")},neo:{projectName:"neo-custom-cmp-template",dir:n.resolve(__dirname,"../../template/neo-custom-cmp-template")},"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")},vue2:{projectName:"vue2-custom-cmp-template",dir:n.resolve(__dirname,"../../template/vue2-custom-cmp-template")}};return s=function(e,t){const r=v[e||"react"],m=r.dir,o=t||"neoCustomCmp",a=n.resolve(process.cwd(),o);i.copy(m,a).then(()=>{u(a,r.projectName,o),u(a,"wibetter","xxx"),u(a,"neo自定义组件模板","neo自定义组件"),_(a),console.log(`${l}已创建自定义组件(${o})!`),d(a)}).catch(e=>j(`${l}自定义组件模板下载失败:`,e))}};
|
package/dist/package.json.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e="1.12.
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e="1.12.10";const o={version:e};exports.default=o,exports.version=e;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neo-cmp-cli",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.10",
|
|
4
4
|
"description": "Neo 自定义组件开发工具,支持react 和 vue2.0技术栈。",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"neo-cli",
|
|
@@ -66,6 +66,9 @@
|
|
|
66
66
|
"lint-staged": "^10.2.9",
|
|
67
67
|
"prettier": "^2.0.5"
|
|
68
68
|
},
|
|
69
|
+
"overrides": {
|
|
70
|
+
"typescript": "<6"
|
|
71
|
+
},
|
|
69
72
|
"engines": {
|
|
70
73
|
"node": ">= 16.0.0",
|
|
71
74
|
"npm": ">= 8.0.0"
|
|
@@ -4,6 +4,23 @@ import axiosFetcher from '$utils/axiosFetcher';
|
|
|
4
4
|
* 这里存放通用查询类 Open API
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/** 将 where 规范为 SQL 片段:字符串直接使用;数组用 and 拼接各条件 */
|
|
8
|
+
function normalizeWhere(where: unknown): string {
|
|
9
|
+
if (where == null || where === '') {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
if (typeof where === 'string') {
|
|
13
|
+
return where.trim();
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(where)) {
|
|
16
|
+
return where
|
|
17
|
+
.map((part) => (part == null ? '' : String(part).trim()))
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
.join(' and ');
|
|
20
|
+
}
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
|
|
7
24
|
// 获取业务对象数据列表
|
|
8
25
|
export const queryXObjectData = async (options?: any) => {
|
|
9
26
|
const apiUrl = '/rest/data/v2/query';
|
|
@@ -29,6 +46,25 @@ export const queryXObjectData = async (options?: any) => {
|
|
|
29
46
|
querySql += ` order by ${curOptions.orderBy}`;
|
|
30
47
|
}
|
|
31
48
|
|
|
49
|
+
/**
|
|
50
|
+
* 添加过滤条件(如果有的话)
|
|
51
|
+
* 支持的操作符包括:=、!=、like、not like、not in、is not null、is null、>、<、<>、>=、<=、in、between ... and ...。
|
|
52
|
+
* 对于 =、like 和 in 有以下说明:
|
|
53
|
+
* “=” 作为字符串的条件时,表示精确匹配。例如,查询条件 city = '北京',将返回 city 字段值严格等于 "北京" 的所有记录。
|
|
54
|
+
* "like" 作为字符串的条件时,需要使用"%" 通配符进行模糊匹配。例如,city like‘北京%',将返回 city 字段值以 "北京" 开头的所有记录。
|
|
55
|
+
* 目前仅支持将通配符“%” 放到已知内容之后的查询方式,例如,不支持 city like ‘% 北京'的查询方式。
|
|
56
|
+
* 当 SQL 查询中包含“%”等特殊字符时,需要对 SQL 进行 URL 编码处理。
|
|
57
|
+
* 支持"in",但不包括子查询。
|
|
58
|
+
* 支持的逻辑运算符包括:and、or。
|
|
59
|
+
*
|
|
60
|
+
* `where` 可为字符串,或字符串数组(多项默认以 and 连接,等价于手写 `a and b`)。
|
|
61
|
+
*/
|
|
62
|
+
const whereClause = normalizeWhere(curOptions.where);
|
|
63
|
+
console.log('whereClause:', whereClause);
|
|
64
|
+
if (whereClause) {
|
|
65
|
+
querySql += ` where ${whereClause}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
32
68
|
if (curOptions.page || curOptions.pageSize) {
|
|
33
69
|
// 添加分页限制
|
|
34
70
|
querySql += ` limit ${pageSize} offset ${offset}`;
|
|
@@ -55,11 +55,14 @@
|
|
|
55
55
|
"@types/react": "^16.9.11",
|
|
56
56
|
"@types/react-dom": "^16.9.15",
|
|
57
57
|
"@types/axios": "^0.14.0",
|
|
58
|
-
"neo-cmp-cli": "^1.12.
|
|
58
|
+
"neo-cmp-cli": "^1.12.10",
|
|
59
59
|
"husky": "^4.2.5",
|
|
60
60
|
"lint-staged": "^10.2.9",
|
|
61
61
|
"prettier": "^2.0.5"
|
|
62
62
|
},
|
|
63
|
+
"overrides": {
|
|
64
|
+
"typescript": "<6"
|
|
65
|
+
},
|
|
63
66
|
"engines": {
|
|
64
67
|
"node": ">= 16.0.0",
|
|
65
68
|
"npm": ">= 8.0.0"
|
|
@@ -4,6 +4,23 @@ import axiosFetcher from '$utils/axiosFetcher';
|
|
|
4
4
|
* 这里存放通用查询类 Open API
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/** 将 where 规范为 SQL 片段:字符串直接使用;数组用 and 拼接各条件 */
|
|
8
|
+
function normalizeWhere(where: unknown): string {
|
|
9
|
+
if (where == null || where === '') {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
if (typeof where === 'string') {
|
|
13
|
+
return where.trim();
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(where)) {
|
|
16
|
+
return where
|
|
17
|
+
.map((part) => (part == null ? '' : String(part).trim()))
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
.join(' and ');
|
|
20
|
+
}
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
|
|
7
24
|
// 获取业务对象数据列表
|
|
8
25
|
export const queryXObjectData = async (options?: any) => {
|
|
9
26
|
const apiUrl = '/rest/data/v2/query';
|
|
@@ -29,6 +46,25 @@ export const queryXObjectData = async (options?: any) => {
|
|
|
29
46
|
querySql += ` order by ${curOptions.orderBy}`;
|
|
30
47
|
}
|
|
31
48
|
|
|
49
|
+
/**
|
|
50
|
+
* 添加过滤条件(如果有的话)
|
|
51
|
+
* 支持的操作符包括:=、!=、like、not like、not in、is not null、is null、>、<、<>、>=、<=、in、between ... and ...。
|
|
52
|
+
* 对于 =、like 和 in 有以下说明:
|
|
53
|
+
* “=” 作为字符串的条件时,表示精确匹配。例如,查询条件 city = '北京',将返回 city 字段值严格等于 "北京" 的所有记录。
|
|
54
|
+
* "like" 作为字符串的条件时,需要使用"%" 通配符进行模糊匹配。例如,city like‘北京%',将返回 city 字段值以 "北京" 开头的所有记录。
|
|
55
|
+
* 目前仅支持将通配符“%” 放到已知内容之后的查询方式,例如,不支持 city like ‘% 北京'的查询方式。
|
|
56
|
+
* 当 SQL 查询中包含“%”等特殊字符时,需要对 SQL 进行 URL 编码处理。
|
|
57
|
+
* 支持"in",但不包括子查询。
|
|
58
|
+
* 支持的逻辑运算符包括:and、or。
|
|
59
|
+
*
|
|
60
|
+
* `where` 可为字符串,或字符串数组(多项默认以 and 连接,等价于手写 `a and b`)。
|
|
61
|
+
*/
|
|
62
|
+
const whereClause = normalizeWhere(curOptions.where);
|
|
63
|
+
console.log('whereClause:', whereClause);
|
|
64
|
+
if (whereClause) {
|
|
65
|
+
querySql += ` where ${whereClause}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
32
68
|
if (curOptions.page || curOptions.pageSize) {
|
|
33
69
|
// 添加分页限制
|
|
34
70
|
querySql += ` limit ${pageSize} offset ${offset}`;
|
|
@@ -44,15 +44,10 @@ module.exports = {
|
|
|
44
44
|
ignoreNodeModules: false
|
|
45
45
|
},
|
|
46
46
|
linkDebug: {},
|
|
47
|
-
|
|
47
|
+
neoConfig: {
|
|
48
48
|
neoBaseURL: "https://crm-test.xiaoshouyi.com",
|
|
49
49
|
loginURL: "https://login-test.xiaoshouyi.com/auc/oauth2/auth",
|
|
50
50
|
tokenURL: "https://login-test.xiaoshouyi.com/auc/oauth2/token"
|
|
51
51
|
},
|
|
52
|
-
neoConfig: {
|
|
53
|
-
neoBaseURL: "https://crm-tencentuat.xiaoshouyi.com",
|
|
54
|
-
loginURL: "https://login-tencentuat.xiaoshouyi.com/auc/oauth2/auth",
|
|
55
|
-
tokenURL: "https://login-tencentuat.xiaoshouyi.com/auc/oauth2/token"
|
|
56
|
-
},
|
|
57
52
|
pushCmp: {}
|
|
58
53
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neo-h5-cmps",
|
|
3
3
|
"version": "1.1.0",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "Neo Web 核心业务组件使用示例(react&ts技术栈)",
|
|
5
5
|
"framework": "react-ts",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"react&ts技术栈",
|
|
8
|
-
"
|
|
8
|
+
"neoh5 核心业务组件"
|
|
9
9
|
],
|
|
10
10
|
"author": "wibetter",
|
|
11
11
|
"license": "MIT",
|
|
@@ -50,11 +50,14 @@
|
|
|
50
50
|
"@types/react": "^16.9.11",
|
|
51
51
|
"@types/react-dom": "^16.9.15",
|
|
52
52
|
"@types/axios": "^0.14.0",
|
|
53
|
-
"neo-cmp-cli": "^1.12.
|
|
53
|
+
"neo-cmp-cli": "^1.12.10",
|
|
54
54
|
"husky": "^4.2.5",
|
|
55
55
|
"lint-staged": "^10.2.9",
|
|
56
56
|
"prettier": "^2.0.5"
|
|
57
57
|
},
|
|
58
|
+
"overrides": {
|
|
59
|
+
"typescript": "<6"
|
|
60
|
+
},
|
|
58
61
|
"engines": {
|
|
59
62
|
"node": ">= 16.0.0",
|
|
60
63
|
"npm": ">= 8.0.0"
|
|
@@ -4,6 +4,23 @@ import axiosFetcher from '$utils/axiosFetcher';
|
|
|
4
4
|
* 这里存放通用查询类 Open API
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/** 将 where 规范为 SQL 片段:字符串直接使用;数组用 and 拼接各条件 */
|
|
8
|
+
function normalizeWhere(where: unknown): string {
|
|
9
|
+
if (where == null || where === '') {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
if (typeof where === 'string') {
|
|
13
|
+
return where.trim();
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(where)) {
|
|
16
|
+
return where
|
|
17
|
+
.map((part) => (part == null ? '' : String(part).trim()))
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
.join(' and ');
|
|
20
|
+
}
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
|
|
7
24
|
// 获取业务对象数据列表
|
|
8
25
|
export const queryXObjectData = async (options?: any) => {
|
|
9
26
|
const apiUrl = '/rest/data/v2/query';
|
|
@@ -29,6 +46,25 @@ export const queryXObjectData = async (options?: any) => {
|
|
|
29
46
|
querySql += ` order by ${curOptions.orderBy}`;
|
|
30
47
|
}
|
|
31
48
|
|
|
49
|
+
/**
|
|
50
|
+
* 添加过滤条件(如果有的话)
|
|
51
|
+
* 支持的操作符包括:=、!=、like、not like、not in、is not null、is null、>、<、<>、>=、<=、in、between ... and ...。
|
|
52
|
+
* 对于 =、like 和 in 有以下说明:
|
|
53
|
+
* “=” 作为字符串的条件时,表示精确匹配。例如,查询条件 city = '北京',将返回 city 字段值严格等于 "北京" 的所有记录。
|
|
54
|
+
* "like" 作为字符串的条件时,需要使用"%" 通配符进行模糊匹配。例如,city like‘北京%',将返回 city 字段值以 "北京" 开头的所有记录。
|
|
55
|
+
* 目前仅支持将通配符“%” 放到已知内容之后的查询方式,例如,不支持 city like ‘% 北京'的查询方式。
|
|
56
|
+
* 当 SQL 查询中包含“%”等特殊字符时,需要对 SQL 进行 URL 编码处理。
|
|
57
|
+
* 支持"in",但不包括子查询。
|
|
58
|
+
* 支持的逻辑运算符包括:and、or。
|
|
59
|
+
*
|
|
60
|
+
* `where` 可为字符串,或字符串数组(多项默认以 and 连接,等价于手写 `a and b`)。
|
|
61
|
+
*/
|
|
62
|
+
const whereClause = normalizeWhere(curOptions.where);
|
|
63
|
+
console.log('whereClause:', whereClause);
|
|
64
|
+
if (whereClause) {
|
|
65
|
+
querySql += ` where ${whereClause}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
32
68
|
if (curOptions.page || curOptions.pageSize) {
|
|
33
69
|
// 添加分页限制
|
|
34
70
|
querySql += ` limit ${pageSize} offset ${offset}`;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"target": "esnext",
|
|
5
5
|
"module": "esnext",
|
|
6
6
|
"allowJs": false,
|
|
7
|
-
"jsx": "react",
|
|
7
|
+
"jsx": "react", // preserve
|
|
8
8
|
"declaration": false,
|
|
9
9
|
"noEmit": false,
|
|
10
10
|
"importHelpers": true,
|
|
@@ -31,10 +31,9 @@
|
|
|
31
31
|
"forceConsistentCasingInFileNames": true
|
|
32
32
|
},
|
|
33
33
|
"include": [
|
|
34
|
-
"src"
|
|
35
|
-
"test"
|
|
34
|
+
"src"
|
|
36
35
|
],
|
|
37
36
|
"exclude": [
|
|
38
37
|
"node_modules"
|
|
39
38
|
]
|
|
40
|
-
}
|
|
39
|
+
}
|
|
@@ -4,6 +4,23 @@ import axiosFetcher from '$utils/axiosFetcher';
|
|
|
4
4
|
* 这里存放通用查询类 Open API
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/** 将 where 规范为 SQL 片段:字符串直接使用;数组用 and 拼接各条件 */
|
|
8
|
+
function normalizeWhere(where: unknown): string {
|
|
9
|
+
if (where == null || where === '') {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
if (typeof where === 'string') {
|
|
13
|
+
return where.trim();
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(where)) {
|
|
16
|
+
return where
|
|
17
|
+
.map((part) => (part == null ? '' : String(part).trim()))
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
.join(' and ');
|
|
20
|
+
}
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
|
|
7
24
|
// 获取业务对象数据列表
|
|
8
25
|
export const queryXObjectData = async (options?: any) => {
|
|
9
26
|
const apiUrl = '/rest/data/v2/query';
|
|
@@ -29,6 +46,25 @@ export const queryXObjectData = async (options?: any) => {
|
|
|
29
46
|
querySql += ` order by ${curOptions.orderBy}`;
|
|
30
47
|
}
|
|
31
48
|
|
|
49
|
+
/**
|
|
50
|
+
* 添加过滤条件(如果有的话)
|
|
51
|
+
* 支持的操作符包括:=、!=、like、not like、not in、is not null、is null、>、<、<>、>=、<=、in、between ... and ...。
|
|
52
|
+
* 对于 =、like 和 in 有以下说明:
|
|
53
|
+
* “=” 作为字符串的条件时,表示精确匹配。例如,查询条件 city = '北京',将返回 city 字段值严格等于 "北京" 的所有记录。
|
|
54
|
+
* "like" 作为字符串的条件时,需要使用"%" 通配符进行模糊匹配。例如,city like‘北京%',将返回 city 字段值以 "北京" 开头的所有记录。
|
|
55
|
+
* 目前仅支持将通配符“%” 放到已知内容之后的查询方式,例如,不支持 city like ‘% 北京'的查询方式。
|
|
56
|
+
* 当 SQL 查询中包含“%”等特殊字符时,需要对 SQL 进行 URL 编码处理。
|
|
57
|
+
* 支持"in",但不包括子查询。
|
|
58
|
+
* 支持的逻辑运算符包括:and、or。
|
|
59
|
+
*
|
|
60
|
+
* `where` 可为字符串,或字符串数组(多项默认以 and 连接,等价于手写 `a and b`)。
|
|
61
|
+
*/
|
|
62
|
+
const whereClause = normalizeWhere(curOptions.where);
|
|
63
|
+
console.log('whereClause:', whereClause);
|
|
64
|
+
if (whereClause) {
|
|
65
|
+
querySql += ` where ${whereClause}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
32
68
|
if (curOptions.page || curOptions.pageSize) {
|
|
33
69
|
// 添加分页限制
|
|
34
70
|
querySql += ` limit ${pageSize} offset ${offset}`;
|
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* BaseCmpProps 基础组件属性接口
|
|
5
|
+
*/
|
|
6
|
+
export interface BaseCmpProps {
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* ScopedComponentType 作用域组件类型接口
|
|
12
|
+
*/
|
|
13
|
+
export interface ScopedComponentType {
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* BaseCmp 基础组件类
|
|
19
|
+
* 继承自 React.PureComponent,提供基础组件功能
|
|
20
|
+
*/
|
|
21
|
+
export declare class BaseCmp<
|
|
22
|
+
T extends BaseCmpProps = BaseCmpProps,
|
|
23
|
+
S = any
|
|
24
|
+
> extends React.PureComponent<T, S> implements ScopedComponentType {
|
|
25
|
+
props: Readonly<T> & Readonly<{ children?: React.ReactNode }>;
|
|
26
|
+
state: Readonly<S>;
|
|
27
|
+
setState<K extends keyof S>(
|
|
28
|
+
state:
|
|
29
|
+
| ((prevState: Readonly<S>, props: Readonly<T>) => Pick<S, K> | S | null)
|
|
30
|
+
| (Pick<S, K> | S | null),
|
|
31
|
+
callback?: () => void
|
|
32
|
+
): void;
|
|
33
|
+
forceUpdate(callback?: () => void): void;
|
|
34
|
+
render(): React.ReactNode;
|
|
35
|
+
}
|
|
36
|
+
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
### 目录说明
|
|
2
|
+
- src: 自定义组件源码;
|
|
3
|
+
- src/assets: 存放组件静态资源,比如 css、img等;
|
|
4
|
+
- src/components: 存放自定义组件代码,每个自定义组件以自身名称(cmpType 数值)作为目录进行存放;
|
|
5
|
+
- src/components/xxCmp/index: 自定义组件的内容文件;
|
|
6
|
+
- src/components/xxCmp/model: 自定义组件的模型文件,用于对接页面设计器;
|
|
7
|
+
- neo.config.js: neo-cmp-cli 配置文件。
|
|
8
|
+
|
|
9
|
+
### 组件开发规范
|
|
10
|
+
- 存放在 src/components 目录下的自定义组件,默认 index 为自定义组件源码入口文件,model.[tj]s 为自定义组件的模型文件(对接页面设计器需要);
|
|
11
|
+
- 当 neo.config.js 中的 entry 为空或者不存在时,cli 将根据 src/components 目录下的自定义组件结构生成对应的 entry 配置(可在命令控制台查看生成的 entry 配置);
|
|
12
|
+
- 自定义组件中可用的配置项类型 请见 [当前可用表单项](https://github.com/wibetter/neo-register/blob/master/docs/FormItemType.md);
|
|
13
|
+
- 自定义组件最外层请设置一个唯一的 ClassName(比如 xx-cmpType-container),所有内容样式请放在该 ClassName 中,避免自定义组件样式相互干扰;
|
|
14
|
+
- 默认开启代码规范检测(含样式内容),如需关闭,请调整 neo.config.js 相关配置;
|
|
15
|
+
- 请使用 react 16 版本;
|
|
16
|
+
- 支持在自定义组件中使用 Open API,详细见[使用说明](https://www.npmjs.com/package/neo-open-api)。
|
|
17
|
+
|
|
18
|
+
### 自定义组件注册器使用说明
|
|
19
|
+
- [neo-register 使用说明](https://www.npmjs.com/package/neo-register?activeTab=readme)
|
|
20
|
+
备注:预览、调试(linkDebug)和构建发布时 cli 会自动创建对应的注册文件(含 neo-register 的使用),用户无需关注 neo-register。
|
|
21
|
+
|
|
22
|
+
### 开发说明
|
|
23
|
+
|
|
24
|
+
1. **安装依赖**
|
|
25
|
+
```bash
|
|
26
|
+
$ npm i 或者 yarn
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
2. **linkDebug: 外链调试(在线上页面设计器端预览自定义组件)**
|
|
30
|
+
> linkDebug模式:用于在线上页面设计器中预览和调试自定义组件。
|
|
31
|
+
```bash
|
|
32
|
+
$ npm run linkDebug
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. **发布到 NeoCRM 平台**
|
|
36
|
+
> 需要确保 package.json 中的 name 值唯一,version 值不重复。
|
|
37
|
+
```bash
|
|
38
|
+
$ npm run pushCmp
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### OAuth2 登录授权
|
|
42
|
+
使用 `neo push cmp`、`neo pull cmp`、`neo delete cmp` 等命令与 NeoCRM 平台交互时,需要进行授权登录。
|
|
43
|
+
|
|
44
|
+
#### 使用步骤
|
|
45
|
+
|
|
46
|
+
1. **登录 NeoCRM 平台**
|
|
47
|
+
```bash
|
|
48
|
+
neo login
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
执行流程:
|
|
52
|
+
- 自动打开浏览器访问授权页面
|
|
53
|
+
- 在浏览器中输入 NeoCRM 账号密码进行登录(需选择对应的租户)
|
|
54
|
+
- 授权成功后自动跳转回本地(附带 code)
|
|
55
|
+
- cli 端 通过 code 获取 Token,并自动保存到项目的 `.neo-cli/token.json` 文件中
|
|
56
|
+
|
|
57
|
+
2. **登出 NeoCRM 平台**
|
|
58
|
+
```bash
|
|
59
|
+
neo logout
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
功能:清除本地保存的 token 文件,下次使用需要重新登录。
|
|
63
|
+
|
|
64
|
+
#### neo login 选择「自定义环境」时的授权配置示例
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
// neo.config.js
|
|
68
|
+
module.exports = {
|
|
69
|
+
neoConfig: {
|
|
70
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
71
|
+
// 登录授权 URL(用于获取 code)
|
|
72
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth',
|
|
73
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### Token 有效期
|
|
79
|
+
|
|
80
|
+
- **access_token**:默认有效期 2 小时
|
|
81
|
+
- **refresh_token**:默认有效期 30 天
|
|
82
|
+
- 系统会在 access_token 过期前 5 分钟自动刷新
|
|
83
|
+
- 如果 refresh_token 也过期,需要重新执行 `neo login`
|
|
84
|
+
|
|
85
|
+
#### 常见问题
|
|
86
|
+
|
|
87
|
+
**Q1: 浏览器无法自动打开怎么办?**
|
|
88
|
+
A: 命令行会输出授权 URL,手动复制到浏览器中打开即可。
|
|
89
|
+
|
|
90
|
+
**Q2: Token 刷新失败怎么办?**
|
|
91
|
+
A: 如果 refresh_token 也过期(默认 30 天),需要重新执行 `neo login`。同时检查网络连接是否正常。
|
|
92
|
+
|
|
93
|
+
**Q3: 授权登录后没有正常跳回 redirect_uri**
|
|
94
|
+
A: 可能被浏览器安装的插件影响,目前已知会影响授权登录的浏览器插件有:Neo UI Extension,请关闭插件后重试。
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### 配置项说明(neo-cmp-cli)
|
|
99
|
+
[请查看neo-cmp-cli](https://www.npmjs.com/package/neo-cmp-cli)
|