typia 3.8.9 → 3.9.0-dev.20230604

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 (239) hide show
  1. package/lib/IRandomGenerator.d.ts +1 -0
  2. package/lib/factories/IdentifierFactory.js +2 -1
  3. package/lib/factories/IdentifierFactory.js.map +1 -1
  4. package/lib/factories/MetadataCollection.d.ts +22 -4
  5. package/lib/factories/MetadataCollection.js +121 -28
  6. package/lib/factories/MetadataCollection.js.map +1 -1
  7. package/lib/factories/MetadataFactory.d.ts +1 -0
  8. package/lib/factories/MetadataFactory.js +6 -48
  9. package/lib/factories/MetadataFactory.js.map +1 -1
  10. package/lib/factories/MetadataTagFactory.js +5 -3
  11. package/lib/factories/MetadataTagFactory.js.map +1 -1
  12. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +5 -0
  13. package/lib/factories/internal/metadata/emplace_metadata_array.js +38 -0
  14. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +1 -0
  15. package/lib/factories/internal/metadata/emplace_metadata_definition.d.ts +5 -0
  16. package/lib/factories/internal/metadata/emplace_metadata_definition.js +38 -0
  17. package/lib/factories/internal/metadata/emplace_metadata_definition.js.map +1 -0
  18. package/lib/factories/internal/metadata/emplace_metadata_object.js +4 -4
  19. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  20. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +5 -0
  21. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +58 -0
  22. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -0
  23. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  24. package/lib/factories/internal/metadata/explore_metadata.js +11 -34
  25. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  27. package/lib/factories/internal/metadata/iterate_metadata.js +5 -2
  28. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata_array.js +4 -5
  30. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -0
  32. package/lib/factories/internal/metadata/iterate_metadata_collection.js +151 -0
  33. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -0
  34. package/lib/factories/internal/metadata/iterate_metadata_definition.d.ts +5 -0
  35. package/lib/factories/internal/metadata/iterate_metadata_definition.js +24 -0
  36. package/lib/factories/internal/metadata/iterate_metadata_definition.js.map +1 -0
  37. package/lib/factories/internal/metadata/iterate_metadata_object.js +1 -1
  38. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  39. package/lib/factories/internal/metadata/iterate_metadata_sort.d.ts +3 -0
  40. package/lib/factories/internal/metadata/iterate_metadata_sort.js +156 -0
  41. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -0
  42. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +3 -26
  43. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  44. package/lib/factories/internal/metadata/iterate_metadata_union.js +3 -3
  45. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  46. package/lib/metadata/IMetadata.d.ts +3 -2
  47. package/lib/metadata/IMetadataAlias.d.ts +10 -0
  48. package/lib/metadata/IMetadataAlias.js +3 -0
  49. package/lib/metadata/IMetadataAlias.js.map +1 -0
  50. package/lib/metadata/IMetadataApplication.d.ts +2 -2
  51. package/lib/metadata/IMetadataArray.d.ts +8 -0
  52. package/lib/metadata/IMetadataArray.js +3 -0
  53. package/lib/metadata/IMetadataArray.js.map +1 -0
  54. package/lib/metadata/IMetadataCollection.d.ts +10 -0
  55. package/lib/metadata/IMetadataCollection.js +3 -0
  56. package/lib/metadata/IMetadataCollection.js.map +1 -0
  57. package/lib/metadata/IMetadataDictionary.js +3 -0
  58. package/lib/metadata/IMetadataDictionary.js.map +1 -0
  59. package/lib/metadata/IMetadataObject.d.ts +3 -0
  60. package/lib/metadata/IMetadataProperty.d.ts +1 -1
  61. package/lib/metadata/IMetadataTuple.d.ts +8 -0
  62. package/lib/metadata/IMetadataTuple.js +3 -0
  63. package/lib/metadata/IMetadataTuple.js.map +1 -0
  64. package/lib/metadata/Metadata.d.ts +24 -21
  65. package/lib/metadata/Metadata.js +323 -262
  66. package/lib/metadata/Metadata.js.map +1 -1
  67. package/lib/metadata/MetadataAlias.d.ts +16 -0
  68. package/lib/metadata/MetadataAlias.js +39 -0
  69. package/lib/metadata/MetadataAlias.js.map +1 -0
  70. package/lib/metadata/MetadataArray.d.ts +12 -0
  71. package/lib/metadata/MetadataArray.js +36 -0
  72. package/lib/metadata/MetadataArray.js.map +1 -0
  73. package/lib/metadata/MetadataObject.d.ts +4 -0
  74. package/lib/metadata/MetadataObject.js +3 -5
  75. package/lib/metadata/MetadataObject.js.map +1 -1
  76. package/lib/metadata/MetadataProperty.d.ts +1 -1
  77. package/lib/metadata/MetadataProperty.js +3 -3
  78. package/lib/metadata/MetadataProperty.js.map +1 -1
  79. package/lib/metadata/MetadataTuple.d.ts +12 -0
  80. package/lib/metadata/MetadataTuple.js +36 -0
  81. package/lib/metadata/MetadataTuple.js.map +1 -0
  82. package/lib/programmers/ApplicationProgrammer.js +3 -3
  83. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  84. package/lib/programmers/AssertProgrammer.js +13 -21
  85. package/lib/programmers/AssertProgrammer.js.map +1 -1
  86. package/lib/programmers/CheckerProgrammer.d.ts +6 -7
  87. package/lib/programmers/CheckerProgrammer.js +276 -185
  88. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  89. package/lib/programmers/CloneProgrammer.js +312 -204
  90. package/lib/programmers/CloneProgrammer.js.map +1 -1
  91. package/lib/programmers/FeatureProgrammer.d.ts +21 -27
  92. package/lib/programmers/FeatureProgrammer.js +60 -63
  93. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  94. package/lib/programmers/IsProgrammer.d.ts +3 -3
  95. package/lib/programmers/IsProgrammer.js +43 -28
  96. package/lib/programmers/IsProgrammer.js.map +1 -1
  97. package/lib/programmers/LiteralsProgrammer.js +1 -0
  98. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  99. package/lib/programmers/PruneProgrammer.js +270 -176
  100. package/lib/programmers/PruneProgrammer.js.map +1 -1
  101. package/lib/programmers/RandomProgrammer.js +124 -32
  102. package/lib/programmers/RandomProgrammer.js.map +1 -1
  103. package/lib/programmers/StringifyProgrammer.js +462 -356
  104. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  105. package/lib/programmers/ValidateProgrammer.js +9 -9
  106. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  107. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  108. package/lib/programmers/helpers/FunctionImporeter.js +17 -2
  109. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  110. package/lib/programmers/helpers/RandomJoiner.d.ts +6 -1
  111. package/lib/programmers/helpers/RandomJoiner.js +11 -14
  112. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  113. package/lib/programmers/helpers/UnionExplorer.d.ts +12 -10
  114. package/lib/programmers/helpers/UnionExplorer.js +47 -12
  115. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  116. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  117. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  118. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  119. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  120. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.d.ts +1 -1
  121. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js +2 -2
  122. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js.map +1 -1
  123. package/lib/programmers/internal/application_array.js +41 -21
  124. package/lib/programmers/internal/application_array.js.map +1 -1
  125. package/lib/programmers/internal/application_boolean.js +1 -1
  126. package/lib/programmers/internal/application_boolean.js.map +1 -1
  127. package/lib/programmers/internal/application_constant.js +2 -2
  128. package/lib/programmers/internal/application_constant.js.map +1 -1
  129. package/lib/programmers/internal/application_default.js +3 -3
  130. package/lib/programmers/internal/application_default.js.map +1 -1
  131. package/lib/programmers/internal/application_definition.d.ts +5 -0
  132. package/lib/programmers/internal/application_definition.js +45 -0
  133. package/lib/programmers/internal/application_definition.js.map +1 -0
  134. package/lib/programmers/internal/application_native.js +14 -11
  135. package/lib/programmers/internal/application_native.js.map +1 -1
  136. package/lib/programmers/internal/application_object.js +19 -14
  137. package/lib/programmers/internal/application_object.js.map +1 -1
  138. package/lib/programmers/internal/application_schema.js +28 -31
  139. package/lib/programmers/internal/application_schema.js.map +1 -1
  140. package/lib/programmers/internal/application_tuple.js +34 -5
  141. package/lib/programmers/internal/application_tuple.js.map +1 -1
  142. package/lib/programmers/internal/check_union_array_like.js +54 -63
  143. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  144. package/lib/programmers/internal/feature_object_entries.js +2 -2
  145. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  146. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +2 -0
  147. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +18 -0
  148. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -0
  149. package/lib/schemas/IJsonApplication.d.ts +0 -4
  150. package/lib/schemas/IJsonComponents.d.ts +16 -4
  151. package/lib/schemas/IJsonSchema.d.ts +1 -1
  152. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  153. package/lib/transformers/FileTransformer.js +3 -3
  154. package/lib/transformers/FileTransformer.js.map +1 -1
  155. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -0
  156. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  157. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +2 -1
  158. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  159. package/lib/utils/ArrayUtil.d.ts +1 -1
  160. package/lib/utils/ArrayUtil.js +2 -1
  161. package/lib/utils/ArrayUtil.js.map +1 -1
  162. package/lib/utils/RandomGenerator.js +2 -3
  163. package/lib/utils/RandomGenerator.js.map +1 -1
  164. package/package.json +6 -1
  165. package/src/IRandomGenerator.ts +1 -0
  166. package/src/factories/IdentifierFactory.ts +3 -1
  167. package/src/factories/MetadataCollection.ts +170 -34
  168. package/src/factories/MetadataFactory.ts +7 -29
  169. package/src/factories/MetadataTagFactory.ts +6 -3
  170. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -0
  171. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -0
  172. package/src/factories/internal/metadata/emplace_metadata_object.ts +4 -4
  173. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -0
  174. package/src/factories/internal/metadata/explore_metadata.ts +18 -44
  175. package/src/factories/internal/metadata/iterate_metadata.ts +13 -3
  176. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -11
  177. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -0
  178. package/src/factories/internal/metadata/iterate_metadata_definition.ts +30 -0
  179. package/src/factories/internal/metadata/iterate_metadata_object.ts +1 -0
  180. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -0
  181. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -31
  182. package/src/factories/internal/metadata/iterate_metadata_union.ts +13 -2
  183. package/src/metadata/IMetadata.ts +3 -2
  184. package/src/metadata/IMetadataAlias.ts +12 -0
  185. package/src/metadata/IMetadataApplication.ts +2 -2
  186. package/src/metadata/IMetadataArray.ts +10 -0
  187. package/src/metadata/IMetadataCollection.ts +11 -0
  188. package/src/metadata/IMetadataDictionary.ts +14 -0
  189. package/src/metadata/IMetadataObject.ts +2 -13
  190. package/src/metadata/IMetadataProperty.ts +1 -1
  191. package/src/metadata/IMetadataTuple.ts +10 -0
  192. package/src/metadata/Metadata.ts +180 -134
  193. package/src/metadata/MetadataAlias.ts +61 -0
  194. package/src/metadata/MetadataArray.ts +52 -0
  195. package/src/metadata/MetadataObject.ts +7 -20
  196. package/src/metadata/MetadataProperty.ts +5 -5
  197. package/src/metadata/MetadataTuple.ts +53 -0
  198. package/src/programmers/ApplicationProgrammer.ts +1 -2
  199. package/src/programmers/AssertProgrammer.ts +45 -39
  200. package/src/programmers/CheckerProgrammer.ts +612 -331
  201. package/src/programmers/CloneProgrammer.ts +344 -138
  202. package/src/programmers/FeatureProgrammer.ts +110 -115
  203. package/src/programmers/IsProgrammer.ts +86 -52
  204. package/src/programmers/LiteralsProgrammer.ts +1 -0
  205. package/src/programmers/PruneProgrammer.ts +304 -101
  206. package/src/programmers/RandomProgrammer.ts +227 -61
  207. package/src/programmers/StringifyProgrammer.ts +374 -182
  208. package/src/programmers/ValidateProgrammer.ts +41 -44
  209. package/src/programmers/helpers/FunctionImporeter.ts +35 -11
  210. package/src/programmers/helpers/RandomJoiner.ts +25 -13
  211. package/src/programmers/helpers/UnionExplorer.ts +76 -50
  212. package/src/programmers/helpers/UnionPredicator.ts +1 -1
  213. package/src/programmers/helpers/disable_function_importer_declare.ts +5 -0
  214. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  215. package/src/programmers/internal/application_array.ts +48 -16
  216. package/src/programmers/internal/application_boolean.ts +1 -1
  217. package/src/programmers/internal/application_constant.ts +2 -2
  218. package/src/programmers/internal/application_default.ts +3 -3
  219. package/src/programmers/internal/application_definition.ts +45 -0
  220. package/src/programmers/internal/application_native.ts +15 -12
  221. package/src/programmers/internal/application_object.ts +17 -12
  222. package/src/programmers/internal/application_schema.ts +31 -65
  223. package/src/programmers/internal/application_tuple.ts +63 -13
  224. package/src/programmers/internal/check_union_array_like.ts +249 -191
  225. package/src/programmers/internal/feature_object_entries.ts +2 -2
  226. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -0
  227. package/src/schemas/IJsonApplication.ts +0 -5
  228. package/src/schemas/IJsonComponents.ts +17 -5
  229. package/src/schemas/IJsonSchema.ts +1 -1
  230. package/src/transformers/CallExpressionTransformer.ts +2 -0
  231. package/src/transformers/FileTransformer.ts +8 -8
  232. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +1 -0
  233. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +2 -1
  234. package/src/utils/ArrayUtil.ts +3 -2
  235. package/src/utils/RandomGenerator.ts +3 -3
  236. package/lib/programmers/internal/check_union_tuple.js +0 -15
  237. package/lib/programmers/internal/check_union_tuple.js.map +0 -1
  238. package/src/programmers/internal/check_union_tuple.ts +0 -33
  239. /package/lib/{programmers/internal/check_union_tuple.d.ts → metadata/IMetadataDictionary.d.ts} +0 -0
@@ -32,41 +32,48 @@ export namespace ValidateProgrammer {
32
32
  (equals: boolean) =>
33
33
  (type: ts.Type, name?: string) => {
34
34
  const importer: FunctionImporter = new FunctionImporter();
35
- const program: ts.ArrowFunction = CheckerProgrammer.write(project)({
36
- functors: "$vo",
37
- unioners: "$vu",
38
- path: true,
39
- trace: true,
40
- numeric: OptionPredicator.numeric(project.options),
41
- equals,
42
- atomist: (explore) => (tuple) => (input) =>
43
- [
44
- tuple.expression,
45
- ...tuple.tags.map((tag) =>
46
- ts.factory.createLogicalOr(
47
- tag.expression,
48
- create_report_call(
49
- explore.from === "top"
50
- ? ts.factory.createTrue()
51
- : ts.factory.createIdentifier(
52
- "_exceptionable",
53
- ),
54
- )(
55
- ts.factory.createIdentifier(
56
- explore.postfix
57
- ? `_path + ${explore.postfix}`
58
- : "_path",
35
+
36
+ const is = IsProgrammer.write(project)(modulo, true)(equals)(
37
+ type,
38
+ name ?? TypeFactory.getFullName(project.checker)(type),
39
+ );
40
+ const validate: ts.ArrowFunction = CheckerProgrammer.write(project)(
41
+ {
42
+ prefix: "$v",
43
+ path: true,
44
+ trace: true,
45
+ numeric: OptionPredicator.numeric(project.options),
46
+ equals,
47
+ atomist: (explore) => (tuple) => (input) =>
48
+ [
49
+ tuple.expression,
50
+ ...tuple.tags.map((tag) =>
51
+ ts.factory.createLogicalOr(
52
+ tag.expression,
53
+ create_report_call(
54
+ explore.from === "top"
55
+ ? ts.factory.createTrue()
56
+ : ts.factory.createIdentifier(
57
+ "_exceptionable",
58
+ ),
59
+ )(
60
+ ts.factory.createIdentifier(
61
+ explore.postfix
62
+ ? `_path + ${explore.postfix}`
63
+ : "_path",
64
+ ),
65
+ tag.expected,
66
+ input,
59
67
  ),
60
- tag.expected,
61
- input,
62
68
  ),
63
69
  ),
64
- ),
65
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
66
- combiner: combine(equals)(importer),
67
- joiner: joiner(equals)(importer),
68
- success: ts.factory.createTrue(),
69
- })(importer)(type, name);
70
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
71
+ combiner: combine(equals)(importer),
72
+ joiner: joiner(equals)(importer),
73
+ success: ts.factory.createTrue(),
74
+ addition: () => importer.declare(modulo),
75
+ },
76
+ )(importer)(type, name);
70
77
 
71
78
  return ts.factory.createArrowFunction(
72
79
  undefined,
@@ -85,16 +92,6 @@ export namespace ValidateProgrammer {
85
92
  undefined,
86
93
  ts.factory.createBlock(
87
94
  [
88
- StatementFactory.constant(
89
- "__is",
90
- IsProgrammer.write(project)(modulo, true)(equals)(
91
- type,
92
- name ??
93
- TypeFactory.getFullName(project.checker)(
94
- type,
95
- ),
96
- ),
97
- ),
98
95
  StatementFactory.constant(
99
96
  "errors",
100
97
  ts.factory.createAsExpression(
@@ -119,7 +116,7 @@ export namespace ValidateProgrammer {
119
116
  [ts.factory.createIdentifier("errors")],
120
117
  ),
121
118
  ),
122
- ...importer.declare(modulo),
119
+ StatementFactory.constant("__is", is),
123
120
  ts.factory.createIfStatement(
124
121
  ts.factory.createStrictEquality(
125
122
  ts.factory.createFalse(),
@@ -131,7 +128,7 @@ export namespace ValidateProgrammer {
131
128
  ),
132
129
  ts.factory.createExpressionStatement(
133
130
  ts.factory.createCallExpression(
134
- program,
131
+ validate,
135
132
  undefined,
136
133
  [
137
134
  ts.factory.createIdentifier("input"),
@@ -7,6 +7,8 @@ import { TypeFactory } from "../../factories/TypeFactory";
7
7
  export class FunctionImporter {
8
8
  private readonly used_: Set<string> = new Set();
9
9
  private readonly local_: Set<string> = new Set();
10
+ private readonly unions_: Map<string, [string, ts.ArrowFunction]> =
11
+ new Map();
10
12
  private sequence_: number = 0;
11
13
 
12
14
  public empty(): boolean {
@@ -28,25 +30,47 @@ export class FunctionImporter {
28
30
  }
29
31
 
30
32
  public declare(modulo: ts.LeftHandSideExpression): ts.Statement[] {
31
- return [...this.used_].map((name) =>
32
- StatementFactory.constant(
33
- "$" + name,
34
- IdentifierFactory.access(
35
- ts.factory.createParenthesizedExpression(
36
- ts.factory.createAsExpression(
37
- modulo,
38
- TypeFactory.keyword("any"),
33
+ return [
34
+ ...[...this.used_].map((name) =>
35
+ StatementFactory.constant(
36
+ "$" + name,
37
+ IdentifierFactory.access(
38
+ ts.factory.createParenthesizedExpression(
39
+ ts.factory.createAsExpression(
40
+ modulo,
41
+ TypeFactory.keyword("any"),
42
+ ),
39
43
  ),
40
- ),
41
- )(name),
44
+ )(name),
45
+ ),
42
46
  ),
43
- );
47
+ ...[...this.unions_.values()].map(([key, arrow]) =>
48
+ StatementFactory.constant(key, arrow),
49
+ ),
50
+ ];
44
51
  }
45
52
 
46
53
  public increment(): number {
47
54
  return ++this.sequence_;
48
55
  }
49
56
 
57
+ public emplaceUnion(
58
+ prefix: string,
59
+ name: string,
60
+ factory: () => ts.ArrowFunction,
61
+ ): string {
62
+ const oldbie = this.unions_.get(name);
63
+ if (oldbie) return oldbie[0];
64
+
65
+ const index: number = this.unions_.size;
66
+ const accessor: string = `${prefix}p${index}`;
67
+
68
+ const tuple: [string, ReturnType<typeof factory>] = [accessor, null!];
69
+ this.unions_.set(name, tuple);
70
+ tuple[1] = factory();
71
+ return accessor;
72
+ }
73
+
50
74
  public trace(): void {
51
75
  console.log(...this.used_);
52
76
  console.log(...this.local_);
@@ -12,7 +12,6 @@ import { MetadataProperty } from "../../metadata/MetadataProperty";
12
12
  import { Escaper } from "../../utils/Escaper";
13
13
 
14
14
  import { get_comment_tags } from "../internal/get_comment_tags";
15
- import { RandomRanger } from "./RandomRanger";
16
15
 
17
16
  export namespace RandomJoiner {
18
17
  export type Decoder = (
@@ -24,17 +23,14 @@ export namespace RandomJoiner {
24
23
  export const array =
25
24
  (coalesce: (method: string) => ts.Expression) =>
26
25
  (decoder: Decoder) =>
27
- (item: Metadata, tags: IMetadataTag[], comments: ICommentTag[]) => {
28
- const tail = RandomRanger.length(coalesce)({
29
- minimum: 0,
30
- maximum: 3,
31
- gap: 3,
32
- })({
33
- fixed: "items",
34
- minimum: "minItems",
35
- maximum: "maxItems",
36
- })(tags);
37
- return ts.factory.createCallExpression(
26
+ (explore: IExplore) =>
27
+ (length: ts.Expression | undefined) =>
28
+ (
29
+ item: Metadata,
30
+ tags: IMetadataTag[],
31
+ comments: ICommentTag[],
32
+ ): ts.Expression => {
33
+ const generator: ts.Expression = ts.factory.createCallExpression(
38
34
  coalesce("array"),
39
35
  undefined,
40
36
  [
@@ -46,9 +42,20 @@ export namespace RandomJoiner {
46
42
  undefined,
47
43
  decoder(item, tags, comments),
48
44
  ),
49
- ...(tail ? [tail] : []),
45
+ ...(length ? [length] : []),
50
46
  ],
51
47
  );
48
+ if (explore.recursive === false) return generator;
49
+ return ts.factory.createConditionalExpression(
50
+ ts.factory.createGreaterThanEquals(
51
+ ts.factory.createNumericLiteral(5),
52
+ ts.factory.createIdentifier("_depth"),
53
+ ),
54
+ undefined,
55
+ generator,
56
+ undefined,
57
+ ts.factory.createArrayLiteralExpression([]),
58
+ );
52
59
  };
53
60
 
54
61
  export const tuple =
@@ -159,3 +166,8 @@ export namespace RandomJoiner {
159
166
  ),
160
167
  ]);
161
168
  }
169
+
170
+ interface IExplore {
171
+ function: boolean;
172
+ recursive: boolean;
173
+ }
@@ -5,7 +5,9 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
5
 
6
6
  import { IMetadataTag } from "../../metadata/IMetadataTag";
7
7
  import { Metadata } from "../../metadata/Metadata";
8
+ import { MetadataArray } from "../../metadata/MetadataArray";
8
9
  import { MetadataObject } from "../../metadata/MetadataObject";
10
+ import { MetadataTuple } from "../../metadata/MetadataTuple";
9
11
 
10
12
  import { FeatureProgrammer } from "../FeatureProgrammer";
11
13
  import { check_union_array_like } from "../internal/check_union_array_like";
@@ -37,7 +39,7 @@ export namespace UnionExplorer {
37
39
  ): ts.Expression => {
38
40
  // BREAKER
39
41
  if (targets.length === 1)
40
- return config.objector.decoder(
42
+ return config.objector.decoder()(
41
43
  input,
42
44
  targets[0]!,
43
45
  explore,
@@ -78,7 +80,7 @@ export namespace UnionExplorer {
78
80
  const accessor: ts.Expression =
79
81
  IdentifierFactory.access(input)(key);
80
82
  const pred: ts.Expression = spec.neighbour
81
- ? config.objector.checker(
83
+ ? config.objector.checker()(
82
84
  accessor,
83
85
  spec.property.value,
84
86
  {
@@ -95,7 +97,7 @@ export namespace UnionExplorer {
95
97
  return ts.factory.createIfStatement(
96
98
  (config.objector.is || ((exp) => exp))(pred),
97
99
  ts.factory.createReturnStatement(
98
- config.objector.decoder(
100
+ config.objector.decoder()(
99
101
  input,
100
102
  spec.object,
101
103
  explore,
@@ -144,50 +146,73 @@ export namespace UnionExplorer {
144
146
  /* -----------------------------------------------------------
145
147
  ARRAY LIKE
146
148
  ----------------------------------------------------------- */
147
- export const tuple = (props: check_union_array_like.IProps<Metadata[]>) =>
148
- check_union_array_like<Metadata[]>({
149
- size: null,
149
+ export const tuple = (
150
+ props: check_union_array_like.IProps<MetadataTuple, MetadataTuple>,
151
+ ) =>
152
+ check_union_array_like<MetadataTuple, MetadataTuple, MetadataTuple>({
153
+ transform: (x) => x,
154
+ element: (x) => x,
155
+ size: null!,
150
156
  front: (input) => input,
151
157
  array: (input) => input,
152
- name: (elems) => `[${elems.map((e) => e.getName()).join(", ")}]`,
158
+ name: (t) => t.name,
153
159
  })(props);
154
160
  export namespace tuple {
155
161
  export type IProps = check_union_array_like.IProps<
156
- Metadata | Metadata[]
162
+ MetadataTuple,
163
+ MetadataTuple
157
164
  >;
158
165
  }
159
166
 
160
167
  export const array = (props: array.IProps) =>
161
- check_union_array_like<Metadata>({
168
+ check_union_array_like<MetadataArray, MetadataArray, Metadata>({
169
+ transform: (x) => x,
170
+ element: (x) => x.value,
162
171
  size: (input) => IdentifierFactory.access(input)("length"),
163
172
  front: (input) =>
164
173
  ts.factory.createElementAccessExpression(input, 0),
165
174
  array: (input) => input,
166
- name: (t) => `Array<${t.getName()}>`,
175
+ name: (t) => t.name,
167
176
  })(props);
168
177
  export namespace array {
169
- export type IProps = check_union_array_like.IProps<Metadata>;
178
+ export type IProps = check_union_array_like.IProps<
179
+ MetadataArray,
180
+ Metadata
181
+ >;
170
182
  }
171
183
 
172
184
  export const array_or_tuple = (props: array_or_tuple.IProps) =>
173
- check_union_array_like<Metadata | Metadata[]>({
185
+ check_union_array_like<
186
+ MetadataArray | MetadataTuple,
187
+ MetadataArray | MetadataTuple,
188
+ Metadata | MetadataTuple
189
+ >({
190
+ transform: (x) => x,
191
+ element: (x) => (x instanceof MetadataArray ? x.value : x),
174
192
  size: (input) => IdentifierFactory.access(input)("length"),
175
193
  front: (input) =>
176
194
  ts.factory.createElementAccessExpression(input, 0),
177
195
  array: (input) => input,
178
- name: (t) =>
179
- Array.isArray(t)
180
- ? `[${t.map((e) => e.getName()).join(", ")}]`
181
- : `Array<${t.getName()}>`,
196
+ name: (m) => m.name,
182
197
  })(props);
183
198
  export namespace array_or_tuple {
184
199
  export type IProps = check_union_array_like.IProps<
185
- Metadata | Metadata[]
200
+ MetadataArray | MetadataTuple,
201
+ Metadata
186
202
  >;
187
203
  }
188
204
 
189
205
  export const set = (props: set.IProps) =>
190
- check_union_array_like<Metadata>({
206
+ check_union_array_like<Metadata, MetadataArray, Metadata>({
207
+ transform: (value: Metadata) =>
208
+ MetadataArray.create({
209
+ name: `Set<${value.getName()}>`,
210
+ index: null,
211
+ recursive: false,
212
+ nullables: [],
213
+ value,
214
+ }),
215
+ element: (array) => array.value,
191
216
  size: (input) => IdentifierFactory.access(input)("size"),
192
217
  front: (input) =>
193
218
  IdentifierFactory.access(
@@ -208,14 +233,23 @@ export namespace UnionExplorer {
208
233
  [ts.factory.createSpreadElement(input)],
209
234
  false,
210
235
  ),
211
- name: (t) => `Set<${t.getName()}>`,
236
+ name: (_m, e) => `Set<${e.getName()}>`,
212
237
  })(props);
213
238
  export namespace set {
214
- export type IProps = check_union_array_like.IProps<Metadata>;
239
+ export type IProps = check_union_array_like.IProps<
240
+ MetadataArray,
241
+ Metadata
242
+ >;
215
243
  }
216
244
 
217
245
  export const map = (props: map.IProps) =>
218
- check_union_array_like<[Metadata, Metadata]>({
246
+ check_union_array_like<
247
+ Metadata.Entry,
248
+ MetadataArray,
249
+ [Metadata, Metadata]
250
+ >({
251
+ element: (array) =>
252
+ array.value.tuples[0]!.elements as [Metadata, Metadata],
219
253
  size: (input) => IdentifierFactory.access(input)("size"),
220
254
  front: (input) =>
221
255
  IdentifierFactory.access(
@@ -236,40 +270,32 @@ export namespace UnionExplorer {
236
270
  [ts.factory.createSpreadElement(input)],
237
271
  false,
238
272
  ),
239
- name: ([k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
273
+ name: (_m, [k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
274
+ transform: (m: Metadata.Entry) =>
275
+ MetadataArray.create({
276
+ name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
277
+ index: null,
278
+ recursive: false,
279
+ nullables: [],
280
+ value: Metadata.create({
281
+ ...Metadata.initialize(),
282
+ tuples: [
283
+ MetadataTuple.create({
284
+ name: `[${m.key.getName()}, ${m.value.getName()}]`,
285
+ index: null,
286
+ recursive: false,
287
+ nullables: [],
288
+ elements: [m.key, m.value],
289
+ }),
290
+ ],
291
+ }),
292
+ }),
240
293
  })(props);
241
294
 
242
295
  export namespace map {
243
296
  export type IProps = check_union_array_like.IProps<
297
+ MetadataArray,
244
298
  [Metadata, Metadata]
245
299
  >;
246
300
  }
247
-
248
- // const transform = <T>(
249
- // props: check_union_array_like.IProps<T>,
250
- // ): check_union_array_like.IProps<T> => ({
251
- // ...props,
252
- // checker: (top, targets, explore, tags, array) =>
253
- // props.checker(
254
- // top,
255
- // targets,
256
- // {
257
- // ...explore,
258
- // tracable: false,
259
- // postfix: `"[0]"`,
260
- // },
261
- // tags,
262
- // array,
263
- // ),
264
- // decoder: (input, targets, explore, tags) =>
265
- // props.decoder(
266
- // input,
267
- // targets,
268
- // {
269
- // ...explore,
270
- // tracable: true,
271
- // },
272
- // tags,
273
- // ),
274
- // });
275
301
  }
@@ -52,7 +52,7 @@ export namespace UnionPredicator {
52
52
  const unique: boolean =
53
53
  neighbors.length === 0 ||
54
54
  neighbors.every(
55
- (n) => !Metadata.intersects(prop.value, n.value, false),
55
+ (n) => !Metadata.intersects(prop.value, n.value),
56
56
  );
57
57
  if (unique === true)
58
58
  children.push({
@@ -13,6 +13,11 @@ const disable = (importer: FunctionImporter): MethodOnly<FunctionImporter> => ({
13
13
  hasLocal: (name: string): boolean => importer.hasLocal(name),
14
14
  declare: (_modulo: ts.LeftHandSideExpression): ts.Statement[] => [],
15
15
  increment: (): number => importer.increment(),
16
+ emplaceUnion: (
17
+ prefix: string,
18
+ name: string,
19
+ factory: () => ts.ArrowFunction,
20
+ ): string => importer.emplaceUnion(prefix, name, factory),
16
21
  trace: (): void => importer.trace(),
17
22
  });
18
23
 
@@ -1 +1 @@
1
- export const JSON_SCHEMA_PREFIX = "#/components/schemas";
1
+ export const JSON_COMPONENTS_PREFIX = "#/components";
@@ -1,8 +1,9 @@
1
- import { Metadata } from "../../metadata/Metadata";
1
+ import { MetadataArray } from "../../metadata/MetadataArray";
2
2
  import { IJsonComponents } from "../../schemas/IJsonComponents";
3
3
  import { IJsonSchema } from "../../schemas/IJsonSchema";
4
4
 
5
5
  import { ApplicationProgrammer } from "../ApplicationProgrammer";
6
+ import { JSON_COMPONENTS_PREFIX } from "./JSON_SCHEMA_PREFIX";
6
7
  import { application_schema } from "./application_schema";
7
8
 
8
9
  /**
@@ -11,22 +12,53 @@ import { application_schema } from "./application_schema";
11
12
  export const application_array =
12
13
  (options: ApplicationProgrammer.IOptions) =>
13
14
  (components: IJsonComponents) =>
14
- (tuple?: IJsonSchema.ITuple) =>
15
- (metadata: Metadata) =>
16
- (attribute: IJsonSchema.IAttribute): IJsonSchema.IArray => {
15
+ (array: MetadataArray) =>
16
+ (attribute: IJsonSchema.IAttribute) =>
17
+ (
18
+ nullable: boolean,
19
+ ):
20
+ | IJsonSchema.IArray
21
+ | IJsonSchema.IReference
22
+ | IJsonSchema.IRecursiveReference => {
17
23
  // SCHEMA
18
- const output: IJsonSchema.IArray = {
19
- ...attribute,
20
- type: "array",
21
- items: application_schema(options)(false)(components)(metadata)(
22
- attribute,
23
- ),
24
- "x-typia-tuple": tuple,
24
+ const generator = () => {
25
+ const schema: IJsonSchema.IArray = {
26
+ ...attribute,
27
+ type: "array",
28
+ items: application_schema(options)(false)(components)(
29
+ array.value,
30
+ )(array.recursive ? {} : attribute),
31
+ };
32
+ if (array.recursive === false) {
33
+ for (const tag of attribute["x-typia-metaTags"] ?? [])
34
+ if (tag.kind === "minItems") schema.minItems = tag.value;
35
+ else if (tag.kind === "maxItems")
36
+ schema.maxItems = tag.value;
37
+ }
38
+ return schema;
25
39
  };
40
+ if (array.recursive === false) return generator();
26
41
 
27
- // RANGE
28
- for (const tag of attribute["x-typia-metaTags"] ?? [])
29
- if (tag.kind === "minItems") output.minItems = tag.value;
30
- else if (tag.kind === "maxItems") output.maxItems = tag.value;
31
- return output;
42
+ // KEY
43
+ const key: string =
44
+ options.purpose === "ajv"
45
+ ? array.name
46
+ : `${array.name}${nullable ? ".Nullable" : ""}`;
47
+ const $id: string = `${JSON_COMPONENTS_PREFIX}/arrays/${key}`;
48
+
49
+ // REFERENCE
50
+ if (components.arrays?.[key] === undefined) {
51
+ components.arrays ??= {};
52
+ components.arrays[key] = {} as any;
53
+
54
+ const repeated: IJsonComponents.IArray = {
55
+ ...generator(),
56
+ $id: options.purpose === "ajv" ? $id : undefined,
57
+ $recursiveAnchor: options.purpose === "ajv" || undefined,
58
+ };
59
+ components.arrays[key] = repeated;
60
+ }
61
+ return options.purpose === "ajv" && array.recursive
62
+ ? { ...attribute, $recursiveRef: $id }
63
+ : { ...attribute, $ref: $id };
32
64
  };
@@ -9,7 +9,7 @@ export const application_boolean = (
9
9
  ): IJsonSchema.IBoolean => ({
10
10
  ...attribute,
11
11
  default: application_default(attribute)(
12
- (def) => def === "true" || def === "false",
12
+ (alias) => alias === "true" || alias === "false",
13
13
  )((str) => Boolean(str)),
14
14
  type: "boolean",
15
15
  });
@@ -12,8 +12,8 @@ export const application_constant =
12
12
  ...attribute,
13
13
  type: constant.type,
14
14
  enum: constant.values as any,
15
- default: application_default(attribute)((def) =>
16
- constant.values.some((v) => v.toString() === def),
15
+ default: application_default(attribute)((alias) =>
16
+ constant.values.some((v) => v.toString() === alias),
17
17
  )(
18
18
  constant.type === "string"
19
19
  ? (str) => str
@@ -10,8 +10,8 @@ export const application_default =
10
10
  const defaults = (attribute["x-typia-jsDocTags"] ?? []).filter(
11
11
  (tag) => tag.name === "default",
12
12
  );
13
- for (const def of defaults)
14
- if (def.text?.length && pred(def.text[0]!.text))
15
- return caster(def.text[0]!.text);
13
+ for (const alias of defaults)
14
+ if (alias.text?.length && pred(alias.text[0]!.text))
15
+ return caster(alias.text[0]!.text);
16
16
  return undefined;
17
17
  };
@@ -0,0 +1,45 @@
1
+ import { MetadataAlias } from "../../metadata/MetadataAlias";
2
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
3
+
4
+ import { IJsonSchema } from "../../module";
5
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
6
+ import { JSON_COMPONENTS_PREFIX } from "./JSON_SCHEMA_PREFIX";
7
+ import { application_schema } from "./application_schema";
8
+
9
+ export const application_definition =
10
+ (options: ApplicationProgrammer.IOptions) =>
11
+ <BlockNever extends boolean>(blockNever: BlockNever) =>
12
+ (components: IJsonComponents) =>
13
+ (alias: MetadataAlias) =>
14
+ (
15
+ nullable: boolean,
16
+ ): IJsonSchema.IReference | IJsonSchema.IRecursiveReference => {
17
+ const key: string =
18
+ options.purpose === "ajv"
19
+ ? alias.name
20
+ : `${alias.name}${nullable ? ".Nullable" : ""}`;
21
+ const $id: string = `${JSON_COMPONENTS_PREFIX}/aliases/${key}`;
22
+
23
+ // TEMPORARY ASSIGNMENT
24
+ if (components.aliases?.[key] === undefined) {
25
+ components.aliases ??= {};
26
+ components.aliases[key] = {
27
+ $id: key,
28
+ } as any;
29
+
30
+ // GENERATE SCHEM
31
+ const schema: IJsonSchema = application_schema(options)(blockNever)(
32
+ components,
33
+ )(alias.value)({})!;
34
+ components.aliases ??= {};
35
+ components.aliases[key] = {
36
+ $id: options.purpose === "ajv" ? $id : undefined,
37
+ $recursiveAnchor:
38
+ (options.purpose === "ajv" && alias.recursive) || undefined,
39
+ ...schema,
40
+ };
41
+ }
42
+ return options.purpose === "ajv" && alias.recursive
43
+ ? { $recursiveRef: $id }
44
+ : { $ref: $id };
45
+ };