ts-class-to-openapi 1.3.2 → 1.3.4
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/index.cjs +976 -0
- package/dist/index.d.cts +56 -0
- package/dist/index.d.mts +58 -0
- package/dist/index.mjs +951 -0
- package/package.json +32 -28
- package/dist/__test__/entities/additional-test-classes.d.ts +0 -12
- package/dist/__test__/entities/circular-reference-cases.d.ts +0 -1
- package/dist/__test__/entities/circular-reference-classes.d.ts +0 -110
- package/dist/__test__/entities/collision/arrays/number-array.d.ts +0 -3
- package/dist/__test__/entities/collision/arrays/string-array.d.ts +0 -3
- package/dist/__test__/entities/collision/number-props/same-name.d.ts +0 -5
- package/dist/__test__/entities/collision/string-props/same-name.d.ts +0 -5
- package/dist/__test__/entities/collision/throwing/class-a.d.ts +0 -4
- package/dist/__test__/entities/collision/throwing/class-b.d.ts +0 -4
- package/dist/__test__/entities/complex-circular-dependencies.d.ts +0 -71
- package/dist/__test__/entities/decorated-classes.d.ts +0 -54
- package/dist/__test__/entities/deep-nested-classes.d.ts +0 -1
- package/dist/__test__/entities/enum-classes.d.ts +0 -38
- package/dist/__test__/entities/evaluation/generics.d.ts +0 -6
- package/dist/__test__/entities/evaluation/modifiers.d.ts +0 -7
- package/dist/__test__/entities/generic-circular-classes.d.ts +0 -57
- package/dist/__test__/entities/nested-classes.d.ts +0 -70
- package/dist/__test__/entities/nested-reuse-classes.d.ts +0 -43
- package/dist/__test__/entities/pure-classes.d.ts +0 -37
- package/dist/__test__/entities/schema-validation-classes.d.ts +0 -35
- package/dist/__test__/index.d.ts +0 -8
- package/dist/__test__/test.d.ts +0 -1
- package/dist/__test__/testCases/collision-advanced.test.d.ts +0 -1
- package/dist/__test__/testCases/collision.test.d.ts +0 -1
- package/dist/__test__/testCases/decorated-classes.test.d.ts +0 -1
- package/dist/__test__/testCases/edge-cases.test.d.ts +0 -1
- package/dist/__test__/testCases/enum-properties.test.d.ts +0 -1
- package/dist/__test__/testCases/generics-and-modifiers.test.d.ts +0 -1
- package/dist/__test__/testCases/nested-classes.test.d.ts +0 -1
- package/dist/__test__/testCases/nested-reuse.test.d.ts +0 -1
- package/dist/__test__/testCases/pure-classes.test.d.ts +0 -1
- package/dist/__test__/testCases/schema-validation.test.d.ts +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.esm.js +0 -1230
- package/dist/index.js +0 -1232
- package/dist/run.d.ts +0 -1
- package/dist/run.js +0 -1319
- package/dist/transformer.d.ts +0 -5
- package/dist/transformer.fixtures.d.ts +0 -175
- package/dist/types.d.ts +0 -97
package/dist/run.js
DELETED
|
@@ -1,1319 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var ts = require('typescript');
|
|
4
|
-
var path = require('path');
|
|
5
|
-
var classValidator = require('class-validator');
|
|
6
|
-
|
|
7
|
-
const TS_CONFIG_DEFAULT_PATH = path.resolve(process.cwd(), 'tsconfig.json');
|
|
8
|
-
const jsPrimitives = {
|
|
9
|
-
String: { type: 'String', value: 'string' },
|
|
10
|
-
Any: { type: 'Any'},
|
|
11
|
-
Unknown: { type: 'Unknown'},
|
|
12
|
-
Number: { type: 'Number', value: 'number', format: 'double' },
|
|
13
|
-
Boolean: { type: 'Boolean', value: 'boolean' },
|
|
14
|
-
Symbol: { type: 'Symbol', value: 'string' },
|
|
15
|
-
BigInt: { type: 'BigInt', value: 'integer', format: 'int64' },
|
|
16
|
-
null: { type: 'null'},
|
|
17
|
-
Object: { type: 'Object', value: 'object' },
|
|
18
|
-
Array: { type: 'Array', value: 'array' },
|
|
19
|
-
Date: { type: 'Date', value: 'string', format: 'date-time' },
|
|
20
|
-
Buffer: { type: 'Buffer'},
|
|
21
|
-
Uint8Array: { type: 'Uint8Array'},
|
|
22
|
-
UploadFile: { type: 'UploadFile', value: 'string', format: 'binary' },
|
|
23
|
-
UploadFileDto: { type: 'UploadFileDto'},
|
|
24
|
-
File: { type: 'File'},
|
|
25
|
-
};
|
|
26
|
-
const validatorDecorators = {
|
|
27
|
-
Length: { name: 'Length'},
|
|
28
|
-
MinLength: { name: 'MinLength'},
|
|
29
|
-
MaxLength: { name: 'MaxLength'},
|
|
30
|
-
IsInt: { name: 'IsInt', type: 'integer', format: 'int32' },
|
|
31
|
-
IsNumber: { name: 'IsNumber', type: 'number'},
|
|
32
|
-
IsString: { name: 'IsString', type: 'string'},
|
|
33
|
-
IsPositive: { name: 'IsPositive'},
|
|
34
|
-
IsDate: { name: 'IsDate', type: 'string', format: 'date-time' },
|
|
35
|
-
IsEmail: { name: 'IsEmail', format: 'email' },
|
|
36
|
-
IsNotEmpty: { name: 'IsNotEmpty' },
|
|
37
|
-
IsOptional: { name: 'IsOptional' },
|
|
38
|
-
IsBoolean: { name: 'IsBoolean', type: 'boolean' },
|
|
39
|
-
IsArray: { name: 'IsArray'},
|
|
40
|
-
Min: { name: 'Min' },
|
|
41
|
-
Max: { name: 'Max' },
|
|
42
|
-
ArrayNotEmpty: { name: 'ArrayNotEmpty' },
|
|
43
|
-
ArrayMaxSize: { name: 'ArrayMaxSize' },
|
|
44
|
-
ArrayMinSize: { name: 'ArrayMinSize' },
|
|
45
|
-
IsEnum: { name: 'IsEnum'},
|
|
46
|
-
};
|
|
47
|
-
const constants = {
|
|
48
|
-
TS_CONFIG_DEFAULT_PATH,
|
|
49
|
-
jsPrimitives,
|
|
50
|
-
validatorDecorators};
|
|
51
|
-
|
|
52
|
-
class SchemaTransformer {
|
|
53
|
-
static instance = null;
|
|
54
|
-
program;
|
|
55
|
-
checker;
|
|
56
|
-
classCache = new Map();
|
|
57
|
-
maxCacheSize;
|
|
58
|
-
autoCleanup;
|
|
59
|
-
loadedFiles = new Set();
|
|
60
|
-
processingClasses = new Set();
|
|
61
|
-
sourceFiles;
|
|
62
|
-
classFileIndex = new Map();
|
|
63
|
-
constructor(tsConfigPath = constants.TS_CONFIG_DEFAULT_PATH, options = {}) {
|
|
64
|
-
this.maxCacheSize = options.maxCacheSize ?? 100;
|
|
65
|
-
this.autoCleanup = options.autoCleanup ?? true;
|
|
66
|
-
const { config, error } = ts.readConfigFile(tsConfigPath || 'tsconfig.json', ts.sys.readFile);
|
|
67
|
-
if (error) {
|
|
68
|
-
console.log(new Error(`Error reading tsconfig file: ${error.messageText}`).message);
|
|
69
|
-
throw new Error(`Error reading tsconfig file: ${error.messageText}`);
|
|
70
|
-
}
|
|
71
|
-
const { options: tsOptions, fileNames } = ts.parseJsonConfigFileContent(config, ts.sys, './');
|
|
72
|
-
this.program = ts.createProgram(fileNames, tsOptions);
|
|
73
|
-
this.checker = this.program.getTypeChecker();
|
|
74
|
-
this.sourceFiles = this.program.getSourceFiles().filter(sf => {
|
|
75
|
-
if (sf.isDeclarationFile)
|
|
76
|
-
return false;
|
|
77
|
-
if (sf.fileName.includes('.d.ts'))
|
|
78
|
-
return false;
|
|
79
|
-
if (sf.fileName.includes('node_modules'))
|
|
80
|
-
return false;
|
|
81
|
-
return true;
|
|
82
|
-
});
|
|
83
|
-
this.sourceFiles.forEach(sf => {
|
|
84
|
-
sf.statements.forEach(stmt => {
|
|
85
|
-
if (ts.isClassDeclaration(stmt) && stmt.name) {
|
|
86
|
-
const name = stmt.name.text;
|
|
87
|
-
const entry = this.classFileIndex.get(name) || [];
|
|
88
|
-
entry.push({ sourceFile: sf, node: stmt });
|
|
89
|
-
this.classFileIndex.set(name, entry);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
getPropertiesByClassDeclaration(classNode, visitedDeclarations = new Set(), genericTypeMap = new Map()) {
|
|
95
|
-
if (visitedDeclarations.has(classNode)) {
|
|
96
|
-
return [];
|
|
97
|
-
}
|
|
98
|
-
visitedDeclarations.add(classNode);
|
|
99
|
-
// if no heritage clauses, get properties directly from class
|
|
100
|
-
if (!classNode.heritageClauses) {
|
|
101
|
-
return this.getPropertiesByClassMembers(classNode.members, classNode, genericTypeMap);
|
|
102
|
-
} // use heritage clauses to get properties from base classes
|
|
103
|
-
else {
|
|
104
|
-
const heritageClause = classNode.heritageClauses[0];
|
|
105
|
-
if (heritageClause &&
|
|
106
|
-
heritageClause.token === ts.SyntaxKind.ExtendsKeyword) {
|
|
107
|
-
const type = heritageClause.types[0];
|
|
108
|
-
let properties = [];
|
|
109
|
-
let baseProperties = [];
|
|
110
|
-
if (!type)
|
|
111
|
-
return [];
|
|
112
|
-
const symbol = this.checker.getSymbolAtLocation(type.expression);
|
|
113
|
-
if (!symbol)
|
|
114
|
-
return [];
|
|
115
|
-
const declaration = symbol.declarations?.[0];
|
|
116
|
-
if (declaration && ts.isClassDeclaration(declaration)) {
|
|
117
|
-
const newGenericTypeMap = new Map();
|
|
118
|
-
if (declaration.typeParameters && type.typeArguments) {
|
|
119
|
-
declaration.typeParameters.forEach((param, index) => {
|
|
120
|
-
const arg = type.typeArguments[index];
|
|
121
|
-
if (arg) {
|
|
122
|
-
const resolvedArg = this.getTypeNodeToString(arg, genericTypeMap);
|
|
123
|
-
newGenericTypeMap.set(param.name.text, resolvedArg);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
baseProperties = this.getPropertiesByClassDeclaration(declaration, visitedDeclarations, newGenericTypeMap);
|
|
128
|
-
}
|
|
129
|
-
properties = this.getPropertiesByClassMembers(classNode.members, classNode, genericTypeMap);
|
|
130
|
-
return baseProperties.concat(properties);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
return this.getPropertiesByClassMembers(classNode.members, classNode, genericTypeMap);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
getPropertiesByClassMembers(members, parentClassNode, genericTypeMap = new Map()) {
|
|
138
|
-
const properties = [];
|
|
139
|
-
for (const member of members) {
|
|
140
|
-
if (ts.isPropertyDeclaration(member) &&
|
|
141
|
-
member.name &&
|
|
142
|
-
ts.isIdentifier(member.name)) {
|
|
143
|
-
// Skip static, private, and protected properties
|
|
144
|
-
if (member.modifiers) {
|
|
145
|
-
const hasExcludedModifier = member.modifiers.some(m => m.kind === ts.SyntaxKind.StaticKeyword ||
|
|
146
|
-
m.kind === ts.SyntaxKind.PrivateKeyword ||
|
|
147
|
-
m.kind === ts.SyntaxKind.ProtectedKeyword);
|
|
148
|
-
if (hasExcludedModifier)
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
const propertyName = member.name.text;
|
|
152
|
-
const type = this.getPropertyType(member, genericTypeMap);
|
|
153
|
-
const decorators = this.extractDecorators(member);
|
|
154
|
-
const isOptional = !!member.questionToken;
|
|
155
|
-
const isGeneric = this.isPropertyTypeGeneric(member);
|
|
156
|
-
const isEnum = this.isEnum(member);
|
|
157
|
-
const isPrimitive = this.isPrimitiveType(type) || isEnum;
|
|
158
|
-
const isClassType = this.isClassType(member);
|
|
159
|
-
const isArray = this.isArrayProperty(member);
|
|
160
|
-
const isTypeLiteral = this.isTypeLiteral(member);
|
|
161
|
-
const property = {
|
|
162
|
-
name: propertyName,
|
|
163
|
-
type,
|
|
164
|
-
decorators,
|
|
165
|
-
isOptional,
|
|
166
|
-
isGeneric,
|
|
167
|
-
originalProperty: member,
|
|
168
|
-
isPrimitive,
|
|
169
|
-
isClassType,
|
|
170
|
-
isArray,
|
|
171
|
-
isEnum,
|
|
172
|
-
isRef: false,
|
|
173
|
-
isTypeLiteral: isTypeLiteral,
|
|
174
|
-
};
|
|
175
|
-
// Check for self-referencing properties to mark as $ref
|
|
176
|
-
if (property.isClassType) {
|
|
177
|
-
const declaration = this.getDeclarationProperty(property);
|
|
178
|
-
if (parentClassNode) {
|
|
179
|
-
if (declaration &&
|
|
180
|
-
declaration.name &&
|
|
181
|
-
this.checker.getSymbolAtLocation(declaration.name) ===
|
|
182
|
-
this.checker.getSymbolAtLocation(parentClassNode.name)) {
|
|
183
|
-
property.isRef = true;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (property.isTypeLiteral &&
|
|
188
|
-
property.originalProperty.type &&
|
|
189
|
-
property.originalProperty.type
|
|
190
|
-
.typeArguments?.length === 1) {
|
|
191
|
-
const typeArguments = property.originalProperty.type.typeArguments;
|
|
192
|
-
if (typeArguments && typeArguments[0]) {
|
|
193
|
-
const firstTypeArg = typeArguments[0];
|
|
194
|
-
if (ts.isTypeReferenceNode(firstTypeArg)) {
|
|
195
|
-
const type = this.checker.getTypeAtLocation(firstTypeArg);
|
|
196
|
-
const symbol = type.getSymbol();
|
|
197
|
-
if (symbol && symbol.declarations) {
|
|
198
|
-
const classDeclaration = symbol.declarations.find(decl => ts.isClassDeclaration(decl));
|
|
199
|
-
if (classDeclaration &&
|
|
200
|
-
ts.isClassDeclaration(classDeclaration)) {
|
|
201
|
-
property.typeLiteralClassReference = classDeclaration;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
properties.push(property);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return properties;
|
|
211
|
-
}
|
|
212
|
-
getPropertyType(property, genericTypeMap = new Map()) {
|
|
213
|
-
if (property.type) {
|
|
214
|
-
return this.getTypeNodeToString(property.type, genericTypeMap);
|
|
215
|
-
}
|
|
216
|
-
const type = this.checker.getTypeAtLocation(property);
|
|
217
|
-
return this.getStringFromType(type);
|
|
218
|
-
}
|
|
219
|
-
getTypeNodeToString(typeNode, genericTypeMap = new Map()) {
|
|
220
|
-
if (ts.isTypeReferenceNode(typeNode) &&
|
|
221
|
-
ts.isIdentifier(typeNode.typeName)) {
|
|
222
|
-
const typeName = typeNode.typeName.text;
|
|
223
|
-
if (genericTypeMap.has(typeName)) {
|
|
224
|
-
return genericTypeMap.get(typeName);
|
|
225
|
-
}
|
|
226
|
-
if (typeName.toLowerCase() === 'uploadfile') {
|
|
227
|
-
return 'UploadFile';
|
|
228
|
-
}
|
|
229
|
-
if (typeName.toLowerCase() === 'uploadfiledto') {
|
|
230
|
-
return 'UploadFileDto';
|
|
231
|
-
}
|
|
232
|
-
if (typeNode.typeArguments && typeNode.typeArguments.length > 0) {
|
|
233
|
-
const firstTypeArg = typeNode.typeArguments[0];
|
|
234
|
-
if (firstTypeArg &&
|
|
235
|
-
ts.isTypeReferenceNode(firstTypeArg) &&
|
|
236
|
-
ts.isIdentifier(firstTypeArg.typeName)) {
|
|
237
|
-
if (firstTypeArg.typeName.text.toLowerCase() === 'uploadfile') {
|
|
238
|
-
return 'UploadFile';
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return this.resolveGenericType(typeNode);
|
|
242
|
-
}
|
|
243
|
-
return typeNode.typeName.text;
|
|
244
|
-
}
|
|
245
|
-
switch (typeNode.kind) {
|
|
246
|
-
case ts.SyntaxKind.StringKeyword:
|
|
247
|
-
return constants.jsPrimitives.String.type;
|
|
248
|
-
case ts.SyntaxKind.NumberKeyword:
|
|
249
|
-
return constants.jsPrimitives.Number.type;
|
|
250
|
-
case ts.SyntaxKind.BooleanKeyword:
|
|
251
|
-
return constants.jsPrimitives.Boolean.type;
|
|
252
|
-
case ts.SyntaxKind.ArrayType:
|
|
253
|
-
const arrayType = typeNode;
|
|
254
|
-
return `${this.getTypeNodeToString(arrayType.elementType, genericTypeMap)}[]`;
|
|
255
|
-
case ts.SyntaxKind.UnionType:
|
|
256
|
-
// Handle union types like string | null
|
|
257
|
-
const unionType = typeNode;
|
|
258
|
-
const types = unionType.types.map(t => this.getTypeNodeToString(t, genericTypeMap));
|
|
259
|
-
// Filter out null and undefined, return the first meaningful type
|
|
260
|
-
const meaningfulTypes = types.filter(t => t !== 'null' && t !== 'undefined');
|
|
261
|
-
if (meaningfulTypes.length > 0 && meaningfulTypes[0]) {
|
|
262
|
-
return meaningfulTypes[0];
|
|
263
|
-
}
|
|
264
|
-
if (types.length > 0 && types[0]) {
|
|
265
|
-
return types[0];
|
|
266
|
-
}
|
|
267
|
-
return 'object';
|
|
268
|
-
default:
|
|
269
|
-
const typeText = typeNode.getText();
|
|
270
|
-
// Check if this is a generic type parameter we can resolve
|
|
271
|
-
if (genericTypeMap && genericTypeMap.has(typeText)) {
|
|
272
|
-
return genericTypeMap.get(typeText);
|
|
273
|
-
}
|
|
274
|
-
// Handle some common TypeScript utility types
|
|
275
|
-
if (typeText.startsWith('Date'))
|
|
276
|
-
return constants.jsPrimitives.Date.type;
|
|
277
|
-
if (typeText.includes('Buffer') || typeText.includes('Uint8Array'))
|
|
278
|
-
return constants.jsPrimitives.Buffer.type;
|
|
279
|
-
return typeText;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
resolveGenericType(typeNode) {
|
|
283
|
-
const typeName = typeNode.typeName.text;
|
|
284
|
-
const typeArguments = typeNode.typeArguments;
|
|
285
|
-
if (!typeArguments || typeArguments.length === 0) {
|
|
286
|
-
return typeName;
|
|
287
|
-
}
|
|
288
|
-
const type = this.checker.getTypeAtLocation(typeNode);
|
|
289
|
-
const resolvedType = this.getStringFromType(type);
|
|
290
|
-
if (resolvedType &&
|
|
291
|
-
resolvedType !== typeName &&
|
|
292
|
-
!resolvedType.includes('any')) {
|
|
293
|
-
return resolvedType;
|
|
294
|
-
}
|
|
295
|
-
return typeName;
|
|
296
|
-
}
|
|
297
|
-
getStringFromType(type) {
|
|
298
|
-
return this.checker.typeToString(type);
|
|
299
|
-
}
|
|
300
|
-
extractDecorators(member) {
|
|
301
|
-
const decorators = [];
|
|
302
|
-
if (member.modifiers) {
|
|
303
|
-
for (const modifier of member.modifiers) {
|
|
304
|
-
if (ts.isDecorator(modifier) &&
|
|
305
|
-
ts.isCallExpression(modifier.expression)) {
|
|
306
|
-
const decoratorName = this.getDecoratorName(modifier.expression);
|
|
307
|
-
const args = this.getDecoratorArguments(modifier.expression);
|
|
308
|
-
decorators.push({ name: decoratorName, arguments: args });
|
|
309
|
-
}
|
|
310
|
-
else if (ts.isDecorator(modifier) &&
|
|
311
|
-
ts.isIdentifier(modifier.expression)) {
|
|
312
|
-
decorators.push({ name: modifier.expression.text, arguments: [] });
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
return decorators;
|
|
317
|
-
}
|
|
318
|
-
getDecoratorName(callExpression) {
|
|
319
|
-
if (ts.isIdentifier(callExpression.expression)) {
|
|
320
|
-
return callExpression.expression.text;
|
|
321
|
-
}
|
|
322
|
-
return 'unknown';
|
|
323
|
-
}
|
|
324
|
-
getDecoratorArguments(callExpression) {
|
|
325
|
-
return callExpression.arguments.map(arg => {
|
|
326
|
-
if (ts.isNumericLiteral(arg))
|
|
327
|
-
return Number(arg.text);
|
|
328
|
-
if (ts.isStringLiteral(arg))
|
|
329
|
-
return arg.text;
|
|
330
|
-
if (arg.kind === ts.SyntaxKind.TrueKeyword)
|
|
331
|
-
return true;
|
|
332
|
-
if (arg.kind === ts.SyntaxKind.FalseKeyword)
|
|
333
|
-
return false;
|
|
334
|
-
return arg;
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
getSafeDecoratorArgument(arg) {
|
|
338
|
-
if (arg && typeof arg === 'object' && 'kind' in arg) {
|
|
339
|
-
return arg.getText();
|
|
340
|
-
}
|
|
341
|
-
return arg;
|
|
342
|
-
}
|
|
343
|
-
isPropertyTypeGeneric(property) {
|
|
344
|
-
if (property.type && this.isGenericTypeFromNode(property.type)) {
|
|
345
|
-
return true;
|
|
346
|
-
}
|
|
347
|
-
try {
|
|
348
|
-
const type = this.checker.getTypeAtLocation(property);
|
|
349
|
-
return this.isGenericTypeFromSymbol(type);
|
|
350
|
-
}
|
|
351
|
-
catch (error) {
|
|
352
|
-
console.warn('Error analyzing property type for generics:', error);
|
|
353
|
-
return false;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
isGenericTypeFromNode(typeNode) {
|
|
357
|
-
if (ts.isTypeReferenceNode(typeNode) && typeNode.typeArguments) {
|
|
358
|
-
return typeNode.typeArguments.length > 0;
|
|
359
|
-
}
|
|
360
|
-
// Check for mapped types (e.g., { [K in keyof T]: T[K] })
|
|
361
|
-
if (ts.isMappedTypeNode(typeNode)) {
|
|
362
|
-
return true;
|
|
363
|
-
}
|
|
364
|
-
// Check for conditional types (e.g., T extends U ? X : Y)
|
|
365
|
-
if (ts.isConditionalTypeNode(typeNode)) {
|
|
366
|
-
return true;
|
|
367
|
-
}
|
|
368
|
-
// Check for indexed access types (e.g., T[K])
|
|
369
|
-
if (ts.isIndexedAccessTypeNode(typeNode)) {
|
|
370
|
-
return true;
|
|
371
|
-
}
|
|
372
|
-
// Check for type operators like keyof, typeof
|
|
373
|
-
if (ts.isTypeOperatorNode(typeNode)) {
|
|
374
|
-
return true;
|
|
375
|
-
}
|
|
376
|
-
return false;
|
|
377
|
-
}
|
|
378
|
-
isGenericTypeFromSymbol(type) {
|
|
379
|
-
// First check if it's a simple array type - these should NOT be considered generic
|
|
380
|
-
if (this.isSimpleArrayType(type)) {
|
|
381
|
-
return false;
|
|
382
|
-
}
|
|
383
|
-
// Check if the type has type parameters
|
|
384
|
-
if (type.aliasTypeArguments && type.aliasTypeArguments.length > 0) {
|
|
385
|
-
return true;
|
|
386
|
-
}
|
|
387
|
-
// Check if it's a type reference with type arguments
|
|
388
|
-
// But exclude simple arrays which internally use Array<T> representation
|
|
389
|
-
if (type.typeArguments && type.typeArguments.length > 0) {
|
|
390
|
-
const symbol = type.getSymbol();
|
|
391
|
-
if (symbol && symbol.getName() === 'Array') {
|
|
392
|
-
// This is Array<T> - only consider it generic if T itself is a utility type
|
|
393
|
-
const elementType = type.typeArguments[0];
|
|
394
|
-
if (elementType) {
|
|
395
|
-
return this.isUtilityTypeFromType(elementType);
|
|
396
|
-
}
|
|
397
|
-
return false;
|
|
398
|
-
}
|
|
399
|
-
const elementType = type.typeArguments[0];
|
|
400
|
-
return this.isUtilityTypeFromType(elementType);
|
|
401
|
-
}
|
|
402
|
-
// Check type flags for generic indicators
|
|
403
|
-
if (type.flags & ts.TypeFlags.TypeParameter) {
|
|
404
|
-
return true;
|
|
405
|
-
}
|
|
406
|
-
if (type.flags & ts.TypeFlags.Conditional) {
|
|
407
|
-
return true;
|
|
408
|
-
}
|
|
409
|
-
if (type.flags & ts.TypeFlags.Index) {
|
|
410
|
-
return true;
|
|
411
|
-
}
|
|
412
|
-
if (type.flags & ts.TypeFlags.IndexedAccess) {
|
|
413
|
-
return true;
|
|
414
|
-
}
|
|
415
|
-
// Check if the type symbol indicates a generic type
|
|
416
|
-
const symbol = type.getSymbol();
|
|
417
|
-
if (symbol && symbol.declarations) {
|
|
418
|
-
for (const declaration of symbol.declarations) {
|
|
419
|
-
// Check for type alias declarations with type parameters
|
|
420
|
-
if (ts.isTypeAliasDeclaration(declaration) &&
|
|
421
|
-
declaration.typeParameters) {
|
|
422
|
-
return true;
|
|
423
|
-
}
|
|
424
|
-
// Check for interface declarations with type parameters
|
|
425
|
-
if (ts.isInterfaceDeclaration(declaration) &&
|
|
426
|
-
declaration.typeParameters) {
|
|
427
|
-
return true;
|
|
428
|
-
}
|
|
429
|
-
// Check for class declarations with type parameters
|
|
430
|
-
if (ts.isClassDeclaration(declaration) && declaration.typeParameters) {
|
|
431
|
-
return true;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
return false;
|
|
436
|
-
}
|
|
437
|
-
isUtilityTypeFromType(type) {
|
|
438
|
-
if (!type.aliasSymbol)
|
|
439
|
-
return false;
|
|
440
|
-
const aliasName = type.aliasSymbol.getName();
|
|
441
|
-
const utilityTypes = [
|
|
442
|
-
'Partial',
|
|
443
|
-
'Required',
|
|
444
|
-
'Readonly',
|
|
445
|
-
'Pick',
|
|
446
|
-
'Omit',
|
|
447
|
-
'Record',
|
|
448
|
-
'Exclude',
|
|
449
|
-
'Extract',
|
|
450
|
-
'NonNullable',
|
|
451
|
-
];
|
|
452
|
-
return utilityTypes.includes(aliasName);
|
|
453
|
-
}
|
|
454
|
-
isSimpleArrayType(type) {
|
|
455
|
-
const symbol = type.getSymbol();
|
|
456
|
-
if (!symbol || symbol.getName() !== 'Array') {
|
|
457
|
-
return false;
|
|
458
|
-
}
|
|
459
|
-
// Check if this is Array<T> where T is a simple, non-generic type
|
|
460
|
-
if (type.typeArguments &&
|
|
461
|
-
type.typeArguments.length === 1) {
|
|
462
|
-
const elementType = type.typeArguments[0];
|
|
463
|
-
if (!elementType)
|
|
464
|
-
return false;
|
|
465
|
-
// If the element type is a utility type, then this array should be considered generic
|
|
466
|
-
if (this.isUtilityTypeFromType(elementType)) {
|
|
467
|
-
return false;
|
|
468
|
-
}
|
|
469
|
-
// If the element type itself has generic parameters, this array is generic
|
|
470
|
-
if (elementType.typeArguments &&
|
|
471
|
-
elementType.typeArguments.length > 0) {
|
|
472
|
-
return false;
|
|
473
|
-
}
|
|
474
|
-
return true;
|
|
475
|
-
}
|
|
476
|
-
return false;
|
|
477
|
-
}
|
|
478
|
-
isPrimitiveType(typeName) {
|
|
479
|
-
const lowerTypeName = typeName.toLowerCase();
|
|
480
|
-
// Check against all primitive types from constants
|
|
481
|
-
const primitiveTypes = [
|
|
482
|
-
constants.jsPrimitives.String.type.toLowerCase(),
|
|
483
|
-
constants.jsPrimitives.Number.type.toLowerCase(),
|
|
484
|
-
constants.jsPrimitives.Boolean.type.toLowerCase(),
|
|
485
|
-
constants.jsPrimitives.Date.type.toLowerCase(),
|
|
486
|
-
constants.jsPrimitives.Buffer.type.toLowerCase(),
|
|
487
|
-
constants.jsPrimitives.Uint8Array.type.toLowerCase(),
|
|
488
|
-
constants.jsPrimitives.File.type.toLowerCase(),
|
|
489
|
-
constants.jsPrimitives.UploadFile.type.toLowerCase(),
|
|
490
|
-
constants.jsPrimitives.UploadFileDto.type.toLowerCase(),
|
|
491
|
-
constants.jsPrimitives.BigInt.type.toLowerCase(),
|
|
492
|
-
constants.jsPrimitives.Symbol.type.toLowerCase(),
|
|
493
|
-
constants.jsPrimitives.null.type.toLowerCase(),
|
|
494
|
-
constants.jsPrimitives.Object.type.toLowerCase(),
|
|
495
|
-
constants.jsPrimitives.Array.type.toLowerCase(),
|
|
496
|
-
constants.jsPrimitives.Any.type.toLowerCase(),
|
|
497
|
-
constants.jsPrimitives.Unknown.type.toLowerCase(),
|
|
498
|
-
];
|
|
499
|
-
const primitivesArray = primitiveTypes.map(t => t.concat('[]'));
|
|
500
|
-
return (primitiveTypes.includes(lowerTypeName) ||
|
|
501
|
-
primitivesArray.includes(lowerTypeName));
|
|
502
|
-
}
|
|
503
|
-
static getInstance(tsConfigPath, options) {
|
|
504
|
-
if (!SchemaTransformer.instance) {
|
|
505
|
-
SchemaTransformer.instance = new SchemaTransformer(tsConfigPath, options);
|
|
506
|
-
}
|
|
507
|
-
return SchemaTransformer.instance;
|
|
508
|
-
}
|
|
509
|
-
getSourceFileByClass(cls, sourceOptions) {
|
|
510
|
-
const className = cls.name;
|
|
511
|
-
let matches = [];
|
|
512
|
-
if (sourceOptions?.isExternal) {
|
|
513
|
-
const sourceFiles = this.getFilteredSourceFiles(sourceOptions);
|
|
514
|
-
for (const sourceFile of sourceFiles) {
|
|
515
|
-
const node = sourceFile.statements.find(stmt => ts.isClassDeclaration(stmt) &&
|
|
516
|
-
stmt.name &&
|
|
517
|
-
stmt.name.text === className);
|
|
518
|
-
if (node) {
|
|
519
|
-
matches.push({ sourceFile, node });
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
else {
|
|
524
|
-
matches = this.classFileIndex.get(className) || [];
|
|
525
|
-
if (sourceOptions?.filePath) {
|
|
526
|
-
matches = matches.filter(m => m.sourceFile.fileName.includes(sourceOptions.filePath));
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
if (matches.length === 0) {
|
|
530
|
-
return undefined;
|
|
531
|
-
}
|
|
532
|
-
if (matches.length === 1) {
|
|
533
|
-
return matches[0];
|
|
534
|
-
}
|
|
535
|
-
if (matches.length > 1 && !sourceOptions?.filePath) {
|
|
536
|
-
const bestMatch = this.findBestMatch(cls, matches);
|
|
537
|
-
if (bestMatch) {
|
|
538
|
-
return bestMatch;
|
|
539
|
-
}
|
|
540
|
-
const firstMatch = matches[0];
|
|
541
|
-
if (firstMatch) {
|
|
542
|
-
console.warn(`[ts-class-to-openapi] Warning: Found multiple classes with name '${className}'. Using the first one found in '${firstMatch.sourceFile.fileName}'. To resolve this collision, provide 'sourceOptions.filePath'.`);
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
return matches[0];
|
|
546
|
-
}
|
|
547
|
-
checkTypeMatch(value, typeNode) {
|
|
548
|
-
const runtimeType = typeof value;
|
|
549
|
-
if (runtimeType === 'string' &&
|
|
550
|
-
typeNode.kind === ts.SyntaxKind.StringKeyword)
|
|
551
|
-
return true;
|
|
552
|
-
if (runtimeType === 'number' &&
|
|
553
|
-
typeNode.kind === ts.SyntaxKind.NumberKeyword)
|
|
554
|
-
return true;
|
|
555
|
-
if (runtimeType === 'boolean' &&
|
|
556
|
-
typeNode.kind === ts.SyntaxKind.BooleanKeyword)
|
|
557
|
-
return true;
|
|
558
|
-
if (Array.isArray(value) && ts.isArrayTypeNode(typeNode)) {
|
|
559
|
-
if (value.length === 0)
|
|
560
|
-
return true;
|
|
561
|
-
const firstItem = value[0];
|
|
562
|
-
const elementType = typeNode.elementType;
|
|
563
|
-
return this.checkTypeMatch(firstItem, elementType);
|
|
564
|
-
}
|
|
565
|
-
if (runtimeType === 'object' && value !== null && !Array.isArray(value)) {
|
|
566
|
-
if (ts.isTypeReferenceNode(typeNode) ||
|
|
567
|
-
typeNode.kind === ts.SyntaxKind.ObjectKeyword) {
|
|
568
|
-
return true;
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
return false;
|
|
572
|
-
}
|
|
573
|
-
findBestMatch(cls, matches) {
|
|
574
|
-
const runtimeSource = cls.toString();
|
|
575
|
-
const runtimeProperties = new Map();
|
|
576
|
-
const regexProperties = new Set();
|
|
577
|
-
// Try to extract properties from runtime source (assignments in constructor)
|
|
578
|
-
try {
|
|
579
|
-
const regex = /this\.([a-zA-Z0-9_$]+)\s*=/g;
|
|
580
|
-
let match;
|
|
581
|
-
while ((match = regex.exec(runtimeSource)) !== null) {
|
|
582
|
-
regexProperties.add(match[1]);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
catch (e) {
|
|
586
|
-
// Ignore regex errors
|
|
587
|
-
}
|
|
588
|
-
// Try to instantiate the class to find properties
|
|
589
|
-
try {
|
|
590
|
-
const instance = new cls();
|
|
591
|
-
Object.keys(instance).forEach(key => {
|
|
592
|
-
runtimeProperties.set(key, instance[key]);
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
catch (e) {
|
|
596
|
-
// Ignore instantiation errors (e.g. required constructor arguments)
|
|
597
|
-
}
|
|
598
|
-
// Try to get properties from class-validator metadata
|
|
599
|
-
try {
|
|
600
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
601
|
-
const { getMetadataStorage } = require('class-validator');
|
|
602
|
-
const metadata = getMetadataStorage();
|
|
603
|
-
const targetMetadata = metadata.getTargetValidationMetadatas(cls, null, false, false);
|
|
604
|
-
targetMetadata.forEach((m) => {
|
|
605
|
-
if (m.propertyName && !runtimeProperties.has(m.propertyName)) {
|
|
606
|
-
runtimeProperties.set(m.propertyName, undefined);
|
|
607
|
-
}
|
|
608
|
-
});
|
|
609
|
-
}
|
|
610
|
-
catch (e) {
|
|
611
|
-
// Ignore if class-validator is not available or fails
|
|
612
|
-
}
|
|
613
|
-
// console.log(`[findBestMatch] Class: ${cls.name}, Runtime Props: ${Array.from(runtimeProperties.keys()).join(', ')}`)
|
|
614
|
-
const scores = matches.map(match => {
|
|
615
|
-
let score = 0;
|
|
616
|
-
for (const member of match.node.members) {
|
|
617
|
-
if (ts.isMethodDeclaration(member) && ts.isIdentifier(member.name)) {
|
|
618
|
-
if (runtimeSource.includes(member.name.text)) {
|
|
619
|
-
score += 2;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
else if (ts.isPropertyDeclaration(member) &&
|
|
623
|
-
ts.isIdentifier(member.name)) {
|
|
624
|
-
const propName = member.name.text;
|
|
625
|
-
if (runtimeProperties.has(propName)) {
|
|
626
|
-
score += 1;
|
|
627
|
-
const value = runtimeProperties.get(propName);
|
|
628
|
-
if (member.type && this.checkTypeMatch(value, member.type)) {
|
|
629
|
-
score += 5;
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
else if (regexProperties.has(propName)) {
|
|
633
|
-
score += 1;
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
return { match, score };
|
|
638
|
-
});
|
|
639
|
-
scores.sort((a, b) => b.score - a.score);
|
|
640
|
-
const firstScore = scores[0];
|
|
641
|
-
const secondScore = scores[1];
|
|
642
|
-
if (firstScore && firstScore.score > 0) {
|
|
643
|
-
if (scores.length === 1 ||
|
|
644
|
-
(secondScore && firstScore.score > secondScore.score)) {
|
|
645
|
-
return firstScore.match;
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
return undefined;
|
|
649
|
-
}
|
|
650
|
-
getFilteredSourceFiles(sourceOptions) {
|
|
651
|
-
if (sourceOptions?.isExternal) {
|
|
652
|
-
return this.program.getSourceFiles().filter(sf => {
|
|
653
|
-
return (sf.fileName.includes(sourceOptions.packageName) &&
|
|
654
|
-
(!sourceOptions.filePath || sf.fileName === sourceOptions.filePath));
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
return this.sourceFiles.filter(sf => {
|
|
658
|
-
if (sourceOptions?.filePath &&
|
|
659
|
-
!sf.fileName.includes(sourceOptions.filePath)) {
|
|
660
|
-
return false;
|
|
661
|
-
}
|
|
662
|
-
return true;
|
|
663
|
-
});
|
|
664
|
-
}
|
|
665
|
-
isEnum(propertyDeclaration) {
|
|
666
|
-
if (!propertyDeclaration.type) {
|
|
667
|
-
return false;
|
|
668
|
-
}
|
|
669
|
-
let typeNode = propertyDeclaration.type;
|
|
670
|
-
if (ts.isArrayTypeNode(typeNode)) {
|
|
671
|
-
typeNode = typeNode.elementType;
|
|
672
|
-
}
|
|
673
|
-
if (ts.isTypeReferenceNode(typeNode)) {
|
|
674
|
-
const type = this.checker.getTypeAtLocation(typeNode);
|
|
675
|
-
// console.log('isEnum check:', typeNode.getText(), type.flags)
|
|
676
|
-
return (!!(type.flags & ts.TypeFlags.Enum) ||
|
|
677
|
-
!!(type.flags & ts.TypeFlags.EnumLiteral));
|
|
678
|
-
}
|
|
679
|
-
return false;
|
|
680
|
-
}
|
|
681
|
-
isClassType(propertyDeclaration) {
|
|
682
|
-
// If there's no explicit type annotation, we can't determine reliably
|
|
683
|
-
if (!propertyDeclaration.type) {
|
|
684
|
-
return false;
|
|
685
|
-
}
|
|
686
|
-
// Check if the original property type is an array type
|
|
687
|
-
if (this.isArrayProperty(propertyDeclaration)) {
|
|
688
|
-
const arrayType = propertyDeclaration.type;
|
|
689
|
-
const elementType = arrayType.elementType;
|
|
690
|
-
// Special handling for utility types with type arguments (e.g., PayloadEntity<Person>)
|
|
691
|
-
if (ts.isTypeReferenceNode(elementType) &&
|
|
692
|
-
elementType.typeArguments &&
|
|
693
|
-
elementType.typeArguments.length > 0) {
|
|
694
|
-
// Check the first type argument - it might be the actual class
|
|
695
|
-
const firstTypeArg = elementType.typeArguments[0];
|
|
696
|
-
if (firstTypeArg) {
|
|
697
|
-
const argType = this.checker.getTypeAtLocation(firstTypeArg);
|
|
698
|
-
const argSymbol = argType.getSymbol();
|
|
699
|
-
if (argSymbol && argSymbol.declarations) {
|
|
700
|
-
const hasClass = argSymbol.declarations.some(decl => ts.isClassDeclaration(decl));
|
|
701
|
-
if (hasClass)
|
|
702
|
-
return true;
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
// Get the type from the element, regardless of its syntaxkind
|
|
707
|
-
const type = this.checker.getTypeAtLocation(elementType);
|
|
708
|
-
const symbol = type.getSymbol();
|
|
709
|
-
if (symbol && symbol.declarations) {
|
|
710
|
-
return symbol.declarations.some(decl => ts.isClassDeclaration(decl));
|
|
711
|
-
}
|
|
712
|
-
return false;
|
|
713
|
-
}
|
|
714
|
-
// Check non-array types
|
|
715
|
-
else {
|
|
716
|
-
// Special handling for utility types with type arguments (e.g., PayloadEntity<Branch>)
|
|
717
|
-
if (ts.isTypeReferenceNode(propertyDeclaration.type) &&
|
|
718
|
-
propertyDeclaration.type.typeArguments &&
|
|
719
|
-
propertyDeclaration.type.typeArguments.length > 0) {
|
|
720
|
-
// Check the first type argument - it might be the actual class
|
|
721
|
-
const firstTypeArg = propertyDeclaration.type.typeArguments[0];
|
|
722
|
-
if (firstTypeArg) {
|
|
723
|
-
const argType = this.checker.getTypeAtLocation(firstTypeArg);
|
|
724
|
-
const argSymbol = argType.getSymbol();
|
|
725
|
-
if (argSymbol && argSymbol.declarations) {
|
|
726
|
-
const hasClass = argSymbol.declarations.some(decl => ts.isClassDeclaration(decl));
|
|
727
|
-
if (hasClass)
|
|
728
|
-
return true;
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
const type = this.checker.getTypeAtLocation(propertyDeclaration.type);
|
|
733
|
-
const symbol = type.getSymbol();
|
|
734
|
-
if (symbol && symbol.declarations) {
|
|
735
|
-
return symbol.declarations.some(decl => ts.isClassDeclaration(decl));
|
|
736
|
-
}
|
|
737
|
-
return false;
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
getDeclarationProperty(property) {
|
|
741
|
-
if (!property.originalProperty.type) {
|
|
742
|
-
return undefined;
|
|
743
|
-
}
|
|
744
|
-
// Handle array types - get the element type
|
|
745
|
-
if (ts.isArrayTypeNode(property.originalProperty.type)) {
|
|
746
|
-
const elementType = property.originalProperty.type.elementType;
|
|
747
|
-
// Check if it's a utility type with type arguments (e.g., PayloadEntity<Branch>[])
|
|
748
|
-
if (ts.isTypeReferenceNode(elementType) &&
|
|
749
|
-
elementType.typeArguments &&
|
|
750
|
-
elementType.typeArguments.length > 0) {
|
|
751
|
-
const firstTypeArg = elementType.typeArguments[0];
|
|
752
|
-
if (firstTypeArg) {
|
|
753
|
-
const argType = this.checker.getTypeAtLocation(firstTypeArg);
|
|
754
|
-
const argSymbol = argType.getSymbol();
|
|
755
|
-
if (argSymbol && argSymbol.declarations) {
|
|
756
|
-
const classDecl = argSymbol.declarations.find(decl => ts.isClassDeclaration(decl));
|
|
757
|
-
if (classDecl)
|
|
758
|
-
return classDecl;
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
const type = this.checker.getTypeAtLocation(elementType);
|
|
763
|
-
const symbol = type.getSymbol();
|
|
764
|
-
if (symbol && symbol.declarations) {
|
|
765
|
-
// Return the first class declaration found
|
|
766
|
-
const classDecl = symbol.declarations.find(decl => ts.isClassDeclaration(decl));
|
|
767
|
-
return classDecl || symbol.declarations[0];
|
|
768
|
-
}
|
|
769
|
-
return undefined;
|
|
770
|
-
}
|
|
771
|
-
// Handle non-array types
|
|
772
|
-
// Check if it's a utility type with type arguments (e.g., PayloadEntity<Branch>)
|
|
773
|
-
if (ts.isTypeReferenceNode(property.originalProperty.type) &&
|
|
774
|
-
property.originalProperty.type.typeArguments &&
|
|
775
|
-
property.originalProperty.type.typeArguments.length > 0) {
|
|
776
|
-
const firstTypeArg = property.originalProperty.type.typeArguments[0];
|
|
777
|
-
if (firstTypeArg) {
|
|
778
|
-
const argType = this.checker.getTypeAtLocation(firstTypeArg);
|
|
779
|
-
const argSymbol = argType.getSymbol();
|
|
780
|
-
if (argSymbol && argSymbol.declarations) {
|
|
781
|
-
const classDecl = argSymbol.declarations.find(decl => ts.isClassDeclaration(decl));
|
|
782
|
-
if (classDecl)
|
|
783
|
-
return classDecl;
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
const type = this.checker.getTypeAtLocation(property.originalProperty.type);
|
|
788
|
-
const symbol = type.getSymbol();
|
|
789
|
-
if (symbol && symbol.declarations) {
|
|
790
|
-
// Return the first class declaration found
|
|
791
|
-
const classDecl = symbol.declarations.find(decl => ts.isClassDeclaration(decl));
|
|
792
|
-
return classDecl || symbol.declarations[0];
|
|
793
|
-
}
|
|
794
|
-
return undefined;
|
|
795
|
-
}
|
|
796
|
-
isArrayProperty(propertyDeclaration) {
|
|
797
|
-
if (!propertyDeclaration.type) {
|
|
798
|
-
return false;
|
|
799
|
-
}
|
|
800
|
-
return ts.isArrayTypeNode(propertyDeclaration.type);
|
|
801
|
-
}
|
|
802
|
-
getSchemaFromProperties({ properties, visitedClass, transformedSchema, classDeclaration, }) {
|
|
803
|
-
let schema = {};
|
|
804
|
-
const required = [];
|
|
805
|
-
for (const property of properties) {
|
|
806
|
-
schema[property.name] = this.getSchemaFromProperty({
|
|
807
|
-
property,
|
|
808
|
-
visitedClass,
|
|
809
|
-
transformedSchema,
|
|
810
|
-
classDeclaration,
|
|
811
|
-
});
|
|
812
|
-
// this.applyDecorators(property, schema as SchemaType)
|
|
813
|
-
if (!property.isOptional) {
|
|
814
|
-
required.push(property.name);
|
|
815
|
-
}
|
|
816
|
-
}
|
|
817
|
-
return {
|
|
818
|
-
type: 'object',
|
|
819
|
-
properties: schema,
|
|
820
|
-
required: required.length ? required : undefined,
|
|
821
|
-
};
|
|
822
|
-
}
|
|
823
|
-
getSchemaFromProperty({ property, visitedClass, transformedSchema, classDeclaration, }) {
|
|
824
|
-
let schema = {};
|
|
825
|
-
if (property.isPrimitive) {
|
|
826
|
-
schema = this.getSchemaFromPrimitive(property);
|
|
827
|
-
}
|
|
828
|
-
else if (property.isClassType) {
|
|
829
|
-
schema = this.buildSchemaFromClass({
|
|
830
|
-
property,
|
|
831
|
-
classDeclaration,
|
|
832
|
-
visitedClass,
|
|
833
|
-
transformedSchema,
|
|
834
|
-
});
|
|
835
|
-
}
|
|
836
|
-
else if (property.isTypeLiteral && property.typeLiteralClassReference) {
|
|
837
|
-
schema = this.buildSchemaFromClass({
|
|
838
|
-
property,
|
|
839
|
-
classDeclaration: property.typeLiteralClassReference,
|
|
840
|
-
visitedClass,
|
|
841
|
-
transformedSchema,
|
|
842
|
-
});
|
|
843
|
-
}
|
|
844
|
-
else {
|
|
845
|
-
schema = { type: 'object', properties: {}, additionalProperties: true };
|
|
846
|
-
}
|
|
847
|
-
this.applyDecorators(property, schema);
|
|
848
|
-
return schema;
|
|
849
|
-
}
|
|
850
|
-
buildSchemaFromClass({ property, classDeclaration, visitedClass, transformedSchema, }) {
|
|
851
|
-
const declaration = this.getDeclarationProperty(property);
|
|
852
|
-
let schema = {};
|
|
853
|
-
if (property.isRef && classDeclaration.name) {
|
|
854
|
-
// Self-referencing property, handle as a reference to avoid infinite recursion
|
|
855
|
-
if (property.isArray) {
|
|
856
|
-
schema.type = 'array';
|
|
857
|
-
schema.items = {
|
|
858
|
-
$ref: `#/components/schemas/${classDeclaration.name.text}`,
|
|
859
|
-
};
|
|
860
|
-
}
|
|
861
|
-
else {
|
|
862
|
-
schema = {
|
|
863
|
-
$ref: `#/components/schemas/${classDeclaration.name.text}`,
|
|
864
|
-
};
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
else if (property.isTypeLiteral && property.typeLiteralClassReference) {
|
|
868
|
-
schema = this.getSchemaFromClass({
|
|
869
|
-
isArray: property.isArray,
|
|
870
|
-
visitedClass,
|
|
871
|
-
transformedSchema,
|
|
872
|
-
declaration: property.typeLiteralClassReference,
|
|
873
|
-
});
|
|
874
|
-
}
|
|
875
|
-
else {
|
|
876
|
-
schema = this.getSchemaFromClass({
|
|
877
|
-
isArray: property.isArray,
|
|
878
|
-
visitedClass,
|
|
879
|
-
transformedSchema,
|
|
880
|
-
declaration,
|
|
881
|
-
});
|
|
882
|
-
}
|
|
883
|
-
return schema;
|
|
884
|
-
}
|
|
885
|
-
getSchemaFromClass({ transformedSchema = new Map(), visitedClass = new Set(), declaration, isArray, }) {
|
|
886
|
-
let schema = { type: 'object' };
|
|
887
|
-
if (!declaration ||
|
|
888
|
-
!ts.isClassDeclaration(declaration) ||
|
|
889
|
-
!declaration.name) {
|
|
890
|
-
return { type: 'object' };
|
|
891
|
-
}
|
|
892
|
-
if (visitedClass.has(declaration)) {
|
|
893
|
-
if (isArray) {
|
|
894
|
-
schema.type = 'array';
|
|
895
|
-
schema.items = {
|
|
896
|
-
$ref: `#/components/schemas/${declaration.name.text}`,
|
|
897
|
-
};
|
|
898
|
-
}
|
|
899
|
-
else {
|
|
900
|
-
schema = {
|
|
901
|
-
$ref: `#/components/schemas/${declaration.name.text}`,
|
|
902
|
-
};
|
|
903
|
-
}
|
|
904
|
-
return schema;
|
|
905
|
-
}
|
|
906
|
-
visitedClass.add(declaration);
|
|
907
|
-
const properties = this.getPropertiesByClassDeclaration(declaration);
|
|
908
|
-
let transformerProps = this.getSchemaFromProperties({
|
|
909
|
-
properties,
|
|
910
|
-
visitedClass,
|
|
911
|
-
transformedSchema: transformedSchema,
|
|
912
|
-
classDeclaration: declaration,
|
|
913
|
-
});
|
|
914
|
-
if (isArray) {
|
|
915
|
-
schema.type = 'array';
|
|
916
|
-
schema.items = {
|
|
917
|
-
type: transformerProps.type,
|
|
918
|
-
properties: transformerProps.properties,
|
|
919
|
-
required: transformerProps.required,
|
|
920
|
-
};
|
|
921
|
-
}
|
|
922
|
-
else {
|
|
923
|
-
schema.type = transformerProps.type;
|
|
924
|
-
schema.properties = transformerProps.properties;
|
|
925
|
-
schema.required = transformerProps.required;
|
|
926
|
-
}
|
|
927
|
-
transformedSchema.set(declaration.name.text, schema);
|
|
928
|
-
visitedClass.delete(declaration);
|
|
929
|
-
return schema;
|
|
930
|
-
}
|
|
931
|
-
getSchemaFromEnum(property) {
|
|
932
|
-
let typeNode = property.originalProperty.type;
|
|
933
|
-
if (ts.isArrayTypeNode(typeNode)) {
|
|
934
|
-
typeNode = typeNode.elementType;
|
|
935
|
-
}
|
|
936
|
-
const type = this.checker.getTypeAtLocation(typeNode);
|
|
937
|
-
if (type.symbol && type.symbol.exports) {
|
|
938
|
-
const values = [];
|
|
939
|
-
type.symbol.exports.forEach(member => {
|
|
940
|
-
const declaration = member.valueDeclaration;
|
|
941
|
-
if (declaration && ts.isEnumMember(declaration)) {
|
|
942
|
-
const value = this.checker.getConstantValue(declaration);
|
|
943
|
-
if (value !== undefined) {
|
|
944
|
-
values.push(value);
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
});
|
|
948
|
-
if (values.length > 0) {
|
|
949
|
-
const propertySchema = { type: 'object' };
|
|
950
|
-
propertySchema.enum = values;
|
|
951
|
-
const isString = values.every(v => typeof v === 'string');
|
|
952
|
-
const isNumber = values.every(v => typeof v === 'number');
|
|
953
|
-
if (isString) {
|
|
954
|
-
propertySchema.type = 'string';
|
|
955
|
-
}
|
|
956
|
-
else if (isNumber) {
|
|
957
|
-
propertySchema.type = 'number';
|
|
958
|
-
}
|
|
959
|
-
else {
|
|
960
|
-
propertySchema.type = 'string';
|
|
961
|
-
}
|
|
962
|
-
if (property.isArray) {
|
|
963
|
-
const itemsSchema = { ...propertySchema };
|
|
964
|
-
propertySchema.type = 'array';
|
|
965
|
-
propertySchema.items = itemsSchema;
|
|
966
|
-
delete propertySchema.enum;
|
|
967
|
-
return propertySchema;
|
|
968
|
-
}
|
|
969
|
-
else {
|
|
970
|
-
return propertySchema;
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
return undefined;
|
|
975
|
-
}
|
|
976
|
-
getSchemaFromPrimitive(property) {
|
|
977
|
-
if (property.isEnum) {
|
|
978
|
-
const enumSchema = this.getSchemaFromEnum(property);
|
|
979
|
-
if (enumSchema) {
|
|
980
|
-
return enumSchema;
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
const propertySchema = { type: 'object' };
|
|
984
|
-
const propertyType = property.type.toLowerCase().replace('[]', '').trim();
|
|
985
|
-
let isFile = false;
|
|
986
|
-
switch (propertyType) {
|
|
987
|
-
case constants.jsPrimitives.String.value:
|
|
988
|
-
propertySchema.type = constants.jsPrimitives.String.value;
|
|
989
|
-
break;
|
|
990
|
-
case constants.jsPrimitives.Number.value:
|
|
991
|
-
propertySchema.type = constants.jsPrimitives.Number.value;
|
|
992
|
-
propertySchema.format = constants.jsPrimitives.Number.format;
|
|
993
|
-
break;
|
|
994
|
-
case constants.jsPrimitives.BigInt.type.toLocaleLowerCase():
|
|
995
|
-
propertySchema.type = constants.jsPrimitives.BigInt.value;
|
|
996
|
-
propertySchema.format = constants.jsPrimitives.BigInt.format;
|
|
997
|
-
break;
|
|
998
|
-
case constants.jsPrimitives.Date.type.toLocaleLowerCase():
|
|
999
|
-
propertySchema.type = constants.jsPrimitives.Date.value;
|
|
1000
|
-
propertySchema.format = constants.jsPrimitives.Date.format;
|
|
1001
|
-
break;
|
|
1002
|
-
case constants.jsPrimitives.Buffer.type.toLocaleLowerCase():
|
|
1003
|
-
case constants.jsPrimitives.Uint8Array.type.toLocaleLowerCase():
|
|
1004
|
-
case constants.jsPrimitives.File.type.toLocaleLowerCase():
|
|
1005
|
-
case constants.jsPrimitives.UploadFile.type.toLocaleLowerCase():
|
|
1006
|
-
case constants.jsPrimitives.UploadFileDto.type.toLocaleLowerCase():
|
|
1007
|
-
propertySchema.type = constants.jsPrimitives.UploadFile.value;
|
|
1008
|
-
propertySchema.format = constants.jsPrimitives.UploadFile.format;
|
|
1009
|
-
isFile = true;
|
|
1010
|
-
break;
|
|
1011
|
-
case constants.jsPrimitives.Array.value:
|
|
1012
|
-
propertySchema.type = constants.jsPrimitives.Array.value;
|
|
1013
|
-
break;
|
|
1014
|
-
case constants.jsPrimitives.Boolean.value:
|
|
1015
|
-
propertySchema.type = constants.jsPrimitives.Boolean.value;
|
|
1016
|
-
break;
|
|
1017
|
-
case constants.jsPrimitives.Symbol.type.toLocaleLowerCase():
|
|
1018
|
-
propertySchema.type = constants.jsPrimitives.Symbol.value;
|
|
1019
|
-
break;
|
|
1020
|
-
case constants.jsPrimitives.Object.value:
|
|
1021
|
-
propertySchema.type = constants.jsPrimitives.Object.value;
|
|
1022
|
-
break;
|
|
1023
|
-
default:
|
|
1024
|
-
propertySchema.type = constants.jsPrimitives.String.value;
|
|
1025
|
-
}
|
|
1026
|
-
if (property.isArray) {
|
|
1027
|
-
delete propertySchema.format;
|
|
1028
|
-
propertySchema.type = `array`;
|
|
1029
|
-
propertySchema.items = {
|
|
1030
|
-
type: isFile ? constants.jsPrimitives.UploadFile.value : propertyType,
|
|
1031
|
-
format: isFile
|
|
1032
|
-
? constants.jsPrimitives.UploadFile.format
|
|
1033
|
-
: propertySchema.format,
|
|
1034
|
-
};
|
|
1035
|
-
}
|
|
1036
|
-
return propertySchema;
|
|
1037
|
-
}
|
|
1038
|
-
isTypeLiteral(property) {
|
|
1039
|
-
if (!property.type)
|
|
1040
|
-
return false;
|
|
1041
|
-
if (ts.isTypeReferenceNode(property.type)) {
|
|
1042
|
-
const symbol = this.checker.getSymbolAtLocation(property.type.typeName);
|
|
1043
|
-
if (symbol) {
|
|
1044
|
-
const declarations = symbol.getDeclarations();
|
|
1045
|
-
if (declarations && declarations.length > 0) {
|
|
1046
|
-
const typeAliasDecl = declarations.find(decl => ts.isTypeAliasDeclaration(decl));
|
|
1047
|
-
if (typeAliasDecl && typeAliasDecl.type) {
|
|
1048
|
-
return this.isLiteralTypeNode(typeAliasDecl.type);
|
|
1049
|
-
}
|
|
1050
|
-
}
|
|
1051
|
-
}
|
|
1052
|
-
}
|
|
1053
|
-
return false;
|
|
1054
|
-
}
|
|
1055
|
-
/**
|
|
1056
|
-
*
|
|
1057
|
-
* @param typeNode
|
|
1058
|
-
* @returns boolean - true si el typeNode representa un tipo literal complejo
|
|
1059
|
-
*/
|
|
1060
|
-
isLiteralTypeNode(typeNode) {
|
|
1061
|
-
return (ts.isIntersectionTypeNode(typeNode) || // {} & Omit<T, ...>
|
|
1062
|
-
ts.isUnionTypeNode(typeNode) || // string | number
|
|
1063
|
-
ts.isMappedTypeNode(typeNode) || // { [K in keyof T]: ... }
|
|
1064
|
-
ts.isTypeLiteralNode(typeNode) || // { foo: string }
|
|
1065
|
-
ts.isConditionalTypeNode(typeNode) || // T extends U ? X : Y
|
|
1066
|
-
ts.isIndexedAccessTypeNode(typeNode) || // T['key']
|
|
1067
|
-
ts.isTypeOperatorNode(typeNode) || // keyof T, readonly T
|
|
1068
|
-
ts.isTypeReferenceNode(typeNode) // Omit, Pick, Partial, etc.
|
|
1069
|
-
);
|
|
1070
|
-
}
|
|
1071
|
-
applyEnumDecorator(decorator, schema) {
|
|
1072
|
-
if (decorator.arguments.length === 0)
|
|
1073
|
-
return;
|
|
1074
|
-
const arg = decorator.arguments[0];
|
|
1075
|
-
if (arg && typeof arg === 'object' && 'kind' in arg) {
|
|
1076
|
-
const type = this.checker.getTypeAtLocation(arg);
|
|
1077
|
-
if (type.symbol && type.symbol.exports) {
|
|
1078
|
-
const values = [];
|
|
1079
|
-
type.symbol.exports.forEach(member => {
|
|
1080
|
-
const declaration = member.valueDeclaration;
|
|
1081
|
-
if (declaration && ts.isEnumMember(declaration)) {
|
|
1082
|
-
const value = this.checker.getConstantValue(declaration);
|
|
1083
|
-
if (value !== undefined) {
|
|
1084
|
-
values.push(value);
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
});
|
|
1088
|
-
if (values.length > 0) {
|
|
1089
|
-
schema.enum = values;
|
|
1090
|
-
const isString = values.every(v => typeof v === 'string');
|
|
1091
|
-
const isNumber = values.every(v => typeof v === 'number');
|
|
1092
|
-
if (isString) {
|
|
1093
|
-
schema.type = 'string';
|
|
1094
|
-
}
|
|
1095
|
-
else if (isNumber) {
|
|
1096
|
-
schema.type = 'number';
|
|
1097
|
-
}
|
|
1098
|
-
else {
|
|
1099
|
-
schema.type = 'string';
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
}
|
|
1103
|
-
}
|
|
1104
|
-
}
|
|
1105
|
-
applyDecorators(property, schema) {
|
|
1106
|
-
for (const decorator of property.decorators) {
|
|
1107
|
-
const decoratorName = decorator.name;
|
|
1108
|
-
switch (decoratorName) {
|
|
1109
|
-
case constants.validatorDecorators.IsString.name:
|
|
1110
|
-
if (!property.isArray) {
|
|
1111
|
-
schema.type = constants.validatorDecorators.IsString.type;
|
|
1112
|
-
}
|
|
1113
|
-
else if (schema.items) {
|
|
1114
|
-
schema.items.type = constants.validatorDecorators.IsString.type;
|
|
1115
|
-
}
|
|
1116
|
-
break;
|
|
1117
|
-
case constants.validatorDecorators.IsInt.name:
|
|
1118
|
-
if (!property.isArray) {
|
|
1119
|
-
schema.type = constants.validatorDecorators.IsInt.type;
|
|
1120
|
-
schema.format = constants.validatorDecorators.IsInt.format;
|
|
1121
|
-
}
|
|
1122
|
-
else if (schema.items) {
|
|
1123
|
-
schema.items.type = constants.validatorDecorators.IsInt.type;
|
|
1124
|
-
schema.items.format = constants.validatorDecorators.IsInt.format;
|
|
1125
|
-
}
|
|
1126
|
-
break;
|
|
1127
|
-
case constants.validatorDecorators.IsNumber.name:
|
|
1128
|
-
if (!property.isArray) {
|
|
1129
|
-
schema.type = constants.validatorDecorators.IsNumber.type;
|
|
1130
|
-
}
|
|
1131
|
-
else if (schema.items) {
|
|
1132
|
-
schema.items.type = constants.validatorDecorators.IsNumber.type;
|
|
1133
|
-
}
|
|
1134
|
-
break;
|
|
1135
|
-
case constants.validatorDecorators.IsBoolean.name:
|
|
1136
|
-
if (!property.isArray) {
|
|
1137
|
-
schema.type = constants.validatorDecorators.IsBoolean.type;
|
|
1138
|
-
}
|
|
1139
|
-
else if (schema.items) {
|
|
1140
|
-
schema.items.type = constants.validatorDecorators.IsBoolean.type;
|
|
1141
|
-
}
|
|
1142
|
-
break;
|
|
1143
|
-
case constants.validatorDecorators.IsEmail.name:
|
|
1144
|
-
if (!property.isArray) {
|
|
1145
|
-
schema.format = constants.validatorDecorators.IsEmail.format;
|
|
1146
|
-
}
|
|
1147
|
-
else if (schema.items) {
|
|
1148
|
-
schema.items.format = constants.validatorDecorators.IsEmail.format;
|
|
1149
|
-
}
|
|
1150
|
-
break;
|
|
1151
|
-
case constants.validatorDecorators.IsDate.name:
|
|
1152
|
-
if (!property.isArray) {
|
|
1153
|
-
schema.type = constants.validatorDecorators.IsDate.type;
|
|
1154
|
-
schema.format = constants.validatorDecorators.IsDate.format;
|
|
1155
|
-
}
|
|
1156
|
-
else if (schema.items) {
|
|
1157
|
-
schema.items.type = constants.validatorDecorators.IsDate.type;
|
|
1158
|
-
schema.items.format = constants.validatorDecorators.IsDate.format;
|
|
1159
|
-
}
|
|
1160
|
-
break;
|
|
1161
|
-
case constants.validatorDecorators.IsNotEmpty.name:
|
|
1162
|
-
property.isOptional = false;
|
|
1163
|
-
break;
|
|
1164
|
-
case constants.validatorDecorators.IsOptional.name:
|
|
1165
|
-
property.isOptional = true;
|
|
1166
|
-
break;
|
|
1167
|
-
case constants.validatorDecorators.MinLength.name:
|
|
1168
|
-
schema.minLength = this.getSafeDecoratorArgument(decorator.arguments[0]);
|
|
1169
|
-
break;
|
|
1170
|
-
case constants.validatorDecorators.MaxLength.name:
|
|
1171
|
-
schema.maxLength = this.getSafeDecoratorArgument(decorator.arguments[0]);
|
|
1172
|
-
break;
|
|
1173
|
-
case constants.validatorDecorators.Length.name:
|
|
1174
|
-
schema.minLength = this.getSafeDecoratorArgument(decorator.arguments[0]);
|
|
1175
|
-
if (decorator.arguments[1]) {
|
|
1176
|
-
schema.maxLength = this.getSafeDecoratorArgument(decorator.arguments[1]);
|
|
1177
|
-
}
|
|
1178
|
-
break;
|
|
1179
|
-
case constants.validatorDecorators.Min.name:
|
|
1180
|
-
schema.minimum = this.getSafeDecoratorArgument(decorator.arguments[0]);
|
|
1181
|
-
break;
|
|
1182
|
-
case constants.validatorDecorators.Max.name:
|
|
1183
|
-
schema.maximum = this.getSafeDecoratorArgument(decorator.arguments[0]);
|
|
1184
|
-
break;
|
|
1185
|
-
case constants.validatorDecorators.IsPositive.name:
|
|
1186
|
-
schema.minimum = 0;
|
|
1187
|
-
break;
|
|
1188
|
-
case constants.validatorDecorators.IsArray.name:
|
|
1189
|
-
schema.type = constants.jsPrimitives.Array.value;
|
|
1190
|
-
break;
|
|
1191
|
-
case constants.validatorDecorators.ArrayNotEmpty.name:
|
|
1192
|
-
schema.minItems = 1;
|
|
1193
|
-
property.isOptional = false;
|
|
1194
|
-
break;
|
|
1195
|
-
case constants.validatorDecorators.ArrayMinSize.name:
|
|
1196
|
-
schema.minItems = this.getSafeDecoratorArgument(decorator.arguments[0]);
|
|
1197
|
-
break;
|
|
1198
|
-
case constants.validatorDecorators.ArrayMaxSize.name:
|
|
1199
|
-
schema.maxItems = this.getSafeDecoratorArgument(decorator.arguments[0]);
|
|
1200
|
-
break;
|
|
1201
|
-
case constants.validatorDecorators.IsEnum.name:
|
|
1202
|
-
if (!property.isArray) {
|
|
1203
|
-
this.applyEnumDecorator(decorator, schema);
|
|
1204
|
-
}
|
|
1205
|
-
else if (schema.items) {
|
|
1206
|
-
this.applyEnumDecorator(decorator, schema.items);
|
|
1207
|
-
}
|
|
1208
|
-
break;
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
}
|
|
1212
|
-
transform(cls, sourceOptions) {
|
|
1213
|
-
let schema = { type: 'object', properties: {} };
|
|
1214
|
-
const result = this.getSourceFileByClass(cls, sourceOptions);
|
|
1215
|
-
if (!result?.sourceFile) {
|
|
1216
|
-
console.warn(`Class ${cls.name} not found in any source file.`);
|
|
1217
|
-
return { name: cls.name, schema: {} };
|
|
1218
|
-
}
|
|
1219
|
-
const properties = this.getPropertiesByClassDeclaration(result.node);
|
|
1220
|
-
schema = this.getSchemaFromProperties({
|
|
1221
|
-
properties,
|
|
1222
|
-
classDeclaration: result.node,
|
|
1223
|
-
});
|
|
1224
|
-
return { name: cls.name, schema };
|
|
1225
|
-
}
|
|
1226
|
-
}
|
|
1227
|
-
function transform(cls, options) {
|
|
1228
|
-
// Use the singleton instance instead of creating a temporary one
|
|
1229
|
-
const transformer = SchemaTransformer.getInstance(undefined, options);
|
|
1230
|
-
return transformer.transform(cls, options?.sourceOptions);
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1233
|
-
/******************************************************************************
|
|
1234
|
-
Copyright (c) Microsoft Corporation.
|
|
1235
|
-
|
|
1236
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
1237
|
-
purpose with or without fee is hereby granted.
|
|
1238
|
-
|
|
1239
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
1240
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
1241
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
1242
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
1243
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
1244
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
1245
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
1246
|
-
***************************************************************************** */
|
|
1247
|
-
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
function __decorate(decorators, target, key, desc) {
|
|
1251
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1252
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1253
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1254
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1255
|
-
}
|
|
1256
|
-
|
|
1257
|
-
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
1258
|
-
var e = new Error(message);
|
|
1259
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
1260
|
-
};
|
|
1261
|
-
|
|
1262
|
-
var UserRole;
|
|
1263
|
-
(function (UserRole) {
|
|
1264
|
-
UserRole["ADMIN"] = "admin";
|
|
1265
|
-
UserRole["USER"] = "user";
|
|
1266
|
-
UserRole["GUEST"] = "guest";
|
|
1267
|
-
})(UserRole || (UserRole = {}));
|
|
1268
|
-
var OrderStatus;
|
|
1269
|
-
(function (OrderStatus) {
|
|
1270
|
-
OrderStatus[OrderStatus["PENDING"] = 0] = "PENDING";
|
|
1271
|
-
OrderStatus[OrderStatus["PROCESSING"] = 1] = "PROCESSING";
|
|
1272
|
-
OrderStatus[OrderStatus["SHIPPED"] = 2] = "SHIPPED";
|
|
1273
|
-
OrderStatus[OrderStatus["DELIVERED"] = 3] = "DELIVERED";
|
|
1274
|
-
OrderStatus[OrderStatus["CANCELLED"] = 4] = "CANCELLED";
|
|
1275
|
-
})(OrderStatus || (OrderStatus = {}));
|
|
1276
|
-
var MixedEnum;
|
|
1277
|
-
(function (MixedEnum) {
|
|
1278
|
-
MixedEnum["YES"] = "yes";
|
|
1279
|
-
MixedEnum[MixedEnum["NO"] = 0] = "NO";
|
|
1280
|
-
})(MixedEnum || (MixedEnum = {}));
|
|
1281
|
-
class EnumTestEntity {
|
|
1282
|
-
role;
|
|
1283
|
-
status;
|
|
1284
|
-
mixed;
|
|
1285
|
-
}
|
|
1286
|
-
__decorate([
|
|
1287
|
-
classValidator.IsEnum(UserRole)
|
|
1288
|
-
], EnumTestEntity.prototype, "role", void 0);
|
|
1289
|
-
__decorate([
|
|
1290
|
-
classValidator.IsEnum(OrderStatus)
|
|
1291
|
-
], EnumTestEntity.prototype, "status", void 0);
|
|
1292
|
-
__decorate([
|
|
1293
|
-
classValidator.IsOptional(),
|
|
1294
|
-
classValidator.IsEnum(MixedEnum)
|
|
1295
|
-
], EnumTestEntity.prototype, "mixed", void 0);
|
|
1296
|
-
class ArrayEnumTestEntity {
|
|
1297
|
-
roles;
|
|
1298
|
-
statuses;
|
|
1299
|
-
files;
|
|
1300
|
-
}
|
|
1301
|
-
__decorate([
|
|
1302
|
-
classValidator.IsEnum(UserRole, { each: true })
|
|
1303
|
-
], ArrayEnumTestEntity.prototype, "roles", void 0);
|
|
1304
|
-
__decorate([
|
|
1305
|
-
classValidator.IsEnum(OrderStatus, { each: true })
|
|
1306
|
-
], ArrayEnumTestEntity.prototype, "statuses", void 0);
|
|
1307
|
-
__decorate([
|
|
1308
|
-
classValidator.IsOptional()
|
|
1309
|
-
], ArrayEnumTestEntity.prototype, "files", void 0);
|
|
1310
|
-
class PureEnumTestEntity {
|
|
1311
|
-
role;
|
|
1312
|
-
status;
|
|
1313
|
-
mixed;
|
|
1314
|
-
files;
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
const { name, schema } = transform(PureEnumTestEntity);
|
|
1318
|
-
console.log(JSON.stringify({ name, schema }, null, 2));
|
|
1319
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtZXIuZml4dHVyZXMudHMiLCIuLi9zcmMvdHJhbnNmb3JtZXIudHMiLCIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHJvbGx1cCtwbHVnaW4tdHlwZXNjcmlwdEAxMi4xLjRfcm9sbHVwQDQuNDYuMl90c2xpYkAyLjguMV90eXBlc2NyaXB0QDUuMC4yL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9zcmMvX190ZXN0X18vZW50aXRpZXMvZW51bS1jbGFzc2VzLnRzIiwiLi4vc3JjL3J1bi50cyJdLCJzb3VyY2VzQ29udGVudCI6W251bGwsbnVsbCwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xyXG4gICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIGFyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG93bktleXMobyk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG5cclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciByLCBzID0gMDtcclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBzIHw9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGU6IF9fZXNEZWNvcmF0ZSxcclxuICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleTogX19wcm9wS2V5LFxyXG4gICAgX19zZXRGdW5jdGlvbk5hbWU6IF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG4gICAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb246IF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxyXG59O1xyXG4iLG51bGwsbnVsbF0sIm5hbWVzIjpbIklzRW51bSIsIklzT3B0aW9uYWwiXSwibWFwcGluZ3MiOiI7Ozs7OztBQVdBLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxDQUFDO0FBRTNFLE1BQU0sWUFB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
|