nango 0.35.13 → 0.35.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action.ejs +36 -2
- package/dist/integration.service.d.ts +6 -0
- package/dist/integration.service.js +37 -0
- package/dist/integration.service.js.map +1 -0
- package/dist/sync.ejs +4 -1
- package/dist/sync.unit.test.d.ts +1 -0
- package/dist/sync.unit.test.js +50 -0
- package/dist/sync.unit.test.js.map +1 -0
- package/docker/docker-compose.yaml +2 -2
- package/package.json +2 -2
package/dist/action.ejs
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
|
-
|
|
1
|
+
<%
|
|
2
|
+
const isArrayInterfaceNames = Array.isArray(interfaceNames);
|
|
3
|
+
const isArrayMappings = Array.isArray(mappings);
|
|
4
|
+
const isArrayInputs = Array.isArray(inputs);
|
|
2
5
|
|
|
3
|
-
|
|
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 %>> {
|
|
4
38
|
// Integration code goes here
|
|
5
39
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
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;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { localFileService } from '@nangohq/shared';
|
|
2
|
+
class IntegrationService {
|
|
3
|
+
async runScript(syncName, _activityLogId, nango, _integrationData, _environmentId, _writeToDb, isAction, optionalLoadLocation, input) {
|
|
4
|
+
try {
|
|
5
|
+
const script = localFileService.getIntegrationFile(syncName, optionalLoadLocation);
|
|
6
|
+
if (!script) {
|
|
7
|
+
const content = `Unable to find integration file for ${syncName}`;
|
|
8
|
+
console.error(content);
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
let scriptExports;
|
|
12
|
+
eval(`scriptExports = ${script}`);
|
|
13
|
+
if (scriptExports && typeof scriptExports.default === 'function') {
|
|
14
|
+
const results = isAction ? await scriptExports.default(nango, input) : await scriptExports.default(nango);
|
|
15
|
+
return results;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const content = `There is no default export that is a function for ${syncName}`;
|
|
19
|
+
console.error(content);
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error(err);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const errorMessage = JSON.stringify(err, ['message', 'name', 'stack'], 2);
|
|
30
|
+
const content = `The script failed to load for ${syncName} with the following error: ${errorMessage}`;
|
|
31
|
+
console.error(content);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export default new IntegrationService();
|
|
37
|
+
//# sourceMappingURL=integration.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.service.js","sourceRoot":"","sources":["../lib/integration.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEjH,MAAM,kBAAkB;IACpB,KAAK,CAAC,SAAS,CACX,QAAgB,EAChB,cAAkC,EAClC,KAAgB,EAChB,gBAAsC,EACtC,cAAsB,EACtB,UAAmB,EACnB,QAAiB,EACjB,oBAA6B,EAC7B,KAAc;QAEd,IAAI;YACA,MAAM,MAAM,GAAkB,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;YAElG,IAAI,CAAC,MAAM,EAAE;gBACT,MAAM,OAAO,GAAG,uCAAuC,QAAQ,EAAE,CAAC;gBAElE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aAC1B;YAED,IAAI;gBACA,IAAI,aAAkB,CAAC;gBAEvB,IAAI,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;gBAClC,IAAI,aAAa,IAAI,OAAO,aAAa,CAAC,OAAO,KAAK,UAAU,EAAE;oBAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC1G,OAAO,OAAO,CAAC;iBAClB;qBAAM;oBACH,MAAM,OAAO,GAAG,qDAAqD,QAAQ,EAAE,CAAC;oBAChF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAEvB,OAAO,IAAI,CAAC;iBACf;aACJ;YAAC,OAAO,GAAQ,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEnB,OAAO,IAAI,CAAC;aACf;SACJ;QAAC,OAAO,GAAG,EAAE;YACV,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,iCAAiC,QAAQ,8BAA8B,YAAY,EAAE,CAAC;YAEtG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvB,OAAO,IAAI,CAAC;SACf;IACL,CAAC;CACJ;AAED,eAAe,IAAI,kBAAkB,EAAE,CAAC"}
|
package/dist/sync.ejs
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
<%
|
|
2
|
+
const formattedInterfaceNames = Array.isArray(interfaceNames) ? interfaceNames.join(', ') : interfaceNames;
|
|
3
|
+
%>
|
|
4
|
+
import type { NangoSync<%= formattedInterfaceNames ? ', ' + formattedInterfaceNames : '' %> } from './<%= interfaceFileName %>';
|
|
2
5
|
|
|
3
6
|
export default async function fetchData(nango: NangoSync): Promise<void> {
|
|
4
7
|
// Integration code goes here
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { expect, describe, it, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as ejs from 'ejs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { generate } from './sync.js';
|
|
6
|
+
describe('generate function tests', () => {
|
|
7
|
+
let fsMock, ejsMock, pathMock;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
fsMock = vi.spyOn(fs, 'readFileSync').mockImplementation(() => 'mocked data');
|
|
10
|
+
ejsMock = vi.spyOn(ejs, 'render').mockImplementation(() => 'mocked render');
|
|
11
|
+
pathMock = vi.spyOn(path, 'resolve').mockImplementation(() => 'mocked path');
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
// Cleanup any mocks after each test
|
|
15
|
+
fsMock.mockRestore();
|
|
16
|
+
ejsMock.mockRestore();
|
|
17
|
+
pathMock.mockRestore();
|
|
18
|
+
});
|
|
19
|
+
it('should generate interface definitions based on configurations', async () => {
|
|
20
|
+
// Setup mock return values
|
|
21
|
+
fs.readFileSync.mockReturnValueOnce('template content here...'); // ... do this for each file read
|
|
22
|
+
await generate();
|
|
23
|
+
// Expectations
|
|
24
|
+
expect(fs.writeFileSync).toHaveBeenCalled(); // Check if files were written as expected
|
|
25
|
+
// ... Add more expectations based on the generated content or other side effects
|
|
26
|
+
});
|
|
27
|
+
it('should not overwrite existing sync files', async () => {
|
|
28
|
+
fs.existsSync.mockReturnValue(true); // Mock the existence of the file
|
|
29
|
+
await generate();
|
|
30
|
+
expect(fs.writeFileSync).not.toHaveBeenCalledWith(expect.stringMatching(/\.ts$/), expect.any(String)); // Ensure .ts files are not overwritten
|
|
31
|
+
});
|
|
32
|
+
it('should handle duplicated sync names with an error', async () => {
|
|
33
|
+
// Mock configurations to have duplicated sync names
|
|
34
|
+
// ...
|
|
35
|
+
try {
|
|
36
|
+
await generate();
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
expect(e.message).toMatch(/is duplicated/); // Check if the error message contains the expected text
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
it('should generate files in parent directory when inParentDirectory is true', async () => {
|
|
43
|
+
// ...
|
|
44
|
+
await generate(false, true);
|
|
45
|
+
// Check if files are being written to the parent directory
|
|
46
|
+
expect(fs.writeFileSync).toHaveBeenCalledWith(expect.stringMatching(/^\.\//), expect.any(String));
|
|
47
|
+
});
|
|
48
|
+
// ... Add more tests based on different scenarios and edge cases
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=sync.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.unit.test.js","sourceRoot":"","sources":["../lib/sync.unit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACrC,IAAI,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IAE9B,UAAU,CAAC,GAAG,EAAE;QACZ,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC;QAC9E,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;QAC5E,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,oCAAoC;QACpC,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,WAAW,EAAE,CAAC;QACtB,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC3E,2BAA2B;QAC3B,EAAE,CAAC,YAAY,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC,CAAC,iCAAiC;QAElG,MAAM,QAAQ,EAAE,CAAC;QAEjB,eAAe;QACf,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,0CAA0C;QACvF,iFAAiF;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACtD,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,iCAAiC;QAEtE,MAAM,QAAQ,EAAE,CAAC;QAEjB,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,uCAAuC;IAClJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAC/D,oDAAoD;QACpD,MAAM;QAEN,IAAI;YACA,MAAM,QAAQ,EAAE,CAAC;SACpB;QAAC,OAAO,CAAC,EAAE;YACR,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,wDAAwD;SACvG;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM;QAEN,MAAM,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAE5B,2DAA2D;QAC3D,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH,iEAAiE;AACrE,CAAC,CAAC,CAAC"}
|
|
@@ -15,7 +15,7 @@ services:
|
|
|
15
15
|
- nango
|
|
16
16
|
|
|
17
17
|
nango-server:
|
|
18
|
-
image: nangohq/nango-server:0.35.
|
|
18
|
+
image: nangohq/nango-server:0.35.14
|
|
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.35.
|
|
50
|
+
image: nangohq/nango-worker:0.35.14
|
|
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.35.
|
|
3
|
+
"version": "0.35.14",
|
|
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.35.
|
|
26
|
+
"@nangohq/shared": "0.35.14",
|
|
27
27
|
"@vercel/ncc": "^0.36.1",
|
|
28
28
|
"axios": "^1.2.0",
|
|
29
29
|
"byots": "^5.0.0-dev.20221103.1.34",
|