diff --git a/packages/twenty-docs/l/ar/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/ar/developers/extend/capabilities/apps.mdx index 0cf9719aed..7432c8f3c2 100644 --- a/packages/twenty-docs/l/ar/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/ar/developers/extend/capabilities/apps.mdx @@ -50,15 +50,12 @@ yarn app:dev ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn app:create-entity +yarn entity:add # Generate a typed Twenty client and workspace entity types yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Watch your application's function logs yarn function:logs # Execute a function by name @@ -68,7 +65,7 @@ yarn function:execute -n my-function -p '{"name": "test"}' yarn app:uninstall # Display commands' help -yarn app:help +yarn help ``` راجع أيضًا: صفحات مرجع CLI لـ [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) و[twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # مطلوب - التكوين الرئيسي للتطبيق - default-function.role.ts # الدور الافتراضي للوظائف بدون خادم - // الكيانات الخاصة بك (*.object.ts, *.function.ts, *.role.ts) - utils/ # اختياري - تنفيذات المُعالِجات والأدوات المساعدة + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### الاتفاقية فوق التهيئة تستخدم التطبيقات نهج **الاتفاقية فوق التهيئة** حيث تُكتشف الكيانات عبر لاحقة اسم الملف. يتيح ذلك تنظيمًا مرنًا داخل مجلد `src/app/`: -| لاحقة الملف | نوع الكيان | -| --------------- | ---------------------- | -| `*.object.ts` | تعريفات كائنات مخصصة | -| `*.function.ts` | تعريفات وظائف بلا خادم | -| `*.role.ts` | تعريفات الأدوار | +| لاحقة الملف | نوع الكيان | +| ----------------------- | --------------------------- | +| `*.object.ts` | تعريفات كائنات مخصصة | +| `*.function.ts` | تعريفات وظائف بلا خادم | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | تعريفات الأدوار | ### طرق تنظيم المجلدات المدعومة @@ -121,12 +119,14 @@ my-twenty-app/ **تقليدي (حسب النوع):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **حسب الميزة:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **مسطح:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` بشكل عام: -* **package.json**: يصرّح باسم التطبيق والإصدار والمحرّكات (Node 24+، Yarn 4)، ويضيف `twenty-sdk` فضلًا عن نصوص مثل `dev` و`sync` و`generate` و`create-entity` و`logs` و`uninstall` و`auth` التي تفوِّض إلى `twenty` CLI المحلي. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: يتجاهل العناصر الشائعة مثل `node_modules` و`.yarn` و`generated/` (عميل مضبوط الأنواع) و`dist/` و`build/` ومجلدات التغطية وملفات السجلات وملفات `.env*`. * **yarn.lock**، **.yarnrc.yml**، **.yarn/**: تقوم بقفل وتكوين حزمة أدوات Yarn 4 المستخدمة في المشروع. * **.nvmrc**: يثبّت إصدار Node.js المتوقع للمشروع. * **eslint.config.mjs** و**tsconfig.json**: يقدّمان إعدادات الفحص والتهيئة لـ TypeScript لمصادر TypeScript في تطبيقك. * **README.md**: ملف README قصير في جذر التطبيق يتضمن تعليمات أساسية. -* **src/app/**: المكان الرئيسي حيث تعرّف تطبيقك ككود: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: التكوين العام لتطبيقك (بيانات وصفية وربط وقت التشغيل). انظر "تكوين التطبيق" أدناه. * `*.role.ts`: تعريفات الأدوار المستخدمة بواسطة وظائفك بلا خادم. انظر "الدور الافتراضي للوظيفة" أدناه. * `*.object.ts`: تعريفات كائنات مخصصة. * `*.function.ts`: تعريفات وظائف بلا خادم. -* **src/utils/**: مجلد اختياري لتنفيذات المعالجات والأدوات المساعدة. + * `*.front-component.tsx`: Front component definitions. ستضيف الأوامر اللاحقة مزيدًا من الملفات والمجلدات: * `yarn app:generate` سيُنشئ مجلدًا `generated/` (عميل Twenty مضبوط الأنواع + أنواع مساحة العمل). -* `yarn app:create-entity` سيضيف ملفات تعريف الكيانات تحت `src/app/` لكائناتك المخصصة أو الوظائف أو الأدوار. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## المصادقة @@ -302,63 +303,12 @@ export default defineObject({ * `universalIdentifier` يجب أن يكون فريدًا وثابتًا عبر عمليات النشر. * يتطلب كل حقل `name` و`type` و`label` ومعرّف `universalIdentifier` ثابتًا خاصًا به. * المصفوفة `fields` اختيارية — يمكنك تعريف كائنات بدون حقول مخصصة. -* يمكنك إنشاء كائنات جديدة باستخدام `yarn app:create-entity`، والذي يرشدك خلال التسمية والحقول والعلاقات. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **يتم إنشاء الحقول الأساسية تلقائيًا.** عند تعريف كائن مخصص، يضيف Twenty تلقائيًا حقولًا قياسية مثل `name` و`createdAt` و`updatedAt` و`createdBy` و`position` و`deletedAt`. لا تحتاج إلى تعريف هذه في مصفوفة `fields` — أضف فقط حقولك المخصصة. - - يمكنك أيضًا تعريف كائنات باستخدام مزيّنات TypeScript. يستخدم هذا النهج صياغة معتمدة على الأصناف مع مزيّنات `@Object` و`@Field` و`@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - ملاحظة: يتطلب نهج المزيّنات `experimentalDecorators` في تهيئة TypeScript لديك. - - ### تكوين التطبيق (application.config.ts) كل تطبيق لديه ملف واحد `application.config.ts` يصف: @@ -469,14 +419,9 @@ export default defineRole({ // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { يمكنك إنشاء وظائف جديدة بطريقتين: -* **مُنشأ بالقالب**: شغّل `yarn app:create-entity` واختر خيار إضافة وظيفة جديدة. يُولّد هذا ملفًا مبدئيًا مع معالج وتكوين. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. يُولّد هذا ملفًا مبدئيًا مع معالج وتكوين. * **يدوي**: أنشئ ملفًا جديدًا `*.function.ts` واستخدم `defineFunction()` مع اتباع النمط نفسه. ### عميل مُولَّد مضبوط الأنواع @@ -641,13 +586,13 @@ const handler = async (event: RoutePayload) => { شغّل yarn app:generate لإنشاء عميل محلي مضبوط الأنواع في generated/ استنادًا إلى مخطط مساحة العمل لديك. استخدمه في وظائفك: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -يُعاد توليد العميل بواسطة `yarn app:generate`. أعِد تشغيله بعد تغيير كائناتك وتشغيل `yarn app:sync` أو عند الانضمام إلى مساحة عمل جديدة. +يُعاد توليد العميل بواسطة `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### بيانات الاعتماد في وقت التشغيل في الوظائف بلا خادم @@ -679,25 +624,29 @@ yarn add -D twenty-sdk ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -يمكنك الآن تشغيل الأوامر نفسها عبر Yarn، مثل `yarn app:dev` و`yarn app:sync`، إلخ. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## استكشاف الأخطاء وإصلاحها * أخطاء المصادقة: شغّل `yarn auth:login` وتأكد من أن مفتاح واجهة برمجة التطبيقات لديك يمتلك الأذونات المطلوبة. * يتعذّر الاتصال بالخادم: تحقق من عنوان URL لواجهة البرمجة وأن خادم Twenty قابل للوصول. -* الأنواع أو العميل مفقود/قديم: شغّل `yarn app:generate` ثم `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * وضع التطوير لا يزامن: تأكد من أن `yarn app:dev` قيد التشغيل وأن التغييرات ليست متجاهلة من بيئتك. قناة المساعدة على Discord: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/cs/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/cs/developers/extend/capabilities/apps.mdx index 18fe47cb0c..6c7a01c20a 100644 --- a/packages/twenty-docs/l/cs/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/cs/developers/extend/capabilities/apps.mdx @@ -50,15 +50,12 @@ Odtud můžete: ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn app:create-entity +yarn entity:add # Generate a typed Twenty client and workspace entity types yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Watch your application's function logs yarn function:logs # Execute a function by name @@ -68,7 +65,7 @@ yarn function:execute -n my-function -p '{"name": "test"}' yarn app:uninstall # Display commands' help -yarn app:help +yarn help ``` Viz také: referenční stránky CLI pro [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) a [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Povinné - hlavní konfigurace aplikace - default-function.role.ts # Výchozí role pro serverless funkce - // vaše entity (*.object.ts, *.function.ts, *.role.ts) - utils/ # Volitelné - implementace handlerů a nástroje + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Konvence před konfigurací Aplikace používají přístup **konvence před konfigurací**, kde jsou entity detekovány podle přípony souboru. To umožňuje flexibilní organizaci ve složce `src/app/`: -| Přípona souboru | Typ entity | -| --------------- | -------------------------- | -| `*.object.ts` | Definice vlastních objektů | -| `*.function.ts` | Definice serverless funkcí | -| `*.role.ts` | Definice rolí | +| Přípona souboru | Typ entity | +| ----------------------- | --------------------------- | +| `*.object.ts` | Definice vlastních objektů | +| `*.function.ts` | Definice serverless funkcí | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | Definice rolí | ### Podporované uspořádání složek @@ -121,12 +119,14 @@ Entity můžete uspořádat podle některého z těchto vzorů: **Tradiční (podle typu):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Podle funkcí:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Plochá:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` V kostce: -* **package.json**: Deklaruje název aplikace, verzi, engines (Node 24+, Yarn 4) a přidává `twenty-sdk` plus skripty jako `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` a `auth`, které delegují na lokální `twenty` CLI. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: Ignoruje běžné artefakty jako `node_modules`, `.yarn`, `generated/` (typovaný klient), `dist/`, `build/`, složky s coverage, logy a soubory `.env*`. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Zamykají a konfigurují nástrojový řetězec Yarn 4 používaný projektem. * **.nvmrc**: Fixuje verzi Node.js požadovanou projektem. * **eslint.config.mjs** a **tsconfig.json**: Poskytují lintování a konfiguraci TypeScriptu pro zdrojové soubory vaší aplikace v TypeScriptu. * **README.md**: Krátké README v kořeni aplikace se základními pokyny. -* **src/app/**: Hlavní místo, kde definujete svou aplikaci jako kód: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Globální konfigurace vaší aplikace (metadata a napojení za běhu). Viz „Konfigurace aplikace“ níže. * `*.role.ts`: Definice rolí používané vašimi serverless funkcemi. Viz „Výchozí role funkce“ níže. * `*.object.ts`: Definice vlastních objektů. * `*.function.ts`: Definice serverless funkcí. -* **src/utils/**: Volitelná složka pro implementace obslužných funkcí a pomocné nástroje. + * `*.front-component.tsx`: Front component definitions. Pozdější příkazy přidají další soubory a složky: * `yarn app:generate` vytvoří složku `generated/` (typovaný klient Twenty + typy pracovního prostoru). -* `yarn app:create-entity` přidá soubory s definicemi entit do `src/app/` pro vaše vlastní objekty, funkce nebo role. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Ověření @@ -302,63 +303,12 @@ Hlavní body: * Hodnota `universalIdentifier` musí být jedinečná a stabilní napříč nasazeními. * Každé pole vyžaduje `name`, `type`, `label` a svůj vlastní stabilní `universalIdentifier`. * Pole `fields` je volitelné — objekty můžete definovat i bez vlastních polí. -* Nové objekty můžete vygenerovat pomocí `yarn app:create-entity`, který vás provede pojmenováním, poli a vztahy. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Základní pole jsou vytvořena automaticky.** Když definujete vlastní objekt, Twenty automaticky přidá standardní pole jako `name`, `createdAt`, `updatedAt`, `createdBy`, `position` a `deletedAt`. Nemusíte je definovat v poli `fields` — přidejte pouze svá vlastní pole. - - Objekty můžete definovat také pomocí dekorátorů TypeScriptu. Tento přístup používá třídovou syntaxi s dekorátory `@Object`, `@Field` a `@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Poznámka: Přístup s dekorátory vyžaduje `experimentalDecorators` v konfiguraci TypeScriptu. - - ### Konfigurace aplikace (application.config.ts) Každá aplikace má jeden soubor `application.config.ts`, který popisuje: @@ -469,14 +419,9 @@ Každý soubor funkce používá `defineFunction()` k exportu konfigurace s obsl // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Nové funkce můžete vytvářet dvěma způsoby: -* **Vygenerované**: Spusťte `yarn app:create-entity` a zvolte možnost přidat novou funkci. Tím se vygeneruje startovací soubor s obslužnou funkcí a konfigurací. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Tím se vygeneruje startovací soubor s obslužnou funkcí a konfigurací. * **Ruční**: Vytvořte nový soubor `*.function.ts` a použijte `defineFunction()` podle stejného vzoru. ### Generovaný typovaný klient @@ -641,13 +586,13 @@ Nové funkce můžete vytvářet dvěma způsoby: Spusťte yarn app:generate a vytvořte lokálního typovaného klienta v generated/ na základě schématu vašeho pracovního prostoru. Použijte jej ve svých funkcích: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -Klient je znovu generován příkazem `yarn app:generate`. Spusťte jej znovu po změně objektů a po `yarn app:sync`, případně při připojení k novému pracovnímu prostoru. +Klient je znovu generován příkazem `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### Běhové přihlašovací údaje v serverless funkcích @@ -679,25 +624,29 @@ Poté přidejte skripty jako tyto: ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Nyní můžete spouštět stejné příkazy přes Yarn, např. `yarn app:dev`, `yarn app:sync` atd. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Řešení potíží * Chyby ověření: spusťte `yarn auth:login` a ujistěte se, že váš klíč API má požadovaná oprávnění. * Nelze se připojit k serveru: ověřte URL API a že je server Twenty dosažitelný. -* Typy nebo klient chybí/jsou zastaralé: spusťte `yarn app:generate` a poté `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * Režim vývoje nesynchronizuje: ujistěte se, že běží `yarn app:dev` a že vaše prostředí změny neignoruje. Kanál podpory na Discordu: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/de/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/de/developers/extend/capabilities/apps.mdx index a4c0ae118a..a54f01c334 100644 --- a/packages/twenty-docs/l/de/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/de/developers/extend/capabilities/apps.mdx @@ -50,15 +50,12 @@ Von hier aus können Sie: ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn app:create-entity +yarn entity:add # Generate a typed Twenty client and workspace entity types yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Watch your application's function logs yarn function:logs # Execute a function by name @@ -68,7 +65,7 @@ yarn function:execute -n my-function -p '{"name": "test"}' yarn app:uninstall # Display commands' help -yarn app:help +yarn help ``` Siehe auch: die CLI-Referenzseiten für [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) und [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Required - main application configuration - default-function.role.ts # Default role for serverless functions - // your entities (*.object.ts, *.function.ts, *.role.ts) - utils/ # Optional - handler implementations & utilities + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Konvention vor Konfiguration Anwendungen verwenden einen Ansatz **Konvention vor Konfiguration**, bei dem Entitäten anhand ihrer Dateiendung erkannt werden. Dies ermöglicht eine flexible Organisation im Ordner `src/app/`: -| Dateiendung | Entitätstyp | -| --------------- | ------------------------------------- | -| `*.object.ts` | Benutzerdefinierte Objektdefinitionen | -| `*.function.ts` | Definitionen serverloser Funktionen | -| `*.role.ts` | Rollendefinitionen | +| Dateiendung | Entitätstyp | +| ----------------------- | ------------------------------------- | +| `*.object.ts` | Benutzerdefinierte Objektdefinitionen | +| `*.function.ts` | Definitionen serverloser Funktionen | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | Rollendefinitionen | ### Unterstützte Ordnerorganisationen @@ -121,12 +119,14 @@ Sie können Ihre Entitäten nach einem der folgenden Muster organisieren: **Traditionell (nach Typ):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Feature-basiert:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Flach:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` Auf hoher Ebene: -* **package.json**: Deklariert App-Name, Version, Engines (Node 24+, Yarn 4) und fügt `twenty-sdk` sowie Skripte wie `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` und `auth` hinzu, die an die lokale `twenty`-CLI delegieren. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: Ignoriert übliche Artefakte wie `node_modules`, `.yarn`, `generated/` (typisierter Client), `dist/`, `build/`, Coverage-Ordner, Logdateien und `.env*`-Dateien. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Fixieren und konfigurieren die vom Projekt verwendete Yarn-4-Toolchain. * **.nvmrc**: Legt die vom Projekt erwartete Node.js-Version fest. * **eslint.config.mjs** und **tsconfig.json**: Stellen Linting und TypeScript-Konfiguration für die TypeScript-Quellen Ihrer App bereit. * **README.md**: Ein kurzes README im App-Root mit grundlegenden Anweisungen. -* **src/app/**: Der Hauptort, an dem Sie Ihre Anwendung als Code definieren: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Globale Konfiguration für Ihre App (Metadaten und Laufzeit-Anbindung). Siehe unten „Anwendungskonfiguration“. * `*.role.ts`: Rollendefinitionen, die von Ihren serverlosen Funktionen verwendet werden. Siehe unten „Standard-Funktionsrolle“. * `*.object.ts`: Benutzerdefinierte Objektdefinitionen. * `*.function.ts`: Definitionen serverloser Funktionen. -* **src/utils/**: Optionaler Ordner für Handler-Implementierungen und Utilities. + * `*.front-component.tsx`: Front component definitions. Spätere Befehle fügen weitere Dateien und Ordner hinzu: * `yarn app:generate` erstellt einen `generated/`-Ordner (typisierter Twenty-Client + Workspace-Typen). -* `yarn app:create-entity` fügt unter `src/app/` Entitätsdefinitionsdateien für Ihre benutzerdefinierten Objekte, Funktionen oder Rollen hinzu. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Authentifizierung @@ -302,63 +303,12 @@ Hauptpunkte: * Der `universalIdentifier` muss eindeutig und über Deployments hinweg stabil sein. * Jedes Feld benötigt `name`, `type`, `label` und einen eigenen stabilen `universalIdentifier`. * Das Array `fields` ist optional — Sie können Objekte ohne benutzerdefinierte Felder definieren. -* Sie können mit `yarn app:create-entity` neue Objekte erzeugen; der Assistent führt Sie durch Benennung, Felder und Beziehungen. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Basisfelder werden automatisch erstellt.** Wenn Sie ein benutzerdefiniertes Objekt definieren, fügt Twenty automatisch Standardfelder wie `name`, `createdAt`, `updatedAt`, `createdBy`, `position` und `deletedAt` hinzu. Sie müssen diese nicht in Ihrem `fields`-Array definieren — fügen Sie nur Ihre benutzerdefinierten Felder hinzu. - - Sie können Objekte auch mit TypeScript-Dekoratoren definieren. Dieser Ansatz verwendet klassenbasierte Syntax mit den Dekoratoren `@Object`, `@Field` und `@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Hinweis: Der Dekorator-Ansatz erfordert `experimentalDecorators` in Ihrer TypeScript-Konfiguration. - - ### Anwendungskonfiguration (application.config.ts) Jede App hat eine einzelne Datei `application.config.ts`, die Folgendes beschreibt: @@ -469,14 +419,9 @@ Jede Funktionsdatei verwendet `defineFunction()`, um eine Konfiguration mit eine // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Sie können neue Funktionen auf zwei Arten erstellen: -* **Generiert**: Führen Sie `yarn app:create-entity` aus und wählen Sie die Option zum Hinzufügen einer neuen Funktion. Dadurch wird eine Starterdatei mit Handler und Konfiguration erzeugt. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Dadurch wird eine Starterdatei mit Handler und Konfiguration erzeugt. * **Manuell**: Erstellen Sie eine neue `*.function.ts`-Datei und verwenden Sie `defineFunction()` nach demselben Muster. ### Generierter typisierter Client @@ -641,13 +586,13 @@ Sie können neue Funktionen auf zwei Arten erstellen: Führen Sie yarn app:generate aus, um einen lokalen typisierten Client in generated/ basierend auf Ihrem Workspace-Schema zu erstellen. Verwenden Sie ihn in Ihren Funktionen: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -Der Client wird durch `yarn app:generate` erneut generiert. Führen Sie ihn nach Änderungen an Ihren Objekten und nach `yarn app:sync` bzw. beim Onboarding in einen neuen Workspace erneut aus. +Der Client wird durch `yarn app:generate` erneut generiert. Re-run after changing your objects or when onboarding to a new workspace. #### Laufzeit-Anmeldedaten in serverlosen Funktionen @@ -679,25 +624,29 @@ Fügen Sie dann Skripte wie diese hinzu: ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Jetzt können Sie dieselben Befehle über Yarn ausführen, z. B. `yarn app:dev`, `yarn app:sync` usw. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Fehlerbehebung * Authentifizierungsfehler: Führen Sie `yarn auth:login` aus und stellen Sie sicher, dass Ihr API-Schlüssel die erforderlichen Berechtigungen hat. * Verbindung zum Server nicht möglich: Überprüfen Sie die API-URL und dass der Twenty-Server erreichbar ist. -* Typen oder Client fehlen/veraltet: Führen Sie `yarn app:generate` und anschließend `yarn app:dev` aus. +* Types or client missing/outdated: run `yarn app:generate`. * Dev-Modus synchronisiert nicht: Stellen Sie sicher, dass `yarn app:dev` läuft und dass Änderungen von Ihrer Umgebung nicht ignoriert werden. Discord-Hilfekanal: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx index 64760e33e0..c285c96986 100644 --- a/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx @@ -49,26 +49,23 @@ yarn app:dev Desde aquí usted puede: ```bash filename="Terminal" -# Add a new entity to your application (guided) -yarn app:create-entity +# Añade una nueva entidad a tu aplicación (guiado) +yarn entity:add -# Generate a typed Twenty client and workspace entity types +# Genera un cliente tipado de Twenty y tipos de entidad del espacio de trabajo yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Supervisa los registros de funciones de tu aplicación yarn function:logs -# Execute a function by name -yarn function:execute -n my-function -p '{"name": "test"}' +# Ejecuta una función por nombre +yarn function:execute -n my-function -p '{\"name\": \"test\"}' -# Uninstall the application from the current workspace +# Desinstala la aplicación del espacio de trabajo actual yarn app:uninstall -# Display commands' help -yarn app:help +# Muestra la ayuda de los comandos +yarn help ``` Consulta también: las páginas de referencia de la CLI para [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) y [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Obligatorio - configuración principal de la aplicación - default-function.role.ts # Rol predeterminado para las funciones sin servidor - // tus entidades (*.object.ts, *.function.ts, *.role.ts) - utils/ # Opcional - implementaciones de manejadores y utilidades + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Convención sobre configuración Las aplicaciones usan un enfoque de **convención sobre configuración** en el que las entidades se detectan por su sufijo de archivo. Esto permite una organización flexible dentro de la carpeta `src/app/`: -| Sufijo de archivo | Tipo de entidad | -| ----------------- | -------------------------------------- | -| `*.object.ts` | Definiciones de objetos personalizados | -| `*.function.ts` | Definiciones de funciones sin servidor | -| `*.role.ts` | Definiciones de roles | +| Sufijo de archivo | Tipo de entidad | +| ----------------------- | --------------------------------------- | +| `*.object.ts` | Definiciones de objetos personalizados | +| `*.function.ts` | Definiciones de funciones sin servidor | +| `*.front-component.tsx` | Definiciones de componentes de interfaz | +| `*.role.ts` | Definiciones de roles | ### Organizaciones de carpetas compatibles @@ -121,12 +119,14 @@ Puedes organizar tus entidades con cualquiera de estos patrones: **Tradicional (por tipo):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Basado en funcionalidades:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Plano:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` A grandes rasgos: -* **package.json**: Declara el nombre de la aplicación, la versión, los entornos (Node 24+, Yarn 4) y agrega `twenty-sdk` además de scripts como `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` y `auth` que delegan en la CLI local `twenty`. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: Ignora artefactos comunes como `node_modules`, `.yarn`, `generated/` (cliente tipado), `dist/`, `build/`, carpetas de cobertura, archivos de registro y archivos `.env*`. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Bloquean y configuran la cadena de herramientas Yarn 4 utilizada por el proyecto. * **.nvmrc**: Fija la versión de Node.js esperada por el proyecto. * **eslint.config.mjs** y **tsconfig.json**: Proporcionan linting y configuración de TypeScript para las fuentes de TypeScript de tu aplicación. * **README.md**: Un README breve en la raíz de la aplicación con instrucciones básicas. -* **src/app/**: El lugar principal donde defines tu aplicación como código: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Configuración global de tu aplicación (metadatos y vinculación en tiempo de ejecución). Consulta "Configuración de la aplicación" más abajo. * `*.role.ts`: Definiciones de roles usadas por tus funciones sin servidor. Consulta "Rol de función predeterminado" más abajo. * `*.object.ts`: Definiciones de objetos personalizados. * `*.function.ts`: Definiciones de funciones sin servidor. -* **src/utils/**: Carpeta opcional para implementaciones de controladores y utilidades. + * `*.front-component.tsx`: Front component definitions. Comandos posteriores añadirán más archivos y carpetas: * `yarn app:generate` creará una carpeta `generated/` (cliente tipado de Twenty + tipos del espacio de trabajo). -* `yarn app:create-entity` añadirá archivos de definición de entidades en `src/app/` para tus objetos, funciones o roles personalizados. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Autenticación @@ -302,63 +303,12 @@ Puntos clave: * El `universalIdentifier` debe ser único y estable entre implementaciones. * Cada campo requiere `name`, `type`, `label` y su propio `universalIdentifier` estable. * La matriz `fields` es opcional: puedes definir objetos sin campos personalizados. -* Puedes generar nuevos objetos usando `yarn app:create-entity`, que te guía por el nombrado, los campos y las relaciones. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Los campos base se crean automáticamente.** Cuando defines un objeto personalizado, Twenty añade automáticamente campos estándar como `name`, `createdAt`, `updatedAt`, `createdBy`, `position` y `deletedAt`. No necesitas definir estos en tu matriz `fields` — solo agrega tus campos personalizados. - - También puedes definir objetos usando decoradores de TypeScript. Este enfoque usa sintaxis basada en clases con los decoradores `@Object`, `@Field` y `@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Nota: El enfoque de decoradores requiere `experimentalDecorators` en tu configuración de TypeScript. - - ### Configuración de la aplicación (application.config.ts) Cada aplicación tiene un único archivo `application.config.ts` que describe: @@ -469,14 +419,9 @@ Cada archivo de función usa `defineFunction()` para exportar una configuración // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Puedes crear funciones nuevas de dos maneras: -* **Generado**: Ejecuta `yarn app:create-entity` y elige la opción para añadir una nueva función. Esto genera un archivo inicial con un controlador y configuración. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Esto genera un archivo inicial con un controlador y configuración. * **Manual**: Crea un nuevo archivo `*.function.ts` y usa `defineFunction()`, siguiendo el mismo patrón. ### Cliente tipado generado @@ -641,13 +586,13 @@ Puedes crear funciones nuevas de dos maneras: Ejecuta yarn app:generate para crear un cliente tipado local en generated/ basado en el esquema de tu espacio de trabajo. Úsalo en tus funciones: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -El cliente se vuelve a generar con `yarn app:generate`. Vuelve a ejecutarlo después de cambiar tus objetos y de hacer `yarn app:sync`, o al incorporarte a un nuevo espacio de trabajo. +El cliente se vuelve a generar con `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### Credenciales en tiempo de ejecución en funciones sin servidor @@ -679,25 +624,29 @@ Luego agrega scripts como estos: ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Ahora puedes ejecutar los mismos comandos mediante Yarn, p. ej., `yarn app:dev`, `yarn app:sync`, etc. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Solución de problemas * Errores de autenticación: ejecuta `yarn auth:login` y asegúrate de que tu clave de API tenga los permisos necesarios. * No se puede conectar al servidor: verifica la URL de la API y que el servidor de Twenty sea accesible. -* Tipos o cliente faltantes/obsoletos: ejecuta `yarn app:generate` y luego `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * El modo de desarrollo no sincroniza: asegúrate de que `yarn app:dev` esté ejecutándose y de que los cambios no sean ignorados por tu entorno. Canal de ayuda en Discord: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/fr/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/fr/developers/extend/capabilities/apps.mdx index ba5ccfb505..b8bb435e56 100644 --- a/packages/twenty-docs/l/fr/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/fr/developers/extend/capabilities/apps.mdx @@ -49,26 +49,23 @@ yarn app:dev À partir d'ici, vous pouvez : ```bash filename="Terminal" -# Add a new entity to your application (guided) -yarn app:create-entity +# Ajouter une nouvelle entité à votre application (assisté) +yarn entity:add -# Generate a typed Twenty client and workspace entity types +# Générer un client Twenty typé et les types d'entité de l'espace de travail yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Surveiller les journaux des fonctions de votre application yarn function:logs -# Execute a function by name +# Exécuter une fonction par nom yarn function:execute -n my-function -p '{"name": "test"}' -# Uninstall the application from the current workspace +# Désinstaller l'application de l'espace de travail actuel yarn app:uninstall -# Display commands' help -yarn app:help},{ +# Afficher l'aide des commandes +yarn help ``` Voir aussi : les pages de référence CLI pour [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) et [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Obligatoire - configuration principale de l'application - default-function.role.ts # Rôle par défaut pour les fonctions serverless - // vos entités (*.object.ts, *.function.ts, *.role.ts) - utils/ # Optionnel - implémentations de gestionnaires et utilitaires + application.config.ts # Obligatoire - configuration principale de l'application + default-function.role.ts # Rôle par défaut pour les fonctions serverless + hello-world.function.ts # Exemple de fonction serverless + hello-world.front-component.tsx # Exemple de composant frontal + // vos entités (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Convention plutôt que configuration Les applications adoptent une approche **convention plutôt que configuration** où les entités sont détectées par leur suffixe de fichier. Cela permet une organisation flexible dans le dossier `src/app/` : -| Suffixe de fichier | Type d’entité | -| ------------------ | ------------------------------------- | -| `*.object.ts` | Définitions d’objets personnalisés | -| `*.function.ts` | Définitions de fonctions sans serveur | -| `*.role.ts` | Définitions de rôles | +| Suffixe de fichier | Type d’entité | +| ----------------------- | ------------------------------------- | +| `*.object.ts` | Définitions d’objets personnalisés | +| `*.function.ts` | Définitions de fonctions sans serveur | +| `*.front-component.tsx` | Définitions des composants frontaux | +| `*.role.ts` | Définitions de rôles | ### Structures de dossiers prises en charge @@ -121,12 +119,14 @@ Vous pouvez organiser vos entités selon l’un des schémas suivants : **Traditionnelle (par type) :** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Par fonctionnalité :** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **À plat :** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` Dans les grandes lignes : -* **package.json** : Déclare le nom de l’application, la version, les moteurs (Node 24+, Yarn 4), et ajoute `twenty-sdk` ainsi que des scripts comme `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` et `auth` qui délèguent à la CLI locale `twenty`. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore** : Ignore les artefacts courants tels que `node_modules`, `.yarn`, `generated/` (client typé), `dist/`, `build/`, les dossiers de couverture, les fichiers journaux et les fichiers `.env*`. * **yarn.lock**, **.yarnrc.yml**, **.yarn/** : Verrouillent et configurent la chaîne d’outils Yarn 4 utilisée par le projet. * **.nvmrc** : Fige la version de Node.js attendue par le projet. * **eslint.config.mjs** et **tsconfig.json** : Fournissent la configuration de linting et TypeScript pour les sources TypeScript de votre application. * **README.md** : Un bref README à la racine de l’application avec des instructions de base. -* **src/app/** : L’endroit principal où vous définissez votre application sous forme de code : +* **src/**: The main place where you define your application-as-code: * `application.config.ts` : Configuration globale de votre application (métadonnées et liaisons d’exécution). Voir « Configuration de l’application » ci-dessous. * `*.role.ts` : Définitions de rôles utilisées par vos fonctions sans serveur. Voir « Rôle de fonction par défaut » ci-dessous. * `*.object.ts` : Définitions d’objets personnalisés. * `*.function.ts` : Définitions de fonctions sans serveur. -* **src/utils/** : Dossier facultatif pour les implémentations de gestionnaires et utilitaires. + * `*.front-component.tsx`: Front component definitions. Des commandes ultérieures ajouteront d’autres fichiers et dossiers : * `yarn app:generate` créera un dossier `generated/` (client Twenty typé + types de l’espace de travail). -* `yarn app:create-entity` ajoutera des fichiers de définition d’entité sous `src/app/` pour vos objets, fonctions ou rôles personnalisés. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Authentification @@ -302,63 +303,12 @@ Points clés : * Le `universalIdentifier` doit être unique et stable entre les déploiements. * Chaque champ nécessite un `name`, un `type`, un `label` et son propre `universalIdentifier` stable. * Le tableau `fields` est facultatif — vous pouvez définir des objets sans champs personnalisés. -* Vous pouvez générer de nouveaux objets avec `yarn app:create-entity`, qui vous guide à travers le nommage, les champs et les relations. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Les champs de base sont créés automatiquement.** Lorsque vous définissez un objet personnalisé, Twenty ajoute automatiquement des champs standard tels que `name`, `createdAt`, `updatedAt`, `createdBy`, `position` et `deletedAt`. Vous n'avez pas besoin de les définir dans votre tableau `fields` — ajoutez uniquement vos champs personnalisés. - - Vous pouvez également définir des objets à l’aide de décorateurs TypeScript. Cette approche utilise une syntaxe basée sur les classes avec les décorateurs `@Object`, `@Field` et `@Relation` : - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Remarque : l’approche avec décorateurs requiert `experimentalDecorators` dans votre configuration TypeScript. - - ### Configuration de l’application (application.config.ts) Chaque application dispose d’un seul fichier `application.config.ts` qui décrit : @@ -469,14 +419,9 @@ Chaque fichier de fonction utilise `defineFunction()` pour exporter une configur // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Vous pouvez créer de nouvelles fonctions de deux façons : -* **Générée** : Exécutez `yarn app:create-entity` et choisissez l’option pour ajouter une nouvelle fonction. Cela génère un fichier de démarrage avec un gestionnaire et une configuration. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Cela génère un fichier de démarrage avec un gestionnaire et une configuration. * **Manuelle** : Créez un nouveau fichier `*.function.ts` et utilisez `defineFunction()`, en suivant le même modèle. ### Client typé généré @@ -641,13 +586,13 @@ Vous pouvez créer de nouvelles fonctions de deux façons : Exécutez yarn app:generate pour créer un client typé local dans generated/ basé sur le schéma de votre espace de travail. Utilisez-le dans vos fonctions : ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -Le client est régénéré par `yarn app:generate`. Relancez la commande après avoir modifié vos objets et exécuté `yarn app:sync`, ou lors de l’intégration à un nouvel espace de travail. +Le client est régénéré par `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### Identifiants d’exécution dans les fonctions sans serveur @@ -679,25 +624,29 @@ Ajoutez ensuite des scripts comme ceux-ci : ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Vous pouvez désormais exécuter les mêmes commandes via Yarn, par exemple `yarn app:dev`, `yarn app:sync`, etc. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Résolution des problèmes * Erreurs d’authentification : exécutez `yarn auth:login` et assurez-vous que votre clé API dispose des autorisations requises. * Impossible de se connecter au serveur : vérifiez l’URL de l’API et que le serveur Twenty est accessible. -* Types ou client manquants/obsolètes : exécutez `yarn app:generate` puis `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * Le mode dev ne se synchronise pas : assurez-vous que `yarn app:dev` est en cours d’exécution et que les modifications ne sont pas ignorées par votre environnement. Canal d’aide Discord : https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/it/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/it/developers/extend/capabilities/apps.mdx index c7b7bfb544..c6ca0e9d79 100644 --- a/packages/twenty-docs/l/it/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/it/developers/extend/capabilities/apps.mdx @@ -50,25 +50,22 @@ Da qui puoi: ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn app:create-entity +yarn entity:add # Generate a typed Twenty client and workspace entity types yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Watch your application's function logs yarn function:logs # Execute a function by name -yarn function:execute -n my-function -p '{\"name\": \"test\"}' +yarn function:execute -n my-function -p '{"name": "test"}' # Uninstall the application from the current workspace yarn app:uninstall # Display commands' help -yarn app:help +yarn help ``` Vedi anche: le pagine di riferimento della CLI per [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) e [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Obbligatorio - configurazione principale dell'applicazione - default-function.role.ts # Ruolo predefinito per le funzioni serverless - // le tue entità (*.object.ts, *.function.ts, *.role.ts) - utils/ # Opzionale - implementazioni degli handler e utility + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Convenzioni invece della configurazione Le applicazioni usano un approccio basato sulle **convenzioni invece della configurazione** in cui le entità vengono rilevate in base al suffisso del file. Questo consente un'organizzazione flessibile all'interno della cartella `src/app/`: -| Suffisso del file | Tipo di entità | -| ----------------- | ------------------------------------- | -| `*.object.ts` | Definizioni di oggetti personalizzati | -| `*.function.ts` | Definizioni di funzioni serverless | -| `*.role.ts` | Definizioni di ruoli | +| Suffisso del file | Tipo di entità | +| ----------------------- | ------------------------------------- | +| `*.object.ts` | Definizioni di oggetti personalizzati | +| `*.function.ts` | Definizioni di funzioni serverless | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | Definizioni di ruoli | ### Organizzazioni di cartelle supportate @@ -121,12 +119,14 @@ Puoi organizzare le tue entità in uno qualsiasi di questi modelli: **Tradizionale (per tipo):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Per funzionalità:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Struttura piatta:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` A livello generale: -* **package.json**: Dichiara il nome dell'app, la versione, i motori (Node 24+, Yarn 4) e aggiunge `twenty-sdk`, oltre a script come `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` e `auth` che delegano alla CLI locale `twenty`. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: Ignora i file generati comuni come `node_modules`, `.yarn`, `generated/` (client tipizzato), `dist/`, `build/`, cartelle di coverage, file di log e file `.env*`. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Bloccano e configurano la toolchain Yarn 4 utilizzata dal progetto. * **.nvmrc**: Fissa la versione di Node.js prevista dal progetto. * **eslint.config.mjs** e **tsconfig.json**: Forniscono linting e configurazione TypeScript per i sorgenti TypeScript della tua app. * **README.md**: Un breve README nella radice dell'app con istruzioni di base. -* **src/app/**: Il luogo principale in cui definisci la tua applicazione come codice: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Configurazione globale della tua app (metadati e collegamenti di runtime). Vedi "Configurazione dell'applicazione" qui sotto. * `*.role.ts`: Definizioni di ruoli usate dalle tue funzioni serverless. Vedi "Ruolo funzione predefinito" qui sotto. * `*.object.ts`: Definizioni di oggetti personalizzati. * `*.function.ts`: Definizioni di funzioni serverless. -* **src/utils/**: Cartella opzionale per le implementazioni degli handler e le utility. + * `*.front-component.tsx`: Front component definitions. Comandi successivi aggiungeranno altri file e cartelle: * `yarn app:generate` creerà una cartella `generated/` (client Twenty tipizzato + tipi dello spazio di lavoro). -* `yarn app:create-entity` aggiungerà file di definizione delle entità sotto `src/app/` per i tuoi oggetti, funzioni o ruoli personalizzati. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Autenticazione @@ -302,63 +303,12 @@ Punti chiave: * Il `universalIdentifier` deve essere univoco e stabile tra i deployment. * Ogni campo richiede un `name`, `type`, `label` e il proprio `universalIdentifier` stabile. * L'array `fields` è facoltativo: puoi definire oggetti senza campi personalizzati. -* Puoi generare nuovi oggetti con `yarn app:create-entity`, che ti guida nella denominazione, nei campi e nelle relazioni. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **I campi base vengono creati automaticamente.** Quando definisci un oggetto personalizzato, Twenty aggiunge automaticamente i campi standard come `name`, `createdAt`, `updatedAt`, `createdBy`, `position` e `deletedAt`. Non è necessario definirli nel tuo array `fields` — aggiungi solo i tuoi campi personalizzati. - - Puoi anche definire oggetti utilizzando i decorator di TypeScript. Questo approccio utilizza una sintassi basata sulle classi con i decorator `@Object`, `@Field` e `@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Nota: L'approccio con i decorator richiede `experimentalDecorators` nella configurazione di TypeScript. - - ### Configurazione dell'applicazione (application.config.ts) Ogni app ha un singolo file `application.config.ts` che descrive: @@ -469,14 +419,9 @@ Ogni file di funzione usa `defineFunction()` per esportare una configurazione co // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Puoi creare nuove funzioni in due modi: -* **Generata dallo scaffolder**: Esegui `yarn app:create-entity` e scegli l'opzione per aggiungere una nuova funzione. Questo genera un file iniziale con un handler e una configurazione. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Questo genera un file iniziale con un handler e una configurazione. * **Manuale**: Crea un nuovo file `*.function.ts` e usa `defineFunction()`, seguendo lo stesso schema. ### Client tipizzato generato @@ -641,13 +586,13 @@ Puoi creare nuove funzioni in due modi: Esegui yarn app:generate per creare un client tipizzato locale in generated/ basato sullo schema del tuo spazio di lavoro. Usalo nelle tue funzioni: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -Il client viene rigenerato da `yarn app:generate`. Eseguilo nuovamente dopo aver modificato i tuoi oggetti e aver eseguito `yarn app:sync`, oppure quando effettui l'onboarding su un nuovo spazio di lavoro. +Il client viene rigenerato da `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### Credenziali di runtime nelle funzioni serverless @@ -679,25 +624,29 @@ Quindi aggiungi script come questi: ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Ora puoi eseguire gli stessi comandi tramite Yarn, ad esempio `yarn app:dev`, `yarn app:sync`, ecc. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Risoluzione dei problemi * Errori di autenticazione: esegui `yarn auth:login` e assicurati che la tua chiave API abbia i permessi richiesti. * Impossibile connettersi al server: verifica l'URL dell'API e che il server Twenty sia raggiungibile. -* Tipi o client mancanti/obsoleti: esegui `yarn app:generate` e poi `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * Modalità di sviluppo non in sincronizzazione: assicurati che `yarn app:dev` sia in esecuzione e che le modifiche non vengano ignorate dal tuo ambiente. Canale di supporto su Discord: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/ja/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/ja/developers/extend/capabilities/apps.mdx index 7cfdddba3a..6dce0d7168 100644 --- a/packages/twenty-docs/l/ja/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/ja/developers/extend/capabilities/apps.mdx @@ -49,26 +49,23 @@ yarn app:dev そこで次のことができます: ```bash filename="Terminal" -# アプリケーションに新しいエンティティを追加(ガイド付き) -yarn app:create-entity +# Add a new entity to your application (guided) +yarn entity:add -# 型付きの Twenty クライアントとワークスペースのエンティティ型を生成 +# Generate a typed Twenty client and workspace entity types yarn app:generate -# 1回限りの同期を実行(ウォッチモードの代わり) -yarn app:sync - -# アプリケーションの関数のログを監視 +# Watch your application's function logs yarn function:logs -# 名前で関数を実行 -yarn function:execute -n my-function -p '{\"name\": \"test\"}' +# Execute a function by name +yarn function:execute -n my-function -p '{"name": "test"}' -# 現在のワークスペースからアプリケーションをアンインストール +# Uninstall the application from the current workspace yarn app:uninstall -# コマンドのヘルプを表示 -yarn app:help +# Display commands' help +yarn help ``` 参考: [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) および [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk) の CLI リファレンスページをご覧ください。 @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Required - main application configuration - default-function.role.ts # Default role for serverless functions - // your entities (*.object.ts, *.function.ts, *.role.ts) - utils/ # Optional - handler implementations & utilities + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### コンベンション優先 アプリケーションは **コンベンション優先(設定より規約)** のアプローチを採用し、エンティティはファイルのサフィックスで検出されます。 これにより、`src/app/` フォルダー内を柔軟に構成できます: -| ファイルサフィックス | エンティティタイプ | -| --------------- | ------------- | -| `*.object.ts` | カスタムオブジェクトの定義 | -| `*.function.ts` | サーバーレス関数の定義 | -| `*.role.ts` | ロールの定義 | +| ファイルサフィックス | エンティティタイプ | +| ----------------------- | --------------------------- | +| `*.object.ts` | カスタムオブジェクトの定義 | +| `*.function.ts` | サーバーレス関数の定義 | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | ロールの定義 | ### サポートされるフォルダー構成 @@ -121,12 +119,14 @@ my-twenty-app/ **従来型(タイプ別):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **機能単位:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **フラット:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` 概要: -* **package.json**: アプリ名、バージョン、エンジン(Node 24+、Yarn 4)を宣言し、`twenty-sdk` と、`dev`、`sync`、`generate`、`create-entity`、`logs`、`uninstall`、`auth` などのスクリプトを追加します。これらはローカルの `twenty` CLI に委譲されます。 +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: `node_modules`、`.yarn`、`generated/`(型付きクライアント)、`dist/`、`build/`、カバレッジ用フォルダー、ログファイル、`.env*` ファイルなどの一般的な生成物を無視します。 * **yarn.lock**、**.yarnrc.yml**、**.yarn/**: プロジェクトで使用する Yarn 4 ツールチェーンをロックおよび構成します。 * **.nvmrc**: プロジェクトで想定する Node.js バージョンを固定します。 * **eslint.config.mjs** と **tsconfig.json**: アプリの TypeScript ソース向けの Lint と TypeScript 設定を提供します。 * **README.md**: アプリのルートにある、基本的な手順を記した短い README。 -* **src/app/**: アプリケーションをコードとして定義する主な場所: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: アプリのグローバル設定(メタデータとランタイムの接続)。 「アプリケーション設定」を参照してください。 * `*.role.ts`: サーバーレス関数で使用するロール定義。 「デフォルトの関数ロール」を参照してください。 * `*.object.ts`: カスタムオブジェクトの定義。 * `*.function.ts`: サーバーレス関数の定義。 -* **src/utils/**: ハンドラーの実装やユーティリティ用の任意フォルダー。 + * `*.front-component.tsx`: Front component definitions. 後続のコマンドにより、さらにファイルやフォルダーが追加されます: * `yarn app:generate` は `generated/` フォルダー(型付きの Twenty クライアント + ワークスペースの型)を作成します。 -* `yarn app:create-entity` は、カスタムオブジェクト、関数、ロール用のエンティティ定義ファイルを `src/app/` 配下に追加します。 - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## 認証 @@ -302,63 +303,12 @@ export default defineObject({ * `universalIdentifier` は、デプロイをまたいで一意かつ安定している必要があります。 * 各フィールドには、`name`、`type`、`label`、および自身の安定した `universalIdentifier` が必要です。 * `fields` 配列は任意です。カスタムフィールドなしでオブジェクトを定義できます。 -* `yarn app:create-entity` を使用すれば、新しいオブジェクトをスキャフォルドできます。名前、フィールド、リレーションシップの設定がガイドされます。 +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **ベースフィールドは自動作成されます。** カスタムオブジェクトを定義すると、Twenty は `name`、`createdAt`、`updatedAt`、`createdBy`、`position`、`deletedAt` などの標準フィールドを自動的に追加します。 これらを `fields` 配列で定義する必要はありません。カスタムフィールドのみを追加してください。 - - TypeScript のデコレーターを使ってオブジェクトを定義することもできます。 この方法では、`@Object`、`@Field`、`@Relation` デコレーターを用いたクラスベースの構文を使用します: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - 注記: デコレーター方式では、TypeScript 設定で `experimentalDecorators` が必要です。 - - ### アプリケーション設定(application.config.ts) すべてのアプリには、次の内容を記述する単一の `application.config.ts` ファイルがあります: @@ -469,14 +419,9 @@ export default defineRole({ // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { 新しい関数は次の 2 通りで作成できます: -* **スキャフォルド**: `yarn app:create-entity` を実行し、新しい関数を追加するオプションを選択します。 これにより、ハンドラーと設定を備えたスターターファイルが生成されます。 +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. これにより、ハンドラーと設定を備えたスターターファイルが生成されます。 * **手動**: 新しい `*.function.ts` ファイルを作成し、同じパターンで `defineFunction()` を使用します。 ### 生成された型付きクライアント @@ -641,13 +586,13 @@ const handler = async (event: RoutePayload) => { ワークスペースのスキーマに基づき、generated/ にローカルの型付きクライアントを作成するには yarn app:generate を実行します。 関数内で使用します: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -このクライアントは `yarn app:generate` によって再生成されます。 オブジェクトを変更して `yarn app:sync` した後、または新しいワークスペースにオンボードする際には再実行してください。 +このクライアントは `yarn app:generate` によって再生成されます。 Re-run after changing your objects or when onboarding to a new workspace. #### サーバーレス関数における実行時認証情報 @@ -679,25 +624,29 @@ yarn add -D twenty-sdk ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -これで Yarn 経由で同じコマンド(例:`yarn app:dev`、`yarn app:sync` など)を実行できます。 +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## トラブルシューティング * 認証エラー: `yarn auth:login` を実行し、API キーに必要な権限があることを確認してください。 * サーバーに接続できません: API URL と、Twenty サーバーに到達可能であることを確認してください。 -* 型やクライアントがない/古い: `yarn app:generate` を実行してから `yarn app:dev` を実行してください。 +* Types or client missing/outdated: run `yarn app:generate`. * 開発モードで同期されない: `yarn app:dev` が実行中であり、環境によって変更が無視されていないことを確認してください。 Discord ヘルプチャンネル: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/ko/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/ko/developers/extend/capabilities/apps.mdx index e517025a20..238483d456 100644 --- a/packages/twenty-docs/l/ko/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/ko/developers/extend/capabilities/apps.mdx @@ -50,15 +50,12 @@ yarn app:dev ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn app:create-entity +yarn entity:add # Generate a typed Twenty client and workspace entity types yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Watch your application's function logs yarn function:logs # Execute a function by name @@ -68,7 +65,7 @@ yarn function:execute -n my-function -p '{"name": "test"}' yarn app:uninstall # Display commands' help -yarn app:help +yarn help ``` 참고: [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) 및 [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk)의 CLI 참고 페이지도 확인하세요. @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Required - main application configuration - default-function.role.ts # Default role for serverless functions - // your entities (*.object.ts, *.function.ts, *.role.ts) - utils/ # Optional - handler implementations & utilities + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### 설정보다 관례 애플리케이션은 파일 접미사로 엔티티를 감지하는 **관례 우선** 접근 방식을 사용합니다. 이를 통해 `src/app/` 폴더 내에서 유연하게 구성할 수 있습니다: -| 파일 접미사 | 엔티티 유형 | -| --------------- | ------------ | -| `*.object.ts` | 사용자 정의 객체 정의 | -| `*.function.ts` | 서버리스 함수 정의 | -| `*.role.ts` | 역할 정의 | +| 파일 접미사 | 엔티티 유형 | +| ----------------------- | --------------------------- | +| `*.object.ts` | 사용자 정의 객체 정의 | +| `*.function.ts` | 서버리스 함수 정의 | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | 역할 정의 | ### 지원되는 폴더 구성 방식 @@ -121,12 +119,14 @@ my-twenty-app/ **전통적(유형별):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **기능 기반:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **플랫:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` 개요: -* **package.json**: 앱 이름, 버전, 엔진(Node 24+, Yarn 4)을 선언하고, `twenty-sdk`와 함께 `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, `auth` 같은 스크립트를 추가합니다. 이 스크립트들은 로컬 `twenty` CLI에 위임됩니다. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: `node_modules`, `.yarn`, `generated/`(타입드 클라이언트), `dist/`, `build/`, 커버리지 폴더, 로그 파일, `.env*` 파일 등의 일반 산출물을 무시합니다. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: 프로젝트에서 사용하는 Yarn 4 툴체인을 고정하고 구성합니다. * **.nvmrc**: 프로젝트에서 예상하는 Node.js 버전을 고정합니다. * **eslint.config.mjs** 및 **tsconfig.json**: 앱의 TypeScript 소스에 대한 린팅 및 TypeScript 구성을 제공합니다. * **README.md**: 앱 루트에 기본 안내를 담은 간단한 README입니다. -* **src/app/**: 애플리케이션을 코드로 정의하는 주요 위치: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: 앱의 전역 구성(메타데이터 및 런타임 연결)입니다. 아래의 "Application config"를 참조하세요. * `*.role.ts`: 서버리스 함수에서 사용하는 역할 정의. 아래의 "Default function role"을 참조하세요. * `*.object.ts`: 사용자 정의 객체 정의. * `*.function.ts`: 서버리스 함수 정의. -* **src/utils/**: 핸들러 구현 및 유틸리티를 위한 선택적 폴더. + * `*.front-component.tsx`: Front component definitions. 이후 명령을 실행하면 더 많은 파일과 폴더가 추가됩니다: * `yarn app:generate`는 `generated/` 폴더를 생성합니다(타입드 Twenty 클라이언트 + 워크스페이스 타입). -* `yarn app:create-entity`는 사용자 정의 객체, 함수, 역할에 대한 엔티티 정의 파일을 `src/app/` 아래에 추가합니다. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## 인증 @@ -302,63 +303,12 @@ export default defineObject({ * `universalIdentifier`는 배포 전반에서 고유하고 안정적이어야 합니다. * 각 필드는 `name`, `type`, `label` 및 고유하고 안정적인 `universalIdentifier`가 필요합니다. * `fields` 배열은 선택 사항입니다. 사용자 정의 필드 없이도 객체를 정의할 수 있습니다. -* `yarn app:create-entity`를 사용하여 새 객체를 스캐폴딩할 수 있으며, 이름, 필드, 관계 설정 과정을 안내합니다. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **기본 필드는 자동으로 생성됩니다.** 사용자 정의 객체를 정의하면 Twenty가 `name`, `createdAt`, `updatedAt`, `createdBy`, `position`, `deletedAt` 등의 표준 필드를 자동으로 추가합니다. 이 필드들은 `fields` 배열에 정의할 필요가 없습니다. 사용자 정의 필드만 추가하세요. - - TypeScript 데코레이터를 사용하여 객체를 정의할 수도 있습니다. 이 접근 방식은 `@Object`, `@Field`, `@Relation` 데코레이터를 사용하는 클래스 기반 문법을 사용합니다: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - 참고: 데코레이터 접근 방식은 TypeScript 구성에서 `experimentalDecorators`가 필요합니다. - - ### 애플리케이션 구성(application.config.ts) 모든 앱에는 다음을 설명하는 단일 `application.config.ts` 파일이 있습니다: @@ -469,14 +419,9 @@ export default defineRole({ // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { 새 함수를 만드는 방법은 두 가지입니다: -* **스캐폴딩**: `yarn app:create-entity`를 실행하고 새 함수를 추가하는 옵션을 선택하세요. 이렇게 하면 핸들러와 구성이 포함된 시작 파일이 생성됩니다. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. 이렇게 하면 핸들러와 구성이 포함된 시작 파일이 생성됩니다. * **수동**: 새 `*.function.ts` 파일을 만들고 동일한 패턴에 따라 `defineFunction()`을 사용하세요. ### 생성된 타입드 클라이언트 @@ -641,13 +586,13 @@ const handler = async (event: RoutePayload) => { 워크스페이스 스키마를 기반으로 generated/에 로컬 타입드 클라이언트를 생성하려면 yarn app:generate를 실행하세요. 함수에서 사용하세요: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -클라이언트는 `yarn app:generate`로 다시 생성됩니다. 객체를 변경하고 `yarn app:sync`를 실행한 후 또는 새 워크스페이스에 온보딩할 때 다시 실행하세요. +클라이언트는 `yarn app:generate`로 다시 생성됩니다. Re-run after changing your objects or when onboarding to a new workspace. #### 서버리스 함수의 런타임 자격 증명 @@ -679,25 +624,29 @@ yarn add -D twenty-sdk ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -이제 Yarn을 통해 동일한 명령을 실행할 수 있습니다. 예: `yarn app:dev`, `yarn app:sync` 등 +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## 문제 해결 * 인증 오류: `yarn auth:login`를 실행하고 API 키에 필요한 권한이 있는지 확인하세요. * 서버에 연결할 수 없음: API URL과 Twenty 서버에 접근 가능한지 확인하세요. -* 타입 또는 클라이언트가 없거나 오래됨: `yarn app:generate`를 실행한 다음 `yarn app:dev`를 실행하세요. +* Types or client missing/outdated: run `yarn app:generate`. * 개발 모드가 동기화되지 않음: `yarn app:dev`가 실행 중인지, 환경에서 변경 사항을 무시하지 않는지 확인하세요. Discord 도움말 채널: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/pt/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/pt/developers/extend/capabilities/apps.mdx index d611997e88..698e2b7349 100644 --- a/packages/twenty-docs/l/pt/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/pt/developers/extend/capabilities/apps.mdx @@ -49,26 +49,23 @@ yarn app:dev A partir daqui você pode: ```bash filename="Terminal" -# Adicionar uma nova entidade à sua aplicação (assistido) -yarn app:create-entity +# Add a new entity to your application (guided) +yarn entity:add -# Gerar um cliente Twenty tipado e tipos de entidades do espaço de trabalho +# Generate a typed Twenty client and workspace entity types yarn app:generate -# Executar uma sincronização única (em vez do modo de monitoramento) -yarn app:sync - -# Acompanhar os logs das funções da sua aplicação +# Watch your application's function logs yarn function:logs -# Executar uma função pelo nome +# Execute a function by name yarn function:execute -n my-function -p '{"name": "test"}' -# Desinstalar a aplicação do espaço de trabalho atual +# Uninstall the application from the current workspace yarn app:uninstall -# Exibir a ajuda dos comandos -yarn app:help +# Display commands' help +yarn help ``` Veja também: as páginas de referência da CLI para [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) e [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Required - main application configuration - default-function.role.ts # Default role for serverless functions - // your entities (*.object.ts, *.function.ts, *.role.ts) - utils/ # Optional - handler implementations & utilities + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Convenção sobre configuração Os aplicativos usam uma abordagem de **convenção sobre configuração** em que as entidades são detectadas pelo sufixo do arquivo. Isso permite organização flexível dentro da pasta `src/app/`: -| Sufixo de arquivo | Tipo de entidade | -| ----------------- | ------------------------------------ | -| `*.object.ts` | Definições de objetos personalizados | -| `*.function.ts` | Definições de funções serverless | -| `*.role.ts` | Definições de papéis | +| Sufixo de arquivo | Tipo de entidade | +| ----------------------- | ------------------------------------ | +| `*.object.ts` | Definições de objetos personalizados | +| `*.function.ts` | Definições de funções serverless | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | Definições de papéis | ### Organizações de pastas suportadas @@ -121,12 +119,14 @@ Você pode organizar suas entidades em qualquer um destes padrões: **Tradicional (por tipo):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Baseada em funcionalidades:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Plana:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` Em alto nível: -* **package.json**: Declara o nome do app, versão, engines (Node 24+, Yarn 4), e adiciona `twenty-sdk` além de scripts como `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` e `auth` que delegam para a CLI `twenty` local. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: Ignora artefatos comuns como `node_modules`, `.yarn`, `generated/` (cliente tipado), `dist/`, `build/`, pastas de cobertura, arquivos de log e arquivos `.env*`. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Bloqueiam e configuram a ferramenta Yarn 4 usada pelo projeto. * **.nvmrc**: Fixa a versão do Node.js esperada pelo projeto. * **eslint.config.mjs** e **tsconfig.json**: Fornecem lint e configuração do TypeScript para os fontes TypeScript do seu aplicativo. * **README.md**: Um README curto na raiz do aplicativo com instruções básicas. -* **src/app/**: O local principal onde você define seu aplicativo como código: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Configuração global do seu aplicativo (metadados e conexões de execução). Veja "Configuração do aplicativo" abaixo. * `*.role.ts`: Definições de papéis usados pelas suas funções serverless. Veja "Papel de função padrão" abaixo. * `*.object.ts`: Definições de objetos personalizados. * `*.function.ts`: Definições de funções serverless. -* **src/utils/**: Pasta opcional para implementações de handlers e utilitários. + * `*.front-component.tsx`: Front component definitions. Comandos posteriores adicionarão mais arquivos e pastas: * `yarn app:generate` criará uma pasta `generated/` (cliente tipado do Twenty + tipos do workspace). -* `yarn app:create-entity` adicionará arquivos de definição de entidades em `src/app/` para seus objetos, funções ou papéis personalizados. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Autenticação @@ -302,63 +303,12 @@ Pontos-chave: * O `universalIdentifier` deve ser exclusivo e estável entre implantações. * Cada campo requer `name`, `type`, `label` e seu próprio `universalIdentifier` estável. * O array `fields` é opcional — você pode definir objetos sem campos personalizados. -* Você pode criar novos objetos usando `yarn app:create-entity`, que orienta você sobre nomeação, campos e relacionamentos. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Os campos base são criados automaticamente.** Quando você define um objeto personalizado, o Twenty adiciona automaticamente campos padrão como `name`, `createdAt`, `updatedAt`, `createdBy`, `position` e `deletedAt`. Você não precisa definir esses no seu array `fields` — adicione apenas seus campos personalizados. - - Você também pode definir objetos usando decoradores do TypeScript. Essa abordagem usa sintaxe baseada em classe com os decoradores `@Object`, `@Field` e `@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Observação: A abordagem com decoradores requer `experimentalDecorators` na sua configuração do TypeScript. - - ### Configuração do aplicativo (application.config.ts) Todo aplicativo tem um único arquivo `application.config.ts` que descreve: @@ -469,14 +419,9 @@ Cada arquivo de função usa `defineFunction()` para exportar uma configuração // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Você pode criar novas funções de duas formas: -* **Gerado automaticamente**: Execute `yarn app:create-entity` e escolha a opção para adicionar uma nova função. Isso gera um arquivo inicial com um handler e configuração. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Isso gera um arquivo inicial com um handler e configuração. * **Manual**: Crie um novo arquivo `*.function.ts` e use `defineFunction()`, seguindo o mesmo padrão. ### Cliente tipado gerado @@ -641,13 +586,13 @@ Você pode criar novas funções de duas formas: Execute yarn app:generate para criar um cliente tipado local em generated/ com base no esquema do seu workspace. Use-o em suas funções: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -O cliente é regenerado pelo `yarn app:generate`. Execute novamente após alterar seus objetos e executar `yarn app:sync`, ou ao ingressar em um novo workspace. +O cliente é regenerado pelo `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### Credenciais em tempo de execução em funções serverless @@ -679,25 +624,29 @@ Em seguida, adicione scripts como estes: ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Agora você pode executar os mesmos comandos via Yarn, por exemplo, `yarn app:dev`, `yarn app:sync`, etc. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Resolução de Problemas * Erros de autenticação: execute `yarn auth:login` e certifique-se de que sua chave de API tenha as permissões necessárias. * Não é possível conectar ao servidor: verifique a URL da API e se o servidor do Twenty está acessível. -* Tipos ou cliente ausentes/desatualizados: execute `yarn app:generate` e depois `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * Modo de desenvolvimento não sincronizando: certifique-se de que `yarn app:dev` esteja em execução e de que as alterações não estejam sendo ignoradas pelo seu ambiente. Canal de ajuda no Discord: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/ro/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/ro/developers/extend/capabilities/apps.mdx index cfbd7b35b7..b848dd1ffd 100644 --- a/packages/twenty-docs/l/ro/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/ro/developers/extend/capabilities/apps.mdx @@ -49,26 +49,23 @@ yarn app:dev De aici puteți: ```bash filename="Terminal" -# Add a new entity to your application (guided) -yarn app:create-entity +# Adaugă o entitate nouă în aplicația ta (ghidat) +yarn entity:add -# Generate a typed Twenty client and workspace entity types +# Generează un client Twenty tipat și tipurile de entități ale spațiului de lucru yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Urmărește jurnalele funcțiilor aplicației tale yarn function:logs -# Execute a function by name +# Execută o funcție după nume yarn function:execute -n my-function -p '{"name": "test"}' -# Uninstall the application from the current workspace +# Dezinstalează aplicația din spațiul de lucru curent yarn app:uninstall -# Display commands' help -yarn app:help},{ +# Afișează ajutorul pentru comenzi +yarn help},{ ``` Consultați și: paginile de referință CLI pentru [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) și [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Obligatoriu - configurația principală a aplicației - default-function.role.ts # Rolul implicit pentru funcțiile serverless - // entitățile tale (*.object.ts, *.function.ts, *.role.ts) - utils/ # Opțional - implementări de handleri și utilitare + application.config.ts # Obligatoriu - configurația principală a aplicației + default-function.role.ts # Rolul implicit pentru funcțiile serverless + hello-world.function.ts # Exemplu de funcție serverless + hello-world.front-component.tsx # Exemplu de componentă de interfață + // entitățile tale (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Convenție în locul configurării Aplicațiile folosesc o abordare bazată pe convenție în locul configurării, în care entitățile sunt detectate după sufixul fișierului. Aceasta permite o organizare flexibilă în folderul `src/app/`: -| Sufixul fișierului | Tipul entității | -| ------------------ | ---------------------------------- | -| `*.object.ts` | Definiții de obiecte personalizate | -| `*.function.ts` | Definiții de funcții serverless | -| `*.role.ts` | Definiții de rol | +| Sufixul fișierului | Tipul entității | +| ----------------------- | ---------------------------------------- | +| `*.object.ts` | Definiții de obiecte personalizate | +| `*.function.ts` | Definiții de funcții serverless | +| `*.front-component.tsx` | Definiții ale componentelor de interfață | +| `*.role.ts` | Definiții de rol | ### Structuri de foldere acceptate @@ -121,12 +119,14 @@ Vă puteți organiza entitățile în oricare dintre aceste modele: **Tradițional (după tip):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Bazat pe funcționalități:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Plat:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` Pe scurt: -* **package.json**: Declară numele aplicației, versiunea, motoarele (Node 24+, Yarn 4) și adaugă `twenty-sdk` plus scripturi precum `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` și `auth` care deleagă către CLI-ul local `twenty`. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: Ignoră artefacte comune precum `node_modules`, `.yarn`, `generated/` (client tipizat), `dist/`, `build/`, foldere de coverage, fișiere jurnal și fișiere `.env*`. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Blochează și configurează lanțul de instrumente Yarn 4 folosit de proiect. * **.nvmrc**: Fixează versiunea Node.js așteptată de proiect. * **eslint.config.mjs** și **tsconfig.json**: Oferă linting și configurație TypeScript pentru fișierele TypeScript ale aplicației. * **README.md**: Un README scurt în rădăcina aplicației, cu instrucțiuni de bază. -* **src/app/**: Locul principal unde vă definiți aplicația sub formă de cod: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Configurație globală pentru aplicație (metadate și conectare la runtime). Vezi "Configurația aplicației" mai jos. * `*.role.ts`: Definiții de rol folosite de funcțiile dvs. serverless. Vezi "Rol implicit pentru funcții" mai jos. * `*.object.ts`: Definiții de obiecte personalizate. * `*.function.ts`: Definiții de funcții serverless. -* **src/utils/**: Folder opțional pentru implementări de handleri și utilitare. + * `*.front-component.tsx`: Front component definitions. Comenzile ulterioare vor adăuga mai multe fișiere și foldere: * `yarn app:generate` va crea un folder `generated/` (client Twenty tipizat + tipuri pentru spațiul de lucru). -* `yarn app:create-entity` va adăuga fișiere de definire a entităților în `src/app/` pentru obiectele, funcțiile sau rolurile personalizate. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Autentificare @@ -302,63 +303,12 @@ Puncte cheie: * `universalIdentifier` trebuie să fie unic și stabil între implementări. * Fiecare câmp necesită un `name`, un `type`, un `label` și propriul `universalIdentifier` stabil. * Matricea `fields` este opțională — puteți defini obiecte fără câmpuri personalizate. -* Puteți genera obiecte noi folosind `yarn app:create-entity`, care vă ghidează prin denumire, câmpuri și relații. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Câmpurile de bază sunt create automat.** Când definiți un obiect personalizat, Twenty adaugă automat câmpuri standard precum `name`, `createdAt`, `updatedAt`, `createdBy`, `position` și `deletedAt`. Nu trebuie să le definiți în tabloul `fields` — adăugați doar câmpurile personalizate proprii. - - Puteți defini obiecte și folosind decoratori TypeScript. Această abordare folosește o sintaxă bazată pe clase cu decoratorii `@Object`, `@Field` și `@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Notă: Abordarea cu decoratori necesită `experimentalDecorators` în configurația TypeScript. - - ### Configurația aplicației (application.config.ts) Fiecare aplicație are un singur fișier `application.config.ts` care descrie: @@ -469,14 +419,9 @@ Fiecare fișier de funcție folosește `defineFunction()` pentru a exporta o con // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Puteți crea funcții noi în două moduri: -* **Generat**: Rulați `yarn app:create-entity` și alegeți opțiunea de a adăuga o funcție nouă. Aceasta generează un fișier inițial cu un handler și o configurație. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Aceasta generează un fișier inițial cu un handler și o configurație. * **Manual**: Creați un fișier nou `*.function.ts` și folosiți `defineFunction()`, urmând același model. ### Client tipizat generat @@ -641,13 +586,13 @@ Puteți crea funcții noi în două moduri: Rulați yarn app:generate pentru a crea un client tipizat local în generated/, pe baza schemei spațiului de lucru. Folosiți-l în funcțiile dvs.: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -Clientul este regenerat de `yarn app:generate`. Rulați din nou după ce vă modificați obiectele și rulați `yarn app:sync` sau când vă integrați într-un spațiu de lucru nou. +Clientul este regenerat de `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### Acreditări la runtime în funcțiile serverless @@ -679,25 +624,29 @@ Apoi adăugați scripturi ca acestea: ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Acum puteți rula aceleași comenzi prin Yarn, de ex. `yarn app:dev`, `yarn app:sync`, etc. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Depanare * Erori de autentificare: rulați `yarn auth:login` și asigurați-vă că cheia API are permisiunile necesare. * Nu se poate conecta la server: verificați URL-ul API și că serverul Twenty este accesibil. -* Tipuri sau client lipsă/învechite: rulați `yarn app:generate` și apoi `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * Modul dev nu sincronizează: asigurați-vă că `yarn app:dev` rulează și că modificările nu sunt ignorate de mediul dvs. Canal de ajutor pe Discord: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/ru/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/ru/developers/extend/capabilities/apps.mdx index 7e081c0e85..24a5050b17 100644 --- a/packages/twenty-docs/l/ru/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/ru/developers/extend/capabilities/apps.mdx @@ -49,26 +49,23 @@ yarn app:dev Отсюда вы можете: ```bash filename="Terminal" -# Добавить новую сущность в ваше приложение (с мастером) -yarn app:create-entity +# Add a new entity to your application (guided) +yarn entity:add -# Сгенерировать типизированный клиент Twenty и типы сущностей рабочего пространства +# Generate a typed Twenty client and workspace entity types yarn app:generate -# Выполнить разовую синхронизацию (вместо watch‑режима) -yarn app:sync - -# Просматривать логи функций вашего приложения +# Watch your application's function logs yarn function:logs -# Выполнить функцию по имени +# Execute a function by name yarn function:execute -n my-function -p '{"name": "test"}' -# Удалить приложение из текущего рабочего пространства +# Uninstall the application from the current workspace yarn app:uninstall -# Показать справку по командам -yarn app:help +# Display commands' help +yarn help ``` Смотрите также: страницы справки CLI для [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) и [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Required - main application configuration - default-function.role.ts # Default role for serverless functions - // your entities (*.object.ts, *.function.ts, *.role.ts) - utils/ # Optional - handler implementations & utilities + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Соглашения важнее конфигурации Приложения используют подход **соглашения важнее конфигурации**, при котором сущности определяются по суффиксу файла. Это позволяет гибко организовать структуру в папке `src/app/`: -| Суффикс файла | Тип сущности | -| --------------- | ------------------------------------- | -| `*.object.ts` | Определения пользовательских объектов | -| `*.function.ts` | Определения бессерверных функций | -| `*.role.ts` | Определения ролей | +| Суффикс файла | Тип сущности | +| ----------------------- | ------------------------------------- | +| `*.object.ts` | Определения пользовательских объектов | +| `*.function.ts` | Определения бессерверных функций | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | Определения ролей | ### Поддерживаемые способы организации папок @@ -121,12 +119,14 @@ my-twenty-app/ **Традиционный (по типам):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **По функциональности:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Плоский:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` В общих чертах: -* **package.json**: Объявляет имя приложения, версию, движки (Node 24+, Yarn 4) и добавляет `twenty-sdk`, а также скрипты вроде `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` и `auth`, которые делегируют выполнение локальному CLI `twenty`. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: Игнорирует распространённые артефакты, такие как `node_modules`, `.yarn`, `generated/` (типизированный клиент), `dist/`, `build/`, каталоги coverage, файлы журналов и файлы `.env*`. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Фиксируют и настраивают используемый в проекте инструментарий Yarn 4. * **.nvmrc**: Фиксирует версию Node.js, ожидаемую проектом. * **eslint.config.mjs** и **tsconfig.json**: Обеспечивают линтинг и конфигурацию TypeScript для исходников вашего приложения на TypeScript. * **README.md**: Короткий README в корне приложения с базовыми инструкциями. -* **src/app/**: Основное место, где вы определяете приложение как код: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Глобальная конфигурация вашего приложения (метаданные и параметры выполнения). См. раздел «Конфигурация приложения» ниже. * `*.role.ts`: Определения ролей, используемых вашими бессерверными функциями. См. раздел «Роль функции по умолчанию» ниже. * `*.object.ts`: Определения пользовательских объектов. * `*.function.ts`: Определения бессерверных функций. -* **src/utils/**: Необязательная папка для реализаций обработчиков и утилит. + * `*.front-component.tsx`: Front component definitions. Позднее команды добавят больше файлов и папок: * `yarn app:generate` создаст папку `generated/` (типизированный клиент Twenty + типы рабочего пространства). -* `yarn app:create-entity` добавит файлы определений сущностей в `src/app/` для ваших пользовательских объектов, функций или ролей. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Аутентификация @@ -302,63 +303,12 @@ export default defineObject({ * `universalIdentifier` должен быть уникальным и стабильным между развёртываниями. * Каждому полю требуются `name`, `type`, `label` и собственный стабильный `universalIdentifier`. * Массив `fields` необязателен — вы можете определять объекты без пользовательских полей. -* Вы можете сгенерировать новые объекты с помощью `yarn app:create-entity`, который проведёт вас через выбор именования, полей и связей. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Базовые поля создаются автоматически.** Когда вы определяете пользовательский объект, Twenty автоматически добавляет стандартные поля, такие как `name`, `createdAt`, `updatedAt`, `createdBy`, `position` и `deletedAt`. Вам не нужно определять их в массиве `fields` — добавляйте только свои пользовательские поля. - - Вы также можете определять объекты с помощью декораторов TypeScript. Этот подход использует классовый синтаксис с декораторами `@Object`, `@Field` и `@Relation`: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Примечание: подход с декораторами требует `experimentalDecorators` в конфигурации TypeScript. - - ### Конфигурация приложения (application.config.ts) У каждого приложения есть единственный файл `application.config.ts`, который описывает: @@ -469,14 +419,9 @@ export default defineRole({ // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Вы можете создать новые функции двумя способами: -* **Сгенерировано**: Запустите `yarn app:create-entity` и выберите опцию добавления новой функции. Это создаёт стартовый файл с обработчиком и конфигурацией. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Это создаёт стартовый файл с обработчиком и конфигурацией. * **Вручную**: Создайте новый файл `*.function.ts` и используйте `defineFunction()`, следуя тому же шаблону. ### Сгенерированный типизированный клиент @@ -641,13 +586,13 @@ const handler = async (event: RoutePayload) => { Запустите yarn app:generate, чтобы создать локальный типизированный клиент в generated/ на основе схемы вашего рабочего пространства. Используйте его в своих функциях: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -Клиент повторно генерируется командой `yarn app:generate`. Запускайте повторно после изменения ваших объектов и `yarn app:sync` или при подключении к новому рабочему пространству. +Клиент повторно генерируется командой `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace. #### Учётные данные времени выполнения в бессерверных функциях @@ -679,25 +624,29 @@ yarn add -D twenty-sdk ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Теперь вы можете запускать те же команды через Yarn, например, `yarn app:dev`, `yarn app:sync` и т. д. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Устранение неполадок * Ошибки аутентификации: выполните `yarn auth:login` и убедитесь, что у вашего ключа API есть необходимые права. * Не удаётся подключиться к серверу: проверьте URL API и доступность сервера Twenty. -* Отсутствующие/устаревшие типы или клиент: выполните `yarn app:generate`, затем `yarn app:dev`. +* Types or client missing/outdated: run `yarn app:generate`. * Режим разработки не синхронизируется: убедитесь, что запущен `yarn app:dev`, и что ваша среда не игнорирует изменения. Канал помощи в Discord: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/tr/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/tr/developers/extend/capabilities/apps.mdx index b9c9a38db9..fc562cdaf7 100644 --- a/packages/twenty-docs/l/tr/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/tr/developers/extend/capabilities/apps.mdx @@ -50,15 +50,12 @@ Buradan şunları yapabilirsiniz: ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn app:create-entity +yarn entity:add # Generate a typed Twenty client and workspace entity types yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Watch your application's function logs yarn function:logs # Execute a function by name @@ -68,7 +65,7 @@ yarn function:execute -n my-function -p '{"name": "test"}' yarn app:uninstall # Display commands' help -yarn app:help +yarn help ``` Ayrıca bkz.: [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) ve [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk) için CLI başvuru sayfaları. @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # Required - main application configuration - default-function.role.ts # Default role for serverless functions - // your entities (*.object.ts, *.function.ts, *.role.ts) - utils/ # Optional - handler implementations & utilities + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### Sözleşme-öncelikli yapılandırma Uygulamalar, varlıkların dosya sonekiyle algılandığı **sözleşme-öncelikli yapılandırma** yaklaşımını kullanır. Bu, `src/app/` klasörü içinde esnek bir düzenlemeye olanak tanır: -| Dosya soneki | Varlık türü | -| --------------- | ----------------------------- | -| `*.object.ts` | Özel nesne tanımları | -| `*.function.ts` | Sunucusuz fonksiyon tanımları | -| `*.role.ts` | Rol tanımları | +| Dosya soneki | Varlık türü | +| ----------------------- | ----------------------------- | +| `*.object.ts` | Özel nesne tanımları | +| `*.function.ts` | Sunucusuz fonksiyon tanımları | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | Rol tanımları | ### Desteklenen klasör düzenleri @@ -121,12 +119,14 @@ Varlıklarınızı şu desenlerden herhangi birine göre düzenleyebilirsiniz: **Geleneksel (türe göre):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **Özelliğe dayalı:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **Düz:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` Genel hatlarıyla: -* **package.json**: Uygulama adını, sürümünü, motorları (Node 24+, Yarn 4) bildirir ve yerel `twenty` CLI’ına yetki devreden `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` ve `auth` gibi betiklerin yanı sıra `twenty-sdk` ekler. +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**: `node_modules`, `.yarn`, `generated/` (türlendirilmiş istemci), `dist/`, `build/`, kapsam klasörleri, günlük dosyaları ve `.env*` dosyaları gibi yaygın artifaktları yok sayar. * **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Proje tarafından kullanılan Yarn 4 araç zincirini kilitler ve yapılandırır. * **.nvmrc**: Projenin beklediği Node.js sürümünü sabitler. * **eslint.config.mjs** ve **tsconfig.json**: Uygulamanızın TypeScript kaynakları için linting ve TypeScript yapılandırması sağlar. * **README.md**: Uygulama kökünde temel talimatların yer aldığı kısa bir README. -* **src/app/**: Uygulamanızı kod olarak tanımladığınız ana yer: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`: Uygulamanız için genel yapılandırma (meta veriler ve çalışma zamanı bağlantıları). Aşağıda "Uygulama yapılandırması"na bakın. * `*.role.ts`: Sunucusuz fonksiyonlarınız tarafından kullanılan rol tanımları. Aşağıda "Varsayılan fonksiyon rolü"ne bakın. * `*.object.ts`: Özel nesne tanımları. * `*.function.ts`: Sunucusuz fonksiyon tanımları. -* **src/utils/**: İşleyici uygulamaları ve yardımcılar için isteğe bağlı klasör. + * `*.front-component.tsx`: Front component definitions. İlerideki komutlar daha fazla dosya ve klasör ekleyecektir: * `yarn app:generate`, `generated/` klasörünü oluşturur (türlendirilmiş Twenty istemcisi + çalışma alanı türleri). -* `yarn app:create-entity`, özel nesneleriniz, fonksiyonlarınız veya rolleriniz için `src/app/` altında varlık tanım dosyaları ekler. - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## Kimlik Doğrulama @@ -302,63 +303,12 @@ export default defineObject({ * `universalIdentifier` dağıtımlar arasında benzersiz ve kararlı olmalıdır. * Her alan bir `name`, `type`, `label` ve kendi kararlı `universalIdentifier` değerini gerektirir. * `fields` dizisi isteğe bağlıdır — özel alanlar olmadan da nesneler tanımlayabilirsiniz. -* `yarn app:create-entity` kullanarak, adlandırma, alanlar ve ilişkiler konusunda sizi yönlendirerek yeni nesneler oluşturabilirsiniz. +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **Temel alanlar otomatik olarak oluşturulur.** Özel bir nesne tanımladığınızda Twenty, `name`, `createdAt`, `updatedAt`, `createdBy`, `position` ve `deletedAt` gibi standart alanları otomatik olarak ekler. Bunları `fields` dizinizde tanımlamanız gerekmez — yalnızca özel alanlarınızı ekleyin. - - Nesneleri TypeScript dekoratörlerini kullanarak da tanımlayabilirsiniz. Bu yaklaşım, `@Object`, `@Field` ve `@Relation` dekoratörleriyle sınıf tabanlı söz dizimi kullanır: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - Not: Dekoratör yaklaşımı, TypeScript yapılandırmanızda `experimentalDecorators` gerektirir. - - ### Uygulama yapılandırması (application.config.ts) Her uygulamanın aşağıdakileri açıklayan tek bir `application.config.ts` dosyası vardır: @@ -469,14 +419,9 @@ Her fonksiyon dosyası, bir işleyici ve isteğe bağlı tetikleyiciler içeren // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { Yeni fonksiyonları iki şekilde oluşturabilirsiniz: -* **Şablondan**: `yarn app:create-entity` çalıştırın ve yeni bir fonksiyon ekleme seçeneğini seçin. Bu, bir işleyici ve yapılandırma içeren bir başlangıç dosyası oluşturur. +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Bu, bir işleyici ve yapılandırma içeren bir başlangıç dosyası oluşturur. * **Manuel**: Yeni bir `*.function.ts` dosyası oluşturun ve aynı deseni izleyerek `defineFunction()` kullanın. ### Oluşturulmuş türlendirilmiş istemci @@ -641,13 +586,13 @@ Yeni fonksiyonları iki şekilde oluşturabilirsiniz: Çalışma alanı şemanıza göre generated/ içinde yerel bir türlendirilmiş istemci oluşturmak için yarn app:generate çalıştırın. Fonksiyonlarınızda kullanın: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -İstemci `yarn app:generate` tarafından yeniden oluşturulur. Nesnelerinizi değiştirip `yarn app:sync` çalıştırdıktan sonra veya yeni bir çalışma alanına katılırken yeniden çalıştırın. +İstemci `yarn app:generate` tarafından yeniden oluşturulur. Re-run after changing your objects or when onboarding to a new workspace. #### Sunucusuz fonksiyonlarda çalışma zamanı kimlik bilgileri @@ -679,25 +624,29 @@ Ardından şu gibi betikler ekleyin: ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -Artık aynı komutları Yarn üzerinden çalıştırabilirsiniz; örn. `yarn app:dev`, `yarn app:sync` vb. +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## Sorun Giderme * Kimlik doğrulama hataları: `yarn auth:login` çalıştırın ve API anahtarınızın gerekli izinlere sahip olduğundan emin olun. * Sunucuya bağlanılamıyor: API URL’sini ve Twenty sunucusunun erişilebilir olduğunu doğrulayın. -* Türler veya istemci eksik/eski: `yarn app:generate` ve ardından `yarn app:dev` çalıştırın. +* Types or client missing/outdated: run `yarn app:generate`. * Geliştirme modu eşitlenmiyor: `yarn app:dev`'in çalıştığından ve değişikliklerin ortamınız tarafından yok sayılmadığından emin olun. Discord Yardım Kanalı: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/zh/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/zh/developers/extend/capabilities/apps.mdx index 4bc611f403..6918c0ba9e 100644 --- a/packages/twenty-docs/l/zh/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/zh/developers/extend/capabilities/apps.mdx @@ -50,15 +50,12 @@ yarn app:dev ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn app:create-entity +yarn entity:add # Generate a typed Twenty client and workspace entity types yarn app:generate -# Run a one‑time sync (instead of watch mode) -yarn app:sync - -# Watch your application's functions logs +# Watch your application's function logs yarn function:logs # Execute a function by name @@ -68,7 +65,7 @@ yarn function:execute -n my-function -p '{"name": "test"}' yarn app:uninstall # Display commands' help -yarn app:help +yarn help ``` 另请参阅:[create-twenty-app](https://www.npmjs.com/package/create-twenty-app) 和 [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk) 的 CLI 参考页面。 @@ -97,22 +94,23 @@ my-twenty-app/ tsconfig.json README.md src/ - app/ - application.config.ts # 必需 - 主应用程序配置 - default-function.role.ts # 用于无服务器函数的默认角色 - // 你的实体 (*.object.ts, *.function.ts, *.role.ts) - utils/ # 可选 - 处理器实现与实用工具 + application.config.ts # Required - main application configuration + default-function.role.ts # Default role for serverless functions + hello-world.function.ts # Example serverless function + hello-world.front-component.tsx # Example front component + // your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts) ``` ### 约定优于配置 应用采用**约定优于配置**的方式,根据文件后缀检测实体。 这使得可以在 `src/app/` 文件夹内灵活组织: -| 文件后缀 | 实体类型 | -| --------------- | -------- | -| `*.object.ts` | 自定义对象定义 | -| `*.function.ts` | 无服务器函数定义 | -| `*.role.ts` | 角色定义 | +| 文件后缀 | 实体类型 | +| ----------------------- | --------------------------- | +| `*.object.ts` | 自定义对象定义 | +| `*.function.ts` | 无服务器函数定义 | +| `*.front-component.tsx` | Front component definitions | +| `*.role.ts` | 角色定义 | ### 支持的文件夹组织方式 @@ -121,12 +119,14 @@ my-twenty-app/ **传统(按类型):** ```text -src/app/ +src/ ├── application.config.ts ├── objects/ │ └── postCard.object.ts ├── functions/ │ └── createPostCard.function.ts +├── components/ +│ └── card.front-component.tsx └── roles/ └── admin.role.ts ``` @@ -134,44 +134,45 @@ src/app/ **基于特性:** ```text -src/app/ +src/ ├── application.config.ts └── post-card/ ├── postCard.object.ts ├── createPostCard.function.ts + ├── card.front-component.tsx └── postCardAdmin.role.ts ``` **扁平:** ```text -src/app/ +src/ ├── application.config.ts ├── postCard.object.ts ├── createPostCard.function.ts +├── card.front-component.tsx └── admin.role.ts ``` 总体来说: -* **package.json**:声明应用名称、版本、运行时(Node 24+、Yarn 4),并添加 `twenty-sdk` 以及 `dev`、`sync`、`generate`、`create-entity`、`logs`、`uninstall`、`auth` 等脚本,这些脚本会委托给本地的 `twenty` CLI。 +* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI. * **.gitignore**:忽略常见产物,如 `node_modules`、`.yarn`、`generated/`(类型化客户端)、`dist/`、`build/`、覆盖率文件夹、日志文件以及 `.env*` 文件。 * **yarn.lock**、**.yarnrc.yml**、**.yarn/**:锁定并配置项目使用的 Yarn 4 工具链。 * **.nvmrc**:固定项目期望的 Node.js 版本。 * **eslint.config.mjs** 和 **tsconfig.json**:为应用的 TypeScript 源码提供 Lint 与 TypeScript 配置。 * **README.md**:应用根目录中的简短 README,包含基本说明。 -* **src/app/**:你以代码形式定义应用的主要位置: +* **src/**: The main place where you define your application-as-code: * `application.config.ts`:应用的全局配置(元数据和运行时关联)。 参见下方“应用配置”。 * `*.role.ts`:你的无服务器函数所使用的角色定义。 参见下方“默认函数角色”。 * `*.object.ts`:自定义对象定义。 * `*.function.ts`:无服务器函数定义。 -* **src/utils/**:可选文件夹,用于处理程序实现和实用工具。 + * `*.front-component.tsx`: Front component definitions. 后续命令将添加更多文件和文件夹: * `yarn app:generate` 将创建一个 `generated/` 文件夹(类型化 Twenty 客户端 + 工作空间类型)。 -* `yarn app:create-entity` 将为你的自定义对象、函数或角色在 `src/app/` 下添加实体定义文件。 - l +* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles. ## 身份验证 @@ -302,63 +303,12 @@ export default defineObject({ * `universalIdentifier` 必须在各次部署间保持唯一且稳定。 * 每个字段都需要 `name`、`type`、`label` 以及其自身稳定的 `universalIdentifier`。 * `fields` 数组是可选的——你可以定义没有自定义字段的对象。 -* 你可以使用 `yarn app:create-entity` 脚手架创建新对象,它会引导你完成命名、字段和关系。 +* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships. **基础字段会自动创建。** 当你定义自定义对象时,Twenty 会自动添加 `name`、`createdAt`、`updatedAt`、`createdBy`、`position`、`deletedAt` 等标准字段。 你无需在 `fields` 数组中定义这些字段——只需添加你的自定义字段。 - - 你也可以使用 TypeScript 装饰器来定义对象。 该方式使用基于类的语法以及 `@Object`、`@Field`、`@Relation` 装饰器: - - ```typescript - import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, - } from 'twenty-sdk'; - import { type Note } from '../../generated'; - - @Object({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: 'A post card object', - icon: 'IconMail', - }) - export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - } - ``` - - 注意:装饰器方式需要在 TypeScript 配置中启用 `experimentalDecorators`。 - - ### 应用配置(application.config.ts) 每个应用都有一个 `application.config.ts` 文件,用于描述: @@ -469,14 +419,9 @@ export default defineRole({ // src/app/createPostCard.function.ts import { defineFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import Twenty, { type Person } from '../../generated'; +import Twenty, { type Person } from '~/generated'; -const handler = async ( - params: - | RoutePayload - | DatabaseEventPayload> - | CronPayload, -) => { +const handler = async (params: RoutePayload) => { const client = new Twenty(); // generated typed client const name = 'name' in params.queryStringParameters ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' @@ -507,18 +452,18 @@ export default defineFunction({ isAuthRequired: false, }, // Cron trigger (CRON pattern) - { - universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - type: 'cron', - pattern: '0 0 1 1 *', - }, + // { + // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', + // type: 'cron', + // pattern: '0 0 1 1 *', + // }, // Database event trigger - { - universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - type: 'databaseEvent', - eventName: 'person.updated', - updatedFields: ['name'], - }, + // { + // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', + // type: 'databaseEvent', + // eventName: 'person.updated', + // updatedFields: ['name'], + // }, ], }); ``` @@ -633,7 +578,7 @@ const handler = async (event: RoutePayload) => { 你可以通过两种方式创建新函数: -* **脚手架生成**:运行 `yarn app:create-entity` 并选择添加新函数的选项。 这将生成一个包含处理程序和配置的入门文件。 +* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. 这将生成一个包含处理程序和配置的入门文件。 * **手动**:创建一个新的 `*.function.ts` 文件,并使用 `defineFunction()`,遵循相同的模式。 ### 生成的类型化客户端 @@ -641,13 +586,13 @@ const handler = async (event: RoutePayload) => { 运行 yarn app:generate,根据你的工作空间模式在 generated/ 中创建本地类型化客户端。 在你的函数中使用它: ```typescript -import Twenty from './generated'; +import Twenty from '~/generated'; const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -客户端会通过 `yarn app:generate` 重新生成。 在更改对象并执行 `yarn app:sync` 之后,或在接入新工作空间时,请重新运行。 +客户端会通过 `yarn app:generate` 重新生成。 Re-run after changing your objects or when onboarding to a new workspace. #### 无服务器函数中的运行时凭据 @@ -679,25 +624,29 @@ yarn add -D twenty-sdk ```json filename="package.json" { "scripts": { - "auth": "twenty auth login", - "generate": "twenty app generate", - "dev": "twenty app dev", - "sync": "twenty app sync", - "uninstall": "twenty app uninstall", - "logs": "twenty app logs", - "create-entity": "twenty app add", - "help": "twenty --help" + "auth:login": "twenty auth:login", + "auth:logout": "twenty auth:logout", + "auth:status": "twenty auth:status", + "auth:switch": "twenty auth:switch", + "auth:list": "twenty auth:list", + "app:dev": "twenty app:dev", + "app:generate": "twenty app:generate", + "app:uninstall": "twenty app:uninstall", + "entity:add": "twenty entity:add", + "function:logs": "twenty function:logs", + "function:execute": "twenty function:execute", + "help": "twenty help" } } ``` -现在你可以通过 Yarn 运行相同的命令,例如 `yarn app:dev`、`yarn app:sync` 等。 +Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc. ## 故障排除 * 身份验证错误:运行 `yarn auth:login`,并确保你的 API 密钥具有所需权限。 * 无法连接到服务器:请验证 API URL,并确保 Twenty 服务器可达。 -* 类型或客户端缺失/过期:运行 `yarn app:generate`,然后运行 `yarn app:dev`。 +* Types or client missing/outdated: run `yarn app:generate`. * 开发模式未同步:确保 `yarn app:dev` 正在运行,并且你的环境不会忽略变更。 Discord 帮助频道:https://discord.com/channels/1130383047699738754/1130386664812982322