nango 0.36.30 → 0.36.33

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