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.
Files changed (45) hide show
  1. package/dist/index.cjs +976 -0
  2. package/dist/index.d.cts +56 -0
  3. package/dist/index.d.mts +58 -0
  4. package/dist/index.mjs +951 -0
  5. package/package.json +32 -28
  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 -38
  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 -1230
  40. package/dist/index.js +0 -1232
  41. package/dist/run.d.ts +0 -1
  42. package/dist/run.js +0 -1319
  43. package/dist/transformer.d.ts +0 -5
  44. package/dist/transformer.fixtures.d.ts +0 -175
  45. 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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