@nangohq/nango-yaml 0.40.1
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/constant.d.ts +1 -0
- package/dist/constant.js +2 -0
- package/dist/constant.js.map +1 -0
- package/dist/errors.d.ts +76 -0
- package/dist/errors.js +110 -0
- package/dist/errors.js.map +1 -0
- package/dist/helpers.d.ts +33 -0
- package/dist/helpers.js +157 -0
- package/dist/helpers.js.map +1 -0
- package/dist/helpers.unit.test.d.ts +1 -0
- package/dist/helpers.unit.test.js +130 -0
- package/dist/helpers.unit.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/load.d.ts +7 -0
- package/dist/load.js +28 -0
- package/dist/load.js.map +1 -0
- package/dist/modelsParser.d.ts +26 -0
- package/dist/modelsParser.js +165 -0
- package/dist/modelsParser.js.map +1 -0
- package/dist/modelsParser.unit.test.d.ts +1 -0
- package/dist/modelsParser.unit.test.js +350 -0
- package/dist/modelsParser.unit.test.js.map +1 -0
- package/dist/parser.d.ts +21 -0
- package/dist/parser.js +144 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser.v1.d.ts +4 -0
- package/dist/parser.v1.js +88 -0
- package/dist/parser.v1.js.map +1 -0
- package/dist/parser.v1.unit.test.d.ts +1 -0
- package/dist/parser.v1.unit.test.js +104 -0
- package/dist/parser.v1.unit.test.js.map +1 -0
- package/dist/parser.v2.d.ts +20 -0
- package/dist/parser.v2.js +171 -0
- package/dist/parser.v2.js.map +1 -0
- package/dist/parser.v2.unit.test.d.ts +1 -0
- package/dist/parser.v2.unit.test.js +151 -0
- package/dist/parser.v2.unit.test.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const nangoConfigFile = "nango.yaml";
|
package/dist/constant.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../lib/constant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export declare class ParserError {
|
|
2
|
+
code: string;
|
|
3
|
+
message: string;
|
|
4
|
+
path: string;
|
|
5
|
+
constructor({ code, message, path }: {
|
|
6
|
+
code: string;
|
|
7
|
+
message: string;
|
|
8
|
+
path: string[];
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export declare class ParserErrorInvalidModelName extends ParserError {
|
|
12
|
+
constructor(options: {
|
|
13
|
+
model: string;
|
|
14
|
+
path: string[];
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export declare class ParserErrorDuplicateModel extends ParserError {
|
|
18
|
+
constructor(options: {
|
|
19
|
+
model: string;
|
|
20
|
+
path: string[];
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export declare class ParserErrorModelNotFound extends ParserError {
|
|
24
|
+
constructor(options: {
|
|
25
|
+
model: string;
|
|
26
|
+
path: string[];
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export declare class ParserErrorMissingId extends ParserError {
|
|
30
|
+
constructor(options: {
|
|
31
|
+
model: string;
|
|
32
|
+
path: string[];
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export declare class ParserErrorDuplicateEndpoint extends ParserError {
|
|
36
|
+
constructor(options: {
|
|
37
|
+
endpoint: string;
|
|
38
|
+
path: string[];
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export declare class ParserErrorEndpointsMismatch extends ParserError {
|
|
42
|
+
constructor(options: {
|
|
43
|
+
syncName: string;
|
|
44
|
+
path: string[];
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export declare class ParserErrorInvalidRuns extends ParserError {
|
|
48
|
+
constructor(options: {
|
|
49
|
+
message: string;
|
|
50
|
+
path: string[];
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export declare class ParserErrorModelIsLiteral extends ParserError {
|
|
54
|
+
constructor(options: {
|
|
55
|
+
model: string;
|
|
56
|
+
path: string[];
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export declare class ParserErrorCycle extends ParserError {
|
|
60
|
+
constructor(options: {
|
|
61
|
+
name: string;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export declare class ParserErrorExtendsNotFound extends ParserError {
|
|
65
|
+
constructor(options: {
|
|
66
|
+
model: string;
|
|
67
|
+
inherit: string;
|
|
68
|
+
path: string[];
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
export declare class ParserErrorDataSyntax extends ParserError {
|
|
72
|
+
constructor(options: {
|
|
73
|
+
value: string;
|
|
74
|
+
path: string[];
|
|
75
|
+
});
|
|
76
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export class ParserError {
|
|
2
|
+
code;
|
|
3
|
+
message;
|
|
4
|
+
path;
|
|
5
|
+
constructor({ code, message, path }) {
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.message = message;
|
|
8
|
+
this.path = path.join(' > ');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class ParserErrorInvalidModelName extends ParserError {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super({
|
|
14
|
+
code: 'invalid_model_name',
|
|
15
|
+
message: `Model "${options.model}" contains invalid characters`,
|
|
16
|
+
path: options.path
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class ParserErrorDuplicateModel extends ParserError {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
super({
|
|
23
|
+
code: 'duplicate_model',
|
|
24
|
+
message: `Model "${options.model}" is used multiple times. Please make sure all models are unique within an integration.`,
|
|
25
|
+
path: options.path
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class ParserErrorModelNotFound extends ParserError {
|
|
30
|
+
constructor(options) {
|
|
31
|
+
super({
|
|
32
|
+
code: 'model_not_found',
|
|
33
|
+
message: `Model "${options.model}" does not exists`,
|
|
34
|
+
path: options.path
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class ParserErrorMissingId extends ParserError {
|
|
39
|
+
constructor(options) {
|
|
40
|
+
super({
|
|
41
|
+
code: 'model_missing_id',
|
|
42
|
+
message: `Model "${options.model}" doesn't have an id field. This is required to be able to uniquely identify the data record`,
|
|
43
|
+
path: options.path
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class ParserErrorDuplicateEndpoint extends ParserError {
|
|
48
|
+
constructor(options) {
|
|
49
|
+
super({
|
|
50
|
+
code: 'duplicate_endpoint',
|
|
51
|
+
message: `Endpoint "${options.endpoint}" is used multiple times. Please make sure all endpoints are unique.`,
|
|
52
|
+
path: options.path
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class ParserErrorEndpointsMismatch extends ParserError {
|
|
57
|
+
constructor(options) {
|
|
58
|
+
super({
|
|
59
|
+
code: 'endpoints_mismatch',
|
|
60
|
+
message: `The number of endpoints doesn't match the number of models returned by "${options.syncName}". The endpoints to model should match 1 to 1.`,
|
|
61
|
+
path: options.path
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export class ParserErrorInvalidRuns extends ParserError {
|
|
66
|
+
constructor(options) {
|
|
67
|
+
super({
|
|
68
|
+
code: 'invalid_runs',
|
|
69
|
+
message: options.message,
|
|
70
|
+
path: options.path
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export class ParserErrorModelIsLiteral extends ParserError {
|
|
75
|
+
constructor(options) {
|
|
76
|
+
super({
|
|
77
|
+
code: 'model_is_literal',
|
|
78
|
+
message: `A literal type "${options.model}" was parsed, which might be an error. It is recommended to use a Model for input and output.`,
|
|
79
|
+
path: options.path
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export class ParserErrorCycle extends ParserError {
|
|
84
|
+
constructor(options) {
|
|
85
|
+
super({
|
|
86
|
+
code: 'cyclic_model',
|
|
87
|
+
message: `Cyclic import ${options.name}->${options.name}`,
|
|
88
|
+
path: [options.name]
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export class ParserErrorExtendsNotFound extends ParserError {
|
|
93
|
+
constructor(options) {
|
|
94
|
+
super({
|
|
95
|
+
code: 'model_extends_not_found',
|
|
96
|
+
message: `Model "${options.model}" is extending "${options.inherit}", but it does not exists`,
|
|
97
|
+
path: options.path
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export class ParserErrorDataSyntax extends ParserError {
|
|
102
|
+
constructor(options) {
|
|
103
|
+
super({
|
|
104
|
+
code: 'data_syntax_warning',
|
|
105
|
+
message: `Data type "${options.value}" contains some unsupported typescript syntax`,
|
|
106
|
+
path: options.path
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { StringValue } from 'ms';
|
|
2
|
+
import type { NangoYaml, NangoYamlParsed, NangoYamlParsedIntegration } from '@nangohq/types';
|
|
3
|
+
interface IntervalResponse {
|
|
4
|
+
interval: StringValue;
|
|
5
|
+
offset: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function determineVersion(configData: NangoYaml): 'v1' | 'v2';
|
|
8
|
+
export declare function getOffset(interval: StringValue, date: Date): number;
|
|
9
|
+
/**
|
|
10
|
+
* Get Interval
|
|
11
|
+
* @desc get the interval based on the runs property in the yaml. The offset
|
|
12
|
+
* should be the amount of time that the interval should be offset by.
|
|
13
|
+
* If the time is 1536 and the interval is 30m then the next time the sync should run is 1606
|
|
14
|
+
* and then 1636 etc. The offset should be based on the interval and should never be
|
|
15
|
+
* greater than the interval
|
|
16
|
+
*/
|
|
17
|
+
export declare function getInterval(runs: string, date: Date): IntervalResponse | Error;
|
|
18
|
+
export declare const JAVASCRIPT_AND_TYPESCRIPT_TYPES: {
|
|
19
|
+
primitives: string[];
|
|
20
|
+
builtInObjects: string[];
|
|
21
|
+
utilityTypes: string[];
|
|
22
|
+
};
|
|
23
|
+
export declare function isJsOrTsType(type?: string): boolean;
|
|
24
|
+
export declare const typesAliases: Record<string, string>;
|
|
25
|
+
export declare function getPotentialTypeAlias(value: string): string | undefined;
|
|
26
|
+
export declare function getNativeDataType(value: string): number | boolean | null | undefined | Error;
|
|
27
|
+
export declare function isDisallowedType(value: string): boolean;
|
|
28
|
+
export declare function shouldQuote(name: string): boolean;
|
|
29
|
+
export declare function getProviderConfigurationFromPath({ filePath, parsed }: {
|
|
30
|
+
filePath: string;
|
|
31
|
+
parsed: NangoYamlParsed;
|
|
32
|
+
}): NangoYamlParsedIntegration | null;
|
|
33
|
+
export {};
|
package/dist/helpers.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import ms from 'ms';
|
|
3
|
+
export function determineVersion(configData) {
|
|
4
|
+
if (!configData.integrations) {
|
|
5
|
+
return 'v1';
|
|
6
|
+
}
|
|
7
|
+
const keys = Object.keys(configData.integrations);
|
|
8
|
+
if (keys.length <= 0) {
|
|
9
|
+
// Actually not possible to know
|
|
10
|
+
return 'v1';
|
|
11
|
+
}
|
|
12
|
+
const firstProviderConfig = configData.integrations[keys[0]];
|
|
13
|
+
if (firstProviderConfig && ('syncs' in firstProviderConfig || 'actions' in firstProviderConfig)) {
|
|
14
|
+
return 'v2';
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return 'v1';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function getOffset(interval, date) {
|
|
21
|
+
const intervalMilliseconds = ms(interval);
|
|
22
|
+
const nowMilliseconds = date.getMinutes() * 60 * 1000 + date.getSeconds() * 1000 + date.getMilliseconds();
|
|
23
|
+
const offset = nowMilliseconds % intervalMilliseconds;
|
|
24
|
+
if (isNaN(offset)) {
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
return offset;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get Interval
|
|
31
|
+
* @desc get the interval based on the runs property in the yaml. The offset
|
|
32
|
+
* should be the amount of time that the interval should be offset by.
|
|
33
|
+
* If the time is 1536 and the interval is 30m then the next time the sync should run is 1606
|
|
34
|
+
* and then 1636 etc. The offset should be based on the interval and should never be
|
|
35
|
+
* greater than the interval
|
|
36
|
+
*/
|
|
37
|
+
export function getInterval(runs, date) {
|
|
38
|
+
if (runs === 'every half day') {
|
|
39
|
+
const response = { interval: '12h', offset: getOffset('12h', date) };
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
if (runs === 'every half hour') {
|
|
43
|
+
const response = { interval: '30m', offset: getOffset('30m', date) };
|
|
44
|
+
return response;
|
|
45
|
+
}
|
|
46
|
+
if (runs === 'every quarter hour') {
|
|
47
|
+
const response = { interval: '15m', offset: getOffset('15m', date) };
|
|
48
|
+
return response;
|
|
49
|
+
}
|
|
50
|
+
if (runs === 'every hour') {
|
|
51
|
+
const response = { interval: '1h', offset: getOffset('1h', date) };
|
|
52
|
+
return response;
|
|
53
|
+
}
|
|
54
|
+
if (runs === 'every day') {
|
|
55
|
+
const response = { interval: '1d', offset: getOffset('1d', date) };
|
|
56
|
+
return response;
|
|
57
|
+
}
|
|
58
|
+
if (runs === 'every month') {
|
|
59
|
+
const response = { interval: '30d', offset: getOffset('30d', date) };
|
|
60
|
+
return response;
|
|
61
|
+
}
|
|
62
|
+
if (runs === 'every week') {
|
|
63
|
+
const response = { interval: '1w', offset: getOffset('1w', date) };
|
|
64
|
+
return response;
|
|
65
|
+
}
|
|
66
|
+
const interval = runs.replace('every ', '');
|
|
67
|
+
if (!ms(interval)) {
|
|
68
|
+
return new Error('sync_interval_invalid');
|
|
69
|
+
}
|
|
70
|
+
if (ms(interval) < ms('5m')) {
|
|
71
|
+
return new Error('sync_interval_too_short');
|
|
72
|
+
}
|
|
73
|
+
const offset = getOffset(interval, date);
|
|
74
|
+
const response = { interval, offset };
|
|
75
|
+
return response;
|
|
76
|
+
}
|
|
77
|
+
export const JAVASCRIPT_AND_TYPESCRIPT_TYPES = {
|
|
78
|
+
primitives: ['string', 'number', 'boolean', 'bigint', 'symbol'],
|
|
79
|
+
builtInObjects: ['Object', 'Array', 'Function', 'Date', 'RegExp', 'Map', 'Set', 'WeakMap', 'WeakSet', 'Promise', 'Symbol', 'Error'],
|
|
80
|
+
utilityTypes: ['Record', 'Partial', 'Readonly', 'Pick', 'Omit', 'Awaited', 'Required', 'Exclude', 'Extract', 'Uppercase', 'Lowercase']
|
|
81
|
+
};
|
|
82
|
+
const typesLowercase = Object.values(JAVASCRIPT_AND_TYPESCRIPT_TYPES)
|
|
83
|
+
.flat()
|
|
84
|
+
.map((v) => v.toLocaleLowerCase());
|
|
85
|
+
const typesWithGenerics = [...JAVASCRIPT_AND_TYPESCRIPT_TYPES.builtInObjects, ...JAVASCRIPT_AND_TYPESCRIPT_TYPES.utilityTypes];
|
|
86
|
+
// Only used externally
|
|
87
|
+
export function isJsOrTsType(type) {
|
|
88
|
+
if (!type) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
const baseType = type.replace(/\[\]$/, '').toLocaleLowerCase();
|
|
92
|
+
if (typesLowercase.includes(baseType)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
const genericTypeRegex = new RegExp(`^(${typesWithGenerics.join('|')})<.+>$`, 'i');
|
|
96
|
+
return genericTypeRegex.test(baseType);
|
|
97
|
+
}
|
|
98
|
+
export const typesAliases = {
|
|
99
|
+
integer: 'number',
|
|
100
|
+
int: 'number',
|
|
101
|
+
char: 'string',
|
|
102
|
+
varchar: 'string',
|
|
103
|
+
float: 'number',
|
|
104
|
+
bool: 'boolean',
|
|
105
|
+
string: 'string',
|
|
106
|
+
number: 'number',
|
|
107
|
+
boolean: 'boolean',
|
|
108
|
+
bigint: 'bigint',
|
|
109
|
+
date: 'Date',
|
|
110
|
+
object: 'object',
|
|
111
|
+
any: 'any',
|
|
112
|
+
array: 'any[]'
|
|
113
|
+
};
|
|
114
|
+
export function getPotentialTypeAlias(value) {
|
|
115
|
+
return typesAliases[value.toLocaleLowerCase()];
|
|
116
|
+
}
|
|
117
|
+
export function getNativeDataType(value) {
|
|
118
|
+
const int = parseInt(value, 10);
|
|
119
|
+
if (!Number.isNaN(int)) {
|
|
120
|
+
return int;
|
|
121
|
+
}
|
|
122
|
+
switch (value.toLocaleLowerCase()) {
|
|
123
|
+
case 'true':
|
|
124
|
+
return true;
|
|
125
|
+
case 'false':
|
|
126
|
+
return false;
|
|
127
|
+
case 'null':
|
|
128
|
+
return null;
|
|
129
|
+
case 'undefined':
|
|
130
|
+
return undefined;
|
|
131
|
+
default:
|
|
132
|
+
return new Error();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export function isDisallowedType(value) {
|
|
136
|
+
return typesWithGenerics.some((type) => value.startsWith(`${type}<`));
|
|
137
|
+
}
|
|
138
|
+
const regQuote = /^[a-zA-Z0-9_]+$/;
|
|
139
|
+
export function shouldQuote(name) {
|
|
140
|
+
return !regQuote.test(name);
|
|
141
|
+
}
|
|
142
|
+
export function getProviderConfigurationFromPath({ filePath, parsed }) {
|
|
143
|
+
const pathSegments = filePath.split('/');
|
|
144
|
+
const scriptType = pathSegments.length > 1 ? pathSegments[pathSegments.length - 2] : null;
|
|
145
|
+
const isNested = scriptType === 'syncs' || scriptType === 'actions' || scriptType === 'post-connection-scripts';
|
|
146
|
+
const baseName = path.basename(filePath, '.ts');
|
|
147
|
+
let providerConfiguration = null;
|
|
148
|
+
if (isNested) {
|
|
149
|
+
const providerConfigKey = pathSegments[pathSegments.length - 3];
|
|
150
|
+
providerConfiguration = parsed.integrations.find((config) => config.providerConfigKey === providerConfigKey) || null;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
providerConfiguration = parsed.integrations.find((config) => [...config.syncs, ...config.actions].find((sync) => sync.name === baseName)) || null;
|
|
154
|
+
}
|
|
155
|
+
return providerConfiguration;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../lib/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { expect, describe, it } from 'vitest';
|
|
2
|
+
import { getInterval, isJsOrTsType } from './helpers.js';
|
|
3
|
+
describe('Nango Config Interval tests', () => {
|
|
4
|
+
it('throws error when interval is less than 5 minutes', () => {
|
|
5
|
+
const interval = getInterval('every 4m', new Date());
|
|
6
|
+
expect(interval).toStrictEqual(new Error('sync_interval_too_short'));
|
|
7
|
+
});
|
|
8
|
+
it('Can parse every half day', () => {
|
|
9
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
10
|
+
const interval = getInterval('every half day', date);
|
|
11
|
+
expect(interval).toEqual({ interval: '12h', offset: 0 });
|
|
12
|
+
const tenMinutes = new Date('2023-07-18T00:10:00');
|
|
13
|
+
const interval2 = getInterval('every half day', tenMinutes);
|
|
14
|
+
expect(interval2).toEqual({ interval: '12h', offset: 600000 });
|
|
15
|
+
});
|
|
16
|
+
it('Can parse every 1.5 hours', () => {
|
|
17
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
18
|
+
const interval = getInterval('every 1.5 hours', date);
|
|
19
|
+
expect(interval).toEqual({ interval: '1.5 hours', offset: 0 });
|
|
20
|
+
});
|
|
21
|
+
it('Can parse every day', () => {
|
|
22
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
23
|
+
const interval = getInterval('every day', date);
|
|
24
|
+
expect(interval).toEqual({ interval: '1d', offset: 0 });
|
|
25
|
+
});
|
|
26
|
+
it('Can parse every 5 minutes', () => {
|
|
27
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
28
|
+
const interval = getInterval('every 5m', date);
|
|
29
|
+
expect(interval).toEqual({ interval: '5m', offset: 0 });
|
|
30
|
+
});
|
|
31
|
+
it('Can parse every 10 minutes', () => {
|
|
32
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
33
|
+
const interval = getInterval('every 10m', date);
|
|
34
|
+
expect(interval).toEqual({ interval: '10m', offset: 0 });
|
|
35
|
+
});
|
|
36
|
+
it('Can parse every week', () => {
|
|
37
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
38
|
+
const interval = getInterval('every week', date);
|
|
39
|
+
expect(interval).toEqual({ interval: '1w', offset: 0 });
|
|
40
|
+
});
|
|
41
|
+
it('Can parse every month', () => {
|
|
42
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
43
|
+
const interval = getInterval('every month', date);
|
|
44
|
+
expect(interval).toEqual({ interval: '30d', offset: 0 });
|
|
45
|
+
});
|
|
46
|
+
it('Returns error for unsupported interval format', () => {
|
|
47
|
+
const date = new Date('2023-07-18T00:00:00');
|
|
48
|
+
const interval = getInterval('every yearasdad', date);
|
|
49
|
+
expect(interval).toStrictEqual(new Error('sync_interval_invalid'));
|
|
50
|
+
});
|
|
51
|
+
it('Can parse intervals with different starting offset', () => {
|
|
52
|
+
const date = new Date('2023-07-18T12:30:00');
|
|
53
|
+
const interval = getInterval('every 1h', date);
|
|
54
|
+
expect(interval).toEqual({ interval: '1h', offset: 1800000 });
|
|
55
|
+
});
|
|
56
|
+
it('Gives back a correct offset', () => {
|
|
57
|
+
const date = new Date('2023-07-18T12:30:00');
|
|
58
|
+
const interval = getInterval('every 1h', date);
|
|
59
|
+
expect(interval).toEqual({ interval: '1h', offset: 1800000 });
|
|
60
|
+
});
|
|
61
|
+
it('Gives back a correct offset with 5 after with an interval of 30 minutes', () => {
|
|
62
|
+
const date = new Date('2023-07-18T12:35:00');
|
|
63
|
+
const interval = getInterval('every 30m', date);
|
|
64
|
+
expect(interval).toEqual({ interval: '30m', offset: 300000 }); // 300000 is 5 minutes
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('isJsOrTsType ', () => {
|
|
68
|
+
it('recognizes primitive types', () => {
|
|
69
|
+
expect(isJsOrTsType('string')).toBe(true);
|
|
70
|
+
expect(isJsOrTsType('number')).toBe(true);
|
|
71
|
+
expect(isJsOrTsType('boolean')).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it('recognizes function types', () => {
|
|
74
|
+
expect(isJsOrTsType('Function')).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
it('recognizes symbol types', () => {
|
|
77
|
+
expect(isJsOrTsType('Symbol')).toBe(true);
|
|
78
|
+
expect(isJsOrTsType('symbol')).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
it('recognizes object types', () => {
|
|
81
|
+
expect(isJsOrTsType('object')).toBe(true);
|
|
82
|
+
expect(isJsOrTsType('Object')).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it('recognizes array types', () => {
|
|
85
|
+
expect(isJsOrTsType('Array')).toBe(true);
|
|
86
|
+
expect(isJsOrTsType('Array<string>')).toBe(true);
|
|
87
|
+
expect(isJsOrTsType('Array<number>')).toBe(true);
|
|
88
|
+
expect(isJsOrTsType('Array<boolean>')).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it('recognizes primitive alias types', () => {
|
|
91
|
+
expect(isJsOrTsType('String')).toBe(true);
|
|
92
|
+
expect(isJsOrTsType('Number')).toBe(true);
|
|
93
|
+
expect(isJsOrTsType('Boolean')).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
it('recognizes built-in object types', () => {
|
|
96
|
+
expect(isJsOrTsType('Object')).toBe(true);
|
|
97
|
+
expect(isJsOrTsType('Array')).toBe(true);
|
|
98
|
+
expect(isJsOrTsType('Date')).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
it('recognizes utility types', () => {
|
|
101
|
+
expect(isJsOrTsType('Record')).toBe(true);
|
|
102
|
+
expect(isJsOrTsType('Partial')).toBe(true);
|
|
103
|
+
expect(isJsOrTsType('Readonly')).toBe(true);
|
|
104
|
+
});
|
|
105
|
+
it('handles array shorthand notation', () => {
|
|
106
|
+
expect(isJsOrTsType('string[]')).toBe(true);
|
|
107
|
+
expect(isJsOrTsType('number[]')).toBe(true);
|
|
108
|
+
expect(isJsOrTsType('Array<string>')).toBe(true); // Testing generic array type
|
|
109
|
+
});
|
|
110
|
+
it('handles generic types', () => {
|
|
111
|
+
expect(isJsOrTsType('Map<string, number>')).toBe(true);
|
|
112
|
+
expect(isJsOrTsType('Set<boolean>')).toBe(true);
|
|
113
|
+
expect(isJsOrTsType('Promise<Date>')).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
it('returns false for unrecognized types', () => {
|
|
116
|
+
expect(isJsOrTsType('UnrecognizedType')).toBe(false);
|
|
117
|
+
expect(isJsOrTsType('AnotherType')).toBe(false);
|
|
118
|
+
expect(isJsOrTsType('string{}')).toBe(false); // Invalid syntax
|
|
119
|
+
});
|
|
120
|
+
it('recognizes shorthand array types', () => {
|
|
121
|
+
expect(isJsOrTsType('string[]')).toBe(true);
|
|
122
|
+
expect(isJsOrTsType('number[]')).toBe(true);
|
|
123
|
+
expect(isJsOrTsType('boolean[]')).toBe(true);
|
|
124
|
+
expect(isJsOrTsType('Map<string, string>[]')).toBe(true);
|
|
125
|
+
expect(isJsOrTsType('Set<number>[]')).toBe(true);
|
|
126
|
+
expect(isJsOrTsType('Promise<boolean>[]')).toBe(true);
|
|
127
|
+
expect(isJsOrTsType('Map<Person>[]')).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=helpers.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.unit.test.js","sourceRoot":"","sources":["../lib/helpers.unit.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
package/dist/load.d.ts
ADDED
package/dist/load.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
import { determineVersion } from './helpers.js';
|
|
5
|
+
import { NangoYamlParserV1 } from './parser.v1.js';
|
|
6
|
+
import { NangoYamlParserV2 } from './parser.v2.js';
|
|
7
|
+
import { nangoConfigFile } from './constant.js';
|
|
8
|
+
/**
|
|
9
|
+
* Load nango.yaml
|
|
10
|
+
*/
|
|
11
|
+
export function loadNangoYaml({ fullPath }) {
|
|
12
|
+
const location = path.resolve(`${fullPath}/${nangoConfigFile}`);
|
|
13
|
+
try {
|
|
14
|
+
const yamlConfig = fs.readFileSync(location, 'utf8');
|
|
15
|
+
const raw = yaml.load(yamlConfig);
|
|
16
|
+
const version = determineVersion(raw);
|
|
17
|
+
if (version === 'v1') {
|
|
18
|
+
return new NangoYamlParserV1({ raw });
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
return new NangoYamlParserV2({ raw });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error(`no nango.yaml config found at ${location}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=load.js.map
|
package/dist/load.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../lib/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAI3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAwB;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,IAAI,eAAe,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAc,CAAC;QAC/C,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,OAAO,IAAI,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { NangoModel, NangoModelField, NangoYamlModel, NangoYamlModelFields } from '@nangohq/types';
|
|
2
|
+
import { ParserError } from './errors.js';
|
|
3
|
+
export declare class ModelsParser {
|
|
4
|
+
parsed: Map<string, NangoModel>;
|
|
5
|
+
references: Set<string>;
|
|
6
|
+
errors: ParserError[];
|
|
7
|
+
warnings: ParserError[];
|
|
8
|
+
raw: NangoYamlModel;
|
|
9
|
+
constructor({ raw }: {
|
|
10
|
+
raw: NangoYamlModel;
|
|
11
|
+
});
|
|
12
|
+
parseAll(): void;
|
|
13
|
+
get(name: string): NangoModel | undefined;
|
|
14
|
+
parseOne({ name, fields }: {
|
|
15
|
+
name: string;
|
|
16
|
+
fields: NangoYamlModelFields;
|
|
17
|
+
}): void;
|
|
18
|
+
ifModelParse({ name, parent }: {
|
|
19
|
+
name: string;
|
|
20
|
+
parent: string;
|
|
21
|
+
}): true | false;
|
|
22
|
+
parseFields({ fields, parent }: {
|
|
23
|
+
fields: NangoYamlModelFields;
|
|
24
|
+
parent: string;
|
|
25
|
+
}): NangoModelField[];
|
|
26
|
+
}
|