nango 0.59.11 → 0.59.13

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.
Files changed (46) hide show
  1. package/dist/index.js +39 -12
  2. package/dist/index.js.map +1 -1
  3. package/dist/services/dryrun.service.d.ts +3 -2
  4. package/dist/services/dryrun.service.js.map +1 -1
  5. package/dist/services/model.service.d.ts +1 -1
  6. package/dist/services/model.service.js +4 -3
  7. package/dist/services/model.service.js.map +1 -1
  8. package/dist/services/model.service.unit.test.js +2 -2
  9. package/dist/services/model.service.unit.test.js.map +1 -1
  10. package/dist/services/verification.service.js +6 -5
  11. package/dist/services/verification.service.js.map +1 -1
  12. package/dist/tests/helpers.js +2 -2
  13. package/dist/tests/helpers.js.map +1 -1
  14. package/dist/types.d.ts +1 -0
  15. package/dist/utils/result.d.ts +1 -17
  16. package/dist/utils/result.js +4 -0
  17. package/dist/utils/result.js.map +1 -1
  18. package/dist/version.d.ts +1 -1
  19. package/dist/version.js +1 -1
  20. package/dist/zeroYaml/compile.d.ts +28 -0
  21. package/dist/zeroYaml/compile.js +354 -0
  22. package/dist/zeroYaml/compile.js.map +1 -0
  23. package/dist/zeroYaml/compile.unit.test.d.ts +1 -0
  24. package/dist/zeroYaml/compile.unit.test.js +33 -0
  25. package/dist/zeroYaml/compile.unit.test.js.map +1 -0
  26. package/dist/zeroYaml/definitions.d.ts +24 -0
  27. package/dist/zeroYaml/definitions.js +146 -0
  28. package/dist/zeroYaml/definitions.js.map +1 -0
  29. package/dist/zeroYaml/definitions.unit.test.d.ts +1 -0
  30. package/dist/zeroYaml/definitions.unit.test.js +102 -0
  31. package/dist/zeroYaml/definitions.unit.test.js.map +1 -0
  32. package/dist/zeroYaml/init.d.ts +7 -0
  33. package/dist/zeroYaml/init.js +94 -0
  34. package/dist/zeroYaml/init.js.map +1 -0
  35. package/dist/zeroYaml/zodToNango.d.ts +3 -0
  36. package/dist/zeroYaml/zodToNango.js +113 -0
  37. package/dist/zeroYaml/zodToNango.js.map +1 -0
  38. package/dist/zeroYaml/zodToNango.unit.test.d.ts +1 -0
  39. package/dist/zeroYaml/zodToNango.unit.test.js +75 -0
  40. package/dist/zeroYaml/zodToNango.unit.test.js.map +1 -0
  41. package/example/github/actions/createIssue.ts +39 -0
  42. package/example/github/on-events/pre-connection-deletion.ts +9 -0
  43. package/example/github/syncs/fetchIssues.ts +94 -0
  44. package/example/index.ts +3 -0
  45. package/example/package.json +13 -0
  46. package/package.json +16 -15
@@ -0,0 +1,102 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod';
3
+ import { buildAction, buildSync } from './definitions.js';
4
+ describe('buildSync', () => {
5
+ it('should build a sync', () => {
6
+ const res = buildSync({
7
+ params: {
8
+ type: 'sync',
9
+ description: 'A sync',
10
+ version: '1',
11
+ endpoints: [{ method: 'GET', path: '/foobar' }],
12
+ frequency: 'every 1 hour',
13
+ autoStart: true,
14
+ trackDeletes: false,
15
+ syncType: 'full',
16
+ webhookSubscriptions: ['*'],
17
+ scopes: ['foobar'],
18
+ models: {
19
+ Model: z.object({ foobar: z.string() })
20
+ },
21
+ metadata: z.void(),
22
+ exec: () => {
23
+ return;
24
+ }
25
+ },
26
+ basename: 'fetchIssues',
27
+ basenameClean: 'fetchIssues',
28
+ integrationIdClean: 'github'
29
+ });
30
+ expect(res.sync).toStrictEqual({
31
+ type: 'sync',
32
+ name: 'fetchIssues',
33
+ description: 'A sync',
34
+ version: '1',
35
+ endpoints: [{ method: 'GET', path: '/foobar' }],
36
+ runs: 'every 1 hour',
37
+ auto_start: true,
38
+ track_deletes: false,
39
+ sync_type: 'full',
40
+ webhookSubscriptions: ['*'],
41
+ scopes: ['foobar'],
42
+ usedModels: ['Model', 'SyncMetadata_github_fetchIssues'],
43
+ input: 'SyncMetadata_github_fetchIssues',
44
+ output: ['Model']
45
+ });
46
+ expect(Array.from(res.models.values())).toStrictEqual([
47
+ {
48
+ fields: [{ name: 'metadata', optional: true, tsType: true, value: 'void' }],
49
+ isAnon: true,
50
+ name: 'SyncMetadata_github_fetchIssues'
51
+ },
52
+ {
53
+ fields: [{ name: 'foobar', optional: false, tsType: true, value: 'string' }],
54
+ name: 'Model'
55
+ }
56
+ ]);
57
+ });
58
+ it('should build an action', () => {
59
+ const res = buildAction({
60
+ params: {
61
+ type: 'action',
62
+ description: 'A sync',
63
+ version: '1',
64
+ endpoint: { method: 'GET', path: '/foobar' },
65
+ scopes: ['foobar'],
66
+ input: z.void(),
67
+ output: z.number(),
68
+ metadata: z.object({ foo: z.string() }),
69
+ exec: () => {
70
+ return;
71
+ }
72
+ },
73
+ basename: 'createIssue',
74
+ basenameClean: 'createIssue',
75
+ integrationIdClean: 'github'
76
+ });
77
+ expect(res.action).toStrictEqual({
78
+ type: 'action',
79
+ name: 'createIssue',
80
+ description: 'A sync',
81
+ version: '1',
82
+ endpoint: { method: 'GET', path: '/foobar' },
83
+ scopes: ['foobar'],
84
+ input: 'ActionInput_github_createIssue',
85
+ output: ['ActionOutput_github_createIssue'],
86
+ usedModels: ['ActionInput_github_createIssue', 'ActionOutput_github_createIssue']
87
+ });
88
+ expect(Array.from(res.models.values())).toStrictEqual([
89
+ {
90
+ fields: [{ name: 'input', optional: true, tsType: true, value: 'void' }],
91
+ isAnon: true,
92
+ name: 'ActionInput_github_createIssue'
93
+ },
94
+ {
95
+ fields: [{ name: 'output', optional: false, tsType: true, value: 'number' }],
96
+ isAnon: true,
97
+ name: 'ActionOutput_github_createIssue'
98
+ }
99
+ ]);
100
+ });
101
+ });
102
+ //# sourceMappingURL=definitions.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.unit.test.js","sourceRoot":"","sources":["../../lib/zeroYaml/definitions.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Init a new nango folder
3
+ */
4
+ export declare function initZero({ absolutePath, debug }: {
5
+ absolutePath: string;
6
+ debug?: boolean;
7
+ }): Promise<boolean>;
@@ -0,0 +1,94 @@
1
+ import { exec } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path, { dirname } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { promisify } from 'node:util';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { printDebug } from '../utils.js';
9
+ import { NANGO_VERSION } from '../version.js';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ const execAsync = promisify(exec);
13
+ /**
14
+ * Init a new nango folder
15
+ */
16
+ export async function initZero({ absolutePath, debug = false }) {
17
+ printDebug(`Creating the nango integrations directory in ${absolutePath}`, debug);
18
+ const stat = fs.statSync(absolutePath, { throwIfNoEntry: false });
19
+ // Create directory if it doesn't exist
20
+ if (!stat) {
21
+ printDebug(`Directory does not exist`, debug);
22
+ await fs.promises.mkdir(absolutePath);
23
+ }
24
+ else if (!stat.isDirectory()) {
25
+ console.log(chalk.red(`The path provided is not a directory. Exiting.`));
26
+ return false;
27
+ }
28
+ // Copy example folder
29
+ {
30
+ const spinner = ora({ text: 'Copy example' }).start();
31
+ const exampleFolderPath = path.join(__dirname, '..', '..', 'example');
32
+ try {
33
+ printDebug(`Copy example folder`, debug);
34
+ await fs.promises.mkdir(absolutePath, { recursive: true });
35
+ await copyRecursive(exampleFolderPath, absolutePath);
36
+ spinner.succeed();
37
+ }
38
+ catch (err) {
39
+ spinner.fail();
40
+ console.log(chalk.red(`Failed to copy template: ${err instanceof Error ? err.message : 'unknown error'}`));
41
+ return false;
42
+ }
43
+ }
44
+ // Update nango dependency version in package.json
45
+ const packageJsonPath = path.join(absolutePath, 'package.json');
46
+ try {
47
+ const packageJsonRaw = await fs.promises.readFile(packageJsonPath, 'utf-8');
48
+ const packageJson = JSON.parse(packageJsonRaw);
49
+ packageJson.devDependencies.nango = NANGO_VERSION;
50
+ await fs.promises.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
51
+ }
52
+ catch (err) {
53
+ console.log(chalk.red(`Failed to update nango version in package.json: ${err instanceof Error ? err.message : 'unknown error'}`));
54
+ return false;
55
+ }
56
+ // Run npm install
57
+ {
58
+ const spinner = ora({ text: 'Install packages' }).start();
59
+ try {
60
+ printDebug(`Running npm install`, debug);
61
+ await execAsync('npm install', { cwd: absolutePath });
62
+ spinner.succeed();
63
+ }
64
+ catch (err) {
65
+ spinner.fail();
66
+ console.log(chalk.red(`Failed to npm install: ${err instanceof Error ? err.message : 'unknown error'}`));
67
+ return false;
68
+ }
69
+ }
70
+ // TODO: add compileAll
71
+ {
72
+ const spinner = ora({ text: 'Initial compilation' }).start();
73
+ spinner.succeed();
74
+ }
75
+ return true;
76
+ }
77
+ async function copyRecursive(src, dest) {
78
+ const entries = await fs.promises.readdir(src, { withFileTypes: true });
79
+ for (const entry of entries) {
80
+ const srcPath = path.join(src, entry.name);
81
+ const destPath = path.join(dest, entry.name);
82
+ if (entry.isDirectory()) {
83
+ if (entry.name === 'node_modules') {
84
+ continue;
85
+ }
86
+ await fs.promises.mkdir(destPath, { recursive: true });
87
+ await copyRecursive(srcPath, destPath);
88
+ }
89
+ else {
90
+ await fs.promises.copyFile(srcPath, destPath);
91
+ }
92
+ }
93
+ }
94
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../lib/zeroYaml/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,YAAY,EAAE,KAAK,GAAG,KAAK,EAA6C;IACrG,UAAU,CAAC,gDAAgD,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IAElF,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,uCAAuC;IACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,UAAU,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QAE9C,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,sBAAsB;IACtB,CAAC;QACG,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACtE,IAAI,CAAC;YACD,UAAU,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAEzC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,aAAa,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YACrD,OAAO,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAC3G,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAChE,IAAI,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAA2C,CAAC;QACzF,WAAW,CAAC,eAAe,CAAC,KAAK,GAAG,aAAa,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QAClI,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,kBAAkB;IAClB,CAAC;QACG,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1D,IAAI,CAAC;YACD,UAAU,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAEzC,MAAM,SAAS,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACzG,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,CAAC;QACG,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7D,OAAO,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,IAAY;IAClD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAChC,SAAS;YACb,CAAC;YACD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACJ,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { NangoModelField } from '@nangohq/types';
2
+ import type { z } from 'zod';
3
+ export declare function zodToNangoModelField(name: string, schema: z.ZodType): NangoModelField;
@@ -0,0 +1,113 @@
1
+ export function zodToNangoModelField(name, schema) {
2
+ const optional = schema.isOptional();
3
+ if (isZodObject(schema)) {
4
+ const values = [];
5
+ for (const [key, value] of Object.entries(schema.shape)) {
6
+ values.push(zodToNangoModelField(key, value));
7
+ }
8
+ return { name, value: values, optional };
9
+ }
10
+ else if (isZodString(schema)) {
11
+ return { name, value: 'string', tsType: true, optional };
12
+ }
13
+ else if (isZodLiteral(schema)) {
14
+ return { name, value: schema._def.value, optional };
15
+ }
16
+ else if (isZodNumber(schema)) {
17
+ return { name, value: 'number', tsType: true, optional };
18
+ }
19
+ else if (isZodBoolean(schema)) {
20
+ return { name, value: 'boolean', tsType: true, optional };
21
+ }
22
+ else if (isZodNull(schema)) {
23
+ return { name, value: null, tsType: true, optional };
24
+ }
25
+ else if (isZodEnum(schema)) {
26
+ const values = [];
27
+ for (const [key, value] of Object.entries(schema._def.values)) {
28
+ values.push({ name: key, value: value });
29
+ }
30
+ return { name, value: values, optional, union: true };
31
+ }
32
+ else if (isZodAny(schema)) {
33
+ return { name, value: 'any', tsType: true, optional };
34
+ }
35
+ else if (isZodDate(schema)) {
36
+ return { name, value: 'date', tsType: true, optional };
37
+ }
38
+ else if (isZodRecord(schema)) {
39
+ return { name, value: [{ ...zodToNangoModelField('__string', schema._def.valueType), dynamic: true }], optional };
40
+ }
41
+ else if (isZodArray(schema)) {
42
+ const value = zodToNangoModelField('0', schema._def.type).value;
43
+ return { name, value, tsType: true, array: true, optional };
44
+ }
45
+ else if (isZodUnion(schema)) {
46
+ const values = [];
47
+ for (const [key, value] of Object.entries(schema._def.options)) {
48
+ values.push(zodToNangoModelField(key, value));
49
+ }
50
+ return { name, value: values, tsType: true, union: true, optional };
51
+ }
52
+ else if (isZodNever(schema)) {
53
+ return { name, value: 'never', tsType: true, optional };
54
+ }
55
+ else if (isZodVoid(schema)) {
56
+ return { name, value: 'void', tsType: true, optional };
57
+ }
58
+ else if (isZodOptional(schema)) {
59
+ return zodToNangoModelField(name, schema._def.innerType);
60
+ }
61
+ else {
62
+ throw new Error(`not handled, ${JSON.stringify(schema)}`);
63
+ }
64
+ }
65
+ // We are using type guards because instanceof does not work
66
+ // the files are compiled and the zod version loaded by the scripts is the not the same
67
+ // (at least that's my interpretation, as it works in unit test)
68
+ function isZodObject(schema) {
69
+ return schema.constructor.name === 'ZodObject';
70
+ }
71
+ function isZodString(schema) {
72
+ return schema.constructor.name === 'ZodString';
73
+ }
74
+ function isZodLiteral(schema) {
75
+ return schema.constructor.name === 'ZodLiteral';
76
+ }
77
+ function isZodNumber(schema) {
78
+ return schema.constructor.name === 'ZodNumber';
79
+ }
80
+ function isZodBoolean(schema) {
81
+ return schema.constructor.name === 'ZodBoolean';
82
+ }
83
+ function isZodNull(schema) {
84
+ return schema.constructor.name === 'ZodNull';
85
+ }
86
+ function isZodEnum(schema) {
87
+ return schema.constructor.name === 'ZodEnum';
88
+ }
89
+ function isZodArray(schema) {
90
+ return schema.constructor.name === 'ZodArray';
91
+ }
92
+ function isZodUnion(schema) {
93
+ return schema.constructor.name === 'ZodUnion';
94
+ }
95
+ function isZodAny(schema) {
96
+ return schema.constructor.name === 'ZodAny';
97
+ }
98
+ function isZodRecord(schema) {
99
+ return schema.constructor.name === 'ZodRecord';
100
+ }
101
+ function isZodDate(schema) {
102
+ return schema.constructor.name === 'ZodDate';
103
+ }
104
+ function isZodNever(schema) {
105
+ return schema.constructor.name === 'ZodNever';
106
+ }
107
+ function isZodVoid(schema) {
108
+ return schema.constructor.name === 'ZodVoid';
109
+ }
110
+ function isZodOptional(schema) {
111
+ return schema.constructor.name === 'ZodOptional';
112
+ }
113
+ //# sourceMappingURL=zodToNango.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zodToNango.js","sourceRoot":"","sources":["../../lib/zeroYaml/zodToNango.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod';
3
+ import { zodToNangoModelField } from './zodToNango.js';
4
+ describe('zodToNango', () => {
5
+ it('should transform stuff', () => {
6
+ const ref = z.object({ id: z.string() });
7
+ expect(zodToNangoModelField('test', z.object({
8
+ foo: z.literal('bar'),
9
+ num: z.number(),
10
+ bool: z.boolean(),
11
+ null: z.null(),
12
+ enum: z.enum(['tip', 'top']),
13
+ arr: z.array(z.string()),
14
+ obj: z.object({ bar: z.string() }),
15
+ union: z.union([z.string(), z.boolean()]),
16
+ any: z.any(),
17
+ reco: z.record(z.string(), z.date()),
18
+ opt: z.any().optional(),
19
+ ref: ref,
20
+ void: z.void(),
21
+ never: z.never()
22
+ // Not supported
23
+ // lazy: z.lazy(() => ref)
24
+ }))).toStrictEqual({
25
+ name: 'test',
26
+ optional: false,
27
+ value: [
28
+ { name: 'foo', optional: false, value: 'bar' },
29
+ { name: 'num', optional: false, tsType: true, value: 'number' },
30
+ { name: 'bool', optional: false, tsType: true, value: 'boolean' },
31
+ { name: 'null', optional: false, tsType: true, value: null },
32
+ {
33
+ name: 'enum',
34
+ optional: false,
35
+ union: true,
36
+ value: [
37
+ { name: '0', value: 'tip' },
38
+ { name: '1', value: 'top' }
39
+ ]
40
+ },
41
+ { array: true, name: 'arr', optional: false, tsType: true, value: 'string' },
42
+ {
43
+ name: 'obj',
44
+ optional: false,
45
+ value: [{ name: 'bar', optional: false, tsType: true, value: 'string' }]
46
+ },
47
+ {
48
+ name: 'union',
49
+ optional: false,
50
+ tsType: true,
51
+ union: true,
52
+ value: [
53
+ { name: '0', optional: false, tsType: true, value: 'string' },
54
+ { name: '1', optional: false, tsType: true, value: 'boolean' }
55
+ ]
56
+ },
57
+ { name: 'any', optional: true, tsType: true, value: 'any' },
58
+ {
59
+ name: 'reco',
60
+ optional: false,
61
+ value: [{ dynamic: true, name: '__string', optional: false, tsType: true, value: 'date' }]
62
+ },
63
+ { name: 'opt', optional: true, tsType: true, value: 'any' },
64
+ {
65
+ name: 'ref',
66
+ optional: false,
67
+ value: [{ name: 'id', optional: false, tsType: true, value: 'string' }]
68
+ },
69
+ { name: 'void', optional: true, tsType: true, value: 'void' },
70
+ { name: 'never', optional: false, tsType: true, value: 'never' }
71
+ ]
72
+ });
73
+ });
74
+ });
75
+ //# sourceMappingURL=zodToNango.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zodToNango.unit.test.js","sourceRoot":"","sources":["../../lib/zeroYaml/zodToNango.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { createAction } from 'nango';
2
+ import { z } from 'zod';
3
+
4
+ const issueSchema = z.object({
5
+ id: z.string(),
6
+ owner: z.string(),
7
+ repo: z.string(),
8
+ issue_number: z.number(),
9
+ title: z.string(),
10
+ state: z.string(),
11
+ author: z.string(),
12
+ author_id: z.number(),
13
+ body: z.string(),
14
+ date_created: z.string(),
15
+ date_last_modified: z.string()
16
+ });
17
+
18
+ const action = createAction({
19
+ description: `Create an issue in GitHub`,
20
+ version: '1.0.0',
21
+ endpoint: { method: 'POST', path: '/example/github/issues', group: 'Issues' },
22
+ input: issueSchema,
23
+ output: z.void(),
24
+
25
+ // Action execution
26
+ exec: async (nango, input) => {
27
+ await nango.proxy({
28
+ endpoint: '/repos/NangoHQ/interactive-demo/issues',
29
+ data: {
30
+ title: `[demo] ${input.title}`,
31
+ body: `This issue was created automatically using Nango Action.`,
32
+ labels: ['automatic']
33
+ }
34
+ });
35
+ }
36
+ });
37
+
38
+ export type NangoActionLocal = Parameters<(typeof action)['params']['exec']>[0];
39
+ export default action;
@@ -0,0 +1,9 @@
1
+ import { createOnEvent } from 'nango';
2
+
3
+ export default createOnEvent({
4
+ event: 'pre-connection-deletion',
5
+ description: 'This script is executed before a connection is deleted',
6
+ exec: async (nango) => {
7
+ await nango.log('Executed');
8
+ }
9
+ });
@@ -0,0 +1,94 @@
1
+ import { createSync } from 'nango';
2
+ import { z } from 'zod';
3
+
4
+ const LIMIT = 100;
5
+ const issueSchema = z.object({
6
+ id: z.string(),
7
+ owner: z.string(),
8
+ repo: z.string(),
9
+ issue_number: z.number(),
10
+ title: z.string(),
11
+ state: z.string(),
12
+ author: z.string(),
13
+ author_id: z.number(),
14
+ body: z.string(),
15
+ date_created: z.string(),
16
+ date_last_modified: z.string()
17
+ });
18
+ type GithubIssue = z.infer<typeof issueSchema>;
19
+
20
+ const sync = createSync({
21
+ description: `Fetches the Github issues from all a user's repositories.`,
22
+ version: '1.0.0',
23
+ endpoints: [{ method: 'GET', path: '/example/github/issues', group: 'Issues' }],
24
+ integrationId: 'github',
25
+ runs: 'every hour',
26
+ autoStart: true,
27
+ syncType: 'full',
28
+ trackDeletes: true,
29
+
30
+ metadata: z.never(),
31
+ models: {
32
+ GithubIssue: issueSchema
33
+ },
34
+
35
+ // Sync execution
36
+ exec: async (nango) => {
37
+ const repos = await getAllRepositories(nango);
38
+
39
+ for (const repo of repos) {
40
+ const proxyConfig = {
41
+ endpoint: `/repos/${repo.owner.login}/${repo.name}/issues`,
42
+ paginate: {
43
+ limit: LIMIT
44
+ }
45
+ };
46
+ for await (const issueBatch of nango.paginate(proxyConfig)) {
47
+ const issues = issueBatch.filter((issue) => !('pull_request' in issue));
48
+
49
+ const mappedIssues: GithubIssue[] = issues.map((issue) => ({
50
+ id: issue.id,
51
+ owner: repo.owner.login,
52
+ repo: repo.name,
53
+ issue_number: issue.number,
54
+ title: issue.title,
55
+ state: issue.state,
56
+ author: issue.user.login,
57
+ author_id: issue.user.id,
58
+ body: issue.body,
59
+ date_created: issue.created_at,
60
+ date_last_modified: issue.updated_at
61
+ }));
62
+
63
+ if (mappedIssues.length > 0) {
64
+ await nango.batchSave(mappedIssues, 'GithubIssue');
65
+ await nango.log(`Sent ${mappedIssues.length} issues from ${repo.owner.login}/${repo.name}`);
66
+ }
67
+ }
68
+ }
69
+ },
70
+
71
+ // Webhook handler
72
+ onWebhook: async (nango, payload) => {
73
+ await nango.log('This is a webhook script', payload);
74
+ }
75
+ });
76
+
77
+ export type NangoSyncLocal = Parameters<(typeof sync)['params']['exec']>[0];
78
+ export default sync;
79
+
80
+ async function getAllRepositories(nango: NangoSyncLocal): Promise<any[]> {
81
+ const records: any[] = [];
82
+ const proxyConfig = {
83
+ endpoint: '/user/repos',
84
+ paginate: {
85
+ limit: LIMIT
86
+ }
87
+ };
88
+
89
+ for await (const recordBatch of nango.paginate(proxyConfig)) {
90
+ records.push(...recordBatch);
91
+ }
92
+
93
+ return records;
94
+ }
@@ -0,0 +1,3 @@
1
+ export * from './github/syncs/fetchIssues.js';
2
+ export * from './github/actions/createIssue.js';
3
+ export * from './github/on-events/pre-connection-deletion.js';
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "nango-integrations",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=18.0"
8
+ },
9
+ "devDependencies": {
10
+ "nango": "XXX",
11
+ "zod": "3.24.2"
12
+ }
13
+ }