ts-class-to-openapi 1.3.1 → 1.3.3

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