typia 5.0.0-dev.20230823 → 5.0.0-dev.20230823-2

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 (135) hide show
  1. package/lib/Primitive.d.ts +14 -12
  2. package/lib/Resolved.d.ts +46 -0
  3. package/lib/{schemas/metadata/IMetadataResolved.js → Resolved.js} +1 -1
  4. package/lib/Resolved.js.map +1 -0
  5. package/lib/factories/MetadataFactory.d.ts +1 -1
  6. package/lib/factories/MetadataTagFactory.js +6 -6
  7. package/lib/factories/MetadataTagFactory.js.map +1 -1
  8. package/lib/factories/ProtobufFactory.js +2 -2
  9. package/lib/factories/ProtobufFactory.js.map +1 -1
  10. package/lib/factories/internal/metadata/explore_metadata.js +3 -3
  11. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  12. package/lib/factories/internal/metadata/iterate_metadata_collection.js +6 -6
  13. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  14. package/lib/factories/internal/metadata/iterate_metadata_native.js +2 -10
  15. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  16. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +6 -6
  17. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  18. package/lib/factories/internal/metadata/iterate_metadata_sort.js +2 -2
  19. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  20. package/lib/functional/$ProtobufWriter.js.map +1 -1
  21. package/lib/json.d.ts +15 -15
  22. package/lib/misc.d.ts +42 -42
  23. package/lib/module.d.ts +18 -17
  24. package/lib/module.js +1 -0
  25. package/lib/module.js.map +1 -1
  26. package/lib/programmers/AssertProgrammer.js +1 -1
  27. package/lib/programmers/AssertProgrammer.js.map +1 -1
  28. package/lib/programmers/CheckerProgrammer.js +1 -1
  29. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  30. package/lib/programmers/IsProgrammer.js +2 -2
  31. package/lib/programmers/IsProgrammer.js.map +1 -1
  32. package/lib/programmers/RandomProgrammer.js +307 -132
  33. package/lib/programmers/RandomProgrammer.js.map +1 -1
  34. package/lib/programmers/ValidateProgrammer.js +1 -1
  35. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  36. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  37. package/lib/programmers/helpers/FunctionImporeter.js +2 -1
  38. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  39. package/lib/programmers/helpers/StringifyPredicator.js +1 -2
  40. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  41. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  42. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  43. package/lib/programmers/internal/application_resolved.d.ts +2 -2
  44. package/lib/programmers/internal/application_resolved.js.map +1 -1
  45. package/lib/programmers/internal/application_schema.js +2 -2
  46. package/lib/programmers/internal/application_schema.js.map +1 -1
  47. package/lib/programmers/json/JsonStringifyProgrammer.js +4 -4
  48. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  49. package/lib/programmers/misc/MiscAssertCloneProgrammer.js +1 -1
  50. package/lib/programmers/misc/MiscAssertCloneProgrammer.js.map +1 -1
  51. package/lib/programmers/misc/MiscCloneProgrammer.js +114 -33
  52. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  53. package/lib/programmers/misc/MiscIsCloneProgrammer.js +1 -1
  54. package/lib/programmers/misc/MiscIsCloneProgrammer.js.map +1 -1
  55. package/lib/programmers/misc/MiscLiteralsProgrammer.js +1 -1
  56. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  57. package/lib/programmers/misc/MiscPruneProgrammer.js +2 -2
  58. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  59. package/lib/programmers/misc/MiscValidateCloneProgrammer.js +1 -1
  60. package/lib/programmers/misc/MiscValidateCloneProgrammer.js.map +1 -1
  61. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +3 -3
  62. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  63. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +2 -2
  64. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  65. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +1 -1
  66. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  67. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js +2 -2
  68. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  69. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +1 -1
  70. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  71. package/lib/protobuf.d.ts +631 -10
  72. package/lib/protobuf.js +13 -13
  73. package/lib/protobuf.js.map +1 -1
  74. package/lib/schemas/metadata/IMetadata.d.ts +2 -2
  75. package/lib/schemas/metadata/{IMetadataResolved.d.ts → IMetadataEscaped.d.ts} +1 -1
  76. package/lib/schemas/metadata/IMetadataEscaped.js +3 -0
  77. package/lib/schemas/metadata/IMetadataEscaped.js.map +1 -0
  78. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  79. package/lib/schemas/metadata/Metadata.js +15 -15
  80. package/lib/schemas/metadata/Metadata.js.map +1 -1
  81. package/lib/schemas/metadata/{MetadataResolved.d.ts → MetadataEscaped.d.ts} +3 -3
  82. package/lib/schemas/metadata/{MetadataResolved.js → MetadataEscaped.js} +11 -11
  83. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -0
  84. package/lib/transformers/features/json/JsonApplicationTransformer.js +1 -1
  85. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  86. package/lib/transformers/features/misc/MetadataTransformer.js +1 -1
  87. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  88. package/lib/utils/RandomGenerator.js +3 -2
  89. package/lib/utils/RandomGenerator.js.map +1 -1
  90. package/package.json +2 -1
  91. package/src/Primitive.ts +19 -15
  92. package/src/Resolved.ts +116 -0
  93. package/src/factories/MetadataFactory.ts +1 -1
  94. package/src/factories/MetadataTagFactory.ts +6 -6
  95. package/src/factories/ProtobufFactory.ts +2 -2
  96. package/src/factories/internal/metadata/explore_metadata.ts +3 -3
  97. package/src/factories/internal/metadata/iterate_metadata_collection.ts +6 -6
  98. package/src/factories/internal/metadata/iterate_metadata_native.ts +0 -9
  99. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +6 -6
  100. package/src/factories/internal/metadata/iterate_metadata_sort.ts +2 -2
  101. package/src/json.ts +15 -15
  102. package/src/misc.ts +42 -42
  103. package/src/module.ts +18 -17
  104. package/src/programmers/AssertProgrammer.ts +3 -1
  105. package/src/programmers/CheckerProgrammer.ts +1 -1
  106. package/src/programmers/IsProgrammer.ts +4 -2
  107. package/src/programmers/RandomProgrammer.ts +322 -26
  108. package/src/programmers/ValidateProgrammer.ts +3 -1
  109. package/src/programmers/helpers/FunctionImporeter.ts +2 -0
  110. package/src/programmers/helpers/StringifyPredicator.ts +1 -2
  111. package/src/programmers/helpers/disable_function_importer_declare.ts +6 -1
  112. package/src/programmers/internal/application_resolved.ts +2 -2
  113. package/src/programmers/internal/application_schema.ts +2 -2
  114. package/src/programmers/json/JsonStringifyProgrammer.ts +6 -4
  115. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +1 -1
  116. package/src/programmers/misc/MiscCloneProgrammer.ts +229 -41
  117. package/src/programmers/misc/MiscIsCloneProgrammer.ts +1 -1
  118. package/src/programmers/misc/MiscLiteralsProgrammer.ts +1 -1
  119. package/src/programmers/misc/MiscPruneProgrammer.ts +4 -2
  120. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +1 -1
  121. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +18 -9
  122. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +6 -2
  123. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +1 -1
  124. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +12 -2
  125. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +2 -2
  126. package/src/protobuf.ts +663 -31
  127. package/src/schemas/metadata/IMetadata.ts +2 -2
  128. package/src/schemas/metadata/{IMetadataResolved.ts → IMetadataEscaped.ts} +1 -1
  129. package/src/schemas/metadata/Metadata.ts +17 -20
  130. package/src/schemas/metadata/{MetadataResolved.ts → MetadataEscaped.ts} +9 -9
  131. package/src/transformers/features/json/JsonApplicationTransformer.ts +1 -1
  132. package/src/transformers/features/misc/MetadataTransformer.ts +1 -1
  133. package/src/utils/RandomGenerator.ts +4 -2
  134. package/lib/schemas/metadata/IMetadataResolved.js.map +0 -1
  135. package/lib/schemas/metadata/MetadataResolved.js.map +0 -1
package/src/module.ts CHANGED
@@ -8,7 +8,7 @@ import { MapUtil } from "./utils/MapUtil";
8
8
  import { CustomValidatorMap } from "./CustomValidatorMap";
9
9
  import { IRandomGenerator } from "./IRandomGenerator";
10
10
  import { IValidation } from "./IValidation";
11
- import { Primitive } from "./Primitive";
11
+ import { Resolved } from "./Resolved";
12
12
 
13
13
  export * as json from "./json";
14
14
  export * as protobuf from "./protobuf";
@@ -20,6 +20,7 @@ export * from "./schemas/json/IJsonSchema";
20
20
  export * from "./IRandomGenerator";
21
21
  export * from "./IValidation";
22
22
  export * from "./Primitive";
23
+ export * from "./Resolved";
23
24
  export * from "./TypeGuardError";
24
25
 
25
26
  /**
@@ -461,7 +462,7 @@ export function random(generator?: Partial<IRandomGenerator>): never;
461
462
  *
462
463
  * @author Jeongho Nam - https://github.com/samchon
463
464
  */
464
- export function random<T>(generator?: Partial<IRandomGenerator>): Primitive<T>;
465
+ export function random<T>(generator?: Partial<IRandomGenerator>): Resolved<T>;
465
466
 
466
467
  /**
467
468
  * @internal
@@ -494,8 +495,8 @@ export function metadata(): never {
494
495
  /**
495
496
  * Creates a reusable {@link assert} function.
496
497
  *
497
- * @danger You have to specify the generic argument `T`
498
- * @return Nothing until specifying the generic argument `T`
498
+ * @danger You must configure the generic argument `T`
499
+ * @returns Nothing until you configure the generic argument `T`
499
500
  * @throws compile error
500
501
  *
501
502
  * @author Jeongho Nam - https://github.com/samchon
@@ -523,8 +524,8 @@ Object.assign(createAssert, assert);
523
524
  /**
524
525
  * Creates a reusable {@link is} function.
525
526
  *
526
- * @danger You have to specify the generic argument `T`
527
- * @return Nothing until specifying the generic argument `T`
527
+ * @danger You must configure the generic argument `T`
528
+ * @returns Nothing until you configure the generic argument `T`
528
529
  * @throws compile error
529
530
  *
530
531
  * @author Jeongho Nam - https://github.com/samchon
@@ -552,8 +553,8 @@ Object.assign(createIs, is);
552
553
  /**
553
554
  * Creates a reusable {@link validate} function.
554
555
  *
555
- * @danger You have to specify the generic argument `T`
556
- * @return Nothing until specifying the generic argument `T`
556
+ * @danger You must configure the generic argument `T`
557
+ * @returns Nothing until you configure the generic argument `T`
557
558
  * @throws compile error
558
559
  *
559
560
  * @author Jeongho Nam - https://github.com/samchon
@@ -581,8 +582,8 @@ Object.assign(createValidate, validate);
581
582
  /**
582
583
  * Creates a reusable {@link assertEquals} function.
583
584
  *
584
- * @danger You have to specify the generic argument `T`
585
- * @return Nothing until specifying the generic argument `T`
585
+ * @danger You must configure the generic argument `T`
586
+ * @returns Nothing until you configure the generic argument `T`
586
587
  * @throws compile error
587
588
  *
588
589
  * @author Jeongho Nam - https://github.com/samchon
@@ -610,8 +611,8 @@ Object.assign(createAssertEquals, assertEquals);
610
611
  /**
611
612
  * Creates a reusable {@link equals} function.
612
613
  *
613
- * @danger You have to specify the generic argument `T`
614
- * @return Nothing until specifying the generic argument `T`
614
+ * @danger You must configure the generic argument `T`
615
+ * @returns Nothing until you configure the generic argument `T`
615
616
  * @throws compile error
616
617
  *
617
618
  * @author Jeongho Nam - https://github.com/samchon
@@ -639,8 +640,8 @@ Object.assign(createEquals, equals);
639
640
  /**
640
641
  * Creates a reusable {@link validateEquals} function.
641
642
  *
642
- * @danger You have to specify the generic argument `T`
643
- * @return Nothing until specifying the generic argument `T`
643
+ * @danger You must configure the generic argument `T`
644
+ * @returns Nothing until you configure the generic argument `T`
644
645
  * @throws compile error
645
646
  *
646
647
  * @author Jeongho Nam - https://github.com/samchon
@@ -668,9 +669,9 @@ Object.assign(createValidateEquals, validateEquals);
668
669
  /**
669
670
  * Creates a reusable {@link random} function.
670
671
  *
671
- * @danger You have to specify the generic argument `T`
672
+ * @danger You must configure the generic argument `T`
672
673
  * @param generator Random data generator
673
- * @return Nothing until specifying the generic argument `T`
674
+ * @returns Nothing until you configure the generic argument `T`
674
675
  * @throws compile error
675
676
  *
676
677
  * @author Jeongho Nam - https://github.com/samchon
@@ -688,7 +689,7 @@ export function createRandom(generator?: Partial<IRandomGenerator>): never;
688
689
  */
689
690
  export function createRandom<T>(
690
691
  generator?: Partial<IRandomGenerator>,
691
- ): () => Primitive<T>;
692
+ ): () => Resolved<T>;
692
693
 
693
694
  /**
694
695
  * @internal
@@ -18,7 +18,9 @@ export namespace AssertProgrammer {
18
18
  (modulo: ts.LeftHandSideExpression) =>
19
19
  (equals: boolean) =>
20
20
  (type: ts.Type, name?: string) => {
21
- const importer: FunctionImporter = new FunctionImporter();
21
+ const importer: FunctionImporter = new FunctionImporter(
22
+ modulo.getText(),
23
+ );
22
24
  const is = IsProgrammer.write(project)(modulo, true)(equals)(
23
25
  type,
24
26
  name ?? TypeFactory.getFullName(project.checker)(type),
@@ -215,7 +215,7 @@ export namespace CheckerProgrammer {
215
215
  const collection: MetadataCollection =
216
216
  new MetadataCollection();
217
217
  const meta: Metadata = MetadataFactory.analyze(checker)({
218
- resolve: false,
218
+ escape: false,
219
219
  constant: true,
220
220
  absorb: true,
221
221
  })(collection)(type);
@@ -97,8 +97,10 @@ export namespace IsProgrammer {
97
97
  (equals: boolean) => {
98
98
  const importer: FunctionImporter =
99
99
  disable === <any>{}
100
- ? disable_function_importer_declare(new FunctionImporter())
101
- : new FunctionImporter();
100
+ ? disable_function_importer_declare(
101
+ new FunctionImporter(modulo.getText()),
102
+ )
103
+ : new FunctionImporter(modulo.getText());
102
104
 
103
105
  // CONFIGURATION
104
106
  const config: CheckerProgrammer.IConfig = {
@@ -27,15 +27,27 @@ export namespace RandomProgrammer {
27
27
  (project: IProject) =>
28
28
  (modulo: ts.LeftHandSideExpression) =>
29
29
  (init?: ts.Expression) => {
30
- const importer: FunctionImporter = new FunctionImporter();
30
+ const importer: FunctionImporter = new FunctionImporter(
31
+ modulo.getText(),
32
+ );
31
33
  return (type: ts.Type, name?: string) => {
32
34
  // INITIALIZE METADATA
33
35
  const collection: MetadataCollection = new MetadataCollection();
34
36
  const meta: Metadata = MetadataFactory.analyze(project.checker)(
35
37
  {
36
- resolve: true,
38
+ escape: false,
37
39
  constant: true,
38
40
  absorb: true,
41
+ validate: (meta) => {
42
+ if (meta.natives.some((n) => n === "WeakSet"))
43
+ throw new Error(
44
+ `Error on ${modulo.getText()}(): WeakSet is not supported.`,
45
+ );
46
+ else if (meta.natives.some((n) => n === "WeakMap"))
47
+ throw new Error(
48
+ `Error on ${modulo.getText()}(): WeakMap is not supported.`,
49
+ );
50
+ },
39
51
  },
40
52
  )(collection)(type);
41
53
 
@@ -67,7 +79,7 @@ export namespace RandomProgrammer {
67
79
  ),
68
80
  ],
69
81
  ts.factory.createTypeReferenceNode(
70
- `typia.Primitive<${
82
+ `typia.Resolved<${
71
83
  name ??
72
84
  TypeFactory.getFullName(project.checker)(type)
73
85
  }>`,
@@ -223,7 +235,7 @@ export namespace RandomProgrammer {
223
235
  );
224
236
 
225
237
  // NULL COALESCING
226
- if (meta.isRequired() === false)
238
+ if (meta.isRequired() === false || meta.functional === true)
227
239
  expressions.push(ts.factory.createIdentifier("undefined"));
228
240
  if (meta.nullable === true)
229
241
  expressions.push(ts.factory.createNull());
@@ -240,17 +252,17 @@ export namespace RandomProgrammer {
240
252
  if (atomic === "boolean")
241
253
  expressions.push(decode_boolean(importer));
242
254
  else if (atomic === "number")
243
- expressions.push(decode_number(importer)(tags)(comments));
255
+ expressions.push(decode_number(importer)(tags, comments));
244
256
  else if (atomic === "string")
245
- expressions.push(decode_string(importer)(tags)(comments));
257
+ expressions.push(decode_string(importer)(tags, comments));
246
258
  else if (atomic === "bigint")
247
- expressions.push(decode_bigint(importer)(tags)(comments));
259
+ expressions.push(decode_bigint(importer)(tags, comments));
248
260
 
249
261
  // INSTANCE TYPES
250
- if (meta.resolved)
262
+ if (meta.escaped)
251
263
  expressions.push(
252
264
  decode(importer)(explore)(
253
- meta.resolved.returns,
265
+ meta.escaped.returns,
254
266
  tags,
255
267
  comments,
256
268
  ),
@@ -266,17 +278,19 @@ export namespace RandomProgrammer {
266
278
  for (const o of meta.objects)
267
279
  expressions.push(decode_object(importer)(explore)(o));
268
280
  for (const native of meta.natives)
269
- if (native === "Boolean")
270
- expressions.push(decode_boolean(importer));
271
- else if (native === "Number")
272
- expressions.push(decode_number(importer)(tags)(comments));
273
- else if (native === "String")
274
- expressions.push(decode_string(importer)(tags)(comments));
275
- else expressions.push(ts.factory.createIdentifier("{}"));
276
- if (meta.sets.length || meta.maps.length)
277
- expressions.push(ts.factory.createIdentifier("{}"));
278
-
279
- // PRIMITIVE TYPES
281
+ expressions.push(
282
+ decode_native(importer)(native, tags, comments),
283
+ );
284
+ for (const set of meta.sets)
285
+ expressions.push(
286
+ decode_set(importer)(explore)(set, tags, comments),
287
+ );
288
+ for (const map of meta.maps)
289
+ expressions.push(
290
+ decode_map(importer)(explore)(map, tags, comments),
291
+ );
292
+
293
+ // PICK UP A TYPE
280
294
  if (expressions.length === 1) return expressions[0]!;
281
295
  return ts.factory.createCallExpression(
282
296
  ts.factory.createCallExpression(
@@ -329,8 +343,7 @@ export namespace RandomProgrammer {
329
343
 
330
344
  const decode_number =
331
345
  (importer: FunctionImporter) =>
332
- (tags: IMetadataTag[]) =>
333
- (comments: ICommentTag[]): ts.Expression => {
346
+ (tags: IMetadataTag[], comments: ICommentTag[]): ts.Expression => {
334
347
  const type = tags.find(
335
348
  (t) =>
336
349
  t.kind === "type" &&
@@ -378,8 +391,7 @@ export namespace RandomProgrammer {
378
391
 
379
392
  const decode_bigint =
380
393
  (importer: FunctionImporter) =>
381
- (tags: IMetadataTag[]) =>
382
- (comments: ICommentTag[]): ts.Expression =>
394
+ (tags: IMetadataTag[], comments: ICommentTag[]): ts.Expression =>
383
395
  random_custom(COALESCE(importer))("bigint")(comments)(
384
396
  RandomRanger.number({
385
397
  type: tags.find(
@@ -407,8 +419,7 @@ export namespace RandomProgrammer {
407
419
 
408
420
  const decode_string =
409
421
  (importer: FunctionImporter) =>
410
- (tags: IMetadataTag[]) =>
411
- (comments: ICommentTag[]): ts.Expression =>
422
+ (tags: IMetadataTag[], comments: ICommentTag[]): ts.Expression =>
412
423
  random_custom(COALESCE(importer))("string")(comments)(
413
424
  (() => {
414
425
  for (const t of tags)
@@ -555,6 +566,290 @@ export namespace RandomProgrammer {
555
566
  ]
556
567
  : undefined,
557
568
  );
569
+
570
+ /* -----------------------------------------------------------
571
+ NATIVE CLASSES
572
+ ----------------------------------------------------------- */
573
+ const decode_set =
574
+ (importer: FunctionImporter) =>
575
+ (explore: IExplore) =>
576
+ (meta: Metadata, tags: IMetadataTag[], comments: ICommentTag[]) =>
577
+ ts.factory.createNewExpression(
578
+ ts.factory.createIdentifier("Set"),
579
+ undefined,
580
+ [
581
+ decode_array(importer)(explore)(
582
+ MetadataArray.create({
583
+ value: meta,
584
+ recursive: false,
585
+ index: null,
586
+ nullables: [],
587
+ name: `Set<${meta.getName()}>`,
588
+ }),
589
+ tags,
590
+ comments,
591
+ ),
592
+ ],
593
+ );
594
+
595
+ const decode_map =
596
+ (importer: FunctionImporter) =>
597
+ (explore: IExplore) =>
598
+ (m: Metadata.Entry, tags: IMetadataTag[], comments: ICommentTag[]) =>
599
+ ts.factory.createNewExpression(
600
+ ts.factory.createIdentifier("Map"),
601
+ undefined,
602
+ [
603
+ decode_array(importer)(explore)(
604
+ MetadataArray.create({
605
+ name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
606
+ index: null,
607
+ recursive: false,
608
+ nullables: [],
609
+ value: Metadata.create({
610
+ ...Metadata.initialize(),
611
+ tuples: [
612
+ (() => {
613
+ const tuple = MetadataTuple.create({
614
+ name: `[${m.key.getName()}, ${m.value.getName()}]`,
615
+ index: null,
616
+ recursive: false,
617
+ nullables: [],
618
+ elements: [m.key, m.value],
619
+ });
620
+ tuple.of_map = true;
621
+ return tuple;
622
+ })(),
623
+ ],
624
+ }),
625
+ }),
626
+ tags,
627
+ comments,
628
+ ),
629
+ ],
630
+ );
631
+
632
+ const decode_native =
633
+ (importer: FunctionImporter) =>
634
+ (
635
+ type: string,
636
+ tags: IMetadataTag[],
637
+ comments: ICommentTag[],
638
+ ): ts.Expression => {
639
+ if (type === "Boolean") return decode_boolean(importer);
640
+ else if (type === "Number")
641
+ return decode_number(importer)(tags, comments);
642
+ else if (type === "String")
643
+ return decode_string(importer)(tags, comments);
644
+ else if (type === "Date") return decode_native_date(importer);
645
+ else if (
646
+ type === "Uint8Array" ||
647
+ type === "Uint8ClampedArray" ||
648
+ type === "Uint16Array" ||
649
+ type === "Uint32Array" ||
650
+ type === "BigUint64Array" ||
651
+ type === "Int8Array" ||
652
+ type === "Int16Array" ||
653
+ type === "Int32Array" ||
654
+ type === "BigInt64Array" ||
655
+ type === "Float32Array" ||
656
+ type === "Float64Array"
657
+ )
658
+ return decode_native_byte_array(importer)(type);
659
+ else if (type === "ArrayBuffer" || type === "SharedArrayBuffer")
660
+ return decode_native_array_buffer(importer)(type);
661
+ else if (type === "DataView")
662
+ return decode_native_data_view(importer);
663
+ else
664
+ return ts.factory.createNewExpression(
665
+ ts.factory.createIdentifier(type),
666
+ undefined,
667
+ [],
668
+ );
669
+ };
670
+
671
+ const decode_native_date = (importer: FunctionImporter) =>
672
+ ts.factory.createNewExpression(
673
+ ts.factory.createIdentifier("Date"),
674
+ undefined,
675
+ [
676
+ ts.factory.createCallExpression(
677
+ COALESCE(importer)("datetime"),
678
+ undefined,
679
+ [],
680
+ ),
681
+ ],
682
+ );
683
+
684
+ const decode_native_byte_array =
685
+ (importer: FunctionImporter) =>
686
+ (
687
+ type:
688
+ | "Uint8Array"
689
+ | "Uint8ClampedArray"
690
+ | "Uint16Array"
691
+ | "Uint32Array"
692
+ | "BigUint64Array"
693
+ | "Int8Array"
694
+ | "Int16Array"
695
+ | "Int32Array"
696
+ | "BigInt64Array"
697
+ | "Float32Array"
698
+ | "Float64Array",
699
+ ): ts.Expression => {
700
+ new BigInt64Array();
701
+ const [minimum, maximum]: [number, number] = (() => {
702
+ if (type === "Uint8Array" || type === "Uint8ClampedArray")
703
+ return [0, 255];
704
+ else if (type === "Uint16Array") return [0, 65535];
705
+ else if (type === "Uint32Array") return [0, 4294967295];
706
+ else if (type === "BigUint64Array")
707
+ return [0, 18446744073709551615];
708
+ else if (type === "Int8Array") return [-128, 127];
709
+ else if (type === "Int16Array") return [-32768, 32767];
710
+ else if (type === "Int32Array")
711
+ return [-2147483648, 2147483647];
712
+ else if (type === "BigInt64Array")
713
+ return [-9223372036854775808, 9223372036854775807];
714
+ else if (type === "Float32Array")
715
+ return [-1.175494351e38, 3.4028235e38];
716
+ return [Number.MIN_VALUE, Number.MAX_VALUE];
717
+ })();
718
+ const literal =
719
+ type === "BigInt64Array" || type === "BigUint64Array"
720
+ ? ExpressionFactory.bigint
721
+ : ts.factory.createNumericLiteral;
722
+ return ts.factory.createNewExpression(
723
+ ts.factory.createIdentifier(type),
724
+ [],
725
+ [
726
+ ts.factory.createCallExpression(
727
+ COALESCE(importer)("array"),
728
+ undefined,
729
+ [
730
+ ts.factory.createArrowFunction(
731
+ undefined,
732
+ undefined,
733
+ [],
734
+ TypeFactory.keyword("any"),
735
+ undefined,
736
+ ts.factory.createCallExpression(
737
+ COALESCE(importer)(
738
+ type === "Float32Array" ||
739
+ type === "Float64Array"
740
+ ? "number"
741
+ : type === "BigInt64Array" ||
742
+ type === "BigUint64Array"
743
+ ? "bigint"
744
+ : "integer",
745
+ ),
746
+ undefined,
747
+ [literal(minimum), literal(maximum)],
748
+ ),
749
+ ),
750
+ ],
751
+ ),
752
+ ],
753
+ );
754
+ };
755
+
756
+ const decode_native_array_buffer =
757
+ (importer: FunctionImporter) =>
758
+ (type: "ArrayBuffer" | "SharedArrayBuffer"): ts.Expression =>
759
+ type === "ArrayBuffer"
760
+ ? IdentifierFactory.access(
761
+ decode_native_byte_array(importer)("Uint8Array"),
762
+ )("buffer")
763
+ : ExpressionFactory.selfCall(
764
+ ts.factory.createBlock(
765
+ [
766
+ StatementFactory.constant(
767
+ "length",
768
+ ts.factory.createCallExpression(
769
+ COALESCE(importer)("integer"),
770
+ undefined,
771
+ [],
772
+ ),
773
+ ),
774
+ StatementFactory.constant(
775
+ "buffer",
776
+ ts.factory.createNewExpression(
777
+ ts.factory.createIdentifier(
778
+ "SharedArrayBuffer",
779
+ ),
780
+ [],
781
+ [ts.factory.createIdentifier("length")],
782
+ ),
783
+ ),
784
+ StatementFactory.constant(
785
+ "bytes",
786
+ ts.factory.createNewExpression(
787
+ ts.factory.createIdentifier("Uint8Array"),
788
+ [],
789
+ [ts.factory.createIdentifier("buffer")],
790
+ ),
791
+ ),
792
+ ts.factory.createExpressionStatement(
793
+ ts.factory.createCallExpression(
794
+ IdentifierFactory.access(
795
+ ts.factory.createIdentifier("bytes"),
796
+ )("set"),
797
+ undefined,
798
+ [
799
+ ts.factory.createCallExpression(
800
+ COALESCE(importer)("array"),
801
+ undefined,
802
+ [
803
+ ts.factory.createArrowFunction(
804
+ undefined,
805
+ undefined,
806
+ [],
807
+ TypeFactory.keyword(
808
+ "any",
809
+ ),
810
+ undefined,
811
+ ts.factory.createCallExpression(
812
+ COALESCE(importer)(
813
+ "integer",
814
+ ),
815
+ undefined,
816
+ [
817
+ ts.factory.createNumericLiteral(
818
+ 0,
819
+ ),
820
+ ts.factory.createNumericLiteral(
821
+ 255,
822
+ ),
823
+ ],
824
+ ),
825
+ ),
826
+ ts.factory.createIdentifier(
827
+ "length",
828
+ ),
829
+ ],
830
+ ),
831
+ ts.factory.createNumericLiteral(0),
832
+ ],
833
+ ),
834
+ ),
835
+ ts.factory.createReturnStatement(
836
+ ts.factory.createIdentifier("buffer"),
837
+ ),
838
+ ],
839
+ true,
840
+ ),
841
+ );
842
+
843
+ const decode_native_data_view = (importer: FunctionImporter) =>
844
+ ts.factory.createNewExpression(
845
+ ts.factory.createIdentifier("DataView"),
846
+ [],
847
+ [
848
+ IdentifierFactory.access(
849
+ decode_native_byte_array(importer)("Uint8Array"),
850
+ )("buffer"),
851
+ ],
852
+ );
558
853
  }
559
854
 
560
855
  type Atomic = boolean | number | string | bigint;
@@ -568,6 +863,7 @@ const PREFIX = {
568
863
  array: (i: number) => `$ra${i}`,
569
864
  tuple: (i: number) => `$rt${i}`,
570
865
  };
866
+
571
867
  const COALESCE = (importer: FunctionImporter) => (name: string) =>
572
868
  ExpressionFactory.coalesce(
573
869
  ts.factory.createPropertyAccessChain(
@@ -19,7 +19,9 @@ export namespace ValidateProgrammer {
19
19
  (modulo: ts.LeftHandSideExpression) =>
20
20
  (equals: boolean) =>
21
21
  (type: ts.Type, name?: string) => {
22
- const importer: FunctionImporter = new FunctionImporter();
22
+ const importer: FunctionImporter = new FunctionImporter(
23
+ modulo.getText(),
24
+ );
23
25
 
24
26
  const is = IsProgrammer.write(project)(modulo, true)(equals)(
25
27
  type,
@@ -11,6 +11,8 @@ export class FunctionImporter {
11
11
  new Map();
12
12
  private sequence_: number = 0;
13
13
 
14
+ public constructor(public readonly method: string) {}
15
+
14
16
  public empty(): boolean {
15
17
  return this.used_.size === 0;
16
18
  }
@@ -6,8 +6,7 @@ export namespace StringifyPredicator {
6
6
 
7
7
  export const undefindable = (meta: Metadata): boolean =>
8
8
  meta.isRequired() === false ||
9
- (meta.resolved !== null &&
10
- meta.resolved.returns.isRequired() === false);
9
+ (meta.escaped !== null && meta.escaped.returns.isRequired() === false);
11
10
 
12
11
  const ESCAPED = ['"', "\\", "\b", "\f", "\n", "\n", "\r", "\t"];
13
12
  }
@@ -7,6 +7,7 @@ export const disable_function_importer_declare = (
7
7
  ): FunctionImporter => disable(importer) as FunctionImporter;
8
8
 
9
9
  const disable = (importer: FunctionImporter): MethodOnly<FunctionImporter> => ({
10
+ method: importer.method,
10
11
  empty: (): boolean => importer.empty(),
11
12
  use: (name: string): ts.Identifier => importer.use(name),
12
13
  useLocal: (name: string): string => importer.useLocal(name),
@@ -23,5 +24,9 @@ const disable = (importer: FunctionImporter): MethodOnly<FunctionImporter> => ({
23
24
  });
24
25
 
25
26
  type MethodOnly<T> = {
26
- [P in keyof T]: T[P] extends Function ? T[P] : never;
27
+ [P in keyof T]: T[P] extends Function
28
+ ? T[P]
29
+ : P extends "method"
30
+ ? T[P]
31
+ : never;
27
32
  };
@@ -1,5 +1,5 @@
1
1
  import { Metadata } from "../../schemas/metadata/Metadata";
2
- import { MetadataResolved } from "../../schemas/metadata/MetadataResolved";
2
+ import { MetadataEscaped } from "../../schemas/metadata/MetadataEscaped";
3
3
 
4
4
  import { IJsonComponents, IJsonSchema } from "../../module";
5
5
  import { JsonApplicationProgrammer } from "../json/JsonApplicationProgrammer";
@@ -9,7 +9,7 @@ export const application_resolved =
9
9
  (options: JsonApplicationProgrammer.IOptions) =>
10
10
  <BlockNever extends boolean>(blockNever: BlockNever) =>
11
11
  (components: IJsonComponents) =>
12
- (resolved: MetadataResolved) =>
12
+ (resolved: MetadataEscaped) =>
13
13
  (attribute: IJsonSchema.IAttribute): IJsonSchema[] => {
14
14
  const output = application_schema(options)(blockNever)(components)(
15
15
  resolved.returns,
@@ -58,10 +58,10 @@ export const application_schema =
58
58
  : (schema: IJsonSchema) => union.push(schema);
59
59
 
60
60
  // toJSON() METHOD
61
- if (meta.resolved !== null)
61
+ if (meta.escaped !== null)
62
62
  union.push(
63
63
  ...application_resolved(options)(blockNever)(components)(
64
- meta.resolved,
64
+ meta.escaped,
65
65
  )(attribute),
66
66
  );
67
67