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.
- package/README.md +82 -8
- package/dist/application/application-config.d.ts +2 -1
- package/dist/application/application-config.d.ts.map +1 -0
- package/dist/application/field-metadata/composite-fields.d.ts +1 -0
- package/dist/application/field-metadata/composite-fields.d.ts.map +1 -0
- package/dist/application/field-metadata/field-type.d.ts +1 -0
- package/dist/application/field-metadata/field-type.d.ts.map +1 -0
- package/dist/application/field-metadata/field.decorator.d.ts +2 -1
- package/dist/application/field-metadata/field.decorator.d.ts.map +1 -0
- package/dist/application/field-metadata/on-delete-action.d.ts +1 -0
- package/dist/application/field-metadata/on-delete-action.d.ts.map +1 -0
- package/dist/application/field-metadata/relation-type.d.ts +1 -0
- package/dist/application/field-metadata/relation-type.d.ts.map +1 -0
- package/dist/application/field-metadata/relation.decorator.d.ts +2 -1
- package/dist/application/field-metadata/relation.decorator.d.ts.map +1 -0
- package/dist/application/{serverless-function-config.d.ts ā function-config.d.ts} +5 -4
- package/dist/application/function-config.d.ts.map +1 -0
- package/dist/application/index.d.ts +2 -1
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/object-metadata/object.decorator.d.ts +2 -1
- package/dist/application/object-metadata/object.decorator.d.ts.map +1 -0
- package/dist/application/object-metadata/standard-object-ids.d.ts +1 -0
- package/dist/application/object-metadata/standard-object-ids.d.ts.map +1 -0
- package/dist/application/syncable-entity-options.type.d.ts +1 -0
- package/dist/application/syncable-entity-options.type.d.ts.map +1 -0
- package/dist/cli/cli.js +39 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/app-add.command.js +143 -0
- package/dist/cli/commands/app-add.command.js.map +1 -0
- package/dist/cli/commands/app-dev.command.js +60 -0
- package/dist/cli/commands/app-dev.command.js.map +1 -0
- package/dist/cli/commands/app-generate.command.js +18 -0
- package/dist/cli/commands/app-generate.command.js.map +1 -0
- package/dist/cli/commands/app-sync.command.js +48 -0
- package/dist/cli/commands/app-sync.command.js.map +1 -0
- package/dist/cli/commands/app-uninstall.command.js +46 -0
- package/dist/cli/commands/app-uninstall.command.js.map +1 -0
- package/dist/cli/commands/app.command.js +99 -0
- package/dist/cli/commands/app.command.js.map +1 -0
- package/dist/cli/commands/auth.command.js +128 -0
- package/dist/cli/commands/auth.command.js.map +1 -0
- package/dist/cli/constants/current-execution-directory.js +2 -0
- package/dist/cli/constants/current-execution-directory.js.map +1 -0
- package/dist/cli/services/api.service.js +171 -0
- package/dist/cli/services/api.service.js.map +1 -0
- package/dist/cli/services/config.service.js +83 -0
- package/dist/cli/services/config.service.js.map +1 -0
- package/dist/cli/services/generate.service.js +45 -0
- package/dist/cli/services/generate.service.js.map +1 -0
- package/dist/cli/types/config.types.js +2 -0
- package/dist/cli/types/config.types.js.map +1 -0
- package/dist/cli/utils/convert-to-label.js +6 -0
- package/dist/cli/utils/convert-to-label.js.map +1 -0
- package/dist/cli/utils/find-path-file.js +10 -0
- package/dist/cli/utils/find-path-file.js.map +1 -0
- package/dist/cli/utils/format-and-warn-ts-diagnostics.js +12 -0
- package/dist/cli/utils/format-and-warn-ts-diagnostics.js.map +1 -0
- package/dist/cli/utils/format-path.js +8 -0
- package/dist/cli/utils/format-path.js.map +1 -0
- package/dist/cli/utils/get-function-base-file.js +28 -0
- package/dist/cli/utils/get-function-base-file.js.map +1 -0
- package/dist/cli/utils/get-object-decorated-class.js +16 -0
- package/dist/cli/utils/get-object-decorated-class.js.map +1 -0
- package/dist/cli/utils/get-ts-program-and-diagnostics.js +35 -0
- package/dist/cli/utils/get-ts-program-and-diagnostics.js.map +1 -0
- package/dist/cli/utils/jsonc-parser.js +45 -0
- package/dist/cli/utils/jsonc-parser.js.map +1 -0
- package/dist/cli/utils/load-env-variables.js +15 -0
- package/dist/cli/utils/load-env-variables.js.map +1 -0
- package/dist/cli/utils/load-manifest.js +377 -0
- package/dist/cli/utils/load-manifest.js.map +1 -0
- package/dist/index.cjs +51 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +17590 -2
- package/package.json +44 -16
- package/dist/application.cjs +0 -20
- package/dist/application.mjs +0 -3202
package/README.md
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
#
|
|
23
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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 '
|
|
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"}
|
|
@@ -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 '
|
|
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"}
|
|
@@ -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"}
|
|
@@ -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 '
|
|
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 '
|
|
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
|
|
18
|
-
export type
|
|
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?:
|
|
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 '
|
|
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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
package/dist/cli/cli.js
ADDED
|
@@ -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"}
|