@rudderstack/integrations-lib 0.2.17 → 0.2.19
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/build/types.d.ts +0 -273
- package/build/types.d.ts.map +1 -1
- package/build/types.js +1 -26
- package/build/utils/index.d.ts +2 -2
- package/build/utils/index.d.ts.map +1 -1
- package/build/utils/index.js +3 -3
- package/build/utils/json-schema-generator.d.ts +109 -0
- package/build/utils/json-schema-generator.d.ts.map +1 -0
- package/build/utils/json-schema-generator.js +218 -0
- package/build/utils/json-schema-generator.test.d.ts +2 -0
- package/build/utils/json-schema-generator.test.d.ts.map +1 -0
- package/build/utils/json-schema-generator.test.js +368 -0
- package/build/utils/misc.d.ts +2 -10
- package/build/utils/misc.d.ts.map +1 -1
- package/build/utils/misc.js +4 -26
- package/build/utils/misc.test.js +21 -65
- package/build/utils/tests.d.ts +8 -0
- package/build/utils/tests.d.ts.map +1 -0
- package/build/utils/tests.js +15 -0
- package/build/utils/tests.test.d.ts +2 -0
- package/build/utils/tests.test.d.ts.map +1 -0
- package/build/utils/tests.test.js +89 -0
- package/package.json +4 -3
- package/build/utils/json.d.ts +0 -51
- package/build/utils/json.d.ts.map +0 -1
- package/build/utils/json.js +0 -520
- package/build/utils/json.test.d.ts +0 -2
- package/build/utils/json.test.d.ts.map +0 -1
- package/build/utils/json.test.js +0 -1290
- package/build/utils/sem.d.ts +0 -49
- package/build/utils/sem.d.ts.map +0 -1
- package/build/utils/sem.js +0 -247
- package/build/utils/sem.test.d.ts +0 -2
- package/build/utils/sem.test.d.ts.map +0 -1
- package/build/utils/sem.test.js +0 -317
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JsonSchemaGenerator = void 0;
|
|
4
|
+
/* eslint-disable no-plusplus */
|
|
5
|
+
const jsonschema_1 = require("jsonschema");
|
|
6
|
+
/**
|
|
7
|
+
* Utility for generating and validating JSON Schemas from data.
|
|
8
|
+
*/
|
|
9
|
+
class JsonSchemaGenerator {
|
|
10
|
+
/**
|
|
11
|
+
* Validates the provided data against the given JSON Schema.
|
|
12
|
+
*
|
|
13
|
+
* @param data - The data to validate.
|
|
14
|
+
* @param schema - The JSON Schema to use for validation.
|
|
15
|
+
* @throws Error if the validation fails.
|
|
16
|
+
*/
|
|
17
|
+
static validate(data, schema) {
|
|
18
|
+
const result = this.validator.validate(data, schema);
|
|
19
|
+
if (!result.valid) {
|
|
20
|
+
throw new Error(`Validation failed: ${result.errors.join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generates a JSON Schema for the given data.
|
|
25
|
+
*
|
|
26
|
+
* @param data - The data for which to generate a JSON Schema.
|
|
27
|
+
* @param options - Generation options.
|
|
28
|
+
* @returns The generated JSON Schema.
|
|
29
|
+
*/
|
|
30
|
+
static generate(data, options = {}) {
|
|
31
|
+
return this.buildSchema(data, options);
|
|
32
|
+
}
|
|
33
|
+
// ─── PRIVATE HELPERS ────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* Determines the primitive type of a value.
|
|
36
|
+
*
|
|
37
|
+
* @param data - The data whose type is to be inferred.
|
|
38
|
+
* @returns A string representing the type.
|
|
39
|
+
*/
|
|
40
|
+
static inferType(data) {
|
|
41
|
+
if (data === null)
|
|
42
|
+
return 'null';
|
|
43
|
+
if (Array.isArray(data))
|
|
44
|
+
return 'array';
|
|
45
|
+
if (typeof data === 'object')
|
|
46
|
+
return 'object';
|
|
47
|
+
return typeof data;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Recursively builds a JSON Schema from the provided data.
|
|
51
|
+
*
|
|
52
|
+
* @param data - The data to interpret.
|
|
53
|
+
* @param options - Generation options.
|
|
54
|
+
* @returns A JSON Schema object.
|
|
55
|
+
*/
|
|
56
|
+
static buildSchema(data, options) {
|
|
57
|
+
const type = this.inferType(data);
|
|
58
|
+
switch (type) {
|
|
59
|
+
case 'null':
|
|
60
|
+
return { type: 'null' };
|
|
61
|
+
case 'array':
|
|
62
|
+
return this.buildArraySchema(data, options);
|
|
63
|
+
case 'object':
|
|
64
|
+
return this.buildObjectSchema(data, options);
|
|
65
|
+
default:
|
|
66
|
+
return { type };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Checks if all types in an array are one of the primitive types:
|
|
71
|
+
* string, number, or boolean.
|
|
72
|
+
*
|
|
73
|
+
* @param types - An array of type strings.
|
|
74
|
+
* @returns True if every type is primitive.
|
|
75
|
+
*/
|
|
76
|
+
static allTypesArePrimitive(types) {
|
|
77
|
+
return types.every((type) => ['string', 'number', 'boolean'].includes(type));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Generates a JSON Schema for an array.
|
|
81
|
+
*
|
|
82
|
+
* @param data - The array data.
|
|
83
|
+
* @param options - Generation options.
|
|
84
|
+
* @returns The JSON Schema corresponding to the array data.
|
|
85
|
+
*/
|
|
86
|
+
static buildArraySchema(data, options) {
|
|
87
|
+
if (data.length === 0) {
|
|
88
|
+
return { type: 'array', items: { type: 'any' } };
|
|
89
|
+
}
|
|
90
|
+
const types = data.map(this.inferType);
|
|
91
|
+
if (this.allTypesArePrimitive(types)) {
|
|
92
|
+
const uniqueTypes = Array.from(new Set(types));
|
|
93
|
+
if (uniqueTypes.length === 1) {
|
|
94
|
+
return {
|
|
95
|
+
type: 'array',
|
|
96
|
+
items: {
|
|
97
|
+
type: uniqueTypes[0],
|
|
98
|
+
...(uniqueTypes[0] === 'string' && options.detectEnums
|
|
99
|
+
? { enum: Array.from(new Set(data)) }
|
|
100
|
+
: {}),
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return { type: 'array', items: { type: uniqueTypes } };
|
|
105
|
+
}
|
|
106
|
+
return this.buildMixedArraySchema(data, options);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Generates a JSON Schema for an array containing mixed types.
|
|
110
|
+
*
|
|
111
|
+
* @param data - The array data.
|
|
112
|
+
* @param options - Generation options.
|
|
113
|
+
* @returns The JSON Schema with an "anyOf" clause.
|
|
114
|
+
*/
|
|
115
|
+
static buildMixedArraySchema(data, options) {
|
|
116
|
+
const schemas = data.map((item) => this.buildSchema(item, options));
|
|
117
|
+
const uniqueSchemas = this.mergeSimilarSchemas(schemas);
|
|
118
|
+
return {
|
|
119
|
+
type: 'array',
|
|
120
|
+
items: uniqueSchemas.length === 1 ? uniqueSchemas[0] : { anyOf: uniqueSchemas },
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Generates a JSON Schema for an object.
|
|
125
|
+
*
|
|
126
|
+
* @param data - The object data.
|
|
127
|
+
* @param options - Generation options.
|
|
128
|
+
* @returns The JSON Schema for the object.
|
|
129
|
+
*/
|
|
130
|
+
static buildObjectSchema(data, options) {
|
|
131
|
+
const properties = {};
|
|
132
|
+
const required = [];
|
|
133
|
+
const { requireAll = false } = options;
|
|
134
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
135
|
+
properties[key] = this.buildSchema(value, options);
|
|
136
|
+
if (requireAll)
|
|
137
|
+
required.push(key);
|
|
138
|
+
});
|
|
139
|
+
return {
|
|
140
|
+
type: 'object',
|
|
141
|
+
properties,
|
|
142
|
+
...(required.length > 0 ? { required } : {}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Attempts to merge two JSON Schemas. Merging is only successful if both schemas have the same type
|
|
147
|
+
* and there are no conflicts within defined properties.
|
|
148
|
+
*
|
|
149
|
+
* @param schemaA - The first JSON Schema.
|
|
150
|
+
* @param schemaB - The second JSON Schema.
|
|
151
|
+
* @returns The merged schema if successful; otherwise, null.
|
|
152
|
+
*/
|
|
153
|
+
static mergeTwoSchemas(schemaA, schemaB) {
|
|
154
|
+
if (schemaA.type !== schemaB.type)
|
|
155
|
+
return null;
|
|
156
|
+
const propsA = schemaA.properties || {};
|
|
157
|
+
const propsB = schemaB.properties || {};
|
|
158
|
+
const allKeys = Array.from(new Set([...Object.keys(propsA), ...Object.keys(propsB)]));
|
|
159
|
+
const hasConflict = allKeys.some((key) => key in propsA &&
|
|
160
|
+
key in propsB &&
|
|
161
|
+
JSON.stringify(propsA[key]) !== JSON.stringify(propsB[key]));
|
|
162
|
+
if (hasConflict)
|
|
163
|
+
return null;
|
|
164
|
+
const mergedProperties = allKeys.reduce((acc, key) => {
|
|
165
|
+
acc[key] = propsA[key] || propsB[key];
|
|
166
|
+
return acc;
|
|
167
|
+
}, {});
|
|
168
|
+
// A property is required in the merged schema only if it was required in both.
|
|
169
|
+
const requiredA = new Set(schemaA.required || []);
|
|
170
|
+
const requiredMerged = (schemaB.required || []).filter((field) => requiredA.has(field));
|
|
171
|
+
return {
|
|
172
|
+
...schemaA,
|
|
173
|
+
...schemaB,
|
|
174
|
+
type: schemaA.type,
|
|
175
|
+
...(Object.keys(mergedProperties).length > 0 ? { properties: mergedProperties } : {}),
|
|
176
|
+
...(requiredMerged.length > 0 ? { required: requiredMerged } : {}),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Merges an array of JSON Schemas. Schemas with the same type and non-conflicting
|
|
181
|
+
* definitions are merged together.
|
|
182
|
+
*
|
|
183
|
+
* @param schemas - The list of schemas to merge.
|
|
184
|
+
* @returns A deduplicated list of merged schemas.
|
|
185
|
+
*/
|
|
186
|
+
static mergeSimilarSchemas(schemas) {
|
|
187
|
+
if (schemas.length <= 1)
|
|
188
|
+
return [...schemas];
|
|
189
|
+
let mergedSchemas = [...schemas];
|
|
190
|
+
// Attempt one merge pass
|
|
191
|
+
const attemptMerge = (schemasList) => {
|
|
192
|
+
for (let i = 0; i < schemasList.length; i++) {
|
|
193
|
+
for (let j = i + 1; j < schemasList.length; j++) {
|
|
194
|
+
const merged = this.mergeTwoSchemas(schemasList[i], schemasList[j]);
|
|
195
|
+
if (merged) {
|
|
196
|
+
const newSchemas = [
|
|
197
|
+
...schemasList.slice(0, i),
|
|
198
|
+
merged,
|
|
199
|
+
...schemasList.slice(i + 1, j),
|
|
200
|
+
...schemasList.slice(j + 1),
|
|
201
|
+
];
|
|
202
|
+
return { schemas: newSchemas, merged: true };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return { schemas: schemasList, merged: false };
|
|
207
|
+
};
|
|
208
|
+
let result = attemptMerge(mergedSchemas);
|
|
209
|
+
while (result.merged) {
|
|
210
|
+
mergedSchemas = result.schemas;
|
|
211
|
+
result = attemptMerge(mergedSchemas);
|
|
212
|
+
}
|
|
213
|
+
return mergedSchemas;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.JsonSchemaGenerator = JsonSchemaGenerator;
|
|
217
|
+
JsonSchemaGenerator.validator = new jsonschema_1.Validator();
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2pzb24tc2NoZW1hLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnQ0FBZ0M7QUFDaEMsMkNBQXVDO0FBd0J2Qzs7R0FFRztBQUNILE1BQWEsbUJBQW1CO0lBRzlCOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBYSxFQUFFLE1BQXNCO1FBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbkU7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFhLEVBQUUsVUFBc0MsRUFBRTtRQUM1RSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxtRUFBbUU7SUFFbkU7Ozs7O09BS0c7SUFDSyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQWE7UUFDcEMsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUN4QyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QyxPQUFPLE9BQU8sSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQWEsRUFB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QUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQzlDO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDakQsQ0FBQyxDQUFDO1FBRUYsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNwQixhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMvQixNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQzs7QUFoUEgsa0RBaVBDO0FBaFBnQiw2QkFBUyxHQUFHLElBQUksc0JBQVMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGx1c3BsdXMgKi9cbmltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gJ2pzb25zY2hlbWEnO1xuXG4vKipcbiAqIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBKU09OIFNjaGVtYS5cbiAqL1xuZXhwb3J0IHR5cGUgSlNPTlNjaGVtYVR5cGUgPSB7XG4gIHR5cGU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgcHJvcGVydGllcz86IHsgW2tleTogc3RyaW5nXTogSlNPTlNjaGVtYVR5cGUgfTtcbiAgaXRlbXM/OiBKU09OU2NoZW1hVHlwZTtcbiAgcmVxdWlyZWQ/OiBzdHJpbmdbXTtcbiAgZW51bT86IGFueVtdO1xuICBhbnlPZj86IEpTT05TY2hlbWFUeXBlW107XG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgSlNPTiBTY2hlbWFzLlxuICovXG5leHBvcnQgdHlwZSBKc29uU2NoZW1hR2VuZXJhdG9yT3B0aW9ucyA9IHtcbiAgLyoqIElmIHRydWUsIG1hcmtzIGV2ZXJ5IHByb3BlcnR5IGluIGFuIG9iamVjdCBhcyByZXF1aXJlZCAqL1xuICByZXF1aXJlQWxsPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGF0dGVtcHRzIHRvIGRldGVjdCBhbmQgaW5jbHVkZSBlbnVtcyBmb3IgYXJyYXlzIG9mIHN0cmluZ3MgKi9cbiAgZGV0ZWN0RW51bXM/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZvciBnZW5lcmF0aW5nIGFuZCB2YWxpZGF0aW5nIEpTT04gU2NoZW1hcyBmcm9tIGRhdGEuXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uU2NoZW1hR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcigpO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHByb3ZpZGVkIGRhdGEgYWdhaW5zdCB0aGUgZ2l2ZW4gSlNPTiBTY2hlbWEuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gdmFsaWRhdGUuXG4gICAqIEBwYXJhbSBzY2hlbWEgLSBUaGUgSlNPTiBTY2hlbWEgdG8gdXNlIGZvciB2YWxpZGF0aW9uLlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSB2YWxpZGF0aW9uIGZhaWxzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZShkYXRhOiB1bmtub3duLCBzY2hlbWE6IEpTT05TY2hlbWFUeXBlKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy52YWxpZGF0b3IudmFsaWRhdGUoZGF0YSwgc2NoZW1hKTtcbiAgICBpZiAoIXJlc3VsdC52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHtyZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIEpTT04gU2NoZW1hIGZvciB0aGUgZ2l2ZW4gZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgYSBKU09OIFNjaGVtYS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgSlNPTiBTY2hlbWEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlKGRhdGE6IHVua25vd24sIG9wdGlvbnM6IEpzb25TY2hlbWFHZW5lcmF0b3JPcHRpb25zID0ge30pOiBKU09OU2NoZW1hVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRTY2hlbWEoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyDilIDilIDilIAgUFJJVkFURSBIRUxQRVJTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBwcmltaXRpdmUgdHlwZSBvZiBhIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHdob3NlIHR5cGUgaXMgdG8gYmUgaW5mZXJyZWQuXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGluZmVyVHlwZShkYXRhOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuICdhcnJheSc7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykgcmV0dXJuICdvYmplY3QnO1xuICAgIHJldHVybiB0eXBlb2YgZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBidWlsZHMgYSBKU09OIFNjaGVtYSBmcm9tIHRoZSBwcm92aWRlZCBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIGludGVycHJldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgSlNPTiBTY2hlbWEgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRTY2hlbWEoZGF0YTogdW5rbm93biwgb3B0aW9uczogSnNvblNjaGVtYUdlbmVyYXRvck9wdGlvbnMpOiBKU09OU2NoZW1hVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuaW5mZXJUeXBlKGRhdGEpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdudWxsJyB9O1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZEFycmF5U2NoZW1hKGRhdGEgYXMgdW5rbm93bltdLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkT2JqZWN0U2NoZW1hKGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9wdGlvbnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHsgdHlwZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYWxsIHR5cGVzIGluIGFuIGFycmF5IGFyZSBvbmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlczpcbiAgICogc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4uXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlcyAtIEFuIGFycmF5IG9mIHR5cGUgc3RyaW5ncy5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiBldmVyeSB0eXBlIGlzIHByaW1pdGl2ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGFsbFR5cGVzQXJlUHJpbWl0aXZlKHR5cGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlcy5ldmVyeSgodHlwZSkgPT4gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXS5pbmNsdWRlcyh0eXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgSlNPTiBTY2hlbWEgZm9yIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBhcnJheSBkYXRhLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIEpTT04gU2NoZW1hIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFycmF5IGRhdGEuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBidWlsZEFycmF5U2NoZW1hKFxuICAgIGRhdGE6IHVua25vd25bXSxcbiAgICBvcHRpb25zOiBKc29uU2NoZW1hR2VuZXJhdG9yT3B0aW9ucyxcbiAgKTogSlNPTlNjaGVtYVR5cGUge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2FycmF5JywgaXRlbXM6IHsgdHlwZTogJ2FueScgfSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVzID0gZGF0YS5tYXAodGhpcy5pbmZlclR5cGUpO1xuICAgIGlmICh0aGlzLmFsbFR5cGVzQXJlUHJpbWl0aXZlKHR5cGVzKSkge1xuICAgICAgY29uc3QgdW5pcXVlVHlwZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQodHlwZXMpKTtcbiAgICAgIGlmICh1bmlxdWVUeXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiB1bmlxdWVUeXBlc1swXSxcbiAgICAgICAgICAgIC4uLih1bmlxdWVUeXBlc1swXSA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5kZXRlY3RFbnVtc1xuICAgICAgICAgICAgICA/IHsgZW51bTogQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEpKSB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0eXBlOiAnYXJyYXknLCBpdGVtczogeyB0eXBlOiB1bmlxdWVUeXBlcyB9IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRNaXhlZEFycmF5U2NoZW1hKGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIEpTT04gU2NoZW1hIGZvciBhbiBhcnJheSBjb250YWluaW5nIG1peGVkIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBhcnJheSBkYXRhLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIEpTT04gU2NoZW1hIHdpdGggYW4gXCJhbnlPZlwiIGNsYXVzZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGJ1aWxkTWl4ZWRBcnJheVNjaGVtYShcbiAgICBkYXRhOiB1bmtub3duW10sXG4gICAgb3B0aW9uczogSnNvblNjaGVtYUdlbmVyYXRvck9wdGlvbnMsXG4gICk6IEpTT05TY2hlbWFUeXBlIHtcbiAgICBjb25zdCBzY2hlbWFzID0gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuYnVpbGRTY2hlbWEoaXRlbSwgb3B0aW9ucykpO1xuICAgIGNvbnN0IHVuaXF1ZVNjaGVtYXMgPSB0aGlzLm1lcmdlU2ltaWxhclNjaGVtYXMoc2NoZW1hcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBpdGVtczogdW5pcXVlU2NoZW1hcy5sZW5ndGggPT09IDEgPyB1bmlxdWVTY2hlbWFzWzBdIDogeyBhbnlPZjogdW5pcXVlU2NoZW1hcyB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgSlNPTiBTY2hlbWEgZm9yIGFuIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgb2JqZWN0IGRhdGEuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgSlNPTiBTY2hlbWEgZm9yIHRoZSBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBidWlsZE9iamVjdFNjaGVtYShcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBvcHRpb25zOiBKc29uU2NoZW1hR2VuZXJhdG9yT3B0aW9ucyxcbiAgKTogSlNPTlNjaGVtYVR5cGUge1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogSlNPTlNjaGVtYVR5cGUgfSA9IHt9O1xuICAgIGNvbnN0IHJlcXVpcmVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHsgcmVxdWlyZUFsbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBwcm9wZXJ0aWVzW2tleV0gPSB0aGlzLmJ1aWxkU2NoZW1hKHZhbHVlLCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXF1aXJlQWxsKSByZXF1aXJlZC5wdXNoKGtleSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgLi4uKHJlcXVpcmVkLmxlbmd0aCA+IDAgPyB7IHJlcXVpcmVkIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBtZXJnZSB0d28gSlNPTiBTY2hlbWFzLiBNZXJnaW5nIGlzIG9ubHkgc3VjY2Vzc2Z1bCBpZiBib3RoIHNjaGVtYXMgaGF2ZSB0aGUgc2FtZSB0eXBlXG4gICAqIGFuZCB0aGVyZSBhcmUgbm8gY29uZmxpY3RzIHdpdGhpbiBkZWZpbmVkIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzY2hlbWFBIC0gVGhlIGZpcnN0IEpTT04gU2NoZW1hLlxuICAgKiBAcGFyYW0gc2NoZW1hQiAtIFRoZSBzZWNvbmQgSlNPTiBTY2hlbWEuXG4gICAqIEByZXR1cm5zIFRoZSBtZXJnZWQgc2NoZW1hIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSwgbnVsbC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1lcmdlVHdvU2NoZW1hcyhcbiAgICBzY2hlbWFBOiBKU09OU2NoZW1hVHlwZSxcbiAgICBzY2hlbWFCOiBKU09OU2NoZW1hVHlwZSxcbiAgKTogSlNPTlNjaGVtYVR5cGUgfCBudWxsIHtcbiAgICBpZiAoc2NoZW1hQS50eXBlICE9PSBzY2hlbWFCLnR5cGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcHJvcHNBID0gc2NoZW1hQS5wcm9wZXJ0aWVzIHx8IHt9O1xuICAgIGNvbnN0IHByb3BzQiA9IHNjaGVtYUIucHJvcGVydGllcyB8fCB7fTtcbiAgICBjb25zdCBhbGxLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhwcm9wc0EpLCAuLi5PYmplY3Qua2V5cyhwcm9wc0IpXSkpO1xuXG4gICAgY29uc3QgaGFzQ29uZmxpY3QgPSBhbGxLZXlzLnNvbWUoXG4gICAgICAoa2V5KSA9PlxuICAgICAgICBrZXkgaW4gcHJvcHNBICYmXG4gICAgICAgIGtleSBpbiBwcm9wc0IgJiZcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocHJvcHNBW2tleV0pICE9PSBKU09OLnN0cmluZ2lmeShwcm9wc0Jba2V5XSksXG4gICAgKTtcbiAgICBpZiAoaGFzQ29uZmxpY3QpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWVyZ2VkUHJvcGVydGllcyA9IGFsbEtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBwcm9wc0Fba2V5XSB8fCBwcm9wc0Jba2V5XTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgeyBba2V5OiBzdHJpbmddOiBKU09OU2NoZW1hVHlwZSB9KTtcblxuICAgIC8vIEEgcHJvcGVydHkgaXMgcmVxdWlyZWQgaW4gdGhlIG1lcmdlZCBzY2hlbWEgb25seSBpZiBpdCB3YXMgcmVxdWlyZWQgaW4gYm90aC5cbiAgICBjb25zdCByZXF1aXJlZEEgPSBuZXcgU2V0KHNjaGVtYUEucmVxdWlyZWQgfHwgW10pO1xuICAgIGNvbnN0IHJlcXVpcmVkTWVyZ2VkID0gKHNjaGVtYUIucmVxdWlyZWQgfHwgW10pLmZpbHRlcigoZmllbGQpID0+IHJlcXVpcmVkQS5oYXMoZmllbGQpKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zY2hlbWFBLFxuICAgICAgLi4uc2NoZW1hQixcbiAgICAgIHR5cGU6IHNjaGVtYUEudHlwZSxcbiAgICAgIC4uLihPYmplY3Qua2V5cyhtZXJnZWRQcm9wZXJ0aWVzKS5sZW5ndGggPiAwID8geyBwcm9wZXJ0aWVzOiBtZXJnZWRQcm9wZXJ0aWVzIH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWlyZWRNZXJnZWQubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkTWVyZ2VkIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgYW4gYXJyYXkgb2YgSlNPTiBTY2hlbWFzLiBTY2hlbWFzIHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgbm9uLWNvbmZsaWN0aW5nXG4gICAqIGRlZmluaXRpb25zIGFyZSBtZXJnZWQgdG9nZXRoZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzY2hlbWFzIC0gVGhlIGxpc3Qgb2Ygc2NoZW1hcyB0byBtZXJnZS5cbiAgICogQHJldHVybnMgQSBkZWR1cGxpY2F0ZWQgbGlzdCBvZiBtZXJnZWQgc2NoZW1hcy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1lcmdlU2ltaWxhclNjaGVtYXMoc2NoZW1hczogSlNPTlNjaGVtYVR5cGVbXSk6IEpTT05TY2hlbWFUeXBlW10ge1xuICAgIGlmIChzY2hlbWFzLmxlbmd0aCA8PSAxKSByZXR1cm4gWy4uLnNjaGVtYXNdO1xuXG4gICAgbGV0IG1lcmdlZFNjaGVtYXMgPSBbLi4uc2NoZW1hc107XG5cbiAgICAvLyBBdHRlbXB0IG9uZSBtZXJnZSBwYXNzXG4gICAgY29uc3QgYXR0ZW1wdE1lcmdlID0gKFxuICAgICAgc2NoZW1hc0xpc3Q6IEpTT05TY2hlbWFUeXBlW10sXG4gICAgKTogeyBzY2hlbWFzOiBKU09OU2NoZW1hVHlwZVtdOyBtZXJnZWQ6IGJvb2xlYW4gfSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYXNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHNjaGVtYXNMaXN0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgbWVyZ2VkID0gdGhpcy5tZXJnZVR3b1NjaGVtYXMoc2NoZW1hc0xpc3RbaV0sIHNjaGVtYXNMaXN0W2pdKTtcbiAgICAgICAgICBpZiAobWVyZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTY2hlbWFzID0gW1xuICAgICAgICAgICAgICAuLi5zY2hlbWFzTGlzdC5zbGljZSgwLCBpKSxcbiAgICAgICAgICAgICAgbWVyZ2VkLFxuICAgICAgICAgICAgICAuLi5zY2hlbWFzTGlzdC5zbGljZShpICsgMSwgaiksXG4gICAgICAgICAgICAgIC4uLnNjaGVtYXNMaXN0LnNsaWNlKGogKyAxKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICByZXR1cm4geyBzY2hlbWFzOiBuZXdTY2hlbWFzLCBtZXJnZWQ6IHRydWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNjaGVtYXM6IHNjaGVtYXNMaXN0LCBtZXJnZWQ6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCByZXN1bHQgPSBhdHRlbXB0TWVyZ2UobWVyZ2VkU2NoZW1hcyk7XG4gICAgd2hpbGUgKHJlc3VsdC5tZXJnZWQpIHtcbiAgICAgIG1lcmdlZFNjaGVtYXMgPSByZXN1bHQuc2NoZW1hcztcbiAgICAgIHJlc3VsdCA9IGF0dGVtcHRNZXJnZShtZXJnZWRTY2hlbWFzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkU2NoZW1hcztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-generator.test.d.ts","sourceRoot":"","sources":["../../src/utils/json-schema-generator.test.ts"],"names":[],"mappings":""}
|