nango 0.36.35 → 0.36.37

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.
@@ -15,7 +15,7 @@ services:
15
15
  - nango
16
16
 
17
17
  nango-server:
18
- image: nangohq/nango-server:0.36.35
18
+ image: nangohq/nango-server:0.36.37
19
19
  container_name: nango-server
20
20
  environment:
21
21
  - TEMPORAL_ADDRESS=temporal:7233
@@ -47,7 +47,7 @@ services:
47
47
  - nango
48
48
 
49
49
  nango-worker:
50
- image: nangohq/nango-worker:0.36.35
50
+ image: nangohq/nango-worker:0.36.37
51
51
  container_name: nango-worker
52
52
  restart: always
53
53
  ports:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nango",
3
- "version": "0.36.35",
3
+ "version": "0.36.37",
4
4
  "description": "Nango's CLI tool.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,7 +23,7 @@
23
23
  "dependencies": {
24
24
  "@babel/traverse": "^7.22.5",
25
25
  "@inquirer/prompts": "^2.3.0",
26
- "@nangohq/shared": "0.36.35",
26
+ "@nangohq/shared": "0.36.37",
27
27
  "@vercel/ncc": "^0.36.1",
28
28
  "ajv": "^8.12.0",
29
29
  "ajv-errors": "^3.0.0",
package/dist/action.ejs DELETED
@@ -1,39 +0,0 @@
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
- }
@@ -1,58 +0,0 @@
1
- import type { NangoSync, <%= interfaceNames.join(', ') %> } from './<%= interfaceFileName %>';
2
-
3
- export default async function fetchData(nango: NangoSync): Promise<void> {
4
-
5
- const repos = await paginate(nango, '/user/repos');
6
-
7
- for (let repo of repos) {
8
- let issues = await paginate(nango, `/repos/${repo.owner.login}/${repo.name}/issues`);
9
-
10
- // Filter out pull requests
11
- issues = issues.filter(issue => !('pull_request' in issue));
12
-
13
- const mappedIssues: GithubIssue[] = issues.map(issue => ({
14
- id: issue.id,
15
- owner: repo.owner.login,
16
- repo: repo.name,
17
- issue_number: issue.number,
18
- title: issue.title,
19
- state: issue.state,
20
- author: issue.user.login,
21
- author_id: issue.user.id,
22
- body: issue.body,
23
- date_created: issue.created_at,
24
- date_last_modified: issue.updated_at
25
- }));
26
-
27
- if (mappedIssues.length > 0) {
28
- await nango.batchSave<GithubIssue>(mappedIssues, 'GithubIssue');
29
- await nango.log(`Sent ${mappedIssues.length} issues from ${repo.owner.login}/${repo.name}`);
30
- }
31
- }
32
- }
33
-
34
- async function paginate(nango: NangoSync, endpoint: string) {
35
- const MAX_PAGE = 100;
36
-
37
- let results: any[] = [];
38
- let page = 1;
39
- while (true) {
40
- const resp = await nango.get({
41
- endpoint: endpoint,
42
- params: {
43
- limit: `${MAX_PAGE}`,
44
- page: `${page}`
45
- }
46
- });
47
-
48
- results = results.concat(resp.data);
49
-
50
- if (resp.data.length == MAX_PAGE) {
51
- page += 1;
52
- } else {
53
- break;
54
- }
55
- }
56
-
57
- return results;
58
- }
@@ -1,6 +0,0 @@
1
- import { IntegrationServiceInterface, NangoIntegrationData, NangoSync } from '@nangohq/shared';
2
- declare class IntegrationService implements IntegrationServiceInterface {
3
- runScript(syncName: string, _activityLogId: number | undefined, nango: NangoSync, _integrationData: NangoIntegrationData, _environmentId: number, _writeToDb: boolean, isAction: boolean, optionalLoadLocation?: string, input?: object): Promise<any>;
4
- }
5
- declare const _default: IntegrationService;
6
- export default _default;
@@ -1,60 +0,0 @@
1
- import { NangoError, formatScriptError, localFileService } from '@nangohq/shared';
2
- import * as vm from 'vm';
3
- import * as url from 'url';
4
- import * as crypto from 'crypto';
5
- class IntegrationService {
6
- async runScript(syncName, _activityLogId, nango, _integrationData, _environmentId, _writeToDb, isAction, optionalLoadLocation, input) {
7
- try {
8
- const script = localFileService.getIntegrationFile(syncName, optionalLoadLocation);
9
- if (!script) {
10
- const content = `Unable to find integration file for ${syncName}`;
11
- return { success: false, error: new NangoError(content, 500), response: null };
12
- }
13
- try {
14
- const wrappedScript = `
15
- (function() {
16
- var module = { exports: {} };
17
- var exports = module.exports;
18
- ${script}
19
- return module.exports.default || module.exports;
20
- })();
21
- `;
22
- const scriptObj = new vm.Script(wrappedScript);
23
- const sandbox = {
24
- console: console,
25
- require: (moduleName) => {
26
- switch (moduleName) {
27
- case 'url':
28
- return url;
29
- case 'crypto':
30
- return crypto;
31
- default:
32
- throw new Error(`Module '${moduleName}' is not allowed`);
33
- }
34
- }
35
- };
36
- const context = vm.createContext(sandbox);
37
- const scriptExports = scriptObj.runInContext(context);
38
- if (scriptExports && typeof scriptExports === 'function') {
39
- const results = isAction ? await scriptExports(nango, input) : await scriptExports(nango);
40
- return { success: true, error: null, response: results };
41
- }
42
- else {
43
- const content = `There is no default export that is a function for ${syncName}`;
44
- return { success: false, error: new NangoError(content, 500), response: null };
45
- }
46
- }
47
- catch (err) {
48
- const errorType = isAction ? 'action_script_failure' : 'sync_script_failre';
49
- return formatScriptError(err, errorType, syncName);
50
- }
51
- }
52
- catch (err) {
53
- const errorMessage = JSON.stringify(err, ['message', 'name', 'stack'], 2);
54
- const content = `The script failed to load for ${syncName} with the following error: ${errorMessage}`;
55
- return { success: false, error: new NangoError(content, 500), response: null };
56
- }
57
- }
58
- }
59
- export default new IntegrationService();
60
- //# sourceMappingURL=local-integration.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-integration.service.js","sourceRoot":"","sources":["../lib/local-integration.service.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- const tableName = '<%= tableName %>'';
2
-
3
- exports.up = function (knex, _) {
4
- return knex.schema.withSchema('nango').createTable(tableName, function (table) {
5
- return knex.schema.withSchema('nango').createTable(tableName, function (table) {
6
- table.increments('id').primary();
7
- <% data.forEach(function(model) { %>
8
- <% Object.keys(model).forEach(function(prop) { %>
9
- <% if (prop === 'id') { return; } %>
10
- <% const type = model[prop]; %>
11
- <% switch (type) { %>
12
- <% case 'integer': %>
13
- table.integer('<%= prop %>');
14
- <% break; %>
15
- <% case 'char': %>
16
- table.string('<%= prop %>', 255);
17
- <% break; %>
18
- <% case 'text': %>
19
- table.text('<%= prop %>');
20
- <% break; %>
21
- <% case 'timestamp': %>
22
- table.timestamp('<%= prop %>');
23
- <% break; %>
24
- <% default: %>
25
- throw new Error(`Unknown type <%= type %> for column <%= prop %>`);
26
- <% } %>
27
- <% }); %>
28
- <% }); %>
29
- });
30
- };
31
-
32
- exports.down = function (knex, _) {
33
- return knex.schema.withSchema('nango').dropTable(tableName);
34
- };
35
-
package/dist/sync.d.ts DELETED
@@ -1,35 +0,0 @@
1
- import type { Metadata } from '@nangohq/shared';
2
- import { SyncConfigType } from '@nangohq/shared';
3
- import type { DeployOptions, GlobalOptions } from './types.js';
4
- interface RunArgs extends GlobalOptions {
5
- sync: string;
6
- connectionId: string;
7
- lastSyncDate?: string;
8
- useServerLastSyncDate?: boolean;
9
- input?: object;
10
- metadata?: Metadata;
11
- }
12
- export declare const exampleSyncName = "github-issue-example";
13
- export declare const version: (debug: boolean) => void;
14
- export declare const generate: (debug?: boolean, inParentDirectory?: boolean) => Promise<void>;
15
- /**
16
- * Init
17
- * If we're not currently in the nango-integrations directory create one
18
- * and create an example nango.yaml file
19
- */
20
- export declare const init: (debug?: boolean) => Promise<void>;
21
- export declare const deploy: (options: DeployOptions, environment: string, debug?: boolean) => Promise<void>;
22
- export declare const adminDeploy: (environmentName: string, debug?: boolean) => Promise<void>;
23
- export declare const dryRun: (options: RunArgs, environment: string, debug?: boolean) => Promise<void>;
24
- export declare const tsc: (debug?: boolean, syncName?: string) => Promise<boolean>;
25
- export declare const checkYamlMatchesTsFiles: () => Promise<boolean>;
26
- export declare const nangoCallsAreUsedCorrectly: (filePath: string, type: SyncConfigType | undefined, modelNames: string[]) => boolean;
27
- export declare const tscWatch: (debug?: boolean) => Promise<void>;
28
- export declare const configWatch: (debug?: boolean) => void;
29
- /**
30
- * Docker Run
31
- * @desc spawn a child process to run the docker compose located in the cli
32
- * Look into https://www.npmjs.com/package/docker-compose to avoid dependency maybe?
33
- */
34
- export declare const dockerRun: (debug?: boolean) => Promise<void>;
35
- export {};
package/dist/sync.ejs DELETED
@@ -1,10 +0,0 @@
1
- <%
2
- const formattedInterfaceNames = Array.isArray(interfaceNames) ? interfaceNames.join(', ') : interfaceNames;
3
- %>
4
- import type { NangoSync<%= formattedInterfaceNames ? ', ' + formattedInterfaceNames : '' %> } from './<%= interfaceFileName %>';
5
-
6
- export default async function fetchData(nango: NangoSync): Promise<void> {
7
- // Integration code goes here
8
- // to save data use await nango.batchSave
9
- // to delete data use await nango.batchDelete
10
- }
package/dist/sync.js DELETED
@@ -1,911 +0,0 @@
1
- import fs from 'fs';
2
- import path, { dirname } from 'path';
3
- import { fileURLToPath } from 'url';
4
- import axios from 'axios';
5
- import yaml from 'js-yaml';
6
- import chalk from 'chalk';
7
- import chokidar from 'chokidar';
8
- import * as tsNode from 'ts-node';
9
- import glob from 'glob';
10
- import ejs from 'ejs';
11
- import * as dotenv from 'dotenv';
12
- import { spawn } from 'child_process';
13
- import parser from '@babel/parser';
14
- import traverse from '@babel/traverse';
15
- import promptly from 'promptly';
16
- import * as t from '@babel/types';
17
- import { getInterval, loadSimplifiedConfig, cloudHost, stagingHost, SyncType, syncRunService, nangoConfigFile, localFileService, SyncConfigType, JAVASCRIPT_PRIMITIVES } from '@nangohq/shared';
18
- import { hostport, port, httpsAgent, verifyNecessaryFiles, getConnection, NANGO_INTEGRATIONS_NAME, buildInterfaces, enrichHeaders, getNangoRootPath, printDebug, getModelNamesFromConfig } from './utils.js';
19
- import integrationService from './local-integration.service.js';
20
- const __filename = fileURLToPath(import.meta.url);
21
- const __dirname = dirname(__filename);
22
- dotenv.config();
23
- const TYPES_FILE_NAME = 'models.ts';
24
- const NangoSyncTypesFileLocation = 'dist/nango-sync.d.ts';
25
- export const exampleSyncName = 'github-issue-example';
26
- export const version = (debug) => {
27
- if (debug) {
28
- printDebug('Looking up the version first for a local path first then globally');
29
- }
30
- const packageJson = JSON.parse(fs.readFileSync(path.resolve(getNangoRootPath(debug), 'package.json'), 'utf8'));
31
- const dockerComposeYaml = fs.readFileSync(path.resolve(getNangoRootPath(), 'docker/docker-compose.yaml'), 'utf8');
32
- const dockerCompose = yaml.load(dockerComposeYaml);
33
- const nangoServerImage = dockerCompose.services['nango-server'].image;
34
- const nangoWorkerImage = dockerCompose.services['nango-worker'].image;
35
- const nangoServerVersion = nangoServerImage.split(':').pop();
36
- const nangoWorkerVersion = nangoWorkerImage.split(':').pop();
37
- console.log(chalk.green('Nango Server version:'), nangoServerVersion);
38
- console.log(chalk.green('Nango Worker version:'), nangoWorkerVersion);
39
- console.log(chalk.green('Nango CLI version:'), packageJson.version);
40
- };
41
- export const generate = async (debug = false, inParentDirectory = false) => {
42
- const dirPrefix = inParentDirectory ? `./${NANGO_INTEGRATIONS_NAME}` : '.';
43
- const syncTemplateContents = fs.readFileSync(path.resolve(__dirname, './sync.ejs'), 'utf8');
44
- const actionTemplateContents = fs.readFileSync(path.resolve(__dirname, './action.ejs'), 'utf8');
45
- const githubExampleTemplateContents = fs.readFileSync(path.resolve(__dirname, './github.sync.ejs'), 'utf8');
46
- const configContents = fs.readFileSync(`${dirPrefix}/${nangoConfigFile}`, 'utf8');
47
- const configData = yaml.load(configContents);
48
- const { integrations } = configData;
49
- const { models } = configData;
50
- const interfaceDefinitions = buildInterfaces(models, integrations, debug);
51
- if (interfaceDefinitions) {
52
- fs.writeFileSync(`${dirPrefix}/${TYPES_FILE_NAME}`, interfaceDefinitions.join('\n'));
53
- }
54
- if (debug) {
55
- printDebug(`Interfaces from the ${nangoConfigFile} file written to ${TYPES_FILE_NAME}`);
56
- }
57
- // insert NangoSync types to the bottom of the file
58
- const typesContent = fs.readFileSync(`${getNangoRootPath()}/${NangoSyncTypesFileLocation}`, 'utf8');
59
- fs.writeFileSync(`${dirPrefix}/${TYPES_FILE_NAME}`, typesContent, { flag: 'a' });
60
- const config = await getConfig(dirPrefix, debug);
61
- const flowConfig = `export const NangoFlows = ${JSON.stringify(config, null, 2)} as const; \n`;
62
- fs.writeFileSync(`${dirPrefix}/${TYPES_FILE_NAME}`, flowConfig, { flag: 'a' });
63
- if (debug) {
64
- printDebug(`NangoSync types written to ${TYPES_FILE_NAME}`);
65
- }
66
- const allSyncNames = {};
67
- for (let i = 0; i < Object.keys(integrations).length; i++) {
68
- const providerConfigKey = Object.keys(integrations)[i];
69
- if (debug) {
70
- printDebug(`Generating ${providerConfigKey} integrations`);
71
- }
72
- const syncObject = integrations[providerConfigKey];
73
- const syncNames = Object.keys(syncObject);
74
- for (let k = 0; k < syncNames.length; k++) {
75
- const syncName = syncNames[k];
76
- if (allSyncNames[syncName] === undefined) {
77
- allSyncNames[syncName] = true;
78
- }
79
- else {
80
- console.log(chalk.red(`The sync name ${syncName} is duplicated in the ${nangoConfigFile} file. All sync names must be unique.`));
81
- process.exit(1);
82
- }
83
- if (debug) {
84
- printDebug(`Generating ${syncName} integration`);
85
- }
86
- const syncData = syncObject[syncName];
87
- if (syncData.type !== SyncConfigType.ACTION && !syncData.returns) {
88
- console.log(chalk.red(`The ${syncName} integration is missing a returns property for what models the sync returns. Make sure you have "returns" instead of "return"`));
89
- process.exit(1);
90
- }
91
- const { returns: modelOrModels, inputs, type = SyncConfigType.SYNC } = syncData;
92
- const syncNameCamel = syncName
93
- .split('-')
94
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
95
- .join('');
96
- let ejsTemplateContents = '';
97
- if (syncName === exampleSyncName && type === SyncConfigType.SYNC) {
98
- ejsTemplateContents = githubExampleTemplateContents;
99
- }
100
- else {
101
- ejsTemplateContents = type === SyncConfigType.SYNC ? syncTemplateContents : actionTemplateContents;
102
- }
103
- const formatModelName = (model) => {
104
- if (JAVASCRIPT_PRIMITIVES.includes(model)) {
105
- return '';
106
- }
107
- const singularModel = model.charAt(model.length - 1) === 's' ? model.slice(0, -1) : model;
108
- return `${singularModel.charAt(0).toUpperCase()}${singularModel.slice(1)}`;
109
- };
110
- let interfaceNames;
111
- let mappings;
112
- if (typeof modelOrModels === 'string') {
113
- const formattedName = formatModelName(modelOrModels);
114
- interfaceNames = formattedName;
115
- mappings = {
116
- name: modelOrModels,
117
- type: formattedName
118
- };
119
- }
120
- else {
121
- interfaceNames = modelOrModels.map(formatModelName);
122
- mappings = modelOrModels.map((model) => ({
123
- name: model,
124
- type: formatModelName(model)
125
- }));
126
- }
127
- const rendered = ejs.render(ejsTemplateContents, {
128
- syncName: syncNameCamel,
129
- interfaceFileName: TYPES_FILE_NAME.replace('.ts', ''),
130
- interfaceNames,
131
- mappings,
132
- inputs: inputs || ''
133
- });
134
- const stripped = rendered.replace(/^\s+/, '');
135
- if (!fs.existsSync(`${dirPrefix}/${syncName}.ts`)) {
136
- fs.writeFileSync(`${dirPrefix}/${syncName}.ts`, stripped);
137
- if (debug) {
138
- printDebug(`Created ${syncName}.ts file`);
139
- }
140
- }
141
- else {
142
- if (debug) {
143
- printDebug(`${syncName}.ts file already exists, so will not overwrite it.`);
144
- }
145
- }
146
- }
147
- }
148
- console.log(chalk.green(`Integration files have been created`));
149
- };
150
- /**
151
- * Init
152
- * If we're not currently in the nango-integrations directory create one
153
- * and create an example nango.yaml file
154
- */
155
- export const init = async (debug = false) => {
156
- const data = {
157
- integrations: {
158
- 'demo-github-integration': {
159
- [exampleSyncName]: {
160
- type: SyncConfigType.SYNC,
161
- runs: 'every half hour',
162
- returns: ['GithubIssue']
163
- }
164
- }
165
- },
166
- models: {
167
- GithubIssue: {
168
- id: 'integer',
169
- owner: 'string',
170
- repo: 'string',
171
- issue_number: 'number',
172
- title: 'string',
173
- author: 'string',
174
- author_id: 'string',
175
- state: 'string',
176
- date_created: 'date',
177
- date_last_modified: 'date',
178
- body: 'string'
179
- }
180
- }
181
- };
182
- const yamlData = yaml.dump(data);
183
- // if currently in the nango-integrations directory then don't create another one
184
- const cwd = process.cwd();
185
- const currentDirectorySplit = cwd.split('/');
186
- const currentDirectory = currentDirectorySplit[currentDirectorySplit.length - 1];
187
- let dirExists = false;
188
- let inParentDirectory = true;
189
- if (currentDirectory === NANGO_INTEGRATIONS_NAME) {
190
- dirExists = true;
191
- inParentDirectory = false;
192
- if (debug) {
193
- printDebug(`Currently in the ${NANGO_INTEGRATIONS_NAME} directory so the directory will not be created`);
194
- }
195
- }
196
- if (fs.existsSync(`./${NANGO_INTEGRATIONS_NAME}`)) {
197
- dirExists = true;
198
- console.log(chalk.red(`The ${NANGO_INTEGRATIONS_NAME} directory already exists. You should run commands from within this directory`));
199
- }
200
- if (!dirExists) {
201
- if (debug) {
202
- printDebug(`Creating the nango integrations directory at ./${NANGO_INTEGRATIONS_NAME}`);
203
- }
204
- fs.mkdirSync(`./${NANGO_INTEGRATIONS_NAME}`);
205
- }
206
- const configFileLocation = inParentDirectory ? `./${NANGO_INTEGRATIONS_NAME}/${nangoConfigFile}` : `./${nangoConfigFile}`;
207
- if (!fs.existsSync(configFileLocation)) {
208
- if (debug) {
209
- printDebug(`Creating the ${nangoConfigFile} file at ${configFileLocation}`);
210
- }
211
- fs.writeFileSync(configFileLocation, yamlData);
212
- }
213
- else {
214
- if (debug) {
215
- printDebug(`Nango config file already exists at ${configFileLocation} so not creating a new one`);
216
- }
217
- }
218
- const envFileLocation = inParentDirectory ? `./${NANGO_INTEGRATIONS_NAME}/.env` : './.env';
219
- if (!fs.existsSync(envFileLocation)) {
220
- if (debug) {
221
- printDebug(`Creating the .env file at ${envFileLocation}`);
222
- }
223
- fs.writeFileSync(envFileLocation, `# Authenticates the CLI (get the keys in the dashboard's Projects Settings).
224
- #NANGO_SECRET_KEY_DEV=xxxx-xxx-xxxx
225
- #NANGO_SECRET_KEY_PROD=xxxx-xxx-xxxx
226
-
227
- # Nango's instance URL (OSS: change to http://localhost:3003 or your instance URL).
228
- NANGO_HOSTPORT=https://api.nango.dev # Default value
229
-
230
- # How to handle CLI upgrades ("prompt", "auto" or "ignore").
231
- NANGO_CLI_UPGRADE_MODE=prompt # Default value
232
-
233
- # Whether to prompt before deployments.
234
- NANGO_DEPLOY_AUTO_CONFIRM=false # Default value`);
235
- }
236
- else {
237
- if (debug) {
238
- printDebug(`.env file already exists at ${envFileLocation} so not creating a new one`);
239
- }
240
- }
241
- await generate(debug, inParentDirectory);
242
- console.log(chalk.green(`Nango integrations initialized!`));
243
- };
244
- const createModelFile = async (notify = false) => {
245
- const configContents = fs.readFileSync(`./${nangoConfigFile}`, 'utf8');
246
- const configData = yaml.load(configContents);
247
- const { models, integrations } = configData;
248
- const interfaceDefinitions = buildInterfaces(models, integrations);
249
- if (interfaceDefinitions) {
250
- fs.writeFileSync(`./${TYPES_FILE_NAME}`, interfaceDefinitions.join('\n'));
251
- }
252
- // insert NangoSync types to the bottom of the file
253
- const typesContent = fs.readFileSync(`${getNangoRootPath()}/${NangoSyncTypesFileLocation}`, 'utf8');
254
- fs.writeFileSync(`./${TYPES_FILE_NAME}`, typesContent, { flag: 'a' });
255
- const config = await getConfig();
256
- const flowConfig = `export const NangoFlows = ${JSON.stringify(config, null, 2)} as const; \n`;
257
- fs.writeFileSync(`./${TYPES_FILE_NAME}`, flowConfig, { flag: 'a' });
258
- if (notify) {
259
- console.log(chalk.green(`The ${nangoConfigFile} was updated. The interface file (${TYPES_FILE_NAME}) was updated to reflect the updated config`));
260
- }
261
- };
262
- const getConfig = async (optionalLoadLocation = '', debug = false) => {
263
- const loadLocation = optionalLoadLocation || './';
264
- const config = await loadSimplifiedConfig(loadLocation);
265
- if (!config) {
266
- throw new Error(`Error loading the ${nangoConfigFile} file`);
267
- }
268
- if (debug) {
269
- printDebug(`Config file file found`);
270
- }
271
- return config;
272
- };
273
- async function parseSecretKey(environment, debug = false) {
274
- if (process.env['NANGO_SECRET_KEY_PROD'] && environment === 'prod') {
275
- if (debug) {
276
- printDebug(`Environment is set to prod, setting NANGO_SECRET_KEY to NANGO_SECRET_KEY_PROD.`);
277
- }
278
- process.env['NANGO_SECRET_KEY'] = process.env['NANGO_SECRET_KEY_PROD'];
279
- }
280
- if (process.env['NANGO_SECRET_KEY_DEV'] && environment === 'dev') {
281
- if (debug) {
282
- printDebug(`Environment is set to dev, setting NANGO_SECRET_KEY to NANGO_SECRET_KEY_DEV.`);
283
- }
284
- process.env['NANGO_SECRET_KEY'] = process.env['NANGO_SECRET_KEY_DEV'];
285
- }
286
- if (!process.env['NANGO_SECRET_KEY']) {
287
- console.log(chalk.red(`NANGO_SECRET_KEY environment variable is not set. Please set it now`));
288
- try {
289
- const secretKey = await promptly.prompt('Secret Key: ');
290
- if (secretKey) {
291
- process.env['NANGO_SECRET_KEY'] = secretKey;
292
- }
293
- else {
294
- return;
295
- }
296
- }
297
- catch (error) {
298
- console.log('Error occurred while trying to prompt for secret key:', error);
299
- process.exit(1);
300
- }
301
- }
302
- }
303
- export const deploy = async (options, environment, debug = false) => {
304
- const { env, version, sync: optionalSyncName, action: optionalActionName, autoConfirm } = options;
305
- await verifyNecessaryFiles(autoConfirm);
306
- await parseSecretKey(environment, debug);
307
- if (!process.env['NANGO_HOSTPORT']) {
308
- switch (env) {
309
- case 'local':
310
- process.env['NANGO_HOSTPORT'] = `http://localhost:${port}`;
311
- break;
312
- case 'staging':
313
- process.env['NANGO_HOSTPORT'] = stagingHost;
314
- break;
315
- default:
316
- process.env['NANGO_HOSTPORT'] = cloudHost;
317
- break;
318
- }
319
- }
320
- if (debug) {
321
- printDebug(`NANGO_HOSTPORT is set to ${process.env['NANGO_HOSTPORT']}.`);
322
- printDebug(`Environment is set to ${environment}`);
323
- }
324
- const singleDeployMode = Boolean(optionalSyncName || optionalActionName);
325
- await tsc(debug);
326
- const config = await getConfig('', debug);
327
- const postData = packageIntegrationData(config, debug, version, optionalSyncName, optionalActionName);
328
- if (!postData) {
329
- return;
330
- }
331
- const url = process.env['NANGO_HOSTPORT'] + `/sync/deploy`;
332
- const nangoYamlBody = localFileService.getNangoYamlFileContents('./');
333
- if (process.env['NANGO_DEPLOY_AUTO_CONFIRM'] !== 'true' && !autoConfirm) {
334
- const confirmationUrl = process.env['NANGO_HOSTPORT'] + `/sync/deploy/confirmation`;
335
- try {
336
- const response = await axios.post(confirmationUrl, { syncs: postData, reconcile: false, debug, singleDeployMode }, { headers: enrichHeaders(), httpsAgent: httpsAgent() });
337
- console.log(JSON.stringify(response.data, null, 2));
338
- const { newSyncs, deletedSyncs } = response.data;
339
- for (const sync of newSyncs) {
340
- const actionMessage = sync.connections === 0 || sync.auto_start === false
341
- ? 'The sync will be added to your Nango instance if you deploy.'
342
- : `Nango will start syncing the corresponding data for ${sync.connections} existing connections.`;
343
- console.log(chalk.yellow(`Sync "${sync.name}" is new. ${actionMessage}`));
344
- }
345
- for (const sync of deletedSyncs) {
346
- console.log(chalk.red(`Sync "${sync.name}" has been removed. It will stop running and the corresponding data will be deleted for ${sync.connections} existing connections.`));
347
- }
348
- const confirmation = await promptly.confirm('Do you want to continue y/n?');
349
- if (confirmation) {
350
- await deploySyncs(url, { syncs: postData, nangoYamlBody, reconcile: true, debug, singleDeployMode });
351
- }
352
- else {
353
- console.log(chalk.red('Syncs/Actions were not deployed. Exiting'));
354
- process.exit(0);
355
- }
356
- }
357
- catch (err) {
358
- let errorMessage;
359
- if (!err?.response?.data) {
360
- const { message, stack, config: { method }, code, status } = err?.toJSON();
361
- const errorObject = { message, stack, code, status, url, method };
362
- errorMessage = JSON.stringify(errorObject, null, 2);
363
- }
364
- else {
365
- errorMessage = JSON.stringify(err.response.data, null, 2);
366
- }
367
- console.log(chalk.red(`Error deploying the syncs/actions with the following error: ${errorMessage}`));
368
- process.exit(1);
369
- }
370
- }
371
- else {
372
- if (debug) {
373
- printDebug(`Auto confirm is set so deploy will start without confirmation`);
374
- }
375
- await deploySyncs(url, { syncs: postData, nangoYamlBody, reconcile: true, debug, singleDeployMode });
376
- }
377
- };
378
- async function deploySyncs(url, body) {
379
- await axios
380
- .post(url, body, { headers: enrichHeaders(), httpsAgent: httpsAgent() })
381
- .then((response) => {
382
- const results = response.data;
383
- if (results.length === 0) {
384
- console.log(chalk.green(`Successfully removed the syncs/actions.`));
385
- }
386
- else {
387
- const nameAndVersions = results.map((result) => `${result.sync_name || result.name}@v${result.version}`);
388
- console.log(chalk.green(`Successfully deployed the syncs/actions: ${nameAndVersions.join(', ')}!`));
389
- }
390
- })
391
- .catch((err) => {
392
- const errorMessage = JSON.stringify(err.response.data, null, 2);
393
- console.log(chalk.red(`Error deploying the syncs/actions with the following error: ${errorMessage}`));
394
- process.exit(1);
395
- });
396
- }
397
- export const adminDeploy = async (environmentName, debug = false) => {
398
- await verifyNecessaryFiles(false);
399
- await parseSecretKey(environmentName, debug);
400
- if (!process.env['NANGO_HOSTPORT']) {
401
- switch (environmentName) {
402
- case 'local':
403
- process.env['NANGO_HOSTPORT'] = `http://localhost:${port}`;
404
- break;
405
- case 'staging':
406
- process.env['NANGO_HOSTPORT'] = stagingHost;
407
- break;
408
- default:
409
- process.env['NANGO_HOSTPORT'] = cloudHost;
410
- break;
411
- }
412
- }
413
- if (debug) {
414
- printDebug(`NANGO_HOSTPORT is set to ${process.env['NANGO_HOSTPORT']}.`);
415
- printDebug(`Environment is set to ${environmentName}`);
416
- }
417
- await tsc(debug);
418
- const config = await getConfig('', debug);
419
- const flowData = packageIntegrationData(config, debug);
420
- if (!flowData) {
421
- return;
422
- }
423
- const targetAccountUUID = await promptly.prompt('Input the account uuid to deploy to: ');
424
- if (!targetAccountUUID) {
425
- console.log(chalk.red('Account uuid is required. Exiting'));
426
- return;
427
- }
428
- const url = process.env['NANGO_HOSTPORT'] + `/admin/flow/deploy/pre-built`;
429
- const nangoYamlBody = localFileService.getNangoYamlFileContents('./');
430
- try {
431
- await axios
432
- .post(url, { targetAccountUUID, targetEnvironment: environmentName, config: flowData, nangoYamlBody }, { headers: enrichHeaders(), httpsAgent: httpsAgent() })
433
- .then(() => {
434
- console.log(chalk.green(`Successfully deployed the syncs/actions to the users account.`));
435
- })
436
- .catch((err) => {
437
- const errorMessage = JSON.stringify(err.response.data, null, 2);
438
- console.log(chalk.red(`Error deploying the syncs/actions with the following error: ${errorMessage}`));
439
- process.exit(1);
440
- });
441
- }
442
- catch (e) {
443
- console.log(e);
444
- }
445
- };
446
- export const dryRun = async (options, environment, debug = false) => {
447
- let syncName = '';
448
- let connectionId, suppliedLastSyncDate, actionInput, stubbedMetadata;
449
- await parseSecretKey(environment, debug);
450
- if (!process.env['NANGO_HOSTPORT']) {
451
- if (debug) {
452
- printDebug(`NANGO_HOSTPORT is not set. Setting the default to ${hostport}`);
453
- }
454
- process.env['NANGO_HOSTPORT'] = hostport;
455
- }
456
- if (debug) {
457
- printDebug(`NANGO_HOSTPORT is set to ${process.env['NANGO_HOSTPORT']}`);
458
- }
459
- if (Object.keys(options).length > 0) {
460
- ({ sync: syncName, connectionId, lastSyncDate: suppliedLastSyncDate, input: actionInput, metadata: stubbedMetadata } = options);
461
- }
462
- if (!syncName) {
463
- console.log(chalk.red('Sync name is required'));
464
- return;
465
- }
466
- if (!connectionId) {
467
- console.log(chalk.red('Connection id is required'));
468
- return;
469
- }
470
- const config = await getConfig('', debug);
471
- const providerConfigKey = config.find((config) => [...config.syncs, ...config.actions].find((sync) => sync.name === syncName))?.providerConfigKey;
472
- if (!providerConfigKey) {
473
- console.log(chalk.red(`Provider config key not found, please check that the provider exists for this sync name: ${syncName}`));
474
- return;
475
- }
476
- const foundConfig = config.find((configItem) => {
477
- const syncsArray = configItem.syncs || [];
478
- const actionsArray = configItem.actions || [];
479
- return [...syncsArray, ...actionsArray].some((sync) => sync.name === syncName);
480
- });
481
- const syncInfo = foundConfig
482
- ? (foundConfig.syncs || []).find((sync) => sync.name === syncName) || (foundConfig.actions || []).find((action) => action.name === syncName)
483
- : null;
484
- if (debug) {
485
- printDebug(`Provider config key found to be ${providerConfigKey}`);
486
- }
487
- const nangoConnection = (await getConnection(providerConfigKey, connectionId, {
488
- 'Nango-Is-Sync': true,
489
- 'Nango-Is-Dry-Run': true
490
- }, debug));
491
- if (!nangoConnection) {
492
- console.log(chalk.red('Connection not found'));
493
- return;
494
- }
495
- if (debug) {
496
- printDebug(`Connection found with ${JSON.stringify(nangoConnection, null, 2)}`);
497
- }
498
- if (process.env['NANGO_HOSTPORT'] === cloudHost || process.env['NANGO_HOSTPORT'] === stagingHost) {
499
- process.env['NANGO_CLOUD'] = 'true';
500
- }
501
- let lastSyncDate = null;
502
- if (suppliedLastSyncDate) {
503
- if (debug) {
504
- printDebug(`Last sync date supplied as ${suppliedLastSyncDate}`);
505
- }
506
- lastSyncDate = new Date(suppliedLastSyncDate);
507
- }
508
- const result = await tsc(debug, syncName);
509
- if (!result) {
510
- console.log(chalk.red('The sync/action did not compile successfully. Exiting'));
511
- return;
512
- }
513
- let normalizedInput;
514
- try {
515
- normalizedInput = JSON.parse(actionInput);
516
- }
517
- catch (e) {
518
- normalizedInput = actionInput;
519
- }
520
- const logMessages = [];
521
- const syncRun = new syncRunService({
522
- integrationService,
523
- writeToDb: false,
524
- nangoConnection,
525
- input: normalizedInput,
526
- isAction: syncInfo?.type === SyncConfigType.ACTION,
527
- syncId: 'abc',
528
- activityLogId: -1,
529
- syncJobId: -1,
530
- syncName,
531
- syncType: SyncType.INITIAL,
532
- loadLocation: './',
533
- debug,
534
- logMessages,
535
- stubbedMetadata
536
- });
537
- try {
538
- const secretKey = process.env['NANGO_SECRET_KEY'];
539
- const results = await syncRun.run(lastSyncDate, true, secretKey, process.env['NANGO_HOSTPORT']);
540
- if (results) {
541
- console.log(JSON.stringify(results, null, 2));
542
- }
543
- if (syncRun.logMessages && syncRun.logMessages.length > 0) {
544
- const logMessages = syncRun.logMessages;
545
- let index = 0;
546
- const batchCount = 10;
547
- const displayBatch = () => {
548
- for (let i = 0; i < batchCount && index < logMessages.length; i++, index++) {
549
- const logs = logMessages[index];
550
- console.log(chalk.yellow(JSON.stringify(logs, null, 2)));
551
- }
552
- };
553
- console.log(chalk.yellow('The following log messages were generated:'));
554
- displayBatch();
555
- while (index < syncRun.logMessages.length) {
556
- const remaining = syncRun.logMessages.length - index;
557
- const confirmation = await promptly.confirm(`There are ${remaining} logs messages remaining. Would you like to see the next 10 log messages? (y/n)`);
558
- if (confirmation) {
559
- displayBatch();
560
- }
561
- else {
562
- break;
563
- }
564
- }
565
- }
566
- process.exit(0);
567
- }
568
- catch (e) {
569
- process.exit(1);
570
- }
571
- };
572
- export const tsc = async (debug = false, syncName) => {
573
- const tsconfig = fs.readFileSync(`${getNangoRootPath()}/tsconfig.dev.json`, 'utf8');
574
- const distDir = './dist';
575
- if (!fs.existsSync(distDir)) {
576
- if (debug) {
577
- printDebug(`Creating ${distDir} directory`);
578
- }
579
- fs.mkdirSync(distDir);
580
- }
581
- if (!fs.existsSync(`./${TYPES_FILE_NAME}`)) {
582
- if (debug) {
583
- printDebug(`Creating ${TYPES_FILE_NAME} file`);
584
- }
585
- await createModelFile();
586
- }
587
- const compiler = tsNode.create({
588
- compilerOptions: JSON.parse(tsconfig).compilerOptions
589
- });
590
- if (debug) {
591
- printDebug(`Compiler options: ${JSON.stringify(JSON.parse(tsconfig).compilerOptions, null, 2)}`);
592
- }
593
- const integrationFiles = syncName ? [`./${syncName}.ts`] : glob.sync(`./*.ts`);
594
- let success = true;
595
- const config = await getConfig();
596
- const modelNames = getModelNamesFromConfig(config);
597
- for (const filePath of integrationFiles) {
598
- try {
599
- const providerConfiguration = config.find((config) => [...config.syncs, ...config.actions].find((sync) => sync.name === path.basename(filePath, '.ts')));
600
- if (!providerConfiguration) {
601
- continue;
602
- }
603
- const syncConfig = [...providerConfiguration.syncs, ...providerConfiguration.actions].find((sync) => sync.name === path.basename(filePath, '.ts'));
604
- const type = syncConfig?.type || SyncConfigType.SYNC;
605
- if (!nangoCallsAreUsedCorrectly(filePath, type, modelNames)) {
606
- if (syncName && filePath.includes(syncName)) {
607
- success = false;
608
- }
609
- continue;
610
- }
611
- const result = compiler.compile(fs.readFileSync(filePath, 'utf8'), filePath);
612
- const jsFilePath = filePath.replace(/\/[^\/]*$/, `/dist/${path.basename(filePath.replace('.ts', '.js'))}`);
613
- fs.writeFileSync(jsFilePath, result);
614
- console.log(chalk.green(`Compiled "${filePath}" successfully`));
615
- }
616
- catch (error) {
617
- console.error(`Error compiling "${filePath}":`);
618
- console.error(error);
619
- success = false;
620
- }
621
- }
622
- return success;
623
- };
624
- export const checkYamlMatchesTsFiles = async () => {
625
- const config = await getConfig();
626
- const syncNames = config.map((provider) => provider.syncs.map((sync) => sync.name)).flat();
627
- const actionNames = config.map((provider) => provider.actions.map((action) => action.name)).flat();
628
- const flows = [...syncNames, ...actionNames];
629
- const tsFiles = glob.sync(`./*.ts`);
630
- const tsFileNames = tsFiles.filter((file) => !file.includes('models.ts')).map((file) => path.basename(file, '.ts'));
631
- const missingSyncsAndActions = flows.filter((syncOrActionName) => !tsFileNames.includes(syncOrActionName));
632
- if (missingSyncsAndActions.length > 0) {
633
- console.log(chalk.red(`The following syncs are missing a corresponding .ts file: ${missingSyncsAndActions.join(', ')}`));
634
- throw new Error('Syncs missing .ts files');
635
- }
636
- const extraSyncs = tsFileNames.filter((syncName) => !flows.includes(syncName));
637
- if (extraSyncs.length > 0) {
638
- console.log(chalk.red(`The following .ts files do not have a corresponding sync in the config: ${extraSyncs.join(', ')}`));
639
- throw new Error('Extra .ts files');
640
- }
641
- return true;
642
- };
643
- export const nangoCallsAreUsedCorrectly = (filePath, type = SyncConfigType.SYNC, modelNames) => {
644
- const code = fs.readFileSync(filePath, 'utf-8');
645
- let areAwaited = true;
646
- let usedCorrectly = true;
647
- const ast = parser.parse(code, { sourceType: 'module', plugins: ['typescript'] });
648
- const awaitMessage = (call, lineNumber) => console.log(chalk.red(`nango.${call}() calls must be awaited in "${filePath}:${lineNumber}". Not awaiting can lead to unexpected results.`));
649
- const disallowedMessage = (call, lineNumber) => console.log(chalk.red(`nango.${call}() calls are not allowed in an action script. Please remove it at "${filePath}:${lineNumber}".`));
650
- const nangoCalls = [
651
- 'batchSend',
652
- 'batchSave',
653
- 'batchDelete',
654
- 'log',
655
- 'getFieldMapping',
656
- 'setFieldMapping',
657
- 'getMetadata',
658
- 'setMetadata',
659
- 'get',
660
- 'post',
661
- 'put',
662
- 'patch',
663
- 'delete',
664
- 'getConnection',
665
- 'setLastSyncDate',
666
- 'getEnvironmentVariables',
667
- 'triggerAction'
668
- ];
669
- const disallowedActionCalls = ['batchSend', 'batchSave', 'batchDelete', 'setLastSyncDate'];
670
- const deprecatedCalls = {
671
- batchSend: 'batchSave',
672
- getFieldMapping: 'getMetadata',
673
- setFieldMapping: 'setMetadata'
674
- };
675
- const callsReferencingModelsToCheck = ['batchSave', 'batchDelete'];
676
- const traverseFn = traverse.default || traverse;
677
- traverseFn(ast, {
678
- CallExpression(path) {
679
- const lineNumber = path.node.loc?.start.line;
680
- const callee = path.node.callee;
681
- if (callee.object?.type === 'Identifier' && callee.object.name === 'nango' && callee.property?.type === 'Identifier') {
682
- if (deprecatedCalls[callee.property.name]) {
683
- console.warn(chalk.yellow(`nango.${callee.property.name}() used at line ${lineNumber} is deprecated. Use nango.${deprecatedCalls[callee.property.name]}() instead.`));
684
- }
685
- if (type === SyncConfigType.ACTION) {
686
- if (disallowedActionCalls.includes(callee.property.name)) {
687
- disallowedMessage(callee.property.name, lineNumber);
688
- usedCorrectly = false;
689
- }
690
- }
691
- const isAwaited = path.findParent((parentPath) => parentPath.isAwaitExpression());
692
- const isThenOrCatch = path.findParent((parentPath) => t.isMemberExpression(parentPath.node) &&
693
- (t.isIdentifier(parentPath.node.property, { name: 'then' }) || t.isIdentifier(parentPath.node.property, { name: 'catch' })));
694
- if (!isAwaited && !isThenOrCatch && nangoCalls.includes(callee.property.name)) {
695
- awaitMessage(callee.property.name, lineNumber);
696
- areAwaited = false;
697
- }
698
- if (callsReferencingModelsToCheck.includes(callee.property.name)) {
699
- const args = path.node.arguments;
700
- const modelArg = args[args.length - 1];
701
- if (!modelNames.includes(modelArg.value)) {
702
- console.log(chalk.red(`"${modelArg.value}" is not a valid model name. Please check "${filePath}:${lineNumber}". The possible model names are: ${modelNames.join(', ')}`));
703
- usedCorrectly = false;
704
- }
705
- }
706
- }
707
- }
708
- });
709
- return areAwaited && usedCorrectly;
710
- };
711
- export const tscWatch = async (debug = false) => {
712
- const tsconfig = fs.readFileSync(`${getNangoRootPath()}/tsconfig.dev.json`, 'utf8');
713
- const config = await getConfig();
714
- const modelNames = getModelNamesFromConfig(config);
715
- const watchPath = [`./*.ts`, `./${nangoConfigFile}`];
716
- if (debug) {
717
- printDebug(`Watching ${watchPath.join(', ')}`);
718
- }
719
- const watcher = chokidar.watch(watchPath, {
720
- ignoreInitial: false,
721
- ignored: (filePath) => {
722
- return filePath === TYPES_FILE_NAME;
723
- }
724
- });
725
- const distDir = './dist';
726
- if (!fs.existsSync(distDir)) {
727
- if (debug) {
728
- printDebug(`Creating ${distDir} directory`);
729
- }
730
- fs.mkdirSync(distDir);
731
- }
732
- if (!fs.existsSync(`./${TYPES_FILE_NAME}`)) {
733
- if (debug) {
734
- printDebug(`Creating ${TYPES_FILE_NAME} file`);
735
- }
736
- await createModelFile();
737
- }
738
- watcher.on('add', (filePath) => {
739
- if (filePath === nangoConfigFile) {
740
- return;
741
- }
742
- compileFile(filePath);
743
- });
744
- watcher.on('unlink', (filePath) => {
745
- if (filePath === nangoConfigFile) {
746
- return;
747
- }
748
- const jsFilePath = `./dist/${path.basename(filePath.replace('.ts', '.js'))}`;
749
- fs.unlinkSync(jsFilePath);
750
- });
751
- watcher.on('change', (filePath) => {
752
- if (filePath === nangoConfigFile) {
753
- // config file changed, re-compile each ts file
754
- const integrationFiles = glob.sync(`./*.ts`);
755
- for (const file of integrationFiles) {
756
- // strip the file to just the last part
757
- const strippedFile = file.replace(/^.*[\\\/]/, '');
758
- compileFile(strippedFile);
759
- }
760
- return;
761
- }
762
- compileFile(filePath);
763
- });
764
- function compileFile(filePath) {
765
- const compiler = tsNode.create({
766
- compilerOptions: JSON.parse(tsconfig).compilerOptions
767
- });
768
- try {
769
- const providerConfiguration = config.find((config) => [...config.syncs, ...config.actions].find((sync) => sync.name === path.basename(filePath, '.ts')));
770
- if (!providerConfiguration) {
771
- return;
772
- }
773
- const syncConfig = [...providerConfiguration.syncs, ...providerConfiguration.actions].find((sync) => sync.name === path.basename(filePath, '.ts'));
774
- const type = syncConfig?.type || SyncConfigType.SYNC;
775
- if (!nangoCallsAreUsedCorrectly(filePath, type, modelNames)) {
776
- return;
777
- }
778
- const result = compiler.compile(fs.readFileSync(filePath, 'utf8'), filePath);
779
- const jsFilePath = `./dist/${path.basename(filePath.replace('.ts', '.js'))}`;
780
- fs.writeFileSync(jsFilePath, result);
781
- console.log(chalk.green(`Compiled ${filePath} successfully`));
782
- }
783
- catch (error) {
784
- console.error(`Error compiling ${filePath}:`);
785
- console.error(error);
786
- return;
787
- }
788
- }
789
- };
790
- export const configWatch = (debug = false) => {
791
- const watchPath = `./${nangoConfigFile}`;
792
- if (debug) {
793
- printDebug(`Watching ${watchPath}`);
794
- }
795
- const watcher = chokidar.watch(watchPath, { ignoreInitial: true });
796
- watcher.on('change', async () => {
797
- await createModelFile(true);
798
- });
799
- };
800
- let child;
801
- process.on('SIGINT', () => {
802
- if (child) {
803
- const dockerDown = spawn('docker', ['compose', '-f', `${getNangoRootPath()}/docker/docker-compose.yaml`, '--project-directory', '.', 'down'], {
804
- stdio: 'inherit'
805
- });
806
- dockerDown.on('exit', () => {
807
- process.exit();
808
- });
809
- }
810
- else {
811
- process.exit();
812
- }
813
- });
814
- /**
815
- * Docker Run
816
- * @desc spawn a child process to run the docker compose located in the cli
817
- * Look into https://www.npmjs.com/package/docker-compose to avoid dependency maybe?
818
- */
819
- export const dockerRun = async (debug = false) => {
820
- const cwd = process.cwd();
821
- const args = ['compose', '-f', `${getNangoRootPath()}/docker/docker-compose.yaml`, '--project-directory', '.', 'up', '--build'];
822
- if (debug) {
823
- printDebug(`Running docker with args: ${args.join(' ')}`);
824
- }
825
- child = spawn('docker', args, {
826
- cwd,
827
- detached: false,
828
- stdio: 'inherit'
829
- });
830
- await new Promise((resolve, reject) => {
831
- child?.on('exit', (code) => {
832
- if (code !== 0) {
833
- reject(new Error(`Error with the nango docker containers, please check your containers using 'docker ps''`));
834
- return;
835
- }
836
- resolve(true);
837
- });
838
- child?.on('error', reject);
839
- });
840
- };
841
- function packageIntegrationData(config, debug, version = '', optionalSyncName = '', optionalActionName = '') {
842
- const postData = [];
843
- for (const integration of config) {
844
- const { providerConfigKey } = integration;
845
- let { syncs, actions } = integration;
846
- let flows = [...syncs, ...actions];
847
- if (optionalSyncName) {
848
- syncs = syncs.filter((sync) => sync.name === optionalSyncName);
849
- flows = syncs;
850
- }
851
- if (optionalActionName) {
852
- actions = actions.filter((action) => action.name === optionalActionName);
853
- flows = actions;
854
- }
855
- if (optionalSyncName && optionalActionName) {
856
- flows = [...syncs, ...actions];
857
- }
858
- for (const sync of flows) {
859
- const { name: syncName, runs = '', returns: models, models: model_schema, type = SyncConfigType.SYNC } = sync;
860
- const { path: integrationFilePath, result: integrationFileResult } = localFileService.checkForIntegrationDistFile(syncName, './');
861
- const metadata = {};
862
- if (sync.description) {
863
- metadata['description'] = sync.description;
864
- }
865
- if (sync.scopes) {
866
- metadata['scopes'] = sync.scopes;
867
- }
868
- if (!integrationFileResult) {
869
- console.log(chalk.red(`No integration file found for ${syncName} at ${integrationFilePath}. Skipping...`));
870
- continue;
871
- }
872
- if (type !== SyncConfigType.SYNC && type !== SyncConfigType.ACTION) {
873
- console.log(chalk.red(`The sync ${syncName} has an invalid type "${type}". The type must be either ${SyncConfigType.SYNC} or${SyncConfigType.ACTION}. Skipping...`));
874
- }
875
- if (type === SyncConfigType.SYNC && !runs) {
876
- console.log(chalk.red(`The sync ${syncName} is missing the "runs" property. Skipping...`));
877
- continue;
878
- }
879
- if (runs && type === SyncConfigType.SYNC) {
880
- const { success, error } = getInterval(runs, new Date());
881
- if (!success) {
882
- console.log(chalk.red(`The sync ${syncName} has an issue with the sync interval "${runs}": ${error?.message}`));
883
- return null;
884
- }
885
- }
886
- if (debug) {
887
- printDebug(`Integration file found for ${syncName} at ${integrationFilePath}`);
888
- }
889
- const body = {
890
- syncName,
891
- providerConfigKey,
892
- models: Array.isArray(models) ? models : [models],
893
- version: version,
894
- runs,
895
- track_deletes: sync.track_deletes || false,
896
- auto_start: sync.auto_start === false ? false : true,
897
- attributes: sync.attributes || {},
898
- metadata: metadata || {},
899
- type,
900
- fileBody: {
901
- js: localFileService.getIntegrationFile(syncName, './'),
902
- ts: localFileService.getIntegrationTsFile(syncName, './')
903
- },
904
- model_schema: JSON.stringify(model_schema)
905
- };
906
- postData.push(body);
907
- }
908
- }
909
- return postData;
910
- }
911
- //# sourceMappingURL=sync.js.map
package/dist/sync.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../lib/sync.ts"],"names":[],"mappings":"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"}