twenty-sdk 0.0.6-alpha → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +82 -8
  2. package/dist/application/application-config.d.ts +2 -1
  3. package/dist/application/application-config.d.ts.map +1 -0
  4. package/dist/application/field-metadata/composite-fields.d.ts +1 -0
  5. package/dist/application/field-metadata/composite-fields.d.ts.map +1 -0
  6. package/dist/application/field-metadata/field-type.d.ts +1 -0
  7. package/dist/application/field-metadata/field-type.d.ts.map +1 -0
  8. package/dist/application/field-metadata/field.decorator.d.ts +2 -1
  9. package/dist/application/field-metadata/field.decorator.d.ts.map +1 -0
  10. package/dist/application/field-metadata/on-delete-action.d.ts +1 -0
  11. package/dist/application/field-metadata/on-delete-action.d.ts.map +1 -0
  12. package/dist/application/field-metadata/relation-type.d.ts +1 -0
  13. package/dist/application/field-metadata/relation-type.d.ts.map +1 -0
  14. package/dist/application/field-metadata/relation.decorator.d.ts +2 -1
  15. package/dist/application/field-metadata/relation.decorator.d.ts.map +1 -0
  16. package/dist/application/{serverless-function-config.d.ts → function-config.d.ts} +5 -4
  17. package/dist/application/function-config.d.ts.map +1 -0
  18. package/dist/application/index.d.ts +2 -1
  19. package/dist/application/index.d.ts.map +1 -0
  20. package/dist/application/object-metadata/object.decorator.d.ts +2 -1
  21. package/dist/application/object-metadata/object.decorator.d.ts.map +1 -0
  22. package/dist/application/object-metadata/standard-object-ids.d.ts +1 -0
  23. package/dist/application/object-metadata/standard-object-ids.d.ts.map +1 -0
  24. package/dist/application/syncable-entity-options.type.d.ts +1 -0
  25. package/dist/application/syncable-entity-options.type.d.ts.map +1 -0
  26. package/dist/cli/cli.js +39 -0
  27. package/dist/cli/cli.js.map +1 -0
  28. package/dist/cli/commands/app-add.command.js +143 -0
  29. package/dist/cli/commands/app-add.command.js.map +1 -0
  30. package/dist/cli/commands/app-dev.command.js +60 -0
  31. package/dist/cli/commands/app-dev.command.js.map +1 -0
  32. package/dist/cli/commands/app-generate.command.js +18 -0
  33. package/dist/cli/commands/app-generate.command.js.map +1 -0
  34. package/dist/cli/commands/app-sync.command.js +48 -0
  35. package/dist/cli/commands/app-sync.command.js.map +1 -0
  36. package/dist/cli/commands/app-uninstall.command.js +46 -0
  37. package/dist/cli/commands/app-uninstall.command.js.map +1 -0
  38. package/dist/cli/commands/app.command.js +99 -0
  39. package/dist/cli/commands/app.command.js.map +1 -0
  40. package/dist/cli/commands/auth.command.js +128 -0
  41. package/dist/cli/commands/auth.command.js.map +1 -0
  42. package/dist/cli/constants/current-execution-directory.js +2 -0
  43. package/dist/cli/constants/current-execution-directory.js.map +1 -0
  44. package/dist/cli/services/api.service.js +171 -0
  45. package/dist/cli/services/api.service.js.map +1 -0
  46. package/dist/cli/services/config.service.js +83 -0
  47. package/dist/cli/services/config.service.js.map +1 -0
  48. package/dist/cli/services/generate.service.js +45 -0
  49. package/dist/cli/services/generate.service.js.map +1 -0
  50. package/dist/cli/types/config.types.js +2 -0
  51. package/dist/cli/types/config.types.js.map +1 -0
  52. package/dist/cli/utils/convert-to-label.js +6 -0
  53. package/dist/cli/utils/convert-to-label.js.map +1 -0
  54. package/dist/cli/utils/find-path-file.js +10 -0
  55. package/dist/cli/utils/find-path-file.js.map +1 -0
  56. package/dist/cli/utils/format-and-warn-ts-diagnostics.js +12 -0
  57. package/dist/cli/utils/format-and-warn-ts-diagnostics.js.map +1 -0
  58. package/dist/cli/utils/format-path.js +8 -0
  59. package/dist/cli/utils/format-path.js.map +1 -0
  60. package/dist/cli/utils/get-function-base-file.js +28 -0
  61. package/dist/cli/utils/get-function-base-file.js.map +1 -0
  62. package/dist/cli/utils/get-object-decorated-class.js +16 -0
  63. package/dist/cli/utils/get-object-decorated-class.js.map +1 -0
  64. package/dist/cli/utils/get-ts-program-and-diagnostics.js +35 -0
  65. package/dist/cli/utils/get-ts-program-and-diagnostics.js.map +1 -0
  66. package/dist/cli/utils/jsonc-parser.js +45 -0
  67. package/dist/cli/utils/jsonc-parser.js.map +1 -0
  68. package/dist/cli/utils/load-env-variables.js +15 -0
  69. package/dist/cli/utils/load-env-variables.js.map +1 -0
  70. package/dist/cli/utils/load-manifest.js +377 -0
  71. package/dist/cli/utils/load-manifest.js.map +1 -0
  72. package/dist/index.cjs +51 -1
  73. package/dist/index.d.ts +2 -2
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.mjs +17590 -2
  76. package/package.json +44 -16
  77. package/dist/application.cjs +0 -20
  78. package/dist/application.mjs +0 -3202
package/README.md CHANGED
@@ -1,6 +1,26 @@
1
- # twenty-sdk
1
+ <div align="center">
2
+ <a href="https://twenty.com">
3
+ <picture>
4
+ <img alt="Twenty logo" src="https://raw.githubusercontent.com/twentyhq/twenty/2f25922f4cd5bd61e1427c57c4f8ea224e1d552c/packages/twenty-website/public/images/core/logo.svg" height="128">
5
+ </picture>
6
+ </a>
7
+ <h1>Twenty SDK</h1>
2
8
 
3
- A lightweight TypeScript SDK for Twenty CRM.
9
+ <a href="https://www.npmjs.com/package/twenty-sdk"><img alt="NPM version" src="https://img.shields.io/npm/v/twenty-sdk.svg?style=for-the-badge&labelColor=000000"></a>
10
+ <a href="https://github.com/twentyhq/twenty/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/npm/l/next.svg?style=for-the-badge&labelColor=000000"></a>
11
+ <a href="https://discord.gg/cx5n4Jzs57"><img alt="Join the community on Discord" src="https://img.shields.io/badge/Join%20the%20community-blueviolet.svg?style=for-the-badge&logo=Twenty&labelColor=000000&logoWidth=20"></a>
12
+
13
+ </div>
14
+
15
+ A CLI and SDK to develop, build, and publish applications that extend [Twenty CRM](https://twenty.com).
16
+
17
+ - Type‑safe client and workspace entity typings
18
+ - Built‑in CLI for auth, generate, dev sync, one‑off sync, and uninstall
19
+ - Works great with the scaffolder: [create-twenty-app](https://www.npmjs.com/package/create-twenty-app)
20
+
21
+ ## Prerequisites
22
+ - Node.js 18+ (recommended) and Yarn 4
23
+ - A Twenty workspace and an API key. Generate one at https://app.twenty.com/settings/api-webhooks
4
24
 
5
25
  ## Installation
6
26
 
@@ -10,18 +30,72 @@ npm install twenty-sdk
10
30
  yarn add twenty-sdk
11
31
  ```
12
32
 
13
- ## Usage
33
+ ## Getting started
34
+ You can either scaffold a new app or add the SDK to an existing one.
35
+
36
+ - Start new (recommended):
37
+ ```bash
38
+ npx create-twenty-app@latest my-twenty-app
39
+ cd my-twenty-app
40
+ ```
41
+ - Existing project: install the SDK as shown above, then use the CLI below.
42
+
43
+ ## CLI quickstart
44
+ ```bash
45
+ # Authenticate using your API key (CLI will prompt for it)
46
+ twenty auth login
47
+
48
+ # Add a new entity to your application (guided prompts)
49
+ twenty app add
50
+
51
+ # Generate a typed Twenty client and TypeScript definitions for your workspace entities
52
+ twenty app generate
53
+
54
+ # Start dev mode: automatically syncs changes to your workspace for instant testing
55
+ twenty app dev
56
+
57
+ # One‑time sync of local changes
58
+ twenty app sync
14
59
 
60
+ # Uninstall the application from the current workspace
61
+ twenty app uninstall
62
+ ```
63
+
64
+ ## Usage (SDK)
15
65
  ```typescript
66
+ // Example: import what you need from the SDK
16
67
  import { /* your exports */ } from 'twenty-sdk';
17
68
  ```
18
69
 
19
- ## Development
70
+ ## Publish your application
71
+ Applications are currently stored in [`twenty/packages/twenty-apps`](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps).
72
+
73
+ You can share your application with all Twenty users:
20
74
 
21
75
  ```bash
22
- # Build
23
- npx nx build twenty-sdk
76
+ # pull the Twenty project
77
+ git clone https://github.com/twentyhq/twenty.git
78
+ cd twenty
79
+
80
+ # create a new branch
81
+ git checkout -b feature/my-awesome-app
82
+ ```
24
83
 
25
- # Lint
26
- npx nx lint twenty-sdk
84
+ - Copy your app folder into `twenty/packages/twenty-apps`.
85
+ - Commit your changes and open a pull request on https://github.com/twentyhq/twenty
86
+
87
+ ```bash
88
+ git commit -m "Add new application"
89
+ git push
27
90
  ```
91
+
92
+ Our team reviews contributions for quality, security, and reusability.
93
+
94
+ ## Troubleshooting
95
+ - Auth errors: run `twenty auth login` again and ensure the API key has the required permissions.
96
+ - Typings out of date: run `twenty app generate` to refresh the client and types.
97
+ - Not seeing changes in dev: make sure dev mode is running (`twenty app dev`).
98
+
99
+ ## Contributing
100
+ - See our [GitHub](https://github.com/twentyhq/twenty)
101
+ - Join our [Discord](https://discord.gg/cx5n4Jzs57)
@@ -1,4 +1,4 @@
1
- import { SyncableEntityOptions } from '@/application/syncable-entity-options.type';
1
+ import { SyncableEntityOptions } from './syncable-entity-options.type';
2
2
 
3
3
  type ApplicationVariable = SyncableEntityOptions & {
4
4
  value?: string;
@@ -12,3 +12,4 @@ export type ApplicationConfig = SyncableEntityOptions & {
12
12
  applicationVariables?: Record<string, ApplicationVariable>;
13
13
  };
14
14
  export {};
15
+ //# sourceMappingURL=application-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-config.d.ts","sourceRoot":"","sources":["../../src/application/application-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE5E,KAAK,mBAAmB,GAAG,qBAAqB,GAAG;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,GAAG;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC5D,CAAC"}
@@ -1 +1,2 @@
1
1
  export type { ActorMetadata as ActorField, AddressMetadata as AddressField, CurrencyMetadata as CurrencyField, EmailsMetadata as EmailsField, FullNameMetadata as FullNameField, LinksMetadata as LinksField, PhonesMetadata as PhonesField, RichTextV2Metadata as RichTextField } from 'twenty-shared/types';
2
+ //# sourceMappingURL=composite-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-fields.d.ts","sourceRoot":"","sources":["../../../src/application/field-metadata/composite-fields.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,IAAI,UAAU,EAC3B,eAAe,IAAI,YAAY,EAC/B,gBAAgB,IAAI,aAAa,EACjC,cAAc,IAAI,WAAW,EAC7B,gBAAgB,IAAI,aAAa,EACjC,aAAa,IAAI,UAAU,EAC3B,cAAc,IAAI,WAAW,EAC7B,kBAAkB,IAAI,aAAa,EACpC,MAAM,qBAAqB,CAAC"}
@@ -1 +1,2 @@
1
1
  export { FieldMetadataType as FieldType } from 'twenty-shared/types';
2
+ //# sourceMappingURL=field-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-type.d.ts","sourceRoot":"","sources":["../../../src/application/field-metadata/field-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { FieldMetadataType, FieldMetadataSettings, FieldMetadataOptions, FieldMetadataDefaultValue } from 'twenty-shared/types';
2
- import { SyncableEntityOptions } from '@/application/syncable-entity-options.type';
2
+ import { SyncableEntityOptions } from '../syncable-entity-options.type';
3
3
 
4
4
  type FieldOptions<T extends FieldMetadataType = Exclude<FieldMetadataType, FieldMetadataType.RELATION>> = SyncableEntityOptions & {
5
5
  type: T;
@@ -13,3 +13,4 @@ type FieldOptions<T extends FieldMetadataType = Exclude<FieldMetadataType, Field
13
13
  };
14
14
  export declare const Field: <T extends FieldMetadataType>(_: FieldOptions<T>) => PropertyDecorator;
15
15
  export {};
16
+ //# sourceMappingURL=field.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.decorator.d.ts","sourceRoot":"","sources":["../../../src/application/field-metadata/field.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAC;AAE7B,KAAK,YAAY,CACf,CAAC,SAAS,iBAAiB,GAAG,OAAO,CACnC,iBAAiB,EAEjB,iBAAiB,CAAC,QAAQ,CAC3B,IACC,qBAAqB,GAAG;IAC1B,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,iBAAiB,EAC/C,GAAG,YAAY,CAAC,CAAC,CAAC,KACjB,iBAEF,CAAC"}
@@ -1 +1,2 @@
1
1
  export { RelationOnDeleteAction as OnDeleteAction } from 'twenty-shared/types';
2
+ //# sourceMappingURL=on-delete-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-delete-action.d.ts","sourceRoot":"","sources":["../../../src/application/field-metadata/on-delete-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +1,2 @@
1
1
  export { RelationType } from 'twenty-shared/types';
2
+ //# sourceMappingURL=relation-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-type.d.ts","sourceRoot":"","sources":["../../../src/application/field-metadata/relation-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { RelationOnDeleteAction, RelationType } from 'twenty-shared/types';
2
- import { SyncableEntityOptions } from '@/application/syncable-entity-options.type';
2
+ import { SyncableEntityOptions } from '../syncable-entity-options.type';
3
3
 
4
4
  interface WorkspaceRelationMinimumBaseOptions<TClass> {
5
5
  label: string;
@@ -27,3 +27,4 @@ type WorkspaceManyToOneRelationOptions<TClass extends object> = WorkspaceRelatio
27
27
  type RelationOptions<T extends object> = SyncableEntityOptions & (WorkspaceOtherRelationOptions<T> | WorkspaceManyToOneRelationOptions<T>);
28
28
  export declare const Relation: <T extends object>(_: RelationOptions<T>) => PropertyDecorator;
29
29
  export {};
30
+ //# sourceMappingURL=relation.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.decorator.d.ts","sourceRoot":"","sources":["../../../src/application/field-metadata/relation.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAE7B,UAAU,mCAAmC,CAAC,MAAM;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC,EAAE,MAAM,CAAC;IAC7C,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC;IACnC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC;AAED,UAAU,mCAAmC,CAAC,MAAM,CAClD,SAAQ,mCAAmC,CAAC,MAAM,CAAC;IACnD,eAAe,CAAC,EAAE,KAAK,CAAC;CACzB;AAED,UAAU,iCAAiC,CAAC,MAAM,CAChD,SAAQ,mCAAmC,CAAC,MAAM,CAAC;IACnD,eAAe,EAAE,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,4BAA4B,CAAC,MAAM,IACpC,mCAAmC,CAAC,MAAM,CAAC,GAC3C,iCAAiC,CAAC,MAAM,CAAC,CAAC;AAE9C,KAAK,6BAA6B,CAAC,MAAM,IACvC,4BAA4B,CAAC,MAAM,CAAC,GAAG;IACrC,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC;CAChC,CAAC;AAEJ,KAAK,iCAAiC,CAAC,MAAM,SAAS,MAAM,IAC1D,4BAA4B,CAAC,MAAM,CAAC,GAAG;IACrC,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC;IAC/B,mBAAmB,EAAE,MAAM,MAAM,CAAC;CACnC,CAAC;AAEJ,KAAK,eAAe,CAAC,CAAC,SAAS,MAAM,IAAI,qBAAqB,GAC5D,CAAC,6BAA6B,CAAC,CAAC,CAAC,GAAG,iCAAiC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5E,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,EACvC,GAAG,eAAe,CAAC,CAAC,CAAC,KACpB,iBAEF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { SyncableEntityOptions } from '@/application/syncable-entity-options.type';
1
+ import { SyncableEntityOptions } from './syncable-entity-options.type';
2
2
 
3
3
  type RouteTrigger = {
4
4
  type: 'route';
@@ -14,11 +14,12 @@ type DatabaseEventTrigger = {
14
14
  type: 'databaseEvent';
15
15
  eventName: string;
16
16
  };
17
- type ServerlessFunctionTrigger = SyncableEntityOptions & (RouteTrigger | CronTrigger | DatabaseEventTrigger);
18
- export type ServerlessFunctionConfig = SyncableEntityOptions & {
17
+ type FunctionTrigger = SyncableEntityOptions & (RouteTrigger | CronTrigger | DatabaseEventTrigger);
18
+ export type FunctionConfig = SyncableEntityOptions & {
19
19
  name?: string;
20
20
  description?: string;
21
21
  timeoutSeconds?: number;
22
- triggers?: ServerlessFunctionTrigger[];
22
+ triggers?: FunctionTrigger[];
23
23
  };
24
24
  export {};
25
+ //# sourceMappingURL=function-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-config.d.ts","sourceRoot":"","sources":["../../src/application/function-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE5E,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxD,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,GAAG,qBAAqB,GAC1C,CAAC,YAAY,GAAG,WAAW,GAAG,oBAAoB,CAAC,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,qBAAqB,GAAG;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B,CAAC"}
@@ -5,7 +5,8 @@ export { Field } from './field-metadata/field.decorator';
5
5
  export { OnDeleteAction } from './field-metadata/on-delete-action';
6
6
  export { RelationType } from './field-metadata/relation-type';
7
7
  export { Relation } from './field-metadata/relation.decorator';
8
+ export type { FunctionConfig } from './function-config';
8
9
  export { Object } from './object-metadata/object.decorator';
9
10
  export { STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from './object-metadata/standard-object-ids';
10
- export type { ServerlessFunctionConfig } from './serverless-function-config';
11
11
  export type { SyncableEntityOptions } from './syncable-entity-options.type';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AASA,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,qCAAqC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,YAAY,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { SyncableEntityOptions } from '@/application/syncable-entity-options.type';
1
+ import { SyncableEntityOptions } from '../syncable-entity-options.type';
2
2
 
3
3
  type ObjectMetadataOptions = SyncableEntityOptions & {
4
4
  nameSingular: string;
@@ -10,3 +10,4 @@ type ObjectMetadataOptions = SyncableEntityOptions & {
10
10
  };
11
11
  export declare const Object: (_: ObjectMetadataOptions) => ClassDecorator;
12
12
  export {};
13
+ //# sourceMappingURL=object.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.decorator.d.ts","sourceRoot":"","sources":["../../../src/application/object-metadata/object.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,KAAK,qBAAqB,GAAG,qBAAqB,GAAG;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,GAAG,qBAAqB,KAAG,cAEjD,CAAC"}
@@ -1 +1,2 @@
1
1
  export { STANDARD_OBJECT_IDS as STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from 'twenty-shared/metadata';
2
+ //# sourceMappingURL=standard-object-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-object-ids.d.ts","sourceRoot":"","sources":["../../../src/application/object-metadata/standard-object-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,qCAAqC,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export type SyncableEntityOptions = {
2
2
  universalIdentifier: string;
3
3
  };
4
+ //# sourceMappingURL=syncable-entity-options.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncable-entity-options.type.d.ts","sourceRoot":"","sources":["../../src/application/syncable-entity-options.type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAAE,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ import chalk from 'chalk';
3
+ import { Command, CommanderError } from 'commander';
4
+ import { readFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { AppCommand } from './commands/app.command';
7
+ import { AuthCommand } from './commands/auth.command';
8
+ import { ConfigService } from './services/config.service';
9
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
10
+ const program = new Command();
11
+ program
12
+ .name('twenty')
13
+ .description('CLI for Twenty application development')
14
+ .version(packageJson.version);
15
+ program.option('--workspace <name>', 'Use a specific workspace configuration', 'default');
16
+ program.hook('preAction', (thisCommand) => {
17
+ const opts = thisCommand.optsWithGlobals
18
+ ? thisCommand.optsWithGlobals()
19
+ : thisCommand.opts();
20
+ const workspace = opts.workspace;
21
+ ConfigService.setActiveWorkspace(workspace);
22
+ console.log(chalk.gray(`šŸ‘©ā€šŸ’» Workspace - ${ConfigService.getActiveWorkspace()}`));
23
+ });
24
+ program.addCommand(new AuthCommand().getCommand());
25
+ program.addCommand(new AppCommand().getCommand());
26
+ program.exitOverride();
27
+ try {
28
+ program.parse();
29
+ }
30
+ catch (error) {
31
+ if (error instanceof CommanderError) {
32
+ process.exit(error.exitCode);
33
+ }
34
+ if (error instanceof Error) {
35
+ console.error(chalk.red('Error:'), error.message);
36
+ process.exit(1);
37
+ }
38
+ }
39
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,MAAM,CACZ,oBAAoB,EACpB,wCAAwC,EACxC,SAAS,CACV,CAAC;AAEF,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACxC,MAAM,IAAI,GAAI,WAAmB,CAAC,eAAe;QAC/C,CAAC,CAAE,WAAmB,CAAC,eAAe,EAAE;QACxC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,aAAa,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,qBAAqB,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CACtE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;AACnD,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;AAElD,OAAO,CAAC,YAAY,EAAE,CAAC;AAEvB,IAAI,CAAC;IACH,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,143 @@
1
+ import chalk from 'chalk';
2
+ import * as fs from 'fs-extra';
3
+ import inquirer from 'inquirer';
4
+ import { join } from 'path';
5
+ import camelcase from 'lodash.camelcase';
6
+ import { CURRENT_EXECUTION_DIRECTORY } from '../constants/current-execution-directory';
7
+ import { getObjectDecoratedClass } from '../utils/get-object-decorated-class';
8
+ import { getFunctionBaseFile } from '../utils/get-function-base-file';
9
+ import { convertToLabel } from '../utils/convert-to-label';
10
+ export var SyncableEntity;
11
+ (function (SyncableEntity) {
12
+ SyncableEntity["AGENT"] = "agent";
13
+ SyncableEntity["OBJECT"] = "object";
14
+ SyncableEntity["FUNCTION"] = "function";
15
+ })(SyncableEntity || (SyncableEntity = {}));
16
+ export const isSyncableEntity = (value) => {
17
+ return Object.values(SyncableEntity).includes(value);
18
+ };
19
+ export class AppAddCommand {
20
+ async execute(entityType, path) {
21
+ try {
22
+ const appPath = join(CURRENT_EXECUTION_DIRECTORY, path !== null && path !== void 0 ? path : '');
23
+ await fs.ensureDir(appPath);
24
+ const entity = entityType !== null && entityType !== void 0 ? entityType : (await this.getEntity());
25
+ if (entity === SyncableEntity.OBJECT) {
26
+ const entityData = await this.getObjectData();
27
+ const name = entityData.nameSingular;
28
+ const objectFileName = `${camelcase(name)}.ts`;
29
+ const decoratedObject = getObjectDecoratedClass({
30
+ data: entityData,
31
+ name,
32
+ });
33
+ await fs.writeFile(join(appPath, objectFileName), decoratedObject);
34
+ return;
35
+ }
36
+ if (entity === SyncableEntity.FUNCTION) {
37
+ const entityName = await this.getEntityName(entity);
38
+ const objectFileName = `${camelcase(entityName)}.ts`;
39
+ const decoratedServerlessFunction = getFunctionBaseFile({
40
+ name: entityName,
41
+ });
42
+ await fs.writeFile(join(appPath, objectFileName), decoratedServerlessFunction);
43
+ return;
44
+ }
45
+ }
46
+ catch (error) {
47
+ console.error(chalk.red(`Add new entity failed:`), error instanceof Error ? error.message : error);
48
+ process.exit(1);
49
+ }
50
+ }
51
+ async getEntity() {
52
+ const { entity } = await inquirer.prompt([
53
+ {
54
+ type: 'select',
55
+ name: 'entity',
56
+ message: `What entity do you want to create?`,
57
+ default: '',
58
+ choices: [SyncableEntity.FUNCTION, SyncableEntity.OBJECT],
59
+ },
60
+ ]);
61
+ return entity;
62
+ }
63
+ async getEntityName(entity) {
64
+ const { name } = await inquirer.prompt([
65
+ {
66
+ type: 'input',
67
+ name: 'name',
68
+ message: `Enter a name for your new ${entity}:`,
69
+ default: '',
70
+ validate: (input) => {
71
+ if (input.length === 0) {
72
+ return `${entity} name is required`;
73
+ }
74
+ if (!/^[a-z0-9-]+$/.test(input)) {
75
+ return 'Name must contain only lowercase letters, numbers, and hyphens';
76
+ }
77
+ return true;
78
+ },
79
+ },
80
+ ]);
81
+ return name;
82
+ }
83
+ async getObjectData() {
84
+ return inquirer.prompt([
85
+ {
86
+ type: 'input',
87
+ name: 'nameSingular',
88
+ message: 'Enter a name singular for your object (eg: company):',
89
+ default: '',
90
+ validate: (input) => {
91
+ if (!input || input.trim().length === 0) {
92
+ return 'Please enter a non empty string';
93
+ }
94
+ return true;
95
+ },
96
+ },
97
+ {
98
+ type: 'input',
99
+ name: 'namePlural',
100
+ message: 'Enter a name plural for your object (eg: companies):',
101
+ default: '',
102
+ validate: (input, answers) => {
103
+ if (input.trim() === (answers === null || answers === void 0 ? void 0 : answers.nameSingular.trim())) {
104
+ return 'Name plural must be different from name singular';
105
+ }
106
+ if (!input || input.trim().length === 0) {
107
+ return 'Please enter a non empty string';
108
+ }
109
+ return true;
110
+ },
111
+ },
112
+ {
113
+ type: 'input',
114
+ name: 'labelSingular',
115
+ message: 'Enter a label singular for your object:',
116
+ default: (answers) => {
117
+ return convertToLabel(answers.nameSingular);
118
+ },
119
+ validate: (input) => {
120
+ if (!input || input.trim().length === 0) {
121
+ return 'Please enter a non empty string';
122
+ }
123
+ return true;
124
+ },
125
+ },
126
+ {
127
+ type: 'input',
128
+ name: 'labelPlural',
129
+ message: 'Enter a label plural for your object:',
130
+ default: (answers) => {
131
+ return convertToLabel(answers.namePlural);
132
+ },
133
+ validate: (input) => {
134
+ if (!input || input.trim().length === 0) {
135
+ return 'Please enter a non empty string';
136
+ }
137
+ return true;
138
+ },
139
+ },
140
+ ]);
141
+ }
142
+ }
143
+ //# sourceMappingURL=app-add.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-add.command.js","sourceRoot":"","sources":["../../../src/cli/commands/app-add.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import chalk from 'chalk';
2
+ import * as chokidar from 'chokidar';
3
+ import { CURRENT_EXECUTION_DIRECTORY } from '../constants/current-execution-directory';
4
+ import { AppSyncCommand } from './app-sync.command';
5
+ export class AppDevCommand {
6
+ constructor() {
7
+ this.syncCommand = new AppSyncCommand();
8
+ }
9
+ async execute(options) {
10
+ var _a;
11
+ try {
12
+ const appPath = (_a = options.appPath) !== null && _a !== void 0 ? _a : CURRENT_EXECUTION_DIRECTORY;
13
+ const debounceMs = parseInt(options.debounce, 10);
14
+ this.logStartupInfo(appPath, debounceMs);
15
+ await this.syncCommand.execute(appPath);
16
+ const watcher = this.setupFileWatcher(appPath, debounceMs);
17
+ this.setupGracefulShutdown(watcher);
18
+ }
19
+ catch (error) {
20
+ console.error(chalk.red('Development mode failed:'), error instanceof Error ? error.message : error);
21
+ process.exit(1);
22
+ }
23
+ }
24
+ logStartupInfo(appPath, debounceMs) {
25
+ console.log(chalk.blue('šŸš€ Starting Twenty Application Development Mode'));
26
+ console.log(chalk.gray(`šŸ“ App Path: ${appPath}`));
27
+ console.log(chalk.gray(`ā±ļø Debounce: ${debounceMs}ms`));
28
+ console.log('');
29
+ }
30
+ setupFileWatcher(appPath, debounceMs) {
31
+ const watcher = chokidar.watch(appPath, {
32
+ ignored: /node_modules|\.git/,
33
+ persistent: true,
34
+ });
35
+ let timeout = null;
36
+ const debouncedSync = () => {
37
+ if (timeout) {
38
+ clearTimeout(timeout);
39
+ }
40
+ timeout = setTimeout(async () => {
41
+ console.log(chalk.blue('šŸ”„ Changes detected, syncing...'));
42
+ await this.syncCommand.execute(appPath);
43
+ console.log(chalk.gray('šŸ‘€ Watching for changes... (Press Ctrl+C to stop)'));
44
+ }, debounceMs);
45
+ };
46
+ watcher.on('change', () => {
47
+ debouncedSync();
48
+ });
49
+ console.log(chalk.gray('šŸ‘€ Watching for changes... (Press Ctrl+C to stop)'));
50
+ return watcher;
51
+ }
52
+ setupGracefulShutdown(watcher) {
53
+ process.on('SIGINT', () => {
54
+ console.log(chalk.yellow('\nšŸ›‘ Stopping development mode...'));
55
+ watcher.close();
56
+ process.exit(0);
57
+ });
58
+ }
59
+ }
60
+ //# sourceMappingURL=app-dev.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-dev.command.js","sourceRoot":"","sources":["../../../src/cli/commands/app-dev.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import chalk from 'chalk';
2
+ import { GenerateService } from '../services/generate.service';
3
+ import { CURRENT_EXECUTION_DIRECTORY } from '../constants/current-execution-directory';
4
+ export class AppGenerateCommand {
5
+ constructor() {
6
+ this.generateService = new GenerateService();
7
+ }
8
+ async execute(appPath = CURRENT_EXECUTION_DIRECTORY) {
9
+ try {
10
+ await this.generateService.generateClient(appPath);
11
+ }
12
+ catch (error) {
13
+ console.error(chalk.red('Generate Twenty client failed:'), error instanceof Error ? error.message : error);
14
+ throw error;
15
+ }
16
+ }
17
+ }
18
+ //# sourceMappingURL=app-generate.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-generate.command.js","sourceRoot":"","sources":["../../../src/cli/commands/app-generate.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AAEvF,MAAM,OAAO,kBAAkB;IAA/B;QACU,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAalD,CAAC;IAXC,KAAK,CAAC,OAAO,CAAC,UAAkB,2BAA2B;QACzD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAC3C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import { CURRENT_EXECUTION_DIRECTORY } from '../constants/current-execution-directory';
3
+ import { ApiService } from '../services/api.service';
4
+ import { GenerateService } from '../services/generate.service';
5
+ import { loadManifest } from '../utils/load-manifest';
6
+ export class AppSyncCommand {
7
+ constructor() {
8
+ this.apiService = new ApiService();
9
+ this.generateService = new GenerateService();
10
+ }
11
+ async execute(appPath = CURRENT_EXECUTION_DIRECTORY) {
12
+ try {
13
+ console.log(chalk.blue('šŸš€ Syncing Twenty Application'));
14
+ console.log(chalk.gray(`šŸ“ App Path: ${appPath}`));
15
+ console.log('');
16
+ return await this.synchronize({ appPath });
17
+ }
18
+ catch (error) {
19
+ console.error(chalk.red('Sync failed:'), error instanceof Error ? error.message : error);
20
+ throw error;
21
+ }
22
+ }
23
+ async synchronize({ appPath }) {
24
+ const { manifest, packageJson, yarnLock, shouldGenerate } = await loadManifest(appPath);
25
+ let serverlessSyncResult = await this.apiService.syncApplication({
26
+ manifest,
27
+ packageJson,
28
+ yarnLock,
29
+ });
30
+ if (shouldGenerate) {
31
+ await this.generateService.generateClient(appPath);
32
+ const { manifest: manifestWithClient } = await loadManifest(appPath);
33
+ serverlessSyncResult = await this.apiService.syncApplication({
34
+ manifest: manifestWithClient,
35
+ packageJson,
36
+ yarnLock,
37
+ });
38
+ }
39
+ if (serverlessSyncResult.success === false) {
40
+ console.error(chalk.red('āŒ Serverless functions Sync failed:'), serverlessSyncResult.error);
41
+ }
42
+ else {
43
+ console.log(chalk.green('āœ… Serverless functions synced successfully'));
44
+ }
45
+ return serverlessSyncResult;
46
+ }
47
+ }
48
+ //# sourceMappingURL=app-sync.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-sync.command.js","sourceRoot":"","sources":["../../../src/cli/commands/app-sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,OAAO,cAAc;IAA3B;QACU,eAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAqDlD,CAAC;IAnDC,KAAK,CAAC,OAAO,CACX,UAAkB,2BAA2B;QAE7C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EACzB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,EAAE,OAAO,EAAuB;QACxD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GACvD,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAE9B,IAAI,oBAAoB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAC/D,QAAQ;YACR,WAAW;YACX,QAAQ;SACT,CAAC,CAAC;QAEH,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEnD,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAErE,oBAAoB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;gBAC3D,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW;gBACX,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,IAAI,oBAAoB,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,EAChD,oBAAoB,CAAC,KAAK,CAC3B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,oBAAoB,CAAC;IAC9B,CAAC;CACF"}