neo-cmp-cli 1.9.12 → 1.9.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/neo/deleteCmp.js +1 -1
- package/dist/neo/neoService.js +1 -1
- package/dist/neo/pushCmp.js +1 -1
- package/dist/package.json.js +1 -1
- package/dist/utils/cmpTypeValidator.js +1 -0
- package/dist/utils/cmpUtils/createCmpByTemplate.js +1 -1
- package/dist/utils/projectNameValidator.js +1 -1
- package/package.json +1 -1
- package/template/antd-custom-cmp-template/neo.config.js +2 -2
- package/template/antd-custom-cmp-template/src/components/{dataDashboard → dataDashboard__c}/model.ts +3 -7
- package/template/antd-custom-cmp-template/src/components/{infoCard → infoCard__c}/model.ts +2 -6
- package/template/develop/neo-custom-cmp-template/src/components/contactCardList/model.ts +1 -1
- package/template/develop/neo-custom-cmp-template/src/components/contactForm/model.ts +1 -1
- package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/model.ts +1 -1
- package/template/echarts-custom-cmp-template/neo.config.js +1 -1
- package/template/echarts-custom-cmp-template/src/components/{chartWidget → chartWidget__c}/model.ts +5 -9
- package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/model.ts +4 -8
- package/template/empty-cmp/model.ts +4 -15
- package/template/neo-custom-cmp-template/src/components/{entityCardList → entityCardList__c}/model.ts +1 -5
- package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/model.ts +2 -6
- package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/model.ts +1 -5
- package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/index.tsx +1 -1
- package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/model.ts +1 -5
- package/template/react-custom-cmp-template/src/components/{infoCard → infoCard__c}/model.js +4 -8
- package/template/react-ts-custom-cmp-template/src/components/{listWidget → listWidget__c}/model.ts +4 -8
- package/template/vue2-custom-cmp-template/src/components/{vueInfoCard → vueInfoCard__c}/model.js +4 -8
- package/test/deprecate-versions.js +1 -1
- /package/template/antd-custom-cmp-template/src/components/{dataDashboard → dataDashboard__c}/README.md +0 -0
- /package/template/antd-custom-cmp-template/src/components/{dataDashboard → dataDashboard__c}/index.tsx +0 -0
- /package/template/antd-custom-cmp-template/src/components/{dataDashboard → dataDashboard__c}/style.scss +0 -0
- /package/template/antd-custom-cmp-template/src/components/{infoCard → infoCard__c}/index.tsx +0 -0
- /package/template/antd-custom-cmp-template/src/components/{infoCard → infoCard__c}/style.scss +0 -0
- /package/template/echarts-custom-cmp-template/src/components/{chartWidget → chartWidget__c}/README.md +0 -0
- /package/template/echarts-custom-cmp-template/src/components/{chartWidget → chartWidget__c}/index.tsx +0 -0
- /package/template/echarts-custom-cmp-template/src/components/{chartWidget → chartWidget__c}/style.scss +0 -0
- /package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/README.md +0 -0
- /package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/USAGE.md +0 -0
- /package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/index.tsx +0 -0
- /package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/style.scss +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityCardList → entityCardList__c}/README.md +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityCardList → entityCardList__c}/index.tsx +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityCardList → entityCardList__c}/style.scss +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/README.md +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/index.tsx +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/style.scss +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/README.md +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/index.tsx +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/style.scss +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/README.md +0 -0
- /package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/style.scss +0 -0
- /package/template/react-custom-cmp-template/src/components/{infoCard → infoCard__c}/index.jsx +0 -0
- /package/template/react-custom-cmp-template/src/components/{infoCard → infoCard__c}/style.scss +0 -0
- /package/template/react-ts-custom-cmp-template/src/components/{listWidget → listWidget__c}/README.md +0 -0
- /package/template/react-ts-custom-cmp-template/src/components/{listWidget → listWidget__c}/index.tsx +0 -0
- /package/template/react-ts-custom-cmp-template/src/components/{listWidget → listWidget__c}/style.scss +0 -0
- /package/template/vue2-custom-cmp-template/src/components/{vueInfoCard → vueInfoCard__c}/index.vue +0 -0
package/README.md
CHANGED
|
@@ -261,7 +261,7 @@ module.exports = {
|
|
|
261
261
|
| tags | ['自定义组件'] | 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示 |
|
|
262
262
|
| exposedToDesigner | true | 是否在页面设计器端可见 |
|
|
263
263
|
| enableDuplicate | true | 在设计器中是否允许多次使用 |
|
|
264
|
-
| targetPage | ['
|
|
264
|
+
| targetPage | ['all'] | 适配的页面类型 |
|
|
265
265
|
| targetObject | ['all'] | 支持的实体类型 |
|
|
266
266
|
| targetApplication | ['all'] | 支持的应用类型 |
|
|
267
267
|
| targetDevice | 'all' | 支持的设备类型 |
|
package/dist/neo/deleteCmp.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("ora"),r=require("./neoService.js"),t=require("../utils/common.js");var o,s;exports.__require=function(){if(s)return o;s=1;const i=e,n=r.__require(),{errorLog:c,successLog:u}=t.__require();return o=async(e,r,t)=>{if(!r)return void c("未找到 NeoCRM 平台授权配置(neo.config.js / authConfig)。");const o=i("正在删除组件...").start();try{let s=t,i=[],a=null;t?i=t.cmpList||[]:(s=new n(r),o.info("正在获取自定义组件列表..."),i=await s.getCustomCmpList()),0===i.length&&(c("删除失败,当前租户暂无任何自定义组件。",o),process.exit(1)),a=s.getCmpInfoByCmpType(e),a||(c(`删除失败,当前租户不存在${e}自定义组件。`,o),process.exit(1)),o.info(`正在删除${e}自定义组件...`),await s.deleteCmp(e),u(`已成功删除${e}自定义组件!\n`,o)}catch(e){c(`删除自定义组件失败: ${e.message||e.msg}`,o),process.exit(1)}},o};
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("ora"),r=require("./neoService.js"),t=require("../utils/common.js");var o,s;exports.__require=function(){if(s)return o;s=1;const i=e,n=r.__require(),{errorLog:c,successLog:u}=t.__require();return o=async(e,r,t)=>{if(!r)return void c("未找到 NeoCRM 平台授权配置(neo.config.js / authConfig)。");const o=i("正在删除组件...").start();try{let s=t,i=[],a=null;t?i=t.cmpList||[]:(s=new n(r),o.info("正在获取自定义组件列表..."),i=await s.getCustomCmpList()),0===i.length&&(c("删除失败,当前租户暂无任何自定义组件。",o),process.exit(1)),a=s.getCmpInfoByCmpType(e),a||(c(`删除失败,当前租户不存在${e}自定义组件。`,o),process.exit(1)),o.info(`正在删除${e}自定义组件...`),await s.deleteCmp(e),u(`已成功删除${e}自定义组件!\n`,o)}catch(e){c(`删除自定义组件失败: ${e.message||e.msg||e}`,o),process.exit(1)}},o};
|
package/dist/neo/neoService.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("axios"),t=require("form-data"),s=require("node:fs"),o=require("node:path"),i=require("ora"),n=require("lodash"),r=require("akfun"),a=require("./neoLogin.js"),c=require("../utils/projectUtils/updatePublishLog.js"),u=require("../utils/common.js");var h,p;exports.__require=function(){if(p)return h;p=1;const l=e,d=t,m=s,f=o,y=i,w=n,{resolve:g}=r,k=a.__require(),$=c.__require(),{getFramework:x,errorLog:A,successLog:C}=u.__require(),T="https://crm.xiaoshouyi.com",F="https://login-cd.xiaoshouyi.com/auc/oauth2/auth",L="https://login.xiaoshouyi.com/auc/oauth2/token",b="/rest/metadata/v3.0/ui/customComponents",S="/rest/metadata/v3.0/ui/customComponents/actions/saveOrUpdateComponent",P="/rest/metadata/v3.0/ui/components/filter?custom=true",U=e=>`/rest/metadata/v3.0/ui/customComponents/${e}/codeLib`,B="/rest/metadata/v3.0/ui/customComponents/actions/upload",E=["cmpType","label","componentCategory","description","framework","icon","iconUrl","orderNo","version","propsSchema","defaultProps","previewProps","events","functions","asset","modelAsset","cssAsset","codeLib"];return h=class{constructor(e={}){const{assetsRoot:t,neoBaseURL:s,tokenAPI:o,loginURL:i,auth:n,authType:r}=e||{};this.authType=r||"oauth2","password"!==this.authType||n||(A("密码授权模式时,neo.config.js / neoConfig / auth 配置不能为空"),process.exit(1)),"password"===this.authType?n.client_id&&n.client_secret&&n.username&&n.password||(A("neo.config.js / neoConfig / auth 配置不完整(password 模式),需要包含 client_id、client_secret、username、password"),process.exit(1)):"oauth2"===this.authType?i&&o||(A("neo.config.js / neoConfig 配置不完整(oauth2 模式),需要包含 loginURL、tokenAPI 配置。"),process.exit(1)):(A(`不支持的授权类型: ${this.authType},可选值:oauth2、password`),process.exit(1)),this.assetsRoot=t||g("dist"),this.neoBaseURL=s||T,this.tokenAPI=o||L,this.loginURL=i||F,this.auth=n,this.cmpList=[],this.cmpInfoMap={},this.tokenCache={token:null,expiresAt:null}}buildFullUrl(e){return e.startsWith("http://")||e.startsWith("https://")?e:`${this.neoBaseURL}${e}`}uploadAPI(){return this.buildFullUrl(B)}saveAPI(){return this.buildFullUrl(S)}isTokenExpired(){return!this.tokenCache.token||!this.tokenCache.expiresAt||Date.now()>=this.tokenCache.expiresAt}async getToken(){return this.isTokenExpired()?"oauth2"===this.authType?await this.getTokenByOAuth2():await this.getTokenByPassword():this.tokenCache.token}async getTokenByPassword(){const e=y("获取 token(密码模式)...").start();if(!this.isTokenExpired())return C("使用缓存的 token。",e),this.tokenCache.token;const t=new URLSearchParams;t.append("grant_type","password"),t.append("client_id",this.auth.client_id),t.append("client_secret",this.auth.client_secret),t.append("username",this.auth.username),t.append("password",this.auth.password);const s=this.buildFullUrl(this.tokenAPI);try{const o=await l.post(s,t.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}}),i=o.data||{},{access_token:n,expires_in:r}=i;n||(A("获取 token 失败(授权配置错误):响应中未包含 access_token,"+JSON.stringify(o.data),e),process.exit(1));const a=parseInt(r)||3600;return this.tokenCache={...i,token:n,expiresAt:Date.now()+1e3*(a-60)},e.clear(),e.stop(),n}catch(o){A("获取 token 失败",e),A(`\n获取 token 失败: ${o.message||o.msg}`),A(`\ntoken 授权地址: ${s}`),A(`\ntoken 请求参数: ${t}`),o.response&&A(`响应数据: ${JSON.stringify(o.response.data)}`),process.exit(1)}}async getTokenByOAuth2(){const e=y("获取 token(OAuth2 模式)...").start();try{const t={loginURL:this.loginURL,tokenAPI:this.tokenAPI},s=new k(t),o=await s.getAccessToken(),i=o.access_token;return this.tokenCache={...o,token:i,expiresAt:Date.now()+72e5},e.clear(),e.stop(),i}catch(t){A("获取 token 失败(OAuth2 模式)",e),A(`\n获取 token 失败: ${t.message||t.msg}`),t.response&&A(`响应数据: ${JSON.stringify(t.response.data)}`),process.exit(1)}}async refreshToken(){return this.tokenCache={token:null,expiresAt:null},await this.getToken()}async ensureValidToken(){if(!this.tokenCache.token)return await this.getToken();if(this.isTokenExpired()){const e=y("token 已过期,正在刷新...").start();try{const t=await this.refreshToken();return C("token 刷新成功。",e),t}catch(t){throw A("token 刷新失败。",e),t}}return this.tokenCache.token}async uploadFile(e,t={}){const s=await this.ensureValidToken();if(!e||"string"!=typeof e)throw new Error(`文件路径无效: ${e}`);if(!m.existsSync(e))throw new Error(`文件不存在: ${e}`);const o=m.statSync(e);if(!o.isFile())throw new Error(`路径不是文件: ${e}`);const i=t.maxSize||5242880;if(o.size>i){const e=(o.size/1024/1024).toFixed(2),t=(i/1024/1024).toFixed(2);throw new Error(`文件大小超过限制: ${e}MB > ${t}MB`)}if(0===o.size)throw new Error(`文件为空: ${e}`);const n=f.basename(e),r=(o.size/1024).toFixed(2),a=y(`正在上传文件: ${n} (${r}KB)...`).start();try{const o=new d,i=t.fieldName||"customComponentCode",r=m.createReadStream(e);o.append(i,r,n);const c=this.uploadAPI(),u=t.timeout||6e4,h={headers:{Authorization:`Bearer ${s}`,"xsy-inner-source":"bff",...o.getHeaders()},timeout:u,maxContentLength:1/0,maxBodyLength:1/0},p=await l.post(c,o,h);let f;const y=p.data;if(200!==p.status&&201!==p.status)throw new Error(`上传失败: HTTP ${p.status}`);if("string"==typeof y)f=y.trim();else{if(!y||"object"!=typeof y)throw new Error("响应数据格式不正确: "+typeof y);if(void 0!==y.code&&200!==y.code&&0!==y.code){const e=y.message||y.msg||"未知错误";throw new Error(`上传失败: ${e} (code: ${y.code})`)}f=void 0!==y.data?y.data:void 0!==y.url?y.url:void 0!==y.fileUrl?y.fileUrl:y}if(!f)throw new Error("返回的文件地址为空");let w;return"string"==typeof f?w=f:f&&"object"==typeof f&&f.url&&(w=f.url),C(`文件上传成功: ${n} -> ${w}`,a),w}catch(t){if(A(`上传文件失败: ${t.message||t.msg}, 文件路径: ${e}`,a),t.response){const e=t.response.status,s=t.response.statusText,o=t.response.data,i=t.config?.url||this.uploadAPI();if(A("\n========== 上传请求详情 =========="),A(`请求 URL: ${i}`),A(`HTTP 状态码: ${e} ${s}`),A(`响应数据: ${JSON.stringify(o)}`),A("==================================\n"),404===e)throw new Error(`上传 API 不存在 (404): ${i}\n请检查 neo.config.js 中的 neoBaseURL 配置是否正确,或者 API 路径是否存在。\n当前配置的 API 路径: ${B}`)}else t.request&&A("请求已发送但未收到响应,请检查网络连接或代理配置。");throw t}}async publish2oss(e,t=[".js",".css",".zip"]){if(!e)return void A(`自定义组件名称不能为空: ${e}`);if(!m.existsSync(this.assetsRoot))return void A(`未找到自定义组件资源目录: ${this.assetsRoot}`);const s={cmpType:e},o=m.readdirSync(this.assetsRoot).map(async o=>{const i=f.join(this.assetsRoot,o),n=m.statSync(i),r=f.parse(i);if(n.isFile()&&t.includes(r.ext)){let t=w.camelCase(e);if(o.indexOf(t)<0)return;try{const e=await this.uploadFile(i);o.indexOf("Model")>-1?s.modelAsset=e:o.endsWith(".css")?s.cssAsset=e:o.endsWith(".zip")?s.codeLib=e:s.asset=e}catch(e){A(`文件上传失败(${o}):\n`),process.exit(1)}}});return await Promise.all(o),s&&s.cmpType&&(console.info("上传至 OSS 的文件信息:\n",s),$(s)),s}async getCmpAssets(e,t=[".js",".css",".zip"]){if(!e)return void A(`自定义组件名称不能为空: ${e}`);if(!m.existsSync(this.assetsRoot))return void A(`未找到自定义组件资源目录: ${this.assetsRoot}`);const s={cmpType:e};return m.readdirSync(this.assetsRoot).forEach(o=>{const i=f.join(this.assetsRoot,o),n=m.statSync(i),r=f.parse(i);if(n.isFile()&&t.includes(r.ext)){let t=w.camelCase(e);if(o.indexOf(t)<0)return;const r=5242880;if(n.size>r){const e=(n.size/1024/1024).toFixed(2),t=(r/1024/1024).toFixed(2);throw new Error(`${o} 文件大小超过限制: ${e}MB > ${t}MB`)}const a={fileContent:m.createReadStream(i),fileName:o,fileSize:n.size};o.indexOf("Model")>-1?s.modelAssetFile=a:o.endsWith(".css")?s.cssAssetFile=a:o.endsWith(".zip")?s.codeLibFile=a:s.assetFile=a}}),s}async updateCustomComponent(e){const t=await this.ensureValidToken();if(!e)throw new Error("componentData 不能为空");const s=y("正在保存自定义组件信息...").start();try{const o=this.saveAPI(),i=new d;e.assetFile&&i.append("assetFile",e.assetFile.fileContent,e.assetFile.fileName),e.modelAssetFile&&i.append("modelAssetFile",e.modelAssetFile.fileContent,e.modelAssetFile.fileName),e.cssAssetFile&&i.append("cssAssetFile",e.cssAssetFile.fileContent,e.cssAssetFile.fileName),e.codeLibFile&&i.append("codeLibFile",e.codeLibFile.fileContent,e.codeLibFile.fileName),i.append("component",JSON.stringify(w.omit(e,["assetFile","modelAssetFile","cssAssetFile","codeLibFile"])));const n=await l.post(o,i,{headers:{Authorization:`Bearer ${t}`,"xsy-inner-source":"bff",...i.getHeaders()},timeout:12e4,maxContentLength:1/0,maxBodyLength:1/0}),{code:r,message:a,msg:c}=n.data||{};r&&200!==r&&(A(`保存自定义组件信息失败: ${a||c||"未知错误"}`),process.exit(1)),s.clear(),s.stop()}catch(e){const t=e.message||e.msg;A(t?`保存自定义组件信息失败: ${t}`:`保存自定义组件信息失败: ${JSON.stringify(e)}`,s),process.exit(1)}}async getCustomCmpList(){const e=await this.ensureValidToken();try{let t=this.buildFullUrl(P);t+=`&fields=${E.join(",")}`;const s=await l.get(t,{headers:{Authorization:`Bearer ${e}`,"xsy-inner-source":"bff","Content-Type":"application/json"}}),{code:o,message:i}=s.data||{};o&&200!==o&&(A(`获取自定义组件列表失败: ${i||"未知错误"}`),process.exit(1)),this.updateCustomCmpList(s.data.data||[])}catch(e){const t=e.message||e.msg;A(t?`获取自定义组件列表失败: ${t}`:`响应数据: ${JSON.stringify(e)}`),process.exit(1)}return this.cmpList||[]}getCodeLibByCmpType(e){return e?this.buildFullUrl(U(e)):null}async deleteCmp(e){const t=await this.ensureValidToken();e||(A("自定义组件名称不能为空。"),process.exit(1));let s=this.buildFullUrl(b);s+=`/${e}`;const o=await l.delete(s,{headers:{Authorization:`Bearer ${t}`,"xsy-inner-source":"bff","Content-Type":"application/json"}}),{code:i,message:n}=o.data||{};return i&&200!==i&&(A(`删除自定义组件失败: ${n||"未知错误"}`),process.exit(1)),o.data}getCmpListByFramework(e){if(!e)return this.cmpList;const t=x(e);return this.cmpList.filter(e=>e.framework===t)}getCmpInfoByCmpType(e){return e&&this.cmpInfoMap[e]||null}updateCustomCmpList(e){e&&Array.isArray(e)&&(this.cmpList=e,e.forEach(e=>{this.cmpInfoMap[e.cmpType]=e}))}async request(e,t,s={}){const o=await this.ensureValidToken(),{data:i,headers:n={},params:r}=s,a=this.buildFullUrl(t);try{const t=await l({method:e,url:a,data:i,params:r,headers:{Authorization:`Bearer ${o}`,"xsy-inner-source":"bff",...n}});if(t.data&&t.data.code&&200!==t.data.code)throw new Error(`请求失败: ${t.data.message||t.data.msg||"未知错误"}`);return t.data}catch(s){throw A(`请求失败 [${e} ${t}]: ${s.message||s.msg}`),s.response&&A(`响应数据: ${JSON.stringify(s.response.data)}`),s}}async get(e,t={}){return await this.request("GET",e,t)}async post(e,t={}){return await this.request("POST",e,t)}async put(e,t={}){return await this.request("PUT",e,t)}async delete(e,t={}){return await this.request("DELETE",e,t)}}};
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("axios"),t=require("form-data"),s=require("node:fs"),o=require("node:path"),i=require("ora"),n=require("lodash"),r=require("akfun"),a=require("./neoLogin.js"),c=require("../utils/projectUtils/updatePublishLog.js"),u=require("../utils/common.js");var h,p;exports.__require=function(){if(p)return h;p=1;const l=e,d=t,m=s,f=o,y=i,g=n,{resolve:w}=r,k=a.__require(),$=c.__require(),{getFramework:x,errorLog:A,successLog:C}=u.__require(),T="https://crm.xiaoshouyi.com",F="https://login-cd.xiaoshouyi.com/auc/oauth2/auth",L="https://login.xiaoshouyi.com/auc/oauth2/token",b="/rest/metadata/v3.0/ui/customComponents",S="/rest/metadata/v3.0/ui/customComponents/actions/saveOrUpdateComponent",P="/rest/metadata/v3.0/ui/components/filter?custom=true",U=e=>`/rest/metadata/v3.0/ui/customComponents/${e}/codeLib`,B="/rest/metadata/v3.0/ui/customComponents/actions/upload",E=["cmpType","label","componentCategory","description","framework","icon","iconUrl","orderNo","version","propsSchema","defaultProps","previewProps","events","functions","asset","modelAsset","cssAsset","codeLib"];return h=class{constructor(e={}){const{assetsRoot:t,neoBaseURL:s,tokenAPI:o,loginURL:i,auth:n,authType:r}=e||{};this.authType=r||"oauth2","password"!==this.authType||n||(A("密码授权模式时,neo.config.js / neoConfig / auth 配置不能为空"),process.exit(1)),"password"===this.authType?n.client_id&&n.client_secret&&n.username&&n.password||(A("neo.config.js / neoConfig / auth 配置不完整(password 模式),需要包含 client_id、client_secret、username、password"),process.exit(1)):"oauth2"===this.authType?i&&o||(A("neo.config.js / neoConfig 配置不完整(oauth2 模式),需要包含 loginURL、tokenAPI 配置。"),process.exit(1)):(A(`不支持的授权类型: ${this.authType},可选值:oauth2、password`),process.exit(1)),this.assetsRoot=t||w("dist"),this.neoBaseURL=s||T,this.tokenAPI=o||L,this.loginURL=i||F,this.auth=n,this.cmpList=[],this.cmpInfoMap={},this.tokenCache={token:null,expiresAt:null}}buildFullUrl(e){return e.startsWith("http://")||e.startsWith("https://")?e:`${this.neoBaseURL}${e}`}uploadAPI(){return this.buildFullUrl(B)}saveAPI(){return this.buildFullUrl(S)}isTokenExpired(){return!this.tokenCache.token||!this.tokenCache.expiresAt||Date.now()>=this.tokenCache.expiresAt}async getToken(){return this.isTokenExpired()?"oauth2"===this.authType?await this.getTokenByOAuth2():await this.getTokenByPassword():this.tokenCache.token}async getTokenByPassword(){const e=y("获取 token(密码模式)...").start();if(!this.isTokenExpired())return C("使用缓存的 token。",e),this.tokenCache.token;const t=new URLSearchParams;t.append("grant_type","password"),t.append("client_id",this.auth.client_id),t.append("client_secret",this.auth.client_secret),t.append("username",this.auth.username),t.append("password",this.auth.password);const s=this.buildFullUrl(this.tokenAPI);try{const o=await l.post(s,t.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}}),i=o.data||{},{access_token:n,expires_in:r}=i;n||(A("获取 token 失败(授权配置错误):响应中未包含 access_token,"+JSON.stringify(o.data),e),process.exit(1));const a=parseInt(r)||3600;return this.tokenCache={...i,token:n,expiresAt:Date.now()+1e3*(a-60)},e.clear(),e.stop(),n}catch(o){A("获取 token 失败",e),A(`\n获取 token 失败: ${o.message||o.msg}`),A(`\ntoken 授权地址: ${s}`),A(`\ntoken 请求参数: ${t}`),o.response&&A(`响应数据: ${JSON.stringify(o.response.data)}`),process.exit(1)}}async getTokenByOAuth2(){const e=y("获取 token(OAuth2 模式)...").start();try{const t={loginURL:this.loginURL,tokenAPI:this.tokenAPI},s=new k(t),o=await s.getAccessToken(),i=o.access_token;return this.tokenCache={...o,token:i,expiresAt:Date.now()+72e5},e.clear(),e.stop(),i}catch(t){A("获取 token 失败(OAuth2 模式)",e),A(`\n获取 token 失败: ${t.message||t.msg}`),t.response&&A(`响应数据: ${JSON.stringify(t.response.data)}`),process.exit(1)}}async refreshToken(){return this.tokenCache={token:null,expiresAt:null},await this.getToken()}async ensureValidToken(){if(!this.tokenCache.token)return await this.getToken();if(this.isTokenExpired()){const e=y("token 已过期,正在刷新...").start();try{const t=await this.refreshToken();return C("token 刷新成功。",e),t}catch(t){throw A("token 刷新失败。",e),t}}return this.tokenCache.token}async uploadFile(e,t={}){const s=await this.ensureValidToken();if(!e||"string"!=typeof e)throw new Error(`文件路径无效: ${e}`);if(!m.existsSync(e))throw new Error(`文件不存在: ${e}`);const o=m.statSync(e);if(!o.isFile())throw new Error(`路径不是文件: ${e}`);const i=t.maxSize||5242880;if(o.size>i){const e=(o.size/1024/1024).toFixed(2),t=(i/1024/1024).toFixed(2);throw new Error(`文件大小超过限制: ${e}MB > ${t}MB`)}if(0===o.size)throw new Error(`文件为空: ${e}`);const n=f.basename(e),r=(o.size/1024).toFixed(2),a=y(`正在上传文件: ${n} (${r}KB)...`).start();try{const o=new d,i=t.fieldName||"customComponentCode",r=m.createReadStream(e);o.append(i,r,n);const c=this.uploadAPI(),u=t.timeout||6e4,h={headers:{Authorization:`Bearer ${s}`,"xsy-inner-source":"bff",...o.getHeaders()},timeout:u,maxContentLength:1/0,maxBodyLength:1/0},p=await l.post(c,o,h);let f;const y=p.data;if(200!==p.status&&201!==p.status)throw new Error(`上传失败: HTTP ${p.status}`);if("string"==typeof y)f=y.trim();else{if(!y||"object"!=typeof y)throw new Error("响应数据格式不正确: "+typeof y);if(void 0!==y.code&&200!==y.code&&0!==y.code){const e=y.message||y.msg||"未知错误";throw new Error(`上传失败: ${e} (code: ${y.code})`)}f=void 0!==y.data?y.data:void 0!==y.url?y.url:void 0!==y.fileUrl?y.fileUrl:y}if(!f)throw new Error("返回的文件地址为空");let g;return"string"==typeof f?g=f:f&&"object"==typeof f&&f.url&&(g=f.url),C(`文件上传成功: ${n} -> ${g}`,a),g}catch(t){if(A(`上传文件失败: ${t.message||t.msg}, 文件路径: ${e}`,a),t.response){const e=t.response.status,s=t.response.statusText,o=t.response.data,i=t.config?.url||this.uploadAPI();if(A("\n========== 上传请求详情 =========="),A(`请求 URL: ${i}`),A(`HTTP 状态码: ${e} ${s}`),A(`响应数据: ${JSON.stringify(o)}`),A("==================================\n"),404===e)throw new Error(`上传 API 不存在 (404): ${i}\n请检查 neo.config.js 中的 neoBaseURL 配置是否正确,或者 API 路径是否存在。\n当前配置的 API 路径: ${B}`)}else t.request&&A("请求已发送但未收到响应,请检查网络连接或代理配置。");throw t}}async publish2oss(e,t=[".js",".css",".zip"]){if(!e)return void A(`自定义组件名称不能为空: ${e}`);if(!m.existsSync(this.assetsRoot))return void A(`未找到自定义组件资源目录: ${this.assetsRoot}`);const s={cmpType:e},o=m.readdirSync(this.assetsRoot).map(async o=>{const i=f.join(this.assetsRoot,o),n=m.statSync(i),r=f.parse(i);if(n.isFile()&&t.includes(r.ext)){let t=g.camelCase(e);if(o.indexOf(t)<0)return;try{const e=await this.uploadFile(i);o.indexOf("Model")>-1?s.modelAsset=e:o.endsWith(".css")?s.cssAsset=e:o.endsWith(".zip")?s.codeLib=e:s.asset=e}catch(e){A(`文件上传失败(${o}):\n`),process.exit(1)}}});return await Promise.all(o),s&&s.cmpType&&(console.info("上传至 OSS 的文件信息:\n",s),$(s)),s}async getCmpAssets(e,t=[".js",".css",".zip"]){if(!e)return void A(`自定义组件名称不能为空: ${e}`);if(!m.existsSync(this.assetsRoot))return void A(`未找到自定义组件资源目录: ${this.assetsRoot}`);const s={cmpType:e};return m.readdirSync(this.assetsRoot).forEach(o=>{const i=f.join(this.assetsRoot,o),n=m.statSync(i),r=f.parse(i);if(n.isFile()&&t.includes(r.ext)){let t=g.camelCase(e);if(o.indexOf(t)<0)return;const r=5242880;if(n.size>r){const e=(n.size/1024/1024).toFixed(2),t=(r/1024/1024).toFixed(2);throw new Error(`${o} 文件大小超过限制: ${e}MB > ${t}MB`)}const a={fileContent:m.createReadStream(i),fileName:o,fileSize:n.size};o.indexOf("Model")>-1?s.modelAssetFile=a:o.endsWith(".css")?s.cssAssetFile=a:o.endsWith(".zip")?s.codeLibFile=a:s.assetFile=a}}),s}async updateCustomComponent(e){const t=await this.ensureValidToken();if(!e)throw new Error("componentData 不能为空");const s=y("正在保存自定义组件信息...").start();try{const o=this.saveAPI(),i=new d;e.assetFile&&i.append("assetFile",e.assetFile.fileContent,e.assetFile.fileName),e.modelAssetFile&&i.append("modelAssetFile",e.modelAssetFile.fileContent,e.modelAssetFile.fileName),e.cssAssetFile&&i.append("cssAssetFile",e.cssAssetFile.fileContent,e.cssAssetFile.fileName),e.codeLibFile&&i.append("codeLibFile",e.codeLibFile.fileContent,e.codeLibFile.fileName),i.append("component",JSON.stringify(g.omit(e,["assetFile","modelAssetFile","cssAssetFile","codeLibFile"])));const n=await l.post(o,i,{headers:{Authorization:`Bearer ${t}`,"xsy-inner-source":"bff",...i.getHeaders()},timeout:12e4,maxContentLength:1/0,maxBodyLength:1/0}),{code:r,message:a,msg:c}=n.data||{};r&&200!==r&&(A(`保存自定义组件信息失败: ${a||c||"未知错误"}`),process.exit(1)),s.clear(),s.stop()}catch(e){const t=e.message||e.msg;A(t?`保存自定义组件信息失败: ${t}`:`保存自定义组件信息失败: ${JSON.stringify(e)}`,s),process.exit(1)}}async getCustomCmpList(){const e=await this.ensureValidToken();try{let t=this.buildFullUrl(P);t+=`&fields=${E.join(",")}`;const s=await l.get(t,{headers:{Authorization:`Bearer ${e}`,"xsy-inner-source":"bff","Content-Type":"application/json"}}),{code:o,message:i,msg:n}=s.data||{};o&&200!==o&&(A(`获取自定义组件列表失败: ${i||n||"未知错误"}`),process.exit(1)),this.updateCustomCmpList(s.data.data||[])}catch(e){const t=e.message||e.msg;A(t?`获取自定义组件列表失败: ${t}`:`响应数据: ${JSON.stringify(e)}`),process.exit(1)}return this.cmpList||[]}getCodeLibByCmpType(e){return e?this.buildFullUrl(U(e)):null}async deleteCmp(e){const t=await this.ensureValidToken();e||(A("自定义组件名称不能为空。"),process.exit(1));let s=this.buildFullUrl(b);s+=`/${e}`;const o=await l.delete(s,{headers:{Authorization:`Bearer ${t}`,"xsy-inner-source":"bff","Content-Type":"application/json"}}),{code:i,message:n,msg:r}=o.data||{};return i&&200!==i&&(A(`删除自定义组件失败: ${n||r||"未知错误"}`),process.exit(1)),o.data}getCmpListByFramework(e){if(!e)return this.cmpList;const t=x(e);return this.cmpList.filter(e=>e.framework===t)}getCmpInfoByCmpType(e){return e&&this.cmpInfoMap[e]||null}updateCustomCmpList(e){e&&Array.isArray(e)&&(this.cmpList=e,e.forEach(e=>{this.cmpInfoMap[e.cmpType]=e}))}async request(e,t,s={}){const o=await this.ensureValidToken(),{data:i,headers:n={},params:r}=s,a=this.buildFullUrl(t);try{const t=await l({method:e,url:a,data:i,params:r,headers:{Authorization:`Bearer ${o}`,"xsy-inner-source":"bff",...n}});if(t.data&&t.data.code&&200!==t.data.code)throw new Error(`请求失败: ${t.data.message||t.data.msg||"未知错误"}`);return t.data}catch(s){throw A(`请求失败 [${e} ${t}]: ${s.message||s.msg}`),s.response&&A(`响应数据: ${JSON.stringify(s.response.data)}`),s}}async get(e,t={}){return await this.request("GET",e,t)}async post(e,t={}){return await this.request("POST",e,t)}async put(e,t={}){return await this.request("PUT",e,t)}async delete(e,t={}){return await this.request("DELETE",e,t)}}};
|
package/dist/neo/pushCmp.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("node:fs"),t=require("node:path"),s=require("lodash"),r=require("akfun"),o=require("ora"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("node:fs"),t=require("node:path"),s=require("lodash"),r=require("akfun"),o=require("ora"),i=require("./neoService.js"),a=require("../utils/common.js"),n=require("../utils/pathUtils.js"),c=require("../utils/projectUtils/createCmpProjectZip.js"),l=require("../utils/projectUtils/updatePublishLog.js"),p=require("../utils/cmpTypeValidator.js");var u,g;exports.__require=function(){if(g)return u;g=1;const m=e,d=t,w=s,{getConfigObj:y}=r,h=o,f=i.__require(),{getFramework:b,errorLog:v,successLog:T}=a.__require(),{catchCurPackageJson:q}=n.__require(),C=c.__require(),j=l.__require(),{validateApiName:P}=p.__require(),$=y(q()),_=(e=[])=>e.map(e=>({label:e.label,description:e.description,propSchema:JSON.stringify(e)})),D=(e=[],t)=>e&&0!==e.length?e.map(e=>({...e,componentType:t,eventCategory:e.eventCategory||2,pageType:e.pageType||1,targetDevice:e.targetDevice||1,eventParams:e.eventParams||[]})):[],S=(e=[],t)=>e&&0!==e.length?e.map(e=>({...e,componentType:t,funcScope:e.funcScope||1,pageType:e.pageType||1,targetDevice:e.targetDevice||1,custom:!0,funcInParams:e.funcInParams||[],funcOutParams:e.funcOutParams||[]})):[];return u=async(e,t)=>{const s=h("正在发布组件...").start(),{isValid:r,errors:o}=P(t);r||(v(o.join("\n")),process.exit(1));try{let r,o=new f(e);await o.ensureValidToken(),s.start("[1/4] 打包源码文件(含单个自定义组件源码)...");try{r=C(t,process.cwd(),e.assetsRoot),r?T(`[1/4] 源码文件打包完成: ${d.basename(r)}。`,s):v("[1/4] 源码文件打包失败,未返回 zip 文件路径。",s)}catch(e){v("[1/4] 源码文件打包失败。",s)}s.start("[2/4] 获取自定义组件构建产物...");const i=await o.getCmpAssets(t);let a;s.start("[3/4] 构建组件数据...");try{a=await(async(e,t)=>{if(!t||!t.cmpType)return v("自定义组件信息或组件名称不能为空"),null;const{cmpType:s}=t;if(!e||!m.existsSync(e))return v(`未找到自定义组件目录: ${e}`),null;const r=w.camelCase(s),o=d.join(e,`${r}Model.js`),i=globalThis.window;globalThis.window||(globalThis.window={console:console,neoRequire:()=>{},postMessage:()=>{}});try{m.existsSync(o)?require(o):(v(`未找到自定义组件模型文件,请检查以下路径是否存在:${o}`),process.exit(1)),globalThis.window&&globalThis.window.NEOEditorCustomModels||(v(`模型文件未导出有效模型方法(CatchCustomCmpModelClass),模型文件地址: ${o} `),process.exit(1));const e=globalThis.window.NEOEditorCustomModels[s];e||(v(`未找到自定义组件模型类(${s}),模型文件地址: ${o} `),process.exit(1));const r=new e;return r||(v(`未找到自定义组件模型信息(${s}),模型文件地址: ${o} `),process.exit(1)),{...t,version:$.version||"1.0.0",framework:$.framework?b($.framework):0,label:r.label||s,description:r.description||"",componentCategory:(r.tags||["自定义组件"]).join(","),targetPage:r.targetPage||["all"],targetObject:r.targetObject||["all"],targetApplication:r.targetApplication||["all"],targetDevice:r.targetDevice||"web",iconUrl:r.iconUrl||r.iconUrl,defaultProps:JSON.stringify(r.defaultComProps||{}),previewProps:JSON.stringify(r.previewComProps||{}),props:_(r.propsSchema||[]),events:D(r.events||[],s),functions:S(r.functions||r.actions||[],s),exposedToDesigner:void 0===r.exposedToDesigner||r.exposedToDesigner,namespace:r.namespace||"neo-cmp-cli",enableDuplicate:void 0===r.enableDuplicate||r.enableDuplicate}}catch(e){return v(`自定义组件模型文件解析失败 (${o||"未知路径"}): ${e.message||e.msg}`),v(e.stack),null}finally{void 0===i?delete globalThis.window:globalThis.window=i}})(e.assetsRoot,i),a?T("[3/4] 组件数据构建完成。",s):v(`[3/4] 未获取到自定义组件模型信息(${t})。`,s)}catch(e){v(`[3/4] 组件数据构建失败: ${e.message||e.msg}`,s)}s.start("[4/4] 保存组件信息到 NeoCRM 平台..."),j(w.omit(a,["assetFile","modelAssetFile","cssAssetFile","codeLibFile"]));try{await o.updateCustomComponent(a),T("[4/4] 组件信息保存成功",s)}catch(e){v("[4/4] 组件信息保存失败",s)}const{tenant_id:n,instance_uri:c}=o.tokenCache||{};console.log(`\n✅ 自定义组件发布成功!\n(当前租户 ID: ${n||"未返回"},所在租户的 API 域名: ${c||"未返回"}。)`)}catch(e){try{s&&s.isSpinning&&v(`❌ 自定义组件发布失败: ${e.message||e.msg}`,s)}catch{v(`\n❌ 自定义组件发布失败: ${e.message||e.msg}`)}throw e}},u};
|
package/dist/package.json.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e="1.9.
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e="1.9.15";const o={version:e};exports.default=o,exports.version=e;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var t,e;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),exports.__require=function(){if(e)return t;function r(t){const e=[];return t&&0!==t.trim().length?(t.length<2&&e.push(`组件API名称长度必须至少2个字符,当前长度: ${t.length}`),/^[a-z]/.test(t)||e.push("组件API名称必须以小写字母开头(驼峰命名规范)"),/^[a-z][a-zA-Z0-9_]*$/.test(t)||e.push("组件API名称只能包含字母、数字和下划线(_),且必须以小写字母开头"),t.startsWith("_")&&e.push("组件API名称不能以下划线开头"),t.endsWith("__c")||e.push("组件API名称必须以 __c 结尾"),{isValid:0===e.length,errors:e}):(e.push("组件API名称不能为空"),{isValid:!1,errors:e})}return e=1,t={validateApiName:r,isValidApiName:function(t){return r(t).isValid},getApiNameErrors:function(t){return r(t).errors},ensureApiNameSuffix:function(t){return t&&0!==t.trim().length?t.endsWith("__c")?t:t+"__c":t}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("fs-extra"),r=require("node:path"),o=require("lodash"),s=require("../neoParams.js"),c=require("../replaceInFilesByMap.js"),t=require("./hasCmpTypeByDir.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("fs-extra"),r=require("node:path"),o=require("lodash"),s=require("../neoParams.js"),c=require("../replaceInFilesByMap.js"),t=require("./hasCmpTypeByDir.js"),i=require("../projectUtils/hasNeoProject.js"),n=require("../cmpTypeValidator.js");var a,p;exports.__require=function(){if(p)return a;p=1;const m=e,l=r,u=o,{consoleTag:d}=s.__require(),_=c.__require(),q=t.__require(),f=i.__require(),{validateApiName:g,ensureApiNameSuffix:x}=n.__require(),j={widgetInfo:{cmpName:"CustomCmp",modelName:"CmpModel",cmpClassName:"custom-cmp-container",cmpType:"xx-custom-cmp",cmpLabel:"xx组件"},dir:l.resolve(__dirname,"../../../template/empty-cmp")};return a=function(e,r="./src/components"){const o=j.dir;let s=e||"neoCustomCmp__c";s=x(s);const{isValid:c,errors:t}=g(s);c||(errorLog(t.join("\n")),process.exit(1));const i=l.resolve(process.cwd(),r,s);f()||(console.error(`${d}当前(${process.cwd()})还不是自定义组件项目,请先创建一个自定义组件项目(neo init / neo create project)。`),process.exit(1)),q(s)&&(console.error(`${d}创建自定义组件失败,当前项目已经存在${s}自定义组件。`),process.exit(1)),m.copy(o,i).then(()=>{const e=u.camelCase(s),r=u.kebabCase(s);_(i,{[j.widgetInfo.modelName]:`${e}Model`,[j.widgetInfo.cmpName]:e,[j.widgetInfo.cmpClassName]:`${r}-container`,[j.widgetInfo.cmpType]:r,[j.widgetInfo.cmpLabel]:r}),console.log(`${d}已创建自定义组件(${s})!`)}).catch(e=>console.error(`${d}自定义组件创建失败(${s}):`,e))}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,r;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),exports.__require=function(){if(r)return e;function t(e){const r=[];return e&&0!==e.trim().length?(e.length<2&&r.push(
|
|
1
|
+
"use strict";var e,r;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),exports.__require=function(){if(r)return e;function t(e){const r=[];return e&&0!==e.trim().length?(e.length<2&&r.push(`项目名长度必须至少2个字符,当前长度: ${e.length}`),/^[a-zA-Z]/.test(e)||r.push("项目名必须以字母开头"),/^[a-zA-Z][a-zA-Z0-9-]*$/.test(e)||r.push("项目名只能包含字母、数字和连字符(-),且必须以字母开头"),e.includes("--")&&r.push("项目名不能包含连续连字符(--)"),e.endsWith("-")&&r.push("项目名不能以连字符结尾"),{isValid:0===r.length,errors:r}):(r.push("项目名不能为空"),{isValid:!1,errors:r})}return r=1,e={validateProjectName:t,isValidProjectName:function(e){return t(e).isValid},getProjectNameErrors:function(e){return t(e).errors}}};
|
package/package.json
CHANGED
|
@@ -51,8 +51,8 @@ module.exports = {
|
|
|
51
51
|
*/
|
|
52
52
|
/*
|
|
53
53
|
neoCommonModule: {
|
|
54
|
-
remoteDeps: ['
|
|
55
|
-
externals: ['
|
|
54
|
+
remoteDeps: ['chartWidget__c'], // 远程依赖组件,表示当前自定义组件会用到的依赖组件,需要和 externals 配合使用
|
|
55
|
+
externals: ['chartWidget__c'], // 自定义组件中需要剔除的模块(仅支持数组写法)
|
|
56
56
|
},
|
|
57
57
|
*/
|
|
58
58
|
preview: {
|
package/template/antd-custom-cmp-template/src/components/{dataDashboard → dataDashboard__c}/model.ts
RENAMED
|
@@ -14,22 +14,18 @@ export class DataDashboardModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description: string = '酷炫的数据展示仪表板,支持动态数据更新和动画效果';
|
|
16
16
|
|
|
17
|
-
//
|
|
18
|
-
// tags: string[] = ['
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
|
+
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* 用于设置组件支持的页面类型
|
|
22
22
|
*
|
|
23
23
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
24
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
25
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
26
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
27
|
*/
|
|
32
|
-
// targetPage: string[] = ['
|
|
28
|
+
// targetPage: string[] = ['all'];
|
|
33
29
|
|
|
34
30
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
35
31
|
iconUrl: string = 'https://neo-widgets.bj.bcebos.com/custom-widget.svg';
|
|
@@ -14,7 +14,7 @@ export class InfoCardModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description: string = '信息展示卡片';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
18
|
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -22,14 +22,10 @@ export class InfoCardModel {
|
|
|
22
22
|
*
|
|
23
23
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
24
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
25
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
26
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
27
|
*/
|
|
32
|
-
// targetPage: string[] = ['
|
|
28
|
+
// targetPage: string[] = ['all'];
|
|
33
29
|
|
|
34
30
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
35
31
|
iconUrl: string = 'https://neo-widgets.bj.bcebos.com/custom-widget.svg';
|
|
@@ -14,7 +14,7 @@ export class ContactCardListModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description: string = '展示联系人信息的卡片列表组件,支持姓名和手机号展示';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
18
|
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
20
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
@@ -15,7 +15,7 @@ export class ContactFormModel {
|
|
|
15
15
|
description: string =
|
|
16
16
|
'基于 Ant Design 的联系人表单组件,支持姓名、所有人、业务类型、所属部门、手机号等字段';
|
|
17
17
|
|
|
18
|
-
//
|
|
18
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
19
19
|
// tags: string[] = ['自定义组件'];
|
|
20
20
|
|
|
21
21
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
@@ -44,7 +44,7 @@ module.exports = {
|
|
|
44
44
|
// exports: ['xxModule'], // 数组写法,用于导出当前自定义组件中的第三方依赖模块
|
|
45
45
|
exports: {
|
|
46
46
|
// 对象写法,可用于导出自定义组件中的某个内容模块(需要使用绝对路径导出)
|
|
47
|
-
//
|
|
47
|
+
// chartWidget__c: path.resolve('./src/components/chartWidget__c'), // 导出图表自定义组件(默认会导致当前自定义组件)
|
|
48
48
|
'neo-register': 'neo-register', // 导出 Neo 注册模块
|
|
49
49
|
},
|
|
50
50
|
// remoteDeps: ['xxCmpType'], // 远程依赖组件,表示当前自定义组件会用到的依赖组件,需要和 externals 配合使用
|
package/template/echarts-custom-cmp-template/src/components/{chartWidget → chartWidget__c}/model.ts
RENAMED
|
@@ -15,22 +15,18 @@ export class ChartWidgetModel {
|
|
|
15
15
|
description: string =
|
|
16
16
|
'支持多种图表类型切换的专业图表组件,支持丰富的配置选项';
|
|
17
17
|
|
|
18
|
-
//
|
|
18
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
19
19
|
// tags: string[] = ['自定义组件'];
|
|
20
20
|
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
22
|
* 用于设置组件支持的页面类型
|
|
23
|
-
*
|
|
23
|
+
*
|
|
24
24
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
25
25
|
* all: 1 全页面
|
|
26
|
-
* indexPage: 2 首页
|
|
27
|
-
* entityListPage: 3 实体列表页
|
|
28
26
|
* entityFormPage: 4 实体表单页
|
|
29
|
-
* entityDetailPage: 5 实体详情页
|
|
30
27
|
* customPage: 6 自定义页面
|
|
31
|
-
* bizPage: 7 业务页面
|
|
32
28
|
*/
|
|
33
|
-
// targetPage: string[] = ['
|
|
29
|
+
// targetPage: string[] = ['all'];
|
|
34
30
|
|
|
35
31
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
36
32
|
iconUrl: string = 'https://custom-widgets.bj.bcebos.com/chart.svg';
|
|
@@ -144,7 +140,7 @@ export class ChartWidgetModel {
|
|
|
144
140
|
name: 'showTooltip',
|
|
145
141
|
label: '显示提示框',
|
|
146
142
|
value: true,
|
|
147
|
-
}
|
|
143
|
+
},
|
|
148
144
|
];
|
|
149
145
|
}
|
|
150
146
|
|
package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/model.ts
RENAMED
|
@@ -14,22 +14,18 @@ export class MapWidgetModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description: string = '地图展示组件,支持传入经纬度或地址名称';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
18
|
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
21
|
* 用于设置组件支持的页面类型
|
|
22
|
-
*
|
|
22
|
+
*
|
|
23
23
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
24
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
25
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
26
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
27
|
*/
|
|
32
|
-
// targetPage: string[] = ['
|
|
28
|
+
// targetPage: string[] = ['all'];
|
|
33
29
|
|
|
34
30
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
35
31
|
iconUrl: string = 'https://custom-widgets.bj.bcebos.com/map.svg';
|
|
@@ -2,19 +2,13 @@
|
|
|
2
2
|
* @file 自定义组件对接编辑器的描述文件
|
|
3
3
|
*/
|
|
4
4
|
export class CmpModel {
|
|
5
|
-
/**
|
|
6
|
-
* cmpType 为自定义组件名称,用于标识组件的唯一性
|
|
7
|
-
* 在构建时根据当前组件目录名称自动生成
|
|
8
|
-
*/
|
|
9
|
-
// cmpType: string = 'xx-custom-cmp';
|
|
10
|
-
|
|
11
5
|
// 组件名称,用于设置在编辑器左侧组件面板中展示的名称
|
|
12
6
|
label: string = 'xx组件';
|
|
13
7
|
|
|
14
8
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
|
-
description: string = '
|
|
9
|
+
description: string = '暂无描述';
|
|
16
10
|
|
|
17
|
-
//
|
|
11
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
12
|
// tags: string[] = ['自定义组件'];
|
|
19
13
|
|
|
20
14
|
/**
|
|
@@ -22,24 +16,19 @@ export class CmpModel {
|
|
|
22
16
|
*
|
|
23
17
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
18
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
19
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
20
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
21
|
*/
|
|
32
|
-
targetPage: string[] = ['
|
|
22
|
+
targetPage: string[] = ['all'];
|
|
33
23
|
|
|
34
24
|
/**
|
|
35
25
|
* 用于设置组件支持的终端类型
|
|
36
26
|
*
|
|
37
27
|
* 当前 NeoCRM 平台存在的终端类型:
|
|
38
|
-
* all: 所有终端
|
|
39
28
|
* web: 网页端
|
|
40
29
|
* mobile: 移动端
|
|
41
30
|
*/
|
|
42
|
-
// targetDevice: string = '
|
|
31
|
+
// targetDevice: string = 'web';
|
|
43
32
|
|
|
44
33
|
|
|
45
34
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
@@ -14,7 +14,7 @@ export class EntityCardListModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description: string = '展示实体数据信息的卡片列表组件,支持姓名和手机号展示';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
18
|
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -22,12 +22,8 @@ export class EntityCardListModel {
|
|
|
22
22
|
*
|
|
23
23
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
24
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
25
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
26
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
27
|
*/
|
|
32
28
|
targetPage: string[] = ['all'];
|
|
33
29
|
|
package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/model.ts
RENAMED
|
@@ -16,7 +16,7 @@ export class EntityDetailModel {
|
|
|
16
16
|
/** 组件描述,用于设置在编辑器左侧组件面板中展示的描述 */
|
|
17
17
|
description: string = '展示实体数据详情信息,支持多列布局和字段类型识别';
|
|
18
18
|
|
|
19
|
-
/**
|
|
19
|
+
/** 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示 */
|
|
20
20
|
// tags: string[] = ['自定义组件'];
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -24,14 +24,10 @@ export class EntityDetailModel {
|
|
|
24
24
|
*
|
|
25
25
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
26
26
|
* all: 1 全页面
|
|
27
|
-
* indexPage: 2 首页
|
|
28
|
-
* entityListPage: 3 实体列表页
|
|
29
27
|
* entityFormPage: 4 实体表单页
|
|
30
|
-
* entityDetailPage: 5 实体详情页
|
|
31
28
|
* customPage: 6 自定义页面
|
|
32
|
-
* bizPage: 7 业务页面
|
|
33
29
|
*/
|
|
34
|
-
// targetPage: string[] = ['
|
|
30
|
+
// targetPage: string[] = ['all'];
|
|
35
31
|
|
|
36
32
|
/** 组件图标,用于设置在编辑器左侧组件面板中展示的图标 */
|
|
37
33
|
iconUrl: string = 'https://custom-widgets.bj.bcebos.com/detail.svg';
|
package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/model.ts
RENAMED
|
@@ -18,7 +18,7 @@ export class EntityFormModel {
|
|
|
18
18
|
/** 组件描述,用于设置在编辑器左侧组件面板中展示的描述 */
|
|
19
19
|
description: string = '基于 XObject 的对象表单组件,用于新增数据';
|
|
20
20
|
|
|
21
|
-
/**
|
|
21
|
+
/** 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示 */
|
|
22
22
|
// tags: string[] = ['自定义组件'];
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -26,12 +26,8 @@ export class EntityFormModel {
|
|
|
26
26
|
*
|
|
27
27
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
28
28
|
* all: 1 全页面
|
|
29
|
-
* indexPage: 2 首页
|
|
30
|
-
* entityListPage: 3 实体列表页
|
|
31
29
|
* entityFormPage: 4 实体表单页
|
|
32
|
-
* entityDetailPage: 5 实体详情页
|
|
33
30
|
* customPage: 6 自定义页面
|
|
34
|
-
* bizPage: 7 业务页面
|
|
35
31
|
*/
|
|
36
32
|
targetPage: string[] = ['all'];
|
|
37
33
|
|
package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/index.tsx
RENAMED
|
@@ -694,7 +694,7 @@ export default class EntityTable extends BaseCmp<
|
|
|
694
694
|
const systemInfo = curAmisData.__NeoSystemInfo || {};
|
|
695
695
|
const { xObjectApiKey } = this.props.xObjectDataApi || {};
|
|
696
696
|
const columns = this.generateColumns();
|
|
697
|
-
console.log('this.props:', this.props, columns);
|
|
697
|
+
console.log('this.props:', this.props, columns, this);
|
|
698
698
|
|
|
699
699
|
return (
|
|
700
700
|
<div className="entity-table-container">
|
package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/model.ts
RENAMED
|
@@ -18,7 +18,7 @@ export class EntityTableModel {
|
|
|
18
18
|
/** 组件描述,用于设置在编辑器左侧组件面板中展示的描述 */
|
|
19
19
|
description: string = '基于 XObject 的数据表格组件,支持增删改查操作';
|
|
20
20
|
|
|
21
|
-
/**
|
|
21
|
+
/** 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示 */
|
|
22
22
|
// tags: string[] = ['自定义组件'];
|
|
23
23
|
|
|
24
24
|
/** 组件图标,用于设置在编辑器左侧组件面板中展示的图标 */
|
|
@@ -29,12 +29,8 @@ export class EntityTableModel {
|
|
|
29
29
|
*
|
|
30
30
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
31
31
|
* all: 1 全页面
|
|
32
|
-
* indexPage: 2 首页
|
|
33
|
-
* entityListPage: 3 实体列表页
|
|
34
32
|
* entityFormPage: 4 实体表单页
|
|
35
|
-
* entityDetailPage: 5 实体详情页
|
|
36
33
|
* customPage: 6 自定义页面
|
|
37
|
-
* bizPage: 7 业务页面
|
|
38
34
|
*/
|
|
39
35
|
targetPage: string[] = ['all'];
|
|
40
36
|
|
|
@@ -14,22 +14,18 @@ export class InfoCardModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description = '信息展示卡片';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
18
|
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
21
|
* 用于设置组件支持的页面类型
|
|
22
|
-
*
|
|
22
|
+
*
|
|
23
23
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
24
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
25
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
26
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
27
|
*/
|
|
32
|
-
// targetPage: string[] = ['
|
|
28
|
+
// targetPage: string[] = ['all'];
|
|
33
29
|
|
|
34
30
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
35
31
|
// iconUrl = 'https://neo-widgets.bj.bcebos.com/custom-widget.svg';
|
package/template/react-ts-custom-cmp-template/src/components/{listWidget → listWidget__c}/model.ts
RENAMED
|
@@ -14,22 +14,18 @@ export class ListWidgetModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description: string = '支持配置的列表展示组件,内置模拟数据';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
18
|
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
21
|
* 用于设置组件支持的页面类型
|
|
22
|
-
*
|
|
22
|
+
*
|
|
23
23
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
24
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
25
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
26
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
27
|
*/
|
|
32
|
-
// targetPage: string[] = ['
|
|
28
|
+
// targetPage: string[] = ['all'];
|
|
33
29
|
|
|
34
30
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
35
31
|
iconUrl: string = 'https://neo-widgets.bj.bcebos.com/favicon.png';
|
package/template/vue2-custom-cmp-template/src/components/{vueInfoCard → vueInfoCard__c}/model.js
RENAMED
|
@@ -14,22 +14,18 @@ export class InfoCardModel {
|
|
|
14
14
|
// 组件描述,用于设置在编辑器左侧组件面板中展示的描述
|
|
15
15
|
description = '信息展示卡片';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示
|
|
18
18
|
// tags: string[] = ['自定义组件'];
|
|
19
19
|
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
21
|
* 用于设置组件支持的页面类型
|
|
22
|
-
*
|
|
22
|
+
*
|
|
23
23
|
* 当前 NeoCRM 平台存在的页面类型:
|
|
24
24
|
* all: 1 全页面
|
|
25
|
-
* indexPage: 2 首页
|
|
26
|
-
* entityListPage: 3 实体列表页
|
|
27
25
|
* entityFormPage: 4 实体表单页
|
|
28
|
-
* entityDetailPage: 5 实体详情页
|
|
29
26
|
* customPage: 6 自定义页面
|
|
30
|
-
* bizPage: 7 业务页面
|
|
31
27
|
*/
|
|
32
|
-
// targetPage: string[] = ['
|
|
28
|
+
// targetPage: string[] = ['all'];
|
|
33
29
|
|
|
34
30
|
// 组件图标,用于设置在编辑器左侧组件面板中展示的图标
|
|
35
31
|
iconUrl = 'https://neo-widgets.bj.bcebos.com/custom-widget.svg';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const { execSync } = require('child_process');
|
|
2
2
|
|
|
3
3
|
// 所有需要废弃的版本
|
|
4
|
-
const versionsToDeprecate = ["1.9.9"];
|
|
4
|
+
const versionsToDeprecate = ["1.9.9", "1.9.10", "1.9.11", "1.9.12", "1.9.13"];
|
|
5
5
|
|
|
6
6
|
const packageName = 'neo-cmp-cli';
|
|
7
7
|
const deprecateMessage = '此版本为开发中版本(存在 bug),请升级到最新版本。';
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/template/antd-custom-cmp-template/src/components/{infoCard → infoCard__c}/index.tsx
RENAMED
|
File without changes
|
/package/template/antd-custom-cmp-template/src/components/{infoCard → infoCard__c}/style.scss
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/README.md
RENAMED
|
File without changes
|
/package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/USAGE.md
RENAMED
|
File without changes
|
/package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/index.tsx
RENAMED
|
File without changes
|
/package/template/echarts-custom-cmp-template/src/components/{mapWidget → mapWidget__c}/style.scss
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/README.md
RENAMED
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/index.tsx
RENAMED
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityDetail → entityDetail__c}/style.scss
RENAMED
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/README.md
RENAMED
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/index.tsx
RENAMED
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityForm_c → entityForm__c}/style.scss
RENAMED
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/README.md
RENAMED
|
File without changes
|
/package/template/neo-custom-cmp-template/src/components/{entityTable → entityTable__c}/style.scss
RENAMED
|
File without changes
|
/package/template/react-custom-cmp-template/src/components/{infoCard → infoCard__c}/index.jsx
RENAMED
|
File without changes
|
/package/template/react-custom-cmp-template/src/components/{infoCard → infoCard__c}/style.scss
RENAMED
|
File without changes
|
/package/template/react-ts-custom-cmp-template/src/components/{listWidget → listWidget__c}/README.md
RENAMED
|
File without changes
|
/package/template/react-ts-custom-cmp-template/src/components/{listWidget → listWidget__c}/index.tsx
RENAMED
|
File without changes
|
|
File without changes
|
/package/template/vue2-custom-cmp-template/src/components/{vueInfoCard → vueInfoCard__c}/index.vue
RENAMED
|
File without changes
|