twenty-sdk 1.23.0 → 2.0.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 CHANGED
@@ -214,7 +214,7 @@ ${M}
214
214
  // },
215
215
  // ],
216
216
  });
217
- `},Hi="src";class dv{async execute(a,i){try{const l=a??await this.getEntity(),d=this.getFolderName(l),A=i?X.join(ie,i):X.join(ie,Hi,d);await m.ensureDir(A);const{name:E,file:M}=await this.getEntityData(l),L=X.join(A,this.getFileName(E,l));if(await m.pathExists(L)){const{overwrite:ue}=await this.handleFileExist();if(!ue)return}await Cn.writeFile(L,M),console.log(y.default.green(`✓ Created ${d}:`),y.default.cyan(X.relative(ie,L))),l===m.e.Object&&await this.promptAndCreateViewAndNavigationMenuItem(E,i)}catch(l){console.error(y.default.red("Add new entity failed:"),l instanceof Error?l.message:l),process.exit(1)}}async getEntityData(a){switch(a){case m.e.Object:{const i=await this.getObjectData(),l=i.nameSingular,d=pe.v4(),A=pe.v4();this.lastObjectUniversalIdentifier=d,this.lastNameFieldUniversalIdentifier=A;const E=lv({data:i,universalIdentifier:d,nameFieldUniversalIdentifier:A});return{name:l,file:E}}case m.e.Field:{const i=await this.getFieldData(),l=i.name,d=av({data:i});return{name:l,file:d}}case m.e.LogicFunction:{const i=await this.getEntityName(a),l=uv({name:i});return{name:i,file:l}}case m.e.FrontComponent:{const i=await this.getEntityName(a),l=ov({name:i});return{name:i,file:l}}case m.e.Role:{const i=await this.getEntityName(a),l=fv({name:i});return{name:i,file:l}}case m.e.Skill:{const i=await this.getEntityName(a),l=pv({name:i});return{name:i,file:l}}case m.e.Agent:{const i=await this.getEntityName(a),l=hv({name:i});return{name:i,file:l}}case m.e.View:{const l=(await this.getViewData()).name,d=Oo({name:l});return{name:l,file:d}}case m.e.NavigationMenuItem:{const i=await this.getEntityName(a),l=Po({name:i});return{name:i,file:l}}case m.e.PageLayout:{const i=await this.getEntityName(a),l=cv({name:i});return{name:i,file:l}}default:m.Te()}}async promptAndCreateViewAndNavigationMenuItem(a,i){const{createViewAndNavItem:l}=await $e.default.prompt([{type:"confirm",name:"createViewAndNavItem",message:"Also create a view and navigation menu item for this object? (recommended)",default:!0}]);if(!l||!this.lastObjectUniversalIdentifier)return;const d=pe.v4(),A=Oo({name:`all-${Ce(a)}`,universalIdentifier:d,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,fields:this.lastNameFieldUniversalIdentifier?[{fieldMetadataUniversalIdentifier:this.lastNameFieldUniversalIdentifier,position:0,isVisible:!0,size:200}]:[]}),E=i?X.join(ie,i):X.join(ie,Hi,this.getFolderName(m.e.View));await m.ensureDir(E);const M=`all-${Ce(a)}.ts`,L=X.join(E,M);if(await m.pathExists(L)){const{overwrite:G}=await this.handleFileExist();if(!G)return}await Cn.writeFile(L,A),console.log(y.default.green("✓ Created view:"),y.default.cyan(X.relative(ie,L)));const ue=Po({name:a,type:"OBJECT",targetObjectUniversalIdentifier:this.lastObjectUniversalIdentifier}),te=i?X.join(ie,i):X.join(ie,Hi,this.getFolderName(m.e.NavigationMenuItem));await m.ensureDir(te);const Y=`${Ce(a)}.ts`,Ke=X.join(te,Y);if(await m.pathExists(Ke)){const{overwrite:G}=await this.handleFileExist();if(!G)return}await Cn.writeFile(Ke,ue),console.log(y.default.green("✓ Created navigation menu item:"),y.default.cyan(X.relative(ie,Ke)))}async getEntity(){const{entity:a}=await $e.default.prompt([{type:"select",name:"entity",message:"What entity do you want to create?",default:"",choices:Object.values(m.e)}]);return a}async handleFileExist(){return await $e.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 $e.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 $e.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=>qi(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(m.R),default:m.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 $e.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=>qi(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=>qi(a.namePlural),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0}])}async getViewData(){return $e.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`${Ce(a)}s`}getFileName(a,i){switch(i){case m.e.FrontComponent:return`${Ce(a)}.tsx`;default:return`${Ce(a)}.ts`}}}const gv="1.23.0",Go={version:gv},vv=async f=>{const a=X.join(f,"package.json");if(await m.pathExists(a))try{const i=await Cn.readFile(a,"utf-8"),l=JSON.parse(i);return l.dependencies?.["twenty-sdk"]??l.devDependencies?.["twenty-sdk"]??void 0}catch{return}},Lo=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},Xt=async f=>{const a=Go.version,i=await vv(f);if(!i)return;const l=Lo(a),d=Lo(i);l===null||d===null||l!==d&&(console.warn(y.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.
217
+ `},Hi="src";class dv{async execute(a,i){try{const l=a??await this.getEntity(),d=this.getFolderName(l),A=i?X.join(ie,i):X.join(ie,Hi,d);await m.ensureDir(A);const{name:E,file:M}=await this.getEntityData(l),L=X.join(A,this.getFileName(E,l));if(await m.pathExists(L)){const{overwrite:ue}=await this.handleFileExist();if(!ue)return}await Cn.writeFile(L,M),console.log(y.default.green(`✓ Created ${d}:`),y.default.cyan(X.relative(ie,L))),l===m.e.Object&&await this.promptAndCreateViewAndNavigationMenuItem(E,i)}catch(l){console.error(y.default.red("Add new entity failed:"),l instanceof Error?l.message:l),process.exit(1)}}async getEntityData(a){switch(a){case m.e.Object:{const i=await this.getObjectData(),l=i.nameSingular,d=pe.v4(),A=pe.v4();this.lastObjectUniversalIdentifier=d,this.lastNameFieldUniversalIdentifier=A;const E=lv({data:i,universalIdentifier:d,nameFieldUniversalIdentifier:A});return{name:l,file:E}}case m.e.Field:{const i=await this.getFieldData(),l=i.name,d=av({data:i});return{name:l,file:d}}case m.e.LogicFunction:{const i=await this.getEntityName(a),l=uv({name:i});return{name:i,file:l}}case m.e.FrontComponent:{const i=await this.getEntityName(a),l=ov({name:i});return{name:i,file:l}}case m.e.Role:{const i=await this.getEntityName(a),l=fv({name:i});return{name:i,file:l}}case m.e.Skill:{const i=await this.getEntityName(a),l=pv({name:i});return{name:i,file:l}}case m.e.Agent:{const i=await this.getEntityName(a),l=hv({name:i});return{name:i,file:l}}case m.e.View:{const l=(await this.getViewData()).name,d=Oo({name:l});return{name:l,file:d}}case m.e.NavigationMenuItem:{const i=await this.getEntityName(a),l=Po({name:i});return{name:i,file:l}}case m.e.PageLayout:{const i=await this.getEntityName(a),l=cv({name:i});return{name:i,file:l}}default:m.Te()}}async promptAndCreateViewAndNavigationMenuItem(a,i){const{createViewAndNavItem:l}=await $e.default.prompt([{type:"confirm",name:"createViewAndNavItem",message:"Also create a view and navigation menu item for this object? (recommended)",default:!0}]);if(!l||!this.lastObjectUniversalIdentifier)return;const d=pe.v4(),A=Oo({name:`all-${Ce(a)}`,universalIdentifier:d,objectUniversalIdentifier:this.lastObjectUniversalIdentifier,fields:this.lastNameFieldUniversalIdentifier?[{fieldMetadataUniversalIdentifier:this.lastNameFieldUniversalIdentifier,position:0,isVisible:!0,size:200}]:[]}),E=i?X.join(ie,i):X.join(ie,Hi,this.getFolderName(m.e.View));await m.ensureDir(E);const M=`all-${Ce(a)}.ts`,L=X.join(E,M);if(await m.pathExists(L)){const{overwrite:G}=await this.handleFileExist();if(!G)return}await Cn.writeFile(L,A),console.log(y.default.green("✓ Created view:"),y.default.cyan(X.relative(ie,L)));const ue=Po({name:a,type:"OBJECT",targetObjectUniversalIdentifier:this.lastObjectUniversalIdentifier}),te=i?X.join(ie,i):X.join(ie,Hi,this.getFolderName(m.e.NavigationMenuItem));await m.ensureDir(te);const Y=`${Ce(a)}.ts`,Ke=X.join(te,Y);if(await m.pathExists(Ke)){const{overwrite:G}=await this.handleFileExist();if(!G)return}await Cn.writeFile(Ke,ue),console.log(y.default.green("✓ Created navigation menu item:"),y.default.cyan(X.relative(ie,Ke)))}async getEntity(){const{entity:a}=await $e.default.prompt([{type:"select",name:"entity",message:"What entity do you want to create?",default:"",choices:Object.values(m.e)}]);return a}async handleFileExist(){return await $e.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 $e.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 $e.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=>qi(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(m.R),default:m.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 $e.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=>qi(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=>qi(a.namePlural),validate:a=>!a||a.trim().length===0?"Please enter a non empty string":!0}])}async getViewData(){return $e.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`${Ce(a)}s`}getFileName(a,i){switch(i){case m.e.FrontComponent:return`${Ce(a)}.tsx`;default:return`${Ce(a)}.ts`}}}const gv="2.0.0",Go={version:gv},vv=async f=>{const a=X.join(f,"package.json");if(await m.pathExists(a))try{const i=await Cn.readFile(a,"utf-8"),l=JSON.parse(i);return l.dependencies?.["twenty-sdk"]??l.devDependencies?.["twenty-sdk"]??void 0}catch{return}},Lo=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},Xt=async f=>{const a=Go.version,i=await vv(f);if(!i)return;const l=Lo(a),d=Lo(i);l===null||d===null||l!==d&&(console.warn(y.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.
218
218
  Update with: npm install -g twenty-sdk@${d}`)),console.warn(""))};class mv{async execute(a){const i=a.appPath??ie;await Xt(i),console.log(y.default.blue("Building application...")),console.log(y.default.gray(`App path: ${i}
219
219
  `));const l=await m.appBuild({appPath:i,tarball:a.tarball,onProgress:d=>console.log(y.default.gray(d))});l.success||(console.error(y.default.red(l.error.message)),process.exit(1)),console.log(y.default.green(`✓ Build succeeded (${l.data.fileCount} file${l.data.fileCount===1?"":"s"})`)),console.log(y.default.gray(`Output: ${l.data.outputDir}`)),l.data.tarballPath&&console.log(y.default.gray(`Tarball: ${l.data.tarballPath}`))}}class _v{async execute(a){a.remote&&m.ConfigService.setActiveRemote(a.remote),console.log(y.default.blue("Syncing marketplace catalog..."));const l=await new m.ApiService().syncMarketplaceCatalog();l.success||(console.error(y.default.red(`Catalog sync failed: ${l.error instanceof Error?l.error.message:String(l.error)}`)),process.exit(1)),console.log(y.default.green("✓ Marketplace catalog synced successfully"))}}class yv{async execute(a){const i=a.appPath??ie;await Xt(i),console.log(y.default.blue("Deploying application...")),console.log(y.default.gray(`App path: ${i}
220
220
  `));const l=E=>console.log(y.default.gray(E)),d=await m.appBuild({appPath:i,tarball:!0,onProgress:l});d.success||(console.error(y.default.red(d.error.message)),process.exit(1));const A=await m.appDeploy({tarballPath:d.data.tarballPath,remote:a.remote,onProgress:l});A.success||(console.error(y.default.red(A.error.message)),process.exit(1)),console.log(y.default.green("✓ Deployed successfully"))}}class wv{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 m.buildAndValidateManifest(a.appPath);if(!d.success){for(const E of d.errors)l.push({message:E,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 E of d.warnings)l.push({message:`⚠ ${E}`,status:"warning"});l.push({message:"Successfully built manifest",status:"success"});const A={manifest:d.manifest,filePaths:d.filePaths};return i.output={result:A},i.status="done",this.state.updatePipeline({appName:d.manifest.application.displayName}),this.state.updateEntitiesFromManifest(d.filePaths),this.state.applyStepEvents(l),A}}class Sv{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 m.detectLocalServer();return d&&!this.hasRetried?(this.hasRetried=!0,await new m.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
@@ -4230,7 +4230,7 @@ class ov {
4230
4230
  }
4231
4231
  }
4232
4232
  }
4233
- const uv = "1.23.0", lu = {
4233
+ const uv = "2.0.0", lu = {
4234
4234
  version: uv
4235
4235
  }, lv = async (h) => {
4236
4236
  const a = pe(h, "package.json");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "twenty-sdk",
3
- "version": "1.23.0",
3
+ "version": "2.0.0",
4
4
  "sideEffects": false,
5
5
  "bin": {
6
6
  "twenty": "dist/cli.cjs"
@@ -73,7 +73,7 @@
73
73
  "react": "^19.0.0",
74
74
  "react-dom": "^19.0.0",
75
75
  "tinyglobby": "^0.2.15",
76
- "twenty-client-sdk": "1.23.0",
76
+ "twenty-client-sdk": "2.0.0",
77
77
  "typescript": "^5.9.2",
78
78
  "uuid": "^13.0.0",
79
79
  "vite": "^7.0.0",