twenty-sdk 2.1.0-canary.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +1 -1
- package/dist/cli.mjs +1 -1
- package/package.json +2 -2
package/dist/cli.cjs
CHANGED
|
@@ -282,7 +282,7 @@ ${q}
|
|
|
282
282
|
// },
|
|
283
283
|
// ],
|
|
284
284
|
});
|
|
285
|
-
`},xr="src";class mv{async execute(a,i){try{const l=a??await this.getEntity(),d=this.getFolderName(l),E=i?z.join(ee,i):z.join(ee,xr,d);await v.ensureDir(E);const{name:I,file:N}=await this.getEntityData(l),q=z.join(E,this.getFileName(I,l));if(await v.pathExists(q)){const{overwrite:te}=await this.handleFileExist();if(!te)return}await Dt.writeFile(q,N),console.log(_.default.green(`✓ Created ${d}:`),_.default.cyan(z.relative(ee,q))),l===v.e.Object&&await this.promptAndCreateObjectCompanions(I,i)}catch(l){console.error(_.default.red("Add new entity failed:"),l instanceof Error?l.message:l),process.exit(1)}}async getEntityData(a){switch(a){case v.e.Object:{const i=await this.getObjectData(),l=i.nameSingular,d=re.v4(),E=re.v4();this.lastObjectUniversalIdentifier=d,this.lastNameFieldUniversalIdentifier=E,this.lastObjectLabelSingular=i.labelSingular;const I=lv({data:i,universalIdentifier:d,nameFieldUniversalIdentifier:E});return{name:l,file:I}}case v.e.Field:{const i=await this.getFieldData(),l=i.name,d=av({data:i});return{name:l,file:d}}case v.e.LogicFunction:{const i=await this.getEntityName(a),l=uv({name:i});return{name:i,file:l}}case v.e.FrontComponent:{const i=await this.getEntityName(a),l=ov({name:i});return{name:i,file:l}}case v.e.Role:{const i=await this.getEntityName(a),l=dv({name:i});return{name:i,file:l}}case v.e.Skill:{const i=await this.getEntityName(a),l=gv({name:i});return{name:i,file:l}}case v.e.Agent:{const i=await this.getEntityName(a),l=pv({name:i});return{name:i,file:l}}case v.e.View:{const l=(await this.getViewData()).name,d=Ki({name:l});return{name:l,file:d}}case v.e.NavigationMenuItem:{const i=await this.getEntityName(a),l=Lo({name:i});return{name:i,file:l}}case v.e.PageLayout:{const i=await this.getEntityName(a),l=cv({name:i});return{name:i,file:l}}case v.e.PageLayoutTab:{const i=await this.getEntityName(a),l=fv({name:i});return{name:i,file:l}}default:v.Te()}}async promptAndCreateObjectCompanions(a,i){const{createCompanions:l}=await Ge.default.prompt([{type:"confirm",name:"createCompanions",message:"Also create a view, navigation menu item, and record page layout for this object? (recommended)",default:!0}]);if(!l||!this.lastObjectUniversalIdentifier)return;const d=re.v4(),E=re.v4(),I=Ki({name:`all-${pe(a)}`,universalIdentifier:d,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,fields:this.lastNameFieldUniversalIdentifier?[{fieldMetadataUniversalIdentifier:this.lastNameFieldUniversalIdentifier,position:0,isVisible:!0,size:200}]:[]}),N=i?z.join(ee,i):z.join(ee,xr,this.getFolderName(v.e.View));await v.ensureDir(N);const q=`all-${pe(a)}.ts`,te=z.join(N,q);if(await v.pathExists(te)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(te,I),console.log(_.default.green("✓ Created view:"),_.default.cyan(z.relative(ee,te)));const X=this.buildRecordPageFieldsViewFields(this.lastNameFieldUniversalIdentifier),K=Ki({name:`${pe(a)}-record-page-fields`,universalIdentifier:E,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,type:v.TE.FIELDS_WIDGET,fields:X}),Ze=`${pe(a)}-record-page-fields.ts`,k=z.join(N,Ze);if(await v.pathExists(k)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(k,K),console.log(_.default.green("✓ Created record-page-fields view:"),_.default.cyan(z.relative(ee,k)));const W=Lo({name:a,type:"OBJECT",targetObjectUniversalIdentifier:this.lastObjectUniversalIdentifier}),Pe=i?z.join(ee,i):z.join(ee,xr,this.getFolderName(v.e.NavigationMenuItem));await v.ensureDir(Pe);const xe=`${pe(a)}.ts`,je=z.join(Pe,xe);if(await v.pathExists(je)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(je,W),console.log(_.default.green("✓ Created navigation menu item:"),_.default.cyan(z.relative(ee,je)));const Cn=hv({objectLabelSingular:this.lastObjectLabelSingular??a,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,fieldsWidgetViewUniversalIdentifier:E}),Le=i?z.join(ee,i):z.join(ee,xr,this.getFolderName(v.e.PageLayout));await v.ensureDir(Le);const At=`${pe(a)}-record-page-layout.ts`,Ie=z.join(Le,At);if(await v.pathExists(Ie)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(Ie,Cn),console.log(_.default.green("✓ Created record page layout:"),_.default.cyan(z.relative(ee,Ie)))}buildRecordPageFieldsViewFields(a){const l=["createdAt","updatedAt","createdBy","updatedBy"].map(E=>({defaultFieldName:E,isVisible:!0,size:200}));return(a?[{fieldMetadataUniversalIdentifier:a,isVisible:!0,size:200},...l]:l).map((E,I)=>({...E,position:I}))}async getEntity(){const{entity:a}=await Ge.default.prompt([{type:"select",name:"entity",message:"What entity do you want to create?",default:"",choices:Object.values(v.e)}]);return a}async handleFileExist(){return await Ge.default.prompt([{type:"confirm",name:"overwrite",message:"File already exists. Do you want to overwrite it?",default:!1}])}async getEntityName(a){const{name:i}=await Ge.default.prompt([{type:"input",name:"name",message:`Enter a name for your new ${a}:`,default:"",validate:l=>l.length===0?`${a} name is required`:!0}]);return i}async getFieldData(){return Ge.default.prompt([{type:"input",name:"name",message:"Enter a name for your field:",default:"",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"label",message:"Enter a label for your field:",default:a=>zi(a.name),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"select",name:"type",message:"Select the field type:",choices:Object.values(v.R),default:v.R.TEXT},{type:"input",name:"objectUniversalIdentifier",message:"Enter the universalIdentifier of the object this field belongs to:",default:"fill-later",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"description",message:"Enter a description for your field (optional):",default:""}])}async getObjectData(){return Ge.default.prompt([{type:"input",name:"nameSingular",message:"Enter a name singular for your object (eg: company):",default:"",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"namePlural",message:"Enter a name plural for your object (eg: companies):",default:"",validate:(a,i)=>a.trim()===i?.nameSingular.trim()?"Name plural must be different from name singular":!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"labelSingular",message:"Enter a label singular for your object:",default:a=>zi(a.nameSingular),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"labelPlural",message:"Enter a label plural for your object:",default:a=>zi(a.namePlural),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0}])}async getViewData(){return Ge.default.prompt([{type:"input",name:"name",message:"Enter a name for your view:",default:"",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"objectUniversalIdentifier",message:"Enter the universalIdentifier of the object this view belongs to:",default:"fill-later",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0}])}getFolderName(a){return`${pe(a)}s`}getFileName(a,i){switch(i){case v.e.FrontComponent:return`${pe(a)}.tsx`;default:return`${pe(a)}.ts`}}}const yv="2.1.0
|
|
285
|
+
`},xr="src";class mv{async execute(a,i){try{const l=a??await this.getEntity(),d=this.getFolderName(l),E=i?z.join(ee,i):z.join(ee,xr,d);await v.ensureDir(E);const{name:I,file:N}=await this.getEntityData(l),q=z.join(E,this.getFileName(I,l));if(await v.pathExists(q)){const{overwrite:te}=await this.handleFileExist();if(!te)return}await Dt.writeFile(q,N),console.log(_.default.green(`✓ Created ${d}:`),_.default.cyan(z.relative(ee,q))),l===v.e.Object&&await this.promptAndCreateObjectCompanions(I,i)}catch(l){console.error(_.default.red("Add new entity failed:"),l instanceof Error?l.message:l),process.exit(1)}}async getEntityData(a){switch(a){case v.e.Object:{const i=await this.getObjectData(),l=i.nameSingular,d=re.v4(),E=re.v4();this.lastObjectUniversalIdentifier=d,this.lastNameFieldUniversalIdentifier=E,this.lastObjectLabelSingular=i.labelSingular;const I=lv({data:i,universalIdentifier:d,nameFieldUniversalIdentifier:E});return{name:l,file:I}}case v.e.Field:{const i=await this.getFieldData(),l=i.name,d=av({data:i});return{name:l,file:d}}case v.e.LogicFunction:{const i=await this.getEntityName(a),l=uv({name:i});return{name:i,file:l}}case v.e.FrontComponent:{const i=await this.getEntityName(a),l=ov({name:i});return{name:i,file:l}}case v.e.Role:{const i=await this.getEntityName(a),l=dv({name:i});return{name:i,file:l}}case v.e.Skill:{const i=await this.getEntityName(a),l=gv({name:i});return{name:i,file:l}}case v.e.Agent:{const i=await this.getEntityName(a),l=pv({name:i});return{name:i,file:l}}case v.e.View:{const l=(await this.getViewData()).name,d=Ki({name:l});return{name:l,file:d}}case v.e.NavigationMenuItem:{const i=await this.getEntityName(a),l=Lo({name:i});return{name:i,file:l}}case v.e.PageLayout:{const i=await this.getEntityName(a),l=cv({name:i});return{name:i,file:l}}case v.e.PageLayoutTab:{const i=await this.getEntityName(a),l=fv({name:i});return{name:i,file:l}}default:v.Te()}}async promptAndCreateObjectCompanions(a,i){const{createCompanions:l}=await Ge.default.prompt([{type:"confirm",name:"createCompanions",message:"Also create a view, navigation menu item, and record page layout for this object? (recommended)",default:!0}]);if(!l||!this.lastObjectUniversalIdentifier)return;const d=re.v4(),E=re.v4(),I=Ki({name:`all-${pe(a)}`,universalIdentifier:d,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,fields:this.lastNameFieldUniversalIdentifier?[{fieldMetadataUniversalIdentifier:this.lastNameFieldUniversalIdentifier,position:0,isVisible:!0,size:200}]:[]}),N=i?z.join(ee,i):z.join(ee,xr,this.getFolderName(v.e.View));await v.ensureDir(N);const q=`all-${pe(a)}.ts`,te=z.join(N,q);if(await v.pathExists(te)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(te,I),console.log(_.default.green("✓ Created view:"),_.default.cyan(z.relative(ee,te)));const X=this.buildRecordPageFieldsViewFields(this.lastNameFieldUniversalIdentifier),K=Ki({name:`${pe(a)}-record-page-fields`,universalIdentifier:E,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,type:v.TE.FIELDS_WIDGET,fields:X}),Ze=`${pe(a)}-record-page-fields.ts`,k=z.join(N,Ze);if(await v.pathExists(k)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(k,K),console.log(_.default.green("✓ Created record-page-fields view:"),_.default.cyan(z.relative(ee,k)));const W=Lo({name:a,type:"OBJECT",targetObjectUniversalIdentifier:this.lastObjectUniversalIdentifier}),Pe=i?z.join(ee,i):z.join(ee,xr,this.getFolderName(v.e.NavigationMenuItem));await v.ensureDir(Pe);const xe=`${pe(a)}.ts`,je=z.join(Pe,xe);if(await v.pathExists(je)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(je,W),console.log(_.default.green("✓ Created navigation menu item:"),_.default.cyan(z.relative(ee,je)));const Cn=hv({objectLabelSingular:this.lastObjectLabelSingular??a,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,fieldsWidgetViewUniversalIdentifier:E}),Le=i?z.join(ee,i):z.join(ee,xr,this.getFolderName(v.e.PageLayout));await v.ensureDir(Le);const At=`${pe(a)}-record-page-layout.ts`,Ie=z.join(Le,At);if(await v.pathExists(Ie)){const{overwrite:Ee}=await this.handleFileExist();if(!Ee)return}await Dt.writeFile(Ie,Cn),console.log(_.default.green("✓ Created record page layout:"),_.default.cyan(z.relative(ee,Ie)))}buildRecordPageFieldsViewFields(a){const l=["createdAt","updatedAt","createdBy","updatedBy"].map(E=>({defaultFieldName:E,isVisible:!0,size:200}));return(a?[{fieldMetadataUniversalIdentifier:a,isVisible:!0,size:200},...l]:l).map((E,I)=>({...E,position:I}))}async getEntity(){const{entity:a}=await Ge.default.prompt([{type:"select",name:"entity",message:"What entity do you want to create?",default:"",choices:Object.values(v.e)}]);return a}async handleFileExist(){return await Ge.default.prompt([{type:"confirm",name:"overwrite",message:"File already exists. Do you want to overwrite it?",default:!1}])}async getEntityName(a){const{name:i}=await Ge.default.prompt([{type:"input",name:"name",message:`Enter a name for your new ${a}:`,default:"",validate:l=>l.length===0?`${a} name is required`:!0}]);return i}async getFieldData(){return Ge.default.prompt([{type:"input",name:"name",message:"Enter a name for your field:",default:"",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"label",message:"Enter a label for your field:",default:a=>zi(a.name),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"select",name:"type",message:"Select the field type:",choices:Object.values(v.R),default:v.R.TEXT},{type:"input",name:"objectUniversalIdentifier",message:"Enter the universalIdentifier of the object this field belongs to:",default:"fill-later",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"description",message:"Enter a description for your field (optional):",default:""}])}async getObjectData(){return Ge.default.prompt([{type:"input",name:"nameSingular",message:"Enter a name singular for your object (eg: company):",default:"",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"namePlural",message:"Enter a name plural for your object (eg: companies):",default:"",validate:(a,i)=>a.trim()===i?.nameSingular.trim()?"Name plural must be different from name singular":!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"labelSingular",message:"Enter a label singular for your object:",default:a=>zi(a.nameSingular),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"labelPlural",message:"Enter a label plural for your object:",default:a=>zi(a.namePlural),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0}])}async getViewData(){return Ge.default.prompt([{type:"input",name:"name",message:"Enter a name for your view:",default:"",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0},{type:"input",name:"objectUniversalIdentifier",message:"Enter the universalIdentifier of the object this view belongs to:",default:"fill-later",validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0}])}getFolderName(a){return`${pe(a)}s`}getFileName(a,i){switch(i){case v.e.FrontComponent:return`${pe(a)}.tsx`;default:return`${pe(a)}.ts`}}}const yv="2.1.0",Go={version:yv},_v=async f=>{const a=z.join(f,"package.json");if(await v.pathExists(a))try{const i=await Dt.readFile(a,"utf-8"),l=JSON.parse(i);return l.dependencies?.["twenty-sdk"]??l.devDependencies?.["twenty-sdk"]??void 0}catch{return}},Oo=f=>{const a=f.match(/(\d+)\./);if(a)return parseInt(a[1],10);const i=f.match(/^[~^>=<]*(\d+)$/);return i?parseInt(i[1],10):null},en=async f=>{const a=Go.version,i=await _v(f);if(!i)return;const l=Oo(a),d=Oo(i);l===null||d===null||l!==d&&(console.warn(_.default.yellow(`⚠ Version mismatch: your app requires twenty-sdk@${d}.x but the CLI running is v${a}. Major version mismatches may cause unexpected behavior.
|
|
286
286
|
Update with: npm install -g twenty-sdk@${d}`)),console.warn(""))};class wv{async execute(a){const i=a.appPath??ee;await en(i),console.log(_.default.blue("Building application...")),console.log(_.default.gray(`App path: ${i}
|
|
287
287
|
`));const l=await v.appBuild({appPath:i,tarball:a.tarball,onProgress:d=>console.log(_.default.gray(d))});l.success||(console.error(_.default.red(l.error.message)),process.exit(1)),console.log(_.default.green(`✓ Build succeeded (${l.data.fileCount} file${l.data.fileCount===1?"":"s"})`)),console.log(_.default.gray(`Output: ${l.data.outputDir}`)),l.data.tarballPath&&console.log(_.default.gray(`Tarball: ${l.data.tarballPath}`))}}class Sv{async execute(a){a.remote&&v.ConfigService.setActiveRemote(a.remote),console.log(_.default.blue("Syncing marketplace catalog..."));const l=await new v.ApiService().syncMarketplaceCatalog();l.success||(console.error(_.default.red(`Catalog sync failed: ${l.error instanceof Error?l.error.message:String(l.error)}`)),process.exit(1)),console.log(_.default.green("✓ Marketplace catalog synced successfully"))}}class xv{async execute(a){const i=a.appPath??ee;await en(i),console.log(_.default.blue("Deploying application...")),console.log(_.default.gray(`App path: ${i}
|
|
288
288
|
`));const l=I=>console.log(_.default.gray(I)),d=await v.appBuild({appPath:i,tarball:!0,onProgress:l});d.success||(console.error(_.default.red(d.error.message)),process.exit(1));const E=await v.appDeploy({tarballPath:d.data.tarballPath,remote:a.remote,onProgress:l});E.success||(console.error(_.default.red(E.error.message)),process.exit(1)),console.log(_.default.green("✓ Deployed successfully"))}}class Iv{constructor({state:a,notify:i}){this.state=a,this.notify=i}async execute(a){const i=this.state.steps.buildManifest;i.status="in_progress",this.state.updatePipeline({status:"building"});const l=[{message:"Building manifest",status:"info"}],d=await v.buildAndValidateManifest(a.appPath);if(!d.success){for(const I of d.errors)l.push({message:I,status:"error"});return i.output={result:null},i.status="error",this.state.updatePipeline({status:"error"}),this.state.applyStepEvents(l),null}if(d.warnings.length>0)for(const I of d.warnings)l.push({message:`⚠ ${I}`,status:"warning"});l.push({message:"Successfully built manifest",status:"success"});const E={manifest:d.manifest,filePaths:d.filePaths};return i.output={result:E},i.status="done",this.state.updatePipeline({appName:d.manifest.application.displayName}),this.state.updateEntitiesFromManifest(d.filePaths),this.state.applyStepEvents(l),E}}class Ev{constructor({apiService:a,state:i,notify:l}){this.hasRetried=!1,this.apiService=a,this.state=i,this.notify=l}async execute(){const a=this.state.steps.checkServer,i=await this.apiService.validateAuth();if(!i.serverUp){const d=await v.detectLocalServer();return d&&!this.hasRetried?(this.hasRetried=!0,await new v.ConfigService().setConfig({apiUrl:d}),this.execute()):(a.output.errorLogged||(a.output={isReady:!1,errorLogged:!0},a.status="error",this.state.applyStepEvents([{message:`Cannot reach Twenty server.
|
package/dist/cli.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "twenty-sdk",
|
|
3
|
-
"version": "2.1.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"bin": {
|
|
6
6
|
"twenty": "dist/cli.cjs"
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"react": "^19.0.0",
|
|
84
84
|
"react-dom": "^19.0.0",
|
|
85
85
|
"tinyglobby": "^0.2.15",
|
|
86
|
-
"twenty-client-sdk": "2.1.0
|
|
86
|
+
"twenty-client-sdk": "2.1.0",
|
|
87
87
|
"typescript": "^5.9.2",
|
|
88
88
|
"uuid": "^13.0.0",
|
|
89
89
|
"vite": "^7.0.0",
|