nango 0.40.0 → 0.40.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +16 -4
- package/dist/cli.js +76 -124
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +0 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +38 -23
- package/dist/index.js.map +1 -1
- package/dist/services/compile.service.d.ts +14 -9
- package/dist/services/compile.service.js +71 -67
- package/dist/services/compile.service.js.map +1 -1
- package/dist/services/compile.service.unit.test.js +17 -7
- package/dist/services/compile.service.unit.test.js.map +1 -1
- package/dist/services/config.service.d.ts +16 -7
- package/dist/services/config.service.js +84 -55
- package/dist/services/config.service.js.map +1 -1
- package/dist/services/config.service.unit.test.d.ts +1 -0
- package/dist/services/config.service.unit.test.js +147 -0
- package/dist/services/config.service.unit.test.js.map +1 -0
- package/dist/services/deploy.service.d.ts +14 -5
- package/dist/services/deploy.service.js +81 -71
- package/dist/services/deploy.service.js.map +1 -1
- package/dist/services/dryrun.service.js +11 -11
- package/dist/services/dryrun.service.js.map +1 -1
- package/dist/services/migration.service.js +23 -26
- package/dist/services/migration.service.js.map +1 -1
- package/dist/services/model.service.d.ts +38 -8
- package/dist/services/model.service.js +129 -167
- package/dist/services/model.service.js.map +1 -1
- package/dist/services/model.service.unit.test.d.ts +1 -0
- package/dist/services/model.service.unit.test.js +138 -0
- package/dist/services/model.service.unit.test.js.map +1 -0
- package/dist/services/parser.service.d.ts +1 -2
- package/dist/services/parser.service.js +3 -4
- package/dist/services/parser.service.js.map +1 -1
- package/dist/services/verification.service.d.ts +9 -2
- package/dist/services/verification.service.js +20 -22
- package/dist/services/verification.service.js.map +1 -1
- package/dist/sync.unit.cli-test.js +157 -222
- package/dist/sync.unit.cli-test.js.map +1 -1
- package/dist/templates/action.ejs +2 -47
- package/dist/templates/nango.yaml +1 -2
- package/dist/templates/sync.ejs +1 -4
- package/dist/utils/layoutMode.d.ts +7 -0
- package/dist/utils/layoutMode.js +41 -0
- package/dist/utils/layoutMode.js.map +1 -0
- package/dist/utils.d.ts +0 -3
- package/dist/utils.js +4 -127
- package/dist/utils.js.map +1 -1
- package/lib/nango.yaml.schema.v2.json +183 -178
- package/package.json +7 -6
- package/dist/nango-sync.d.ts +0 -299
|
@@ -2,30 +2,29 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import { exec } from 'child_process';
|
|
5
|
-
import { nangoConfigFile
|
|
5
|
+
import { nangoConfigFile } from '@nangohq/nango-yaml';
|
|
6
6
|
import { printDebug, getNangoRootPath } from '../utils.js';
|
|
7
|
+
import { load } from './config.service.js';
|
|
7
8
|
export const v1toV2Migration = async (loadLocation) => {
|
|
8
9
|
if (process.env['NANGO_CLI_UPGRADE_MODE'] === 'ignore') {
|
|
9
10
|
return;
|
|
10
11
|
}
|
|
11
|
-
const
|
|
12
|
-
if (!
|
|
12
|
+
const { response: parsed, success } = load(loadLocation);
|
|
13
|
+
if (!success || !parsed) {
|
|
13
14
|
return;
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
if (version === 'v2') {
|
|
16
|
+
if (parsed.yamlVersion === 'v2') {
|
|
17
17
|
console.log(chalk.blue(`nango.yaml is already at v2.`));
|
|
18
|
+
return;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
});
|
|
28
|
-
}
|
|
20
|
+
exec(`node ${getNangoRootPath()}/scripts/v1-v2.js ./${nangoConfigFile}`, (error) => {
|
|
21
|
+
if (error) {
|
|
22
|
+
console.log(chalk.red(`There was an issue migrating your nango.yaml to v2.`));
|
|
23
|
+
console.error(error);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log(chalk.blue(`Migrated to v2 of nango.yaml!`));
|
|
27
|
+
});
|
|
29
28
|
};
|
|
30
29
|
async function createDirectory(dirPath, debug = false) {
|
|
31
30
|
if (fs.existsSync(dirPath)) {
|
|
@@ -66,23 +65,21 @@ async function updateModelImport(filePath, debug = false) {
|
|
|
66
65
|
}
|
|
67
66
|
}
|
|
68
67
|
export const directoryMigration = async (loadLocation, debug) => {
|
|
69
|
-
const
|
|
70
|
-
if (!
|
|
68
|
+
const { response: parsed, success } = load(loadLocation);
|
|
69
|
+
if (!success || !parsed) {
|
|
71
70
|
return;
|
|
72
71
|
}
|
|
73
|
-
|
|
74
|
-
if (version !== 'v2') {
|
|
72
|
+
if (parsed.yamlVersion !== 'v2') {
|
|
75
73
|
console.log(chalk.red(`nango.yaml is not at v2. Nested directories are not supported in v1.`));
|
|
76
74
|
return;
|
|
77
75
|
}
|
|
78
|
-
for (const integration of Object.
|
|
79
|
-
const integrationPath = `${loadLocation}/${
|
|
76
|
+
for (const [providerConfigKey, integration] of Object.entries(parsed.integrations)) {
|
|
77
|
+
const integrationPath = `${loadLocation}/${providerConfigKey}`;
|
|
80
78
|
await createDirectory(integrationPath, debug);
|
|
81
|
-
|
|
82
|
-
if (scripts?.syncs) {
|
|
79
|
+
if (integration.syncs) {
|
|
83
80
|
const syncsPath = path.join(integrationPath, 'syncs');
|
|
84
81
|
await createDirectory(syncsPath, debug);
|
|
85
|
-
for (const sync of Object.keys(
|
|
82
|
+
for (const sync of Object.keys(integration.syncs)) {
|
|
86
83
|
const syncPath = path.join(syncsPath, `${sync}.ts`);
|
|
87
84
|
const moved = await moveFile(path.join(loadLocation, `${sync}.ts`), syncPath, debug);
|
|
88
85
|
if (moved) {
|
|
@@ -90,10 +87,10 @@ export const directoryMigration = async (loadLocation, debug) => {
|
|
|
90
87
|
}
|
|
91
88
|
}
|
|
92
89
|
}
|
|
93
|
-
if (
|
|
90
|
+
if (integration.actions) {
|
|
94
91
|
const actionsPath = path.join(integrationPath, 'actions');
|
|
95
92
|
await createDirectory(actionsPath, debug);
|
|
96
|
-
for (const action of Object.keys(
|
|
93
|
+
for (const action of Object.keys(integration.actions)) {
|
|
97
94
|
const actionPath = path.join(actionsPath, `${action}.ts`);
|
|
98
95
|
const moved = await moveFile(path.join(loadLocation, `${action}.ts`), actionPath, debug);
|
|
99
96
|
if (moved) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.service.js","sourceRoot":"","sources":["../../lib/services/migration.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"migration.service.js","sourceRoot":"","sources":["../../lib/services/migration.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,YAAoB,EAAiB,EAAE;IACzE,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO;IACX,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO;IACX,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,OAAO;IACX,CAAC;IAED,IAAI,CAAC,QAAQ,gBAAgB,EAAE,uBAAuB,eAAe,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/E,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,KAAK,GAAG,KAAK;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACR,UAAU,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO;IACX,CAAC;IAED,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,KAAK,EAAE,CAAC;QACR,UAAU,CAAC,wBAAwB,OAAO,GAAG,CAAC,CAAC;IACnD,CAAC;AACL,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,WAAmB,EAAE,KAAK,GAAG,KAAK;IACtE,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,IAAI,KAAK,EAAE,CAAC;YACR,UAAU,CAAC,0BAA0B,WAAW,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9C,IAAI,KAAK,EAAE,CAAC;QACR,UAAU,CAAC,mBAAmB,MAAM,OAAO,WAAW,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,KAAK,GAAG,KAAK;IAC5D,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,KAAK,EAAE,CAAC;YACR,UAAU,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/F,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,YAAoB,EAAE,KAAe,EAAiB,EAAE;IAC7F,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO;IACX,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;QAC/F,OAAO;IACX,CAAC;IAED,KAAK,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACjF,MAAM,eAAe,GAAG,GAAG,YAAY,IAAI,iBAAiB,EAAE,CAAC;QAC/D,MAAM,eAAe,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAE9C,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,SAAS,GAAW,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,MAAM,QAAQ,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;gBAC5D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACrF,IAAI,KAAK,EAAE,CAAC;oBACR,MAAM,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,WAAW,GAAW,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;YAClE,MAAM,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,MAAM,UAAU,GAAW,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,KAAK,CAAC,CAAC;gBAClE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBACzF,IAAI,KAAK,EAAE,CAAC;oBACR,MAAM,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC/C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC"}
|
|
@@ -1,8 +1,38 @@
|
|
|
1
|
-
import type { NangoModel,
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
declare
|
|
8
|
-
|
|
1
|
+
import type { NangoModel, NangoModelField, NangoYamlParsed } from '@nangohq/types';
|
|
2
|
+
import type { ServiceResponse } from '@nangohq/shared';
|
|
3
|
+
export type ModelsMap = Map<string, Record<string, any>>;
|
|
4
|
+
/**
|
|
5
|
+
* Load nango.yaml and generate model.ts
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadYamlAndGeneratedModel({ fullPath, debug }: {
|
|
8
|
+
fullPath: string;
|
|
9
|
+
debug?: boolean;
|
|
10
|
+
}): ServiceResponse<NangoYamlParsed>;
|
|
11
|
+
/**
|
|
12
|
+
* Build models.ts
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildModelsTS({ parsed }: {
|
|
15
|
+
parsed: NangoYamlParsed;
|
|
16
|
+
}): string;
|
|
17
|
+
export declare function generateInterfaces({ parsed }: {
|
|
18
|
+
parsed: NangoYamlParsed;
|
|
19
|
+
}): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Transform a JSON model to its Typescript equivalent
|
|
22
|
+
*/
|
|
23
|
+
export declare function modelToTypescript({ model }: {
|
|
24
|
+
model: NangoModel;
|
|
25
|
+
}): string;
|
|
26
|
+
export declare function fieldsToTypescript({ fields }: {
|
|
27
|
+
fields: NangoModelField[];
|
|
28
|
+
}): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Transform a field definition to its typescript equivalent
|
|
31
|
+
*/
|
|
32
|
+
export declare function fieldToTypescript({ field }: {
|
|
33
|
+
field: NangoModelField;
|
|
34
|
+
}): string | boolean | null | undefined | number;
|
|
35
|
+
/**
|
|
36
|
+
* Generate SDK types
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateSDKTypes(): string;
|
|
@@ -1,180 +1,142 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { resolve } from 'import-meta-resolve';
|
|
3
4
|
import chalk from 'chalk';
|
|
4
|
-
import {
|
|
5
|
-
import { printDebug
|
|
6
|
-
import { TYPES_FILE_NAME
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}, []);
|
|
26
|
-
if (!models) {
|
|
27
|
-
return null;
|
|
5
|
+
import { NANGO_VERSION } from '@nangohq/shared';
|
|
6
|
+
import { printDebug } from '../utils.js';
|
|
7
|
+
import { TYPES_FILE_NAME } from '../constants.js';
|
|
8
|
+
import { load } from './config.service.js';
|
|
9
|
+
import { shouldQuote } from '@nangohq/nango-yaml';
|
|
10
|
+
/**
|
|
11
|
+
* Load nango.yaml and generate model.ts
|
|
12
|
+
*/
|
|
13
|
+
export function loadYamlAndGeneratedModel({ fullPath, debug = false }) {
|
|
14
|
+
if (debug) {
|
|
15
|
+
printDebug(`Generating ${TYPES_FILE_NAME} file`);
|
|
16
|
+
}
|
|
17
|
+
const fp = path.resolve(fullPath, TYPES_FILE_NAME);
|
|
18
|
+
if (!fs.existsSync(fp)) {
|
|
19
|
+
if (debug) {
|
|
20
|
+
printDebug('First compilation');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
if (debug) {
|
|
25
|
+
printDebug(`File already exists, replacing`);
|
|
28
26
|
}
|
|
29
|
-
const interfaceDefinitions = Object.keys(models).map((modelName) => {
|
|
30
|
-
const fields = models[modelName];
|
|
31
|
-
// we only care that models that are returned have an ID field
|
|
32
|
-
// if the model is not returned from a sync script then it must be a
|
|
33
|
-
// helper model that is used to build the returned models
|
|
34
|
-
const syncForModel = Object.keys(integrations).find((providerConfigKey) => {
|
|
35
|
-
const syncObject = integrations[providerConfigKey];
|
|
36
|
-
const syncNames = Object.keys(syncObject);
|
|
37
|
-
for (const syncName of syncNames) {
|
|
38
|
-
const syncData = syncObject[syncName];
|
|
39
|
-
if (syncData.returns && syncData.type !== SyncConfigType.ACTION) {
|
|
40
|
-
return syncData.returns.includes(modelName);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return false;
|
|
44
|
-
});
|
|
45
|
-
if (returnedModels.includes(modelName) && !fields['id'] && syncForModel) {
|
|
46
|
-
throw new Error(`Model "${modelName}" doesn't have an id field. This is required to be able to uniquely identify the data record.`);
|
|
47
|
-
}
|
|
48
|
-
const interfaceName = `${modelName.charAt(0).toUpperCase()}${modelName.slice(1)}`;
|
|
49
|
-
let extendsClause = '';
|
|
50
|
-
const fieldDefinitions = Object.keys(fields)
|
|
51
|
-
.filter((fieldName) => {
|
|
52
|
-
if (fieldName === '__extends') {
|
|
53
|
-
const fieldModel = fields[fieldName];
|
|
54
|
-
const multipleExtends = fieldModel.split(',').map((e) => e.trim());
|
|
55
|
-
extendsClause = ` extends ${multipleExtends.join(', ')}`;
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
return true;
|
|
59
|
-
})
|
|
60
|
-
.map((fieldName) => {
|
|
61
|
-
const fieldModel = fields[fieldName];
|
|
62
|
-
const fieldType = this.getFieldType(fieldModel, debug, modelName, models);
|
|
63
|
-
if (fieldName === '__string') {
|
|
64
|
-
const dynamicName = fields[fieldName];
|
|
65
|
-
return ` [key: string]: ${dynamicName};`;
|
|
66
|
-
}
|
|
67
|
-
return ` ${fieldName}: ${fieldType};`;
|
|
68
|
-
})
|
|
69
|
-
.join('\n');
|
|
70
|
-
const interfaceDefinition = `export interface ${interfaceName}${extendsClause} {\n${fieldDefinitions}\n}\n`;
|
|
71
|
-
return interfaceDefinition;
|
|
72
|
-
});
|
|
73
|
-
return interfaceDefinitions;
|
|
74
27
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
28
|
+
const { success, error, response: parsed } = load(fullPath, debug);
|
|
29
|
+
if (!success || !parsed) {
|
|
30
|
+
console.log(chalk.red(error?.message));
|
|
31
|
+
return { success: false, error: null, response: null };
|
|
32
|
+
}
|
|
33
|
+
const modelTs = buildModelsTS({ parsed });
|
|
34
|
+
fs.writeFileSync(fp, modelTs);
|
|
35
|
+
if (debug) {
|
|
36
|
+
printDebug(`${TYPES_FILE_NAME} generated`);
|
|
37
|
+
}
|
|
38
|
+
return { success: true, error: null, response: parsed };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build models.ts
|
|
42
|
+
*/
|
|
43
|
+
export function buildModelsTS({ parsed }) {
|
|
44
|
+
return `// ---------------------------
|
|
45
|
+
// This file was generated by Nango (v${NANGO_VERSION})
|
|
46
|
+
// It's recommended to version this file
|
|
47
|
+
// https://nango.dev
|
|
48
|
+
// ---------------------------
|
|
49
|
+
|
|
50
|
+
// ------ Models
|
|
51
|
+
${generateInterfaces({ parsed }).join('\n\n')}
|
|
52
|
+
// ------ /Models
|
|
53
|
+
|
|
54
|
+
// ------ SDK
|
|
55
|
+
${generateSDKTypes()}
|
|
56
|
+
// ------ /SDK
|
|
57
|
+
|
|
58
|
+
// ------ Flows
|
|
59
|
+
export const NangoFlows = ${JSON.stringify(parsed.integrations, null, 2)} as const;
|
|
60
|
+
// ------ /Flows
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
export function generateInterfaces({ parsed }) {
|
|
64
|
+
const interfaces = [];
|
|
65
|
+
for (const [, model] of parsed.models) {
|
|
66
|
+
interfaces.push(modelToTypescript({ model }));
|
|
67
|
+
}
|
|
68
|
+
return interfaces;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Transform a JSON model to its Typescript equivalent
|
|
72
|
+
*/
|
|
73
|
+
export function modelToTypescript({ model }) {
|
|
74
|
+
const output = [];
|
|
75
|
+
if (model.isAnon) {
|
|
76
|
+
output.push(`/** @deprecated It is recommended to use a Model */`);
|
|
77
|
+
output.push(`export type ${model.name} = ${fieldToTypescript({ field: model.fields[0] })}`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
output.push(`export interface ${model.name} {`);
|
|
81
|
+
output.push(...fieldsToTypescript({ fields: model.fields }));
|
|
82
|
+
output.push(`};`);
|
|
83
|
+
}
|
|
84
|
+
return output.join('\n');
|
|
85
|
+
}
|
|
86
|
+
export function fieldsToTypescript({ fields }) {
|
|
87
|
+
const output = [];
|
|
88
|
+
const dynamic = fields.find((field) => field.dynamic);
|
|
89
|
+
// Insert dynamic key at the beginning
|
|
90
|
+
if (dynamic) {
|
|
91
|
+
if (!Array.isArray(dynamic.value)) {
|
|
92
|
+
output.push(` [key: string]: ${fieldToTypescript({ field: dynamic })};`);
|
|
138
93
|
}
|
|
139
94
|
else {
|
|
140
|
-
|
|
141
|
-
const nestedFields = Object.keys(rawField)
|
|
142
|
-
.map((fieldName) => ` ${fieldName}: ${this.getFieldType(rawField[fieldName], debug, modelName, models)};`)
|
|
143
|
-
.join('\n');
|
|
144
|
-
return `{\n${nestedFields}\n}`;
|
|
145
|
-
}
|
|
146
|
-
catch (_) {
|
|
147
|
-
// eslint-disable-next-line no-console
|
|
148
|
-
console.log(chalk.red(`Failed to parse field ${JSON.stringify(rawField)} so just returning it back as a string`));
|
|
149
|
-
return String(rawField);
|
|
150
|
-
}
|
|
95
|
+
output.push(` [key: string]: {${fieldsToTypescript({ fields: dynamic.value }).join('\n')}};`);
|
|
151
96
|
}
|
|
152
97
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const interfaceDefinitions = modelService.build(models, integrations);
|
|
158
|
-
if (interfaceDefinitions) {
|
|
159
|
-
fs.writeFileSync(`./${TYPES_FILE_NAME}`, interfaceDefinitions.join('\n'));
|
|
98
|
+
// Regular fields
|
|
99
|
+
for (const field of fields) {
|
|
100
|
+
if (field.dynamic) {
|
|
101
|
+
continue;
|
|
160
102
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
103
|
+
output.push(` ${shouldQuote(field.name) ? `"${field.name}"` : field.name}${field.optional ? '?' : ''}: ${fieldToTypescript({ field: field })};`);
|
|
104
|
+
}
|
|
105
|
+
return output;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Transform a field definition to its typescript equivalent
|
|
109
|
+
*/
|
|
110
|
+
export function fieldToTypescript({ field }) {
|
|
111
|
+
if (Array.isArray(field.value)) {
|
|
112
|
+
if (field.union) {
|
|
113
|
+
return field.value.map((f) => fieldToTypescript({ field: f })).join(' | ');
|
|
169
114
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (notify) {
|
|
173
|
-
// eslint-disable-next-line no-console
|
|
174
|
-
console.log(chalk.green(`The ${nangoConfigFile} was updated. The interface file (${TYPES_FILE_NAME}) was updated to reflect the updated config`));
|
|
115
|
+
if (field.array) {
|
|
116
|
+
return `(${field.value.map((f) => fieldToTypescript({ field: f })).join(' | ')})[]`;
|
|
175
117
|
}
|
|
118
|
+
return `{${fieldsToTypescript({ fields: field.value }).join('\n')}}`;
|
|
176
119
|
}
|
|
120
|
+
if (field.model || field.tsType) {
|
|
121
|
+
return `${field.value}${field.array ? '[]' : ''}`;
|
|
122
|
+
}
|
|
123
|
+
if (field.value === null) {
|
|
124
|
+
return 'null';
|
|
125
|
+
}
|
|
126
|
+
if (typeof field.value === 'string') {
|
|
127
|
+
return `'${field.value}${field.array ? '[]' : ''}'`;
|
|
128
|
+
}
|
|
129
|
+
return `${field.value}${field.array ? '[]' : ''}`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Generate SDK types
|
|
133
|
+
*/
|
|
134
|
+
export function generateSDKTypes() {
|
|
135
|
+
const filePath = resolve('@nangohq/shared/dist/sdk/sync.d.ts', import.meta.url);
|
|
136
|
+
const typesContent = fs.readFileSync(filePath.replace('file://', ''), 'utf8');
|
|
137
|
+
return `
|
|
138
|
+
${typesContent}
|
|
139
|
+
|
|
140
|
+
`;
|
|
177
141
|
}
|
|
178
|
-
const modelService = new ModelService();
|
|
179
|
-
export default modelService;
|
|
180
142
|
//# sourceMappingURL=model.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.service.js","sourceRoot":"","sources":["../../lib/services/model.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"model.service.js","sourceRoot":"","sources":["../../lib/services/model.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|