nango 0.36.14 → 0.36.16
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 -0
- package/dist/cli.js +338 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.js +25 -16
- package/dist/index.js.map +1 -1
- package/dist/nango-sync.d.ts +1 -0
- package/dist/services/compile.service.d.ts +5 -0
- package/dist/services/compile.service.js +72 -0
- package/dist/services/compile.service.js.map +1 -0
- package/dist/services/config.service.d.ts +8 -0
- package/dist/services/config.service.js +73 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/deploy.service.d.ts +16 -0
- package/dist/services/deploy.service.js +237 -0
- package/dist/services/deploy.service.js.map +1 -0
- package/dist/services/dryrun.service.d.ts +15 -0
- package/dist/services/dryrun.service.js +149 -0
- package/dist/services/dryrun.service.js.map +1 -0
- package/dist/services/local-integration.service.d.ts +6 -0
- package/dist/services/local-integration.service.js +62 -0
- package/dist/services/local-integration.service.js.map +1 -0
- package/dist/services/model.service.d.ts +8 -0
- package/dist/services/model.service.js +162 -0
- package/dist/services/model.service.js.map +1 -0
- package/dist/services/parser.service.d.ts +6 -0
- package/dist/services/parser.service.js +79 -0
- package/dist/services/parser.service.js.map +1 -0
- package/dist/services/verification.service.d.ts +6 -0
- package/dist/services/verification.service.js +113 -0
- package/dist/services/verification.service.js.map +1 -0
- package/dist/sync.unit.test.js +93 -11
- package/dist/sync.unit.test.js.map +1 -1
- package/dist/templates/action.ejs +39 -0
- package/dist/templates/github.sync.ejs +55 -0
- package/dist/templates/nango.yaml +29 -0
- package/dist/templates/sync.ejs +10 -0
- package/dist/utils.d.ts +2 -3
- package/dist/utils.js +31 -90
- package/dist/utils.js.map +1 -1
- package/docker/docker-compose.yaml +2 -2
- package/package.json +5 -3
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import yaml from 'js-yaml';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { SyncConfigType, nangoConfigFile } from '@nangohq/shared';
|
|
5
|
+
import { printDebug, getNangoRootPath } from '../utils.js';
|
|
6
|
+
import { TYPES_FILE_NAME, NangoSyncTypesFileLocation } from '../constants.js';
|
|
7
|
+
import configService from './config.service.js';
|
|
8
|
+
class ModelService {
|
|
9
|
+
build(models, integrations, debug = false) {
|
|
10
|
+
const returnedModels = Object.keys(integrations).reduce((acc, providerConfigKey) => {
|
|
11
|
+
const syncObject = integrations[providerConfigKey];
|
|
12
|
+
const syncNames = Object.keys(syncObject);
|
|
13
|
+
for (let i = 0; i < syncNames.length; i++) {
|
|
14
|
+
const syncName = syncNames[i];
|
|
15
|
+
const syncData = syncObject[syncName];
|
|
16
|
+
if (syncData.returns) {
|
|
17
|
+
const syncReturns = Array.isArray(syncData.returns) ? syncData.returns : [syncData.returns];
|
|
18
|
+
syncReturns.forEach((modelName) => {
|
|
19
|
+
if (!acc.includes(modelName)) {
|
|
20
|
+
acc.push(modelName);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return acc;
|
|
26
|
+
}, []);
|
|
27
|
+
if (!models) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const interfaceDefinitions = Object.keys(models).map((modelName) => {
|
|
31
|
+
const fields = models[modelName];
|
|
32
|
+
// we only care that models that are returned have an ID field
|
|
33
|
+
// if the model is not returned from a sync script then it must be a
|
|
34
|
+
// helper model that is used to build the returned models
|
|
35
|
+
const syncForModel = Object.keys(integrations).find((providerConfigKey) => {
|
|
36
|
+
const syncObject = integrations[providerConfigKey];
|
|
37
|
+
const syncNames = Object.keys(syncObject);
|
|
38
|
+
for (let i = 0; i < syncNames.length; i++) {
|
|
39
|
+
const syncName = syncNames[i];
|
|
40
|
+
const syncData = syncObject[syncName];
|
|
41
|
+
if (syncData.returns && syncData.type !== SyncConfigType.ACTION) {
|
|
42
|
+
return syncData.returns.includes(modelName);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
});
|
|
47
|
+
if (returnedModels.includes(modelName) && !fields['id'] && syncForModel) {
|
|
48
|
+
throw new Error(`Model "${modelName}" doesn't have an id field. This is required to be able to uniquely identify the data record.`);
|
|
49
|
+
}
|
|
50
|
+
const singularModelName = modelName.charAt(modelName.length - 1) === 's' ? modelName.slice(0, -1) : modelName;
|
|
51
|
+
const interfaceName = `${singularModelName.charAt(0).toUpperCase()}${singularModelName.slice(1)}`;
|
|
52
|
+
let extendsClause = '';
|
|
53
|
+
const fieldDefinitions = Object.keys(fields)
|
|
54
|
+
.filter((fieldName) => {
|
|
55
|
+
if (fieldName === '__extends') {
|
|
56
|
+
const fieldModel = fields[fieldName];
|
|
57
|
+
const multipleExtends = fieldModel.split(',').map((e) => e.trim());
|
|
58
|
+
extendsClause = ` extends ${multipleExtends.join(', ')}`;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
})
|
|
63
|
+
.map((fieldName) => {
|
|
64
|
+
const fieldModel = fields[fieldName];
|
|
65
|
+
const fieldType = this.getFieldType(fieldModel, debug);
|
|
66
|
+
return ` ${fieldName}: ${fieldType};`;
|
|
67
|
+
})
|
|
68
|
+
.join('\n');
|
|
69
|
+
const interfaceDefinition = `export interface ${interfaceName}${extendsClause} {\n${fieldDefinitions}\n}\n`;
|
|
70
|
+
return interfaceDefinition;
|
|
71
|
+
});
|
|
72
|
+
return interfaceDefinitions;
|
|
73
|
+
}
|
|
74
|
+
getFieldType(rawField, debug = false) {
|
|
75
|
+
if (typeof rawField === 'string') {
|
|
76
|
+
let field = rawField;
|
|
77
|
+
let hasNull = false;
|
|
78
|
+
let hasUndefined = false;
|
|
79
|
+
let tsType = '';
|
|
80
|
+
if (field.indexOf('null') !== -1) {
|
|
81
|
+
field = field.replace(/\s*\|\s*null\s*/g, '');
|
|
82
|
+
hasNull = true;
|
|
83
|
+
}
|
|
84
|
+
if (field === 'undefined') {
|
|
85
|
+
if (debug) {
|
|
86
|
+
printDebug(`Field is defined undefined which isn't recommended.`);
|
|
87
|
+
}
|
|
88
|
+
return 'undefined';
|
|
89
|
+
}
|
|
90
|
+
if (field.indexOf('undefined') !== -1) {
|
|
91
|
+
field = field.replace(/\s*\|\s*undefined\s*/g, '');
|
|
92
|
+
hasUndefined = true;
|
|
93
|
+
}
|
|
94
|
+
switch (field) {
|
|
95
|
+
case 'boolean':
|
|
96
|
+
case 'bool':
|
|
97
|
+
tsType = 'boolean';
|
|
98
|
+
break;
|
|
99
|
+
case 'string':
|
|
100
|
+
tsType = 'string';
|
|
101
|
+
break;
|
|
102
|
+
case 'char':
|
|
103
|
+
tsType = 'string';
|
|
104
|
+
break;
|
|
105
|
+
case 'integer':
|
|
106
|
+
case 'int':
|
|
107
|
+
case 'number':
|
|
108
|
+
tsType = 'number';
|
|
109
|
+
break;
|
|
110
|
+
case 'date':
|
|
111
|
+
tsType = 'Date';
|
|
112
|
+
break;
|
|
113
|
+
default:
|
|
114
|
+
tsType = field;
|
|
115
|
+
}
|
|
116
|
+
if (hasNull) {
|
|
117
|
+
tsType = `${tsType} | null`;
|
|
118
|
+
}
|
|
119
|
+
if (hasUndefined) {
|
|
120
|
+
tsType = `${tsType} | undefined`;
|
|
121
|
+
}
|
|
122
|
+
return tsType;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
try {
|
|
126
|
+
const nestedFields = Object.keys(rawField)
|
|
127
|
+
.map((fieldName) => ` ${fieldName}: ${this.getFieldType(rawField[fieldName])};`)
|
|
128
|
+
.join('\n');
|
|
129
|
+
return `{\n${nestedFields}\n}`;
|
|
130
|
+
}
|
|
131
|
+
catch (_) {
|
|
132
|
+
console.log(chalk.red(`Failed to parse field ${rawField} so just returning it back as a string`));
|
|
133
|
+
return String(rawField);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async createModelFile(notify = false) {
|
|
138
|
+
const configContents = fs.readFileSync(`./${nangoConfigFile}`, 'utf8');
|
|
139
|
+
const configData = yaml.load(configContents);
|
|
140
|
+
const { models, integrations } = configData;
|
|
141
|
+
const interfaceDefinitions = modelService.build(models, integrations);
|
|
142
|
+
if (interfaceDefinitions) {
|
|
143
|
+
fs.writeFileSync(`./${TYPES_FILE_NAME}`, interfaceDefinitions.join('\n'));
|
|
144
|
+
}
|
|
145
|
+
// insert NangoSync types to the bottom of the file
|
|
146
|
+
const typesContent = fs.readFileSync(`${getNangoRootPath()}/${NangoSyncTypesFileLocation}`, 'utf8');
|
|
147
|
+
fs.writeFileSync(`./${TYPES_FILE_NAME}`, typesContent, { flag: 'a' });
|
|
148
|
+
const { success, error, response: config } = await configService.load();
|
|
149
|
+
if (!success || !config) {
|
|
150
|
+
console.log(chalk.red(error?.message));
|
|
151
|
+
throw new Error('Failed to load config');
|
|
152
|
+
}
|
|
153
|
+
const flowConfig = `export const NangoFlows = ${JSON.stringify(config, null, 2)} as const; \n`;
|
|
154
|
+
fs.writeFileSync(`./${TYPES_FILE_NAME}`, flowConfig, { flag: 'a' });
|
|
155
|
+
if (notify) {
|
|
156
|
+
console.log(chalk.green(`The ${nangoConfigFile} was updated. The interface file (${TYPES_FILE_NAME}) was updated to reflect the updated config`));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const modelService = new ModelService();
|
|
161
|
+
export default modelService;
|
|
162
|
+
//# sourceMappingURL=model.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.service.js","sourceRoot":"","sources":["../../lib/services/model.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SyncConfigType } from '@nangohq/shared';
|
|
2
|
+
declare class ParserService {
|
|
3
|
+
callsAreUsedCorrectly(filePath: string, type: SyncConfigType | undefined, modelNames: string[]): boolean;
|
|
4
|
+
}
|
|
5
|
+
declare const parserService: ParserService;
|
|
6
|
+
export default parserService;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import traverse from '@babel/traverse';
|
|
4
|
+
import * as t from '@babel/types';
|
|
5
|
+
import parser from '@babel/parser';
|
|
6
|
+
import { SyncConfigType } from '@nangohq/shared';
|
|
7
|
+
class ParserService {
|
|
8
|
+
callsAreUsedCorrectly(filePath, type = SyncConfigType.SYNC, modelNames) {
|
|
9
|
+
const code = fs.readFileSync(filePath, 'utf-8');
|
|
10
|
+
let areAwaited = true;
|
|
11
|
+
let usedCorrectly = true;
|
|
12
|
+
const ast = parser.parse(code, { sourceType: 'module', plugins: ['typescript'] });
|
|
13
|
+
const awaitMessage = (call, lineNumber) => console.log(chalk.red(`nango.${call}() calls must be awaited in "${filePath}:${lineNumber}". Not awaiting can lead to unexpected results.`));
|
|
14
|
+
const disallowedMessage = (call, lineNumber) => console.log(chalk.red(`nango.${call}() calls are not allowed in an action script. Please remove it at "${filePath}:${lineNumber}".`));
|
|
15
|
+
const nangoCalls = [
|
|
16
|
+
'batchSend',
|
|
17
|
+
'batchSave',
|
|
18
|
+
'batchDelete',
|
|
19
|
+
'log',
|
|
20
|
+
'getFieldMapping',
|
|
21
|
+
'setFieldMapping',
|
|
22
|
+
'getMetadata',
|
|
23
|
+
'setMetadata',
|
|
24
|
+
'get',
|
|
25
|
+
'post',
|
|
26
|
+
'put',
|
|
27
|
+
'patch',
|
|
28
|
+
'delete',
|
|
29
|
+
'getConnection',
|
|
30
|
+
'setLastSyncDate',
|
|
31
|
+
'getEnvironmentVariables',
|
|
32
|
+
'triggerAction'
|
|
33
|
+
];
|
|
34
|
+
const disallowedActionCalls = ['batchSend', 'batchSave', 'batchDelete', 'setLastSyncDate'];
|
|
35
|
+
const deprecatedCalls = {
|
|
36
|
+
batchSend: 'batchSave',
|
|
37
|
+
getFieldMapping: 'getMetadata',
|
|
38
|
+
setFieldMapping: 'setMetadata'
|
|
39
|
+
};
|
|
40
|
+
const callsReferencingModelsToCheck = ['batchSave', 'batchDelete'];
|
|
41
|
+
const traverseFn = traverse.default || traverse;
|
|
42
|
+
traverseFn(ast, {
|
|
43
|
+
CallExpression(path) {
|
|
44
|
+
const lineNumber = path.node.loc?.start.line;
|
|
45
|
+
const callee = path.node.callee;
|
|
46
|
+
if (callee.object?.type === 'Identifier' && callee.object.name === 'nango' && callee.property?.type === 'Identifier') {
|
|
47
|
+
if (deprecatedCalls[callee.property.name]) {
|
|
48
|
+
console.warn(chalk.yellow(`nango.${callee.property.name}() used at line ${lineNumber} is deprecated. Use nango.${deprecatedCalls[callee.property.name]}() instead.`));
|
|
49
|
+
}
|
|
50
|
+
if (type === SyncConfigType.ACTION) {
|
|
51
|
+
if (disallowedActionCalls.includes(callee.property.name)) {
|
|
52
|
+
disallowedMessage(callee.property.name, lineNumber);
|
|
53
|
+
usedCorrectly = false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const isAwaited = path.findParent((parentPath) => parentPath.isAwaitExpression());
|
|
57
|
+
const isThenOrCatch = path.findParent((parentPath) => t.isMemberExpression(parentPath.node) &&
|
|
58
|
+
(t.isIdentifier(parentPath.node.property, { name: 'then' }) || t.isIdentifier(parentPath.node.property, { name: 'catch' })));
|
|
59
|
+
if (!isAwaited && !isThenOrCatch && nangoCalls.includes(callee.property.name)) {
|
|
60
|
+
awaitMessage(callee.property.name, lineNumber);
|
|
61
|
+
areAwaited = false;
|
|
62
|
+
}
|
|
63
|
+
if (callsReferencingModelsToCheck.includes(callee.property.name)) {
|
|
64
|
+
const args = path.node.arguments;
|
|
65
|
+
const modelArg = args[args.length - 1];
|
|
66
|
+
if (t.isStringLiteral(modelArg) && !modelNames.includes(modelArg.value)) {
|
|
67
|
+
console.log(chalk.red(`"${modelArg.value}" is not a valid model name. Please check "${filePath}:${lineNumber}". The possible model names are: ${modelNames.join(', ')}`));
|
|
68
|
+
usedCorrectly = false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return areAwaited && usedCorrectly;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const parserService = new ParserService();
|
|
78
|
+
export default parserService;
|
|
79
|
+
//# sourceMappingURL=parser.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.service.js","sourceRoot":"","sources":["../../lib/services/parser.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare class VerificationService {
|
|
2
|
+
necessaryFilesExist(autoConfirm: boolean, debug?: boolean, checkDist?: boolean): Promise<void>;
|
|
3
|
+
filesMatchConfig(): Promise<boolean>;
|
|
4
|
+
}
|
|
5
|
+
declare const verificationService: VerificationService;
|
|
6
|
+
export default verificationService;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import glob from 'glob';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import promptly from 'promptly';
|
|
6
|
+
import { nangoConfigFile } from '@nangohq/shared';
|
|
7
|
+
import configService from './config.service.js';
|
|
8
|
+
import compileService from './compile.service.js';
|
|
9
|
+
import { printDebug } from '../utils.js';
|
|
10
|
+
import { NANGO_INTEGRATIONS_NAME } from '../constants.js';
|
|
11
|
+
import { init, generate } from '../cli.js';
|
|
12
|
+
class VerificationService {
|
|
13
|
+
async necessaryFilesExist(autoConfirm, debug = false, checkDist = false) {
|
|
14
|
+
const cwd = process.cwd();
|
|
15
|
+
if (debug) {
|
|
16
|
+
printDebug(`Current full working directory is read as: ${cwd}`);
|
|
17
|
+
}
|
|
18
|
+
const currentDirectorySplit = cwd.split(/[\/\\]/);
|
|
19
|
+
const currentDirectory = currentDirectorySplit[currentDirectorySplit.length - 1];
|
|
20
|
+
if (debug) {
|
|
21
|
+
printDebug(`Current stripped directory is read as: ${currentDirectory}`);
|
|
22
|
+
}
|
|
23
|
+
if (currentDirectory !== NANGO_INTEGRATIONS_NAME) {
|
|
24
|
+
console.log(chalk.red(`You must run this command in the ${NANGO_INTEGRATIONS_NAME} directory.`));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
if (!fs.existsSync(`./${nangoConfigFile}`)) {
|
|
28
|
+
const install = autoConfirm
|
|
29
|
+
? true
|
|
30
|
+
: await promptly.confirm(`No ${nangoConfigFile} file was found. Would you like to create some default integrations and build them? (yes/no)`);
|
|
31
|
+
if (install) {
|
|
32
|
+
if (debug) {
|
|
33
|
+
printDebug(`Running init, generate, and tsc to create ${nangoConfigFile} file, generate the integration files and then compile them.`);
|
|
34
|
+
}
|
|
35
|
+
init(debug);
|
|
36
|
+
await generate(debug);
|
|
37
|
+
await compileService.run(debug);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.log(chalk.red(`Exiting...`));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (debug) {
|
|
46
|
+
printDebug(`Found ${nangoConfigFile} file successfully.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!checkDist) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const distDir = './dist';
|
|
53
|
+
if (!fs.existsSync(distDir)) {
|
|
54
|
+
if (debug) {
|
|
55
|
+
printDebug("Dist directory doesn't exist.");
|
|
56
|
+
}
|
|
57
|
+
const createDist = autoConfirm
|
|
58
|
+
? true
|
|
59
|
+
: await promptly.confirm(`No dist directory was found. Would you like to create it and create default integrations? (yes/no)`);
|
|
60
|
+
if (createDist) {
|
|
61
|
+
if (debug) {
|
|
62
|
+
printDebug(`Creating the dist directory and generating the default integration files.`);
|
|
63
|
+
}
|
|
64
|
+
fs.mkdirSync(distDir);
|
|
65
|
+
await generate(debug);
|
|
66
|
+
await compileService.run(debug);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const files = fs.readdirSync(distDir);
|
|
71
|
+
if (files.length === 0) {
|
|
72
|
+
if (debug) {
|
|
73
|
+
printDebug(`Dist directory exists but is empty.`);
|
|
74
|
+
}
|
|
75
|
+
const compile = autoConfirm
|
|
76
|
+
? true
|
|
77
|
+
: await promptly.confirm(`The dist directory is empty. Would you like to generate the default integrations? (yes/no)`);
|
|
78
|
+
if (compile) {
|
|
79
|
+
if (debug) {
|
|
80
|
+
printDebug(`Generating the default integration files.`);
|
|
81
|
+
}
|
|
82
|
+
await compileService.run(debug);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async filesMatchConfig() {
|
|
88
|
+
const { success, error, response: config } = await configService.load();
|
|
89
|
+
if (!success || !config) {
|
|
90
|
+
console.log(chalk.red(error?.message));
|
|
91
|
+
throw new Error('Failed to load config');
|
|
92
|
+
}
|
|
93
|
+
const syncNames = config.map((provider) => provider.syncs.map((sync) => sync.name)).flat();
|
|
94
|
+
const actionNames = config.map((provider) => provider.actions.map((action) => action.name)).flat();
|
|
95
|
+
const flows = [...syncNames, ...actionNames];
|
|
96
|
+
const tsFiles = glob.sync(`./*.ts`);
|
|
97
|
+
const tsFileNames = tsFiles.filter((file) => !file.includes('models.ts')).map((file) => path.basename(file, '.ts'));
|
|
98
|
+
const missingSyncsAndActions = flows.filter((syncOrActionName) => !tsFileNames.includes(syncOrActionName));
|
|
99
|
+
if (missingSyncsAndActions.length > 0) {
|
|
100
|
+
console.log(chalk.red(`The following syncs are missing a corresponding .ts file: ${missingSyncsAndActions.join(', ')}`));
|
|
101
|
+
throw new Error('Syncs missing .ts files');
|
|
102
|
+
}
|
|
103
|
+
const extraSyncs = tsFileNames.filter((syncName) => !flows.includes(syncName));
|
|
104
|
+
if (extraSyncs.length > 0) {
|
|
105
|
+
console.log(chalk.red(`The following .ts files do not have a corresponding sync in the config: ${extraSyncs.join(', ')}`));
|
|
106
|
+
throw new Error('Extra .ts files');
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const verificationService = new VerificationService();
|
|
112
|
+
export default verificationService;
|
|
113
|
+
//# sourceMappingURL=verification.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.service.js","sourceRoot":"","sources":["../../lib/services/verification.service.ts"],"names":[],"mappings":"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"}
|
package/dist/sync.unit.test.js
CHANGED
|
@@ -3,9 +3,13 @@ import path from 'path';
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import yaml from 'js-yaml';
|
|
5
5
|
import { SyncConfigType } from '@nangohq/shared';
|
|
6
|
-
import { init, generate
|
|
6
|
+
import { init, generate } from './cli.js';
|
|
7
|
+
import { exampleSyncName } from './constants.js';
|
|
8
|
+
import configService from './services/config.service.js';
|
|
9
|
+
import parserService from './services/parser.service.js';
|
|
7
10
|
describe('generate function tests', () => {
|
|
8
11
|
const testDirectory = './nango-integrations';
|
|
12
|
+
const fixturesPath = './packages/cli/lib/fixtures';
|
|
9
13
|
beforeAll(async () => {
|
|
10
14
|
if (!fs.existsSync('./packages/cli/dist/nango-sync.d.ts')) {
|
|
11
15
|
await fs.promises.writeFile('./packages/cli/dist/nango-sync.d.ts', '', 'utf8');
|
|
@@ -98,6 +102,76 @@ describe('generate function tests', () => {
|
|
|
98
102
|
await generate(false, true);
|
|
99
103
|
expect(fs.existsSync(`${testDirectory}/single-model-return.ts`)).toBe(true);
|
|
100
104
|
});
|
|
105
|
+
it('should not create a file if endpoint is missing from a v2 config', async () => {
|
|
106
|
+
await init();
|
|
107
|
+
const data = {
|
|
108
|
+
integrations: {
|
|
109
|
+
'demo-github-integration': {
|
|
110
|
+
syncs: {
|
|
111
|
+
'single-model-return': {
|
|
112
|
+
type: 'sync',
|
|
113
|
+
runs: 'every half hour',
|
|
114
|
+
returns: 'GithubIssue'
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
models: {
|
|
120
|
+
GithubIssue: {
|
|
121
|
+
id: 'integer',
|
|
122
|
+
owner: 'string',
|
|
123
|
+
repo: 'string',
|
|
124
|
+
issue_number: 'number',
|
|
125
|
+
title: 'string',
|
|
126
|
+
author: 'string',
|
|
127
|
+
author_id: 'string',
|
|
128
|
+
state: 'string',
|
|
129
|
+
date_created: 'date',
|
|
130
|
+
date_last_modified: 'date',
|
|
131
|
+
body: 'string'
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const yamlData = yaml.dump(data);
|
|
136
|
+
await fs.promises.writeFile(`${testDirectory}/nango.yaml`, yamlData, 'utf8');
|
|
137
|
+
expect(fs.existsSync(`${testDirectory}/single-model-return.ts`)).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
it('should generate missing from a v2 config', async () => {
|
|
140
|
+
await init();
|
|
141
|
+
const data = {
|
|
142
|
+
integrations: {
|
|
143
|
+
'demo-github-integration': {
|
|
144
|
+
syncs: {
|
|
145
|
+
'single-model-issue-output': {
|
|
146
|
+
type: 'sync',
|
|
147
|
+
runs: 'every half hour',
|
|
148
|
+
endpoint: 'GET /tickets/issue',
|
|
149
|
+
output: 'GithubIssue'
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
models: {
|
|
155
|
+
GithubIssue: {
|
|
156
|
+
id: 'integer',
|
|
157
|
+
owner: 'string',
|
|
158
|
+
repo: 'string',
|
|
159
|
+
issue_number: 'number',
|
|
160
|
+
title: 'string',
|
|
161
|
+
author: 'string',
|
|
162
|
+
author_id: 'string',
|
|
163
|
+
state: 'string',
|
|
164
|
+
date_created: 'date',
|
|
165
|
+
date_last_modified: 'date',
|
|
166
|
+
body: 'string'
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
const yamlData = yaml.dump(data);
|
|
171
|
+
await fs.promises.writeFile(`${testDirectory}/nango.yaml`, yamlData, 'utf8');
|
|
172
|
+
await generate(false, true);
|
|
173
|
+
expect(fs.existsSync(`${testDirectory}/single-model-issue-output.ts`)).toBe(true);
|
|
174
|
+
});
|
|
101
175
|
it('should throw an error if a model is missing an id that is actively used', async () => {
|
|
102
176
|
await init();
|
|
103
177
|
const data = {
|
|
@@ -159,7 +233,7 @@ describe('generate function tests', () => {
|
|
|
159
233
|
await fs.promises.writeFile(`${testDirectory}/nango.yaml`, yamlData, 'utf8');
|
|
160
234
|
await generate(false, true);
|
|
161
235
|
});
|
|
162
|
-
it('should allow javascript
|
|
236
|
+
it('should allow javascript primitives as a return type with no model', async () => {
|
|
163
237
|
await init();
|
|
164
238
|
const data = {
|
|
165
239
|
integrations: {
|
|
@@ -197,27 +271,35 @@ describe('generate function tests', () => {
|
|
|
197
271
|
};
|
|
198
272
|
const yamlData = yaml.dump(data);
|
|
199
273
|
await fs.promises.writeFile(`${testDirectory}/nango.yaml`, yamlData, 'utf8');
|
|
200
|
-
expect(generate(false, true)).
|
|
274
|
+
expect(await generate(false, true)).toBeUndefined();
|
|
201
275
|
});
|
|
202
276
|
it('should not complain of try catch not being awaited', async () => {
|
|
203
|
-
const
|
|
204
|
-
const awaiting = nangoCallsAreUsedCorrectly(`${filePath}/sync.ts`, SyncConfigType.SYNC, ['GithubIssue']);
|
|
277
|
+
const awaiting = parserService.callsAreUsedCorrectly(`${fixturesPath}/sync.ts`, SyncConfigType.SYNC, ['GithubIssue']);
|
|
205
278
|
expect(awaiting).toBe(true);
|
|
206
279
|
});
|
|
207
280
|
it('should complain of a non try catch not being awaited', async () => {
|
|
208
|
-
const
|
|
209
|
-
const awaiting = nangoCallsAreUsedCorrectly(`${filePath}/failing-sync.ts`, SyncConfigType.SYNC, ['GithubIssue']);
|
|
281
|
+
const awaiting = parserService.callsAreUsedCorrectly(`${fixturesPath}/failing-sync.ts`, SyncConfigType.SYNC, ['GithubIssue']);
|
|
210
282
|
expect(awaiting).toBe(false);
|
|
211
283
|
});
|
|
212
284
|
it('should not complain about a correct model', async () => {
|
|
213
|
-
const
|
|
214
|
-
const usedCorrectly = nangoCallsAreUsedCorrectly(`${filePath}/bad-model.ts`, SyncConfigType.SYNC, ['SomeBadModel']);
|
|
285
|
+
const usedCorrectly = parserService.callsAreUsedCorrectly(`${fixturesPath}/bad-model.ts`, SyncConfigType.SYNC, ['SomeBadModel']);
|
|
215
286
|
expect(usedCorrectly).toBe(true);
|
|
216
287
|
});
|
|
217
288
|
it('should complain about an incorrect model', async () => {
|
|
218
|
-
const
|
|
219
|
-
const awaiting = nangoCallsAreUsedCorrectly(`${filePath}/bad-model.ts`, SyncConfigType.SYNC, ['GithubIssue']);
|
|
289
|
+
const awaiting = parserService.callsAreUsedCorrectly(`${fixturesPath}/bad-model.ts`, SyncConfigType.SYNC, ['GithubIssue']);
|
|
220
290
|
expect(awaiting).toBe(false);
|
|
221
291
|
});
|
|
292
|
+
it('should parse a nango.yaml file that is version 1 as expected', async () => {
|
|
293
|
+
const { response: config } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v1`));
|
|
294
|
+
expect(config).toBeDefined();
|
|
295
|
+
const json = fs.readFileSync(path.resolve(__dirname, `./fixtures/nango-yaml/v1/object.json`), 'utf8');
|
|
296
|
+
expect(config).toEqual(JSON.parse(json));
|
|
297
|
+
});
|
|
298
|
+
it('should parse a nango.yaml file that is version 2 as expected', async () => {
|
|
299
|
+
const { response: config } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v2`));
|
|
300
|
+
expect(config).toBeDefined();
|
|
301
|
+
const json = fs.readFileSync(path.resolve(__dirname, `./fixtures/nango-yaml/v2/object.json`), 'utf8');
|
|
302
|
+
expect(config).toEqual(JSON.parse(json));
|
|
303
|
+
});
|
|
222
304
|
});
|
|
223
305
|
//# sourceMappingURL=sync.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.unit.test.js","sourceRoot":"","sources":["../lib/sync.unit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"sync.unit.test.js","sourceRoot":"","sources":["../lib/sync.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const isArrayInterfaceNames = Array.isArray(interfaceNames);
|
|
3
|
+
const isArrayMappings = Array.isArray(mappings);
|
|
4
|
+
const isArrayInputs = Array.isArray(inputs);
|
|
5
|
+
|
|
6
|
+
const formattedInterfaceNames = isArrayInterfaceNames ? interfaceNames.join(', ') : interfaceNames;
|
|
7
|
+
const javascriptPrimitives = ['string', 'number', 'boolean', 'bigint', 'symbol', 'undefined', 'object', 'null'];
|
|
8
|
+
const filteredInputs = isArrayInputs ? inputs.filter(input => !javascriptPrimitives.includes(input)) : inputs;
|
|
9
|
+
|
|
10
|
+
const formattedInputs = isArrayInputs ? filteredInputs.join(', ') : (javascriptPrimitives.includes(inputs) ? '' : inputs);
|
|
11
|
+
|
|
12
|
+
let returnTypes = 'void';
|
|
13
|
+
if (isArrayMappings && mappings.length > 0) {
|
|
14
|
+
if (mappings.length === 1) {
|
|
15
|
+
returnTypes = `${mappings[0].name}[]`;
|
|
16
|
+
} else {
|
|
17
|
+
returnTypes = '{' + mappings.map(mapping => `${mapping.name}: ${mapping.type}[]`).join(', ') + '}';
|
|
18
|
+
}
|
|
19
|
+
} else if (typeof mappings === 'object') {
|
|
20
|
+
returnTypes = `${mappings.name}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let paramInputs = 'object';
|
|
24
|
+
let optionalInput = '?';
|
|
25
|
+
if (inputs) {
|
|
26
|
+
optionalInput = '';
|
|
27
|
+
|
|
28
|
+
if (isArrayInputs) {
|
|
29
|
+
paramInputs = `${inputs}[];`
|
|
30
|
+
} else {
|
|
31
|
+
paramInputs = inputs;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
%>
|
|
35
|
+
import type { NangoAction<%= formattedInterfaceNames ? ', ' + formattedInterfaceNames : '' %><%= formattedInputs ? ', ' + formattedInputs : '' %> } from './<%= interfaceFileName %>';
|
|
36
|
+
|
|
37
|
+
export default async function runAction(nango: NangoAction, input<%= optionalInput %>: <%= paramInputs %>): Promise<<%= returnTypes %>> {
|
|
38
|
+
// Integration code goes here
|
|
39
|
+
}
|