From 57dc1ae6e8f98fb73260eff0dbef626798e7414f Mon Sep 17 00:00:00 2001 From: martmull Date: Fri, 19 Dec 2025 16:40:12 +0100 Subject: [PATCH] Fix create twenty app template (#16708) Adds a default function role to scaffolded application --- packages/create-twenty-app/package.json | 2 +- .../src/utils/app-template.ts | 47 ++++++++++++++++++- packages/twenty-sdk/package.json | 2 +- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/packages/create-twenty-app/package.json b/packages/create-twenty-app/package.json index 708cbbb0d0..b4962a7318 100644 --- a/packages/create-twenty-app/package.json +++ b/packages/create-twenty-app/package.json @@ -1,6 +1,6 @@ { "name": "create-twenty-app", - "version": "0.2.2", + "version": "0.2.3", "description": "Command-line interface to create Twenty application", "main": "dist/cli.cjs", "bin": "dist/cli.cjs", diff --git a/packages/create-twenty-app/src/utils/app-template.ts b/packages/create-twenty-app/src/utils/app-template.ts index 1cedb91386..149b12f56b 100644 --- a/packages/create-twenty-app/src/utils/app-template.ts +++ b/packages/create-twenty-app/src/utils/app-template.ts @@ -2,6 +2,8 @@ import * as fs from 'fs-extra'; import { join } from 'path'; import { v4 } from 'uuid'; +const SOURCE_FOLDER = 'src'; + export const copyBaseApplicationProject = async ({ appName, appDisplayName, @@ -21,10 +23,23 @@ export const copyBaseApplicationProject = async ({ await createYarnLock(appDirectory); + const sourceFolderPath = join(appDirectory, SOURCE_FOLDER); + + await fs.ensureDir(sourceFolderPath); + + const defaultServerlessFunctionRoleUniversalIdentifier = v4(); + + await createDefaultServerlessFunctionRoleConfig({ + displayName: appDisplayName, + appDirectory: sourceFolderPath, + defaultServerlessFunctionRoleUniversalIdentifier, + }); + await createApplicationConfig({ displayName: appDisplayName, description: appDescription, - appDirectory, + appDirectory: sourceFolderPath, + defaultServerlessFunctionRoleUniversalIdentifier, }); }; @@ -76,14 +91,41 @@ yarn-error.log* await fs.writeFile(join(appDirectory, '.gitignore'), gitignoreContent); }; +const createDefaultServerlessFunctionRoleConfig = async ({ + displayName, + appDirectory, + defaultServerlessFunctionRoleUniversalIdentifier, +}: { + displayName: string; + appDirectory: string; + defaultServerlessFunctionRoleUniversalIdentifier: string; +}) => { + const content = `import { PermissionFlag, type RoleConfig } from 'twenty-sdk'; + +export const functionRole: RoleConfig = { + universalIdentifier: '${defaultServerlessFunctionRoleUniversalIdentifier}', + label: '${displayName} default function role', + description: '${displayName} default function role', + canReadAllObjectRecords: true, + canUpdateAllObjectRecords: true, + canSoftDeleteAllObjectRecords: true, + canDestroyAllObjectRecords: false, +}; +`; + + await fs.writeFile(join(appDirectory, 'role.config.ts'), content); +}; + const createApplicationConfig = async ({ displayName, description, appDirectory, + defaultServerlessFunctionRoleUniversalIdentifier, }: { displayName: string; description?: string; appDirectory: string; + defaultServerlessFunctionRoleUniversalIdentifier: string; }) => { const content = `import { type ApplicationConfig } from 'twenty-sdk'; @@ -91,6 +133,7 @@ const config: ApplicationConfig = { universalIdentifier: '${v4()}', displayName: '${displayName}', description: '${description ?? ''}', + functionRoleUniversalIdentifier: '${defaultServerlessFunctionRoleUniversalIdentifier}', }; export default config; @@ -127,7 +170,7 @@ const createPackageJson = async ({ auth: 'twenty auth login', }, dependencies: { - 'twenty-sdk': '0.2.2', + 'twenty-sdk': '0.2.3', }, devDependencies: { '@types/node': '^24.7.2', diff --git a/packages/twenty-sdk/package.json b/packages/twenty-sdk/package.json index ca1e8b6847..4fcc3c273c 100644 --- a/packages/twenty-sdk/package.json +++ b/packages/twenty-sdk/package.json @@ -1,6 +1,6 @@ { "name": "twenty-sdk", - "version": "0.2.2", + "version": "0.2.3", "main": "dist/index.cjs", "module": "dist/index.mjs", "types": "dist/index.d.ts",