typia 3.8.8 → 3.9.0-dev.20230603

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 (233) hide show
  1. package/lib/IRandomGenerator.d.ts +1 -0
  2. package/lib/factories/CommentFactory.js +2 -1
  3. package/lib/factories/CommentFactory.js.map +1 -1
  4. package/lib/factories/IdentifierFactory.js +2 -1
  5. package/lib/factories/IdentifierFactory.js.map +1 -1
  6. package/lib/factories/MetadataCollection.d.ts +22 -4
  7. package/lib/factories/MetadataCollection.js +121 -28
  8. package/lib/factories/MetadataCollection.js.map +1 -1
  9. package/lib/factories/MetadataFactory.d.ts +1 -0
  10. package/lib/factories/MetadataFactory.js +6 -48
  11. package/lib/factories/MetadataFactory.js.map +1 -1
  12. package/lib/factories/MetadataTagFactory.js +5 -3
  13. package/lib/factories/MetadataTagFactory.js.map +1 -1
  14. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +5 -0
  15. package/lib/factories/internal/metadata/emplace_metadata_array.js +38 -0
  16. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +1 -0
  17. package/lib/factories/internal/metadata/emplace_metadata_definition.d.ts +5 -0
  18. package/lib/factories/internal/metadata/emplace_metadata_definition.js +38 -0
  19. package/lib/factories/internal/metadata/emplace_metadata_definition.js.map +1 -0
  20. package/lib/factories/internal/metadata/emplace_metadata_object.js +4 -4
  21. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  22. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +5 -0
  23. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +58 -0
  24. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -0
  25. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  26. package/lib/factories/internal/metadata/explore_metadata.js +11 -34
  27. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata.js +5 -2
  30. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_array.js +4 -5
  32. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  33. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -0
  34. package/lib/factories/internal/metadata/iterate_metadata_collection.js +151 -0
  35. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -0
  36. package/lib/factories/internal/metadata/iterate_metadata_definition.d.ts +5 -0
  37. package/lib/factories/internal/metadata/iterate_metadata_definition.js +24 -0
  38. package/lib/factories/internal/metadata/iterate_metadata_definition.js.map +1 -0
  39. package/lib/factories/internal/metadata/iterate_metadata_object.js +1 -1
  40. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  41. package/lib/factories/internal/metadata/iterate_metadata_sort.d.ts +3 -0
  42. package/lib/factories/internal/metadata/iterate_metadata_sort.js +156 -0
  43. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -0
  44. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +3 -26
  45. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  46. package/lib/factories/internal/metadata/iterate_metadata_union.js +3 -3
  47. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  48. package/lib/metadata/IMetadata.d.ts +3 -2
  49. package/lib/metadata/IMetadataApplication.d.ts +2 -2
  50. package/lib/metadata/IMetadataArray.d.ts +8 -0
  51. package/lib/metadata/IMetadataArray.js +3 -0
  52. package/lib/metadata/IMetadataArray.js.map +1 -0
  53. package/lib/metadata/IMetadataCollection.d.ts +10 -0
  54. package/lib/metadata/IMetadataCollection.js +3 -0
  55. package/lib/metadata/IMetadataCollection.js.map +1 -0
  56. package/lib/metadata/IMetadataDefinition.d.ts +10 -0
  57. package/lib/metadata/IMetadataDefinition.js +3 -0
  58. package/lib/metadata/IMetadataDefinition.js.map +1 -0
  59. package/lib/metadata/IMetadataDictionary.js +3 -0
  60. package/lib/metadata/IMetadataDictionary.js.map +1 -0
  61. package/lib/metadata/IMetadataObject.d.ts +3 -0
  62. package/lib/metadata/IMetadataProperty.d.ts +1 -1
  63. package/lib/metadata/IMetadataTuple.d.ts +8 -0
  64. package/lib/metadata/IMetadataTuple.js +3 -0
  65. package/lib/metadata/IMetadataTuple.js.map +1 -0
  66. package/lib/metadata/Metadata.d.ts +24 -21
  67. package/lib/metadata/Metadata.js +323 -262
  68. package/lib/metadata/Metadata.js.map +1 -1
  69. package/lib/metadata/MetadataArray.d.ts +12 -0
  70. package/lib/metadata/MetadataArray.js +36 -0
  71. package/lib/metadata/MetadataArray.js.map +1 -0
  72. package/lib/metadata/MetadataDefinition.d.ts +16 -0
  73. package/lib/metadata/MetadataDefinition.js +39 -0
  74. package/lib/metadata/MetadataDefinition.js.map +1 -0
  75. package/lib/metadata/MetadataObject.d.ts +4 -0
  76. package/lib/metadata/MetadataObject.js +3 -5
  77. package/lib/metadata/MetadataObject.js.map +1 -1
  78. package/lib/metadata/MetadataProperty.d.ts +1 -1
  79. package/lib/metadata/MetadataProperty.js +3 -3
  80. package/lib/metadata/MetadataProperty.js.map +1 -1
  81. package/lib/metadata/MetadataTuple.d.ts +12 -0
  82. package/lib/metadata/MetadataTuple.js +36 -0
  83. package/lib/metadata/MetadataTuple.js.map +1 -0
  84. package/lib/programmers/ApplicationProgrammer.js +3 -3
  85. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  86. package/lib/programmers/AssertProgrammer.js +13 -21
  87. package/lib/programmers/AssertProgrammer.js.map +1 -1
  88. package/lib/programmers/CheckerProgrammer.d.ts +6 -7
  89. package/lib/programmers/CheckerProgrammer.js +276 -185
  90. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  91. package/lib/programmers/CloneProgrammer.js +312 -204
  92. package/lib/programmers/CloneProgrammer.js.map +1 -1
  93. package/lib/programmers/FeatureProgrammer.d.ts +21 -27
  94. package/lib/programmers/FeatureProgrammer.js +60 -63
  95. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  96. package/lib/programmers/IsProgrammer.d.ts +3 -3
  97. package/lib/programmers/IsProgrammer.js +43 -28
  98. package/lib/programmers/IsProgrammer.js.map +1 -1
  99. package/lib/programmers/LiteralsProgrammer.js +1 -0
  100. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  101. package/lib/programmers/PruneProgrammer.js +270 -176
  102. package/lib/programmers/PruneProgrammer.js.map +1 -1
  103. package/lib/programmers/RandomProgrammer.js +124 -32
  104. package/lib/programmers/RandomProgrammer.js.map +1 -1
  105. package/lib/programmers/StringifyProgrammer.js +462 -356
  106. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  107. package/lib/programmers/ValidateProgrammer.js +9 -9
  108. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  109. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  110. package/lib/programmers/helpers/FunctionImporeter.js +17 -2
  111. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  112. package/lib/programmers/helpers/RandomJoiner.d.ts +6 -1
  113. package/lib/programmers/helpers/RandomJoiner.js +11 -14
  114. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  115. package/lib/programmers/helpers/UnionExplorer.d.ts +12 -10
  116. package/lib/programmers/helpers/UnionExplorer.js +47 -12
  117. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  118. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  119. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  120. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  121. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  122. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.d.ts +1 -1
  123. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js +2 -2
  124. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js.map +1 -1
  125. package/lib/programmers/internal/application_array.js +41 -21
  126. package/lib/programmers/internal/application_array.js.map +1 -1
  127. package/lib/programmers/internal/application_definition.d.ts +5 -0
  128. package/lib/programmers/internal/application_definition.js +45 -0
  129. package/lib/programmers/internal/application_definition.js.map +1 -0
  130. package/lib/programmers/internal/application_native.js +14 -11
  131. package/lib/programmers/internal/application_native.js.map +1 -1
  132. package/lib/programmers/internal/application_object.js +19 -14
  133. package/lib/programmers/internal/application_object.js.map +1 -1
  134. package/lib/programmers/internal/application_schema.js +28 -31
  135. package/lib/programmers/internal/application_schema.js.map +1 -1
  136. package/lib/programmers/internal/application_tuple.js +34 -5
  137. package/lib/programmers/internal/application_tuple.js.map +1 -1
  138. package/lib/programmers/internal/check_union_array_like.js +54 -63
  139. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  140. package/lib/programmers/internal/feature_object_entries.js +2 -2
  141. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  142. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +2 -0
  143. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +18 -0
  144. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -0
  145. package/lib/schemas/IJsonApplication.d.ts +0 -4
  146. package/lib/schemas/IJsonComponents.d.ts +16 -4
  147. package/lib/schemas/IJsonSchema.d.ts +1 -1
  148. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  149. package/lib/transformers/FileTransformer.js +3 -3
  150. package/lib/transformers/FileTransformer.js.map +1 -1
  151. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -0
  152. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  153. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +2 -1
  154. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  155. package/lib/utils/ArrayUtil.d.ts +1 -1
  156. package/lib/utils/ArrayUtil.js +2 -1
  157. package/lib/utils/ArrayUtil.js.map +1 -1
  158. package/lib/utils/RandomGenerator.js +2 -3
  159. package/lib/utils/RandomGenerator.js.map +1 -1
  160. package/package.json +6 -1
  161. package/src/IRandomGenerator.ts +1 -0
  162. package/src/factories/CommentFactory.ts +2 -1
  163. package/src/factories/IdentifierFactory.ts +3 -1
  164. package/src/factories/MetadataCollection.ts +173 -34
  165. package/src/factories/MetadataFactory.ts +7 -29
  166. package/src/factories/MetadataTagFactory.ts +6 -3
  167. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -0
  168. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -0
  169. package/src/factories/internal/metadata/emplace_metadata_object.ts +4 -4
  170. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -0
  171. package/src/factories/internal/metadata/explore_metadata.ts +18 -44
  172. package/src/factories/internal/metadata/iterate_metadata.ts +13 -3
  173. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -11
  174. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -0
  175. package/src/factories/internal/metadata/iterate_metadata_definition.ts +34 -0
  176. package/src/factories/internal/metadata/iterate_metadata_object.ts +1 -0
  177. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -0
  178. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -31
  179. package/src/factories/internal/metadata/iterate_metadata_union.ts +13 -2
  180. package/src/metadata/IMetadata.ts +3 -2
  181. package/src/metadata/IMetadataApplication.ts +2 -2
  182. package/src/metadata/IMetadataArray.ts +10 -0
  183. package/src/metadata/IMetadataCollection.ts +11 -0
  184. package/src/metadata/IMetadataDefinition.ts +12 -0
  185. package/src/metadata/IMetadataDictionary.ts +14 -0
  186. package/src/metadata/IMetadataObject.ts +2 -13
  187. package/src/metadata/IMetadataProperty.ts +1 -1
  188. package/src/metadata/IMetadataTuple.ts +10 -0
  189. package/src/metadata/Metadata.ts +473 -134
  190. package/src/metadata/MetadataArray.ts +52 -0
  191. package/src/metadata/MetadataDefinition.ts +65 -0
  192. package/src/metadata/MetadataObject.ts +7 -20
  193. package/src/metadata/MetadataProperty.ts +5 -5
  194. package/src/metadata/MetadataTuple.ts +53 -0
  195. package/src/programmers/ApplicationProgrammer.ts +1 -2
  196. package/src/programmers/AssertProgrammer.ts +45 -39
  197. package/src/programmers/CheckerProgrammer.ts +612 -331
  198. package/src/programmers/CloneProgrammer.ts +344 -138
  199. package/src/programmers/FeatureProgrammer.ts +110 -115
  200. package/src/programmers/IsProgrammer.ts +86 -52
  201. package/src/programmers/LiteralsProgrammer.ts +1 -0
  202. package/src/programmers/PruneProgrammer.ts +304 -101
  203. package/src/programmers/RandomProgrammer.ts +227 -61
  204. package/src/programmers/StringifyProgrammer.ts +374 -182
  205. package/src/programmers/ValidateProgrammer.ts +41 -44
  206. package/src/programmers/helpers/FunctionImporeter.ts +35 -11
  207. package/src/programmers/helpers/RandomJoiner.ts +25 -13
  208. package/src/programmers/helpers/UnionExplorer.ts +76 -50
  209. package/src/programmers/helpers/UnionPredicator.ts +1 -1
  210. package/src/programmers/helpers/disable_function_importer_declare.ts +5 -0
  211. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  212. package/src/programmers/internal/application_array.ts +48 -16
  213. package/src/programmers/internal/application_definition.ts +45 -0
  214. package/src/programmers/internal/application_native.ts +15 -12
  215. package/src/programmers/internal/application_object.ts +17 -12
  216. package/src/programmers/internal/application_schema.ts +31 -65
  217. package/src/programmers/internal/application_tuple.ts +63 -13
  218. package/src/programmers/internal/check_union_array_like.ts +249 -191
  219. package/src/programmers/internal/feature_object_entries.ts +2 -2
  220. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -0
  221. package/src/schemas/IJsonApplication.ts +0 -5
  222. package/src/schemas/IJsonComponents.ts +17 -5
  223. package/src/schemas/IJsonSchema.ts +1 -1
  224. package/src/transformers/CallExpressionTransformer.ts +2 -0
  225. package/src/transformers/FileTransformer.ts +8 -8
  226. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +1 -0
  227. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +2 -1
  228. package/src/utils/ArrayUtil.ts +3 -2
  229. package/src/utils/RandomGenerator.ts +3 -3
  230. package/lib/programmers/internal/check_union_tuple.js +0 -15
  231. package/lib/programmers/internal/check_union_tuple.js.map +0 -1
  232. package/src/programmers/internal/check_union_tuple.ts +0 -33
  233. /package/lib/{programmers/internal/check_union_tuple.d.ts → metadata/IMetadataDictionary.d.ts} +0 -0
@@ -4,9 +4,14 @@ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
4
  import { IdentifierFactory } from "../factories/IdentifierFactory";
5
5
  import { MetadataCollection } from "../factories/MetadataCollection";
6
6
  import { MetadataFactory } from "../factories/MetadataFactory";
7
+ import { StatementFactory } from "../factories/StatementFactory";
7
8
  import { TypeFactory } from "../factories/TypeFactory";
8
9
 
10
+ import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
11
+ import { IMetadataTag } from "../metadata/IMetadataTag";
9
12
  import { Metadata } from "../metadata/Metadata";
13
+ import { MetadataArray } from "../metadata/MetadataArray";
14
+ import { MetadataTuple } from "../metadata/MetadataTuple";
10
15
 
11
16
  import { IProject } from "../transformers/IProject";
12
17
 
@@ -16,6 +21,7 @@ import { CloneJoiner } from "./helpers/CloneJoiner";
16
21
  import { FunctionImporter } from "./helpers/FunctionImporeter";
17
22
  import { UnionExplorer } from "./helpers/UnionExplorer";
18
23
  import { decode_union_object } from "./internal/decode_union_object";
24
+ import { wrap_metadata_rest_tuple } from "./internal/wrap_metadata_rest_tuple";
19
25
 
20
26
  export namespace CloneProgrammer {
21
27
  /**
@@ -29,36 +35,89 @@ export namespace CloneProgrammer {
29
35
  export const write =
30
36
  (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
31
37
  const importer: FunctionImporter = new FunctionImporter();
32
- return FeatureProgrammer.analyze(project)({
33
- ...CONFIG(project, importer),
34
- addition: (collection) => {
35
- const isFunctors =
36
- IsProgrammer.write_functors(project)(importer)(
37
- collection,
38
- );
39
- const isUnioners =
40
- IsProgrammer.write_unioners(project)(importer)(
41
- collection,
42
- );
43
-
44
- return [
45
- ...importer.declare(modulo),
46
- ...isFunctors.filter((_, i) =>
47
- importer.hasLocal(`$io${i}`),
48
- ),
49
- ...isUnioners.filter((_, i) =>
50
- importer.hasLocal(`$iu${i}`),
51
- ),
52
- ];
53
- },
38
+ return FeatureProgrammer.write(project)({
39
+ ...configure(project)(importer),
40
+ addition: (collection) => [
41
+ ...IsProgrammer.write_function_statements(project)(
42
+ importer,
43
+ )(collection),
44
+ ...importer.declare(modulo),
45
+ ],
54
46
  })(importer);
55
47
  };
56
48
 
49
+ const write_array_functions =
50
+ (config: FeatureProgrammer.IConfig) =>
51
+ (importer: FunctionImporter) =>
52
+ (collection: MetadataCollection): ts.VariableStatement[] =>
53
+ collection
54
+ .arrays()
55
+ .filter((a) => a.recursive)
56
+ .map((array, i) =>
57
+ StatementFactory.constant(
58
+ `${config.prefix}a${i}`,
59
+ ts.factory.createArrowFunction(
60
+ undefined,
61
+ undefined,
62
+ FeatureProgrammer.parameterDeclarations(config)(
63
+ TypeFactory.keyword("any"),
64
+ )(ts.factory.createIdentifier("input")),
65
+ TypeFactory.keyword("any"),
66
+ undefined,
67
+ decode_array_inline(config)(importer)(
68
+ ts.factory.createIdentifier("input"),
69
+ array,
70
+ {
71
+ tracable: config.trace,
72
+ source: "function",
73
+ from: "array",
74
+ postfix: "",
75
+ },
76
+ ),
77
+ ),
78
+ ),
79
+ );
80
+
81
+ const write_tuple_functions =
82
+ (project: IProject) =>
83
+ (config: FeatureProgrammer.IConfig) =>
84
+ (importer: FunctionImporter) =>
85
+ (collection: MetadataCollection): ts.VariableStatement[] =>
86
+ collection
87
+ .tuples()
88
+ .filter((t) => t.recursive)
89
+ .map((tuple, i) =>
90
+ StatementFactory.constant(
91
+ `${config.prefix}t${i}`,
92
+ ts.factory.createArrowFunction(
93
+ undefined,
94
+ undefined,
95
+ FeatureProgrammer.parameterDeclarations(config)(
96
+ TypeFactory.keyword("any"),
97
+ )(ts.factory.createIdentifier("input")),
98
+ TypeFactory.keyword("any"),
99
+ undefined,
100
+ decode_tuple_inline(project)(config)(importer)(
101
+ ts.factory.createIdentifier("input"),
102
+ tuple,
103
+ {
104
+ tracable: config.trace,
105
+ source: "function",
106
+ from: "array",
107
+ postfix: "",
108
+ },
109
+ ),
110
+ ),
111
+ ),
112
+ );
113
+
57
114
  /* -----------------------------------------------------------
58
115
  DECODERS
59
116
  ----------------------------------------------------------- */
60
117
  const decode =
61
- (project: IProject, importer: FunctionImporter) =>
118
+ (project: IProject) =>
119
+ (config: FeatureProgrammer.IConfig) =>
120
+ (importer: FunctionImporter) =>
62
121
  (
63
122
  input: ts.Expression,
64
123
  meta: Metadata,
@@ -67,8 +126,8 @@ export namespace CloneProgrammer {
67
126
  // ANY TYPE
68
127
  if (
69
128
  meta.any ||
70
- meta.arrays.some((a) => a.any) ||
71
- meta.tuples.some((t) => t.every((e) => e.any))
129
+ meta.arrays.some((a) => a.value.any) ||
130
+ meta.tuples.some((t) => t.elements.every((e) => e.any))
72
131
  )
73
132
  return ts.factory.createCallExpression(
74
133
  importer.use("any"),
@@ -92,7 +151,7 @@ export namespace CloneProgrammer {
92
151
  type: "resolved",
93
152
  is: () => IsProgrammer.decode_to_json(true)(input),
94
153
  value: () =>
95
- decode_to_json(project, importer)(
154
+ decode_to_json(project)(config)(importer)(
96
155
  input,
97
156
  meta.resolved!,
98
157
  explore,
@@ -104,7 +163,7 @@ export namespace CloneProgrammer {
104
163
  unions.push({
105
164
  type: "tuple",
106
165
  is: () =>
107
- IsProgrammer.decode(project, importer)(
166
+ IsProgrammer.decode(project)(importer)(
108
167
  input,
109
168
  (() => {
110
169
  const partial = Metadata.initialize();
@@ -116,7 +175,11 @@ export namespace CloneProgrammer {
116
175
  [],
117
176
  ),
118
177
  value: () =>
119
- decode_tuple(project, importer)(input, tuple, explore),
178
+ decode_tuple(project)(config)(importer)(
179
+ input,
180
+ tuple,
181
+ explore,
182
+ ),
120
183
  });
121
184
 
122
185
  // ARRAYS
@@ -125,15 +188,13 @@ export namespace CloneProgrammer {
125
188
  type: "array",
126
189
  is: () => ExpressionFactory.isArray(input),
127
190
  value: () =>
128
- explore_arrays(project, importer)(
191
+ explore_arrays(project)(config)(importer)(
129
192
  input,
130
193
  meta.arrays,
131
194
  {
132
195
  ...explore,
133
196
  from: "array",
134
197
  },
135
- [],
136
- [],
137
198
  ),
138
199
  });
139
200
 
@@ -176,7 +237,7 @@ export namespace CloneProgrammer {
176
237
  checkArray: false,
177
238
  })(input),
178
239
  value: () =>
179
- explore_objects(importer)(input, meta, {
240
+ explore_objects(config)(importer)(input, meta, {
180
241
  ...explore,
181
242
  from: "object",
182
243
  }),
@@ -199,13 +260,15 @@ export namespace CloneProgrammer {
199
260
  };
200
261
 
201
262
  const decode_to_json =
202
- (project: IProject, importer: FunctionImporter) =>
263
+ (project: IProject) =>
264
+ (config: FeatureProgrammer.IConfig) =>
265
+ (importer: FunctionImporter) =>
203
266
  (
204
267
  input: ts.Expression,
205
268
  resolved: Metadata,
206
269
  explore: FeatureProgrammer.IExplore,
207
270
  ): ts.Expression => {
208
- return decode(project, importer)(
271
+ return decode(project)(config)(importer)(
209
272
  ts.factory.createCallExpression(
210
273
  IdentifierFactory.access(input)("toJSON"),
211
274
  undefined,
@@ -216,75 +279,133 @@ export namespace CloneProgrammer {
216
279
  );
217
280
  };
218
281
 
282
+ const decode_object = (importer: FunctionImporter) =>
283
+ FeatureProgrammer.decode_object({
284
+ trace: false,
285
+ path: false,
286
+ prefix: PREFIX,
287
+ })(importer);
288
+
289
+ const decode_array =
290
+ (config: FeatureProgrammer.IConfig) =>
291
+ (importer: FunctionImporter) =>
292
+ (
293
+ input: ts.Expression,
294
+ array: MetadataArray,
295
+ explore: FeatureProgrammer.IExplore,
296
+ ) =>
297
+ array.recursive
298
+ ? ts.factory.createCallExpression(
299
+ ts.factory.createIdentifier(
300
+ importer.useLocal(`${config.prefix}a${array.index}`),
301
+ ),
302
+ undefined,
303
+ FeatureProgrammer.argumentsArray(config)({
304
+ ...explore,
305
+ source: "function",
306
+ from: "array",
307
+ })(input),
308
+ )
309
+ : decode_array_inline(config)(importer)(input, array, explore);
310
+
311
+ const decode_array_inline =
312
+ (config: FeatureProgrammer.IConfig) =>
313
+ (importer: FunctionImporter) =>
314
+ (
315
+ input: ts.Expression,
316
+ array: MetadataArray,
317
+ explore: FeatureProgrammer.IExplore,
318
+ ) =>
319
+ FeatureProgrammer.decode_array(config)(importer)(CloneJoiner.array)(
320
+ input,
321
+ array,
322
+ explore,
323
+ [],
324
+ [],
325
+ );
326
+
219
327
  const decode_tuple =
220
- (project: IProject, importer: FunctionImporter) =>
328
+ (project: IProject) =>
329
+ (config: FeatureProgrammer.IConfig) =>
330
+ (importer: FunctionImporter) =>
221
331
  (
222
332
  input: ts.Expression,
223
- tuple: Metadata[],
333
+ tuple: MetadataTuple,
334
+ explore: FeatureProgrammer.IExplore,
335
+ ): ts.Expression =>
336
+ tuple.recursive
337
+ ? ts.factory.createCallExpression(
338
+ ts.factory.createIdentifier(
339
+ importer.useLocal(`${config.prefix}t${tuple.index}`),
340
+ ),
341
+ undefined,
342
+ FeatureProgrammer.argumentsArray(config)({
343
+ ...explore,
344
+ source: "function",
345
+ })(input),
346
+ )
347
+ : decode_tuple_inline(project)(config)(importer)(
348
+ input,
349
+ tuple,
350
+ explore,
351
+ );
352
+
353
+ const decode_tuple_inline =
354
+ (project: IProject) =>
355
+ (config: FeatureProgrammer.IConfig) =>
356
+ (importer: FunctionImporter) =>
357
+ (
358
+ input: ts.Expression,
359
+ tuple: MetadataTuple,
224
360
  explore: FeatureProgrammer.IExplore,
225
361
  ): ts.Expression => {
226
- const children: ts.Expression[] = tuple
362
+ const children: ts.Expression[] = tuple.elements
227
363
  .filter((m) => m.rest === null)
228
364
  .map((elem, index) =>
229
- decode(project, importer)(
365
+ decode(project)(config)(importer)(
230
366
  ts.factory.createElementAccessExpression(input, index),
231
367
  elem,
232
368
  {
233
369
  ...explore,
234
370
  from: "array",
371
+ postfix: explore.postfix.length
372
+ ? `${explore.postfix.slice(0, -1)}[${index}]"`
373
+ : `"[${index}]"`,
235
374
  },
236
375
  ),
237
376
  );
238
377
  const rest = (() => {
239
- if (tuple.length === 0) return null;
378
+ if (tuple.elements.length === 0) return null;
240
379
 
241
- const last: Metadata = tuple[tuple.length - 1]!;
380
+ const last: Metadata = tuple.elements.at(-1)!;
242
381
  const rest: Metadata | null = last.rest;
243
382
  if (rest === null) return null;
244
383
 
245
- return decode(project, importer)(
384
+ return decode(project)(config)(importer)(
246
385
  ts.factory.createCallExpression(
247
386
  IdentifierFactory.access(input)("slice"),
248
387
  undefined,
249
- [ts.factory.createNumericLiteral(tuple.length - 1)],
388
+ [
389
+ ts.factory.createNumericLiteral(
390
+ tuple.elements.length - 1,
391
+ ),
392
+ ],
250
393
  ),
251
- (() => {
252
- const wrapper: Metadata = Metadata.initialize();
253
- wrapper.arrays.push(rest);
254
- return wrapper;
255
- })(),
394
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
256
395
  {
257
396
  ...explore,
258
- start: tuple.length - 1,
397
+ start: tuple.elements.length - 1,
259
398
  },
260
399
  );
261
400
  })();
262
401
  return CloneJoiner.tuple(children, rest);
263
402
  };
264
403
 
265
- const decode_array = (project: IProject, importer: FunctionImporter) =>
266
- FeatureProgrammer.decode_array(CONFIG(project, importer))(importer)(
267
- CloneJoiner.array,
268
- );
269
-
270
- const decode_object = (importer: FunctionImporter) =>
271
- FeatureProgrammer.decode_object({
272
- trace: false,
273
- path: false,
274
- functors: FUNCTORS,
275
- })(importer);
276
-
277
- const explore_arrays = (project: IProject, importer: FunctionImporter) =>
278
- UnionExplorer.array({
279
- checker: IsProgrammer.decode(project, importer),
280
- decoder: decode_array(project, importer),
281
- empty: ts.factory.createReturnStatement(),
282
- success: ts.factory.createTrue(),
283
- failure: (input, expected) =>
284
- create_throw_error(importer, input, expected),
285
- });
286
-
404
+ /* -----------------------------------------------------------
405
+ EXPLORERS FOR UNION TYPES
406
+ ----------------------------------------------------------- */
287
407
  const explore_objects =
408
+ (config: FeatureProgrammer.IConfig) =>
288
409
  (importer: FunctionImporter) =>
289
410
  (
290
411
  input: ts.Expression,
@@ -299,58 +420,140 @@ export namespace CloneProgrammer {
299
420
  );
300
421
 
301
422
  return ts.factory.createCallExpression(
302
- ts.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
423
+ ts.factory.createIdentifier(
424
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
425
+ ),
426
+ undefined,
427
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
428
+ );
429
+ };
430
+
431
+ const explore_arrays =
432
+ (project: IProject) =>
433
+ (config: FeatureProgrammer.IConfig) =>
434
+ (importer: FunctionImporter) =>
435
+ (
436
+ input: ts.Expression,
437
+ elements: MetadataArray[],
438
+ explore: FeatureProgrammer.IExplore,
439
+ ): ts.Expression =>
440
+ explore_array_like_union_types(config)(importer)(
441
+ UnionExplorer.array({
442
+ checker: IsProgrammer.decode(project)(importer),
443
+ decoder: decode_array(config)(importer),
444
+ empty: ts.factory.createIdentifier("[]"),
445
+ success: ts.factory.createTrue(),
446
+ failure: (input, expected) =>
447
+ create_throw_error(importer)(expected)(input),
448
+ }),
449
+ )(input, elements, explore);
450
+
451
+ const explore_array_like_union_types =
452
+ (config: FeatureProgrammer.IConfig) =>
453
+ (importer: FunctionImporter) =>
454
+ <T extends MetadataArray | MetadataTuple>(
455
+ factory: (
456
+ parameters: ts.ParameterDeclaration[],
457
+ ) => (
458
+ input: ts.Expression,
459
+ elements: T[],
460
+ explore: FeatureProgrammer.IExplore,
461
+ tags: IMetadataTag[],
462
+ jsDocTags: IJsDocTagInfo[],
463
+ ) => ts.ArrowFunction,
464
+ ) =>
465
+ (
466
+ input: ts.Expression,
467
+ elements: T[],
468
+ explore: FeatureProgrammer.IExplore,
469
+ ): ts.Expression => {
470
+ const arrow =
471
+ (parameters: ts.ParameterDeclaration[]) =>
472
+ (explore: FeatureProgrammer.IExplore) =>
473
+ (input: ts.Expression): ts.ArrowFunction =>
474
+ factory(parameters)(input, elements, explore, [], []);
475
+ if (elements.every((e) => e.recursive === false))
476
+ ts.factory.createCallExpression(
477
+ arrow([])(explore)(input),
478
+ undefined,
479
+ [],
480
+ );
481
+
482
+ explore = {
483
+ ...explore,
484
+ source: "function",
485
+ from: "array",
486
+ };
487
+ return ts.factory.createCallExpression(
488
+ ts.factory.createIdentifier(
489
+ importer.emplaceUnion(
490
+ config.prefix,
491
+ elements.map((e) => e.name).join(" | "),
492
+ () =>
493
+ arrow(
494
+ FeatureProgrammer.parameterDeclarations(config)(
495
+ TypeFactory.keyword("any"),
496
+ )(ts.factory.createIdentifier("input")),
497
+ )({
498
+ ...explore,
499
+ postfix: "",
500
+ })(ts.factory.createIdentifier("input")),
501
+ ),
502
+ ),
303
503
  undefined,
304
- [input],
504
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
305
505
  );
306
506
  };
307
507
 
308
508
  /* -----------------------------------------------------------
309
509
  CONFIGURATIONS
310
510
  ----------------------------------------------------------- */
311
- const FUNCTORS = "$co";
312
- const UNIONERS = "$cu";
313
-
314
- const CONFIG = (
315
- project: IProject,
316
- importer: FunctionImporter,
317
- ): FeatureProgrammer.IConfig => ({
318
- types: {
319
- input: (type, name) =>
320
- ts.factory.createTypeReferenceNode(
321
- name ?? TypeFactory.getFullName(project.checker)(type),
322
- ),
323
- output: (type, name) =>
324
- ts.factory.createTypeReferenceNode(
325
- `typia.Primitive<${
326
- name ?? TypeFactory.getFullName(project.checker)(type)
327
- }>`,
328
- ),
329
- },
330
- functors: FUNCTORS,
331
- unioners: UNIONERS,
332
- trace: false,
333
- path: false,
334
- initializer,
335
- decoder: decode(project, importer),
336
- objector: OBJECTOR(project, importer),
337
- });
338
-
339
- const OBJECTOR = (
340
- project: IProject,
341
- importer: FunctionImporter,
342
- ): FeatureProgrammer.IConfig.IObjector => ({
343
- checker: IsProgrammer.decode(project, importer),
344
- decoder: decode_object(importer),
345
- joiner: CloneJoiner.object,
346
- unionizer: decode_union_object(IsProgrammer.decode_object(importer))(
347
- decode_object(importer),
348
- )((exp) => exp)((value, expected) =>
349
- create_throw_error(importer, value, expected),
350
- ),
351
- failure: (input, expected) =>
352
- create_throw_error(importer, input, expected),
353
- });
511
+ const PREFIX = "$c";
512
+
513
+ const configure =
514
+ (project: IProject) =>
515
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
516
+ const config: FeatureProgrammer.IConfig = {
517
+ types: {
518
+ input: (type, name) =>
519
+ ts.factory.createTypeReferenceNode(
520
+ name ??
521
+ TypeFactory.getFullName(project.checker)(type),
522
+ ),
523
+ output: (type, name) =>
524
+ ts.factory.createTypeReferenceNode(
525
+ `typia.Primitive<${
526
+ name ??
527
+ TypeFactory.getFullName(project.checker)(type)
528
+ }>`,
529
+ ),
530
+ },
531
+ prefix: PREFIX,
532
+ trace: false,
533
+ path: false,
534
+ initializer,
535
+ decoder: () => decode(project)(config)(importer),
536
+ objector: {
537
+ checker: () => IsProgrammer.decode(project)(importer),
538
+ decoder: () => decode_object(importer),
539
+ joiner: CloneJoiner.object,
540
+ unionizer: decode_union_object(
541
+ IsProgrammer.decode_object(importer),
542
+ )(decode_object(importer))((exp) => exp)(
543
+ (input, expected) =>
544
+ create_throw_error(importer)(expected)(input),
545
+ ),
546
+ failure: (input, expected) =>
547
+ create_throw_error(importer)(expected)(input),
548
+ },
549
+ generator: {
550
+ arrays: () => write_array_functions(config)(importer),
551
+ tuples: () =>
552
+ write_tuple_functions(project)(config)(importer),
553
+ },
554
+ };
555
+ return config;
556
+ };
354
557
 
355
558
  const initializer: FeatureProgrammer.IConfig["initializer"] =
356
559
  ({ checker }) =>
@@ -359,31 +562,34 @@ export namespace CloneProgrammer {
359
562
  const meta = MetadataFactory.analyze(checker)({
360
563
  resolve: true,
361
564
  constant: true,
565
+ absorb: true,
362
566
  })(collection)(type);
363
567
  return [collection, meta];
364
568
  };
365
569
 
366
- const create_throw_error = (
367
- importer: FunctionImporter,
368
- value: ts.Expression,
369
- expected: string,
370
- ) =>
371
- ts.factory.createExpressionStatement(
372
- ts.factory.createCallExpression(
373
- importer.use("throws"),
374
- [],
375
- [
376
- ts.factory.createObjectLiteralExpression(
377
- [
378
- ts.factory.createPropertyAssignment(
379
- "expected",
380
- ts.factory.createStringLiteral(expected),
381
- ),
382
- ts.factory.createPropertyAssignment("value", value),
383
- ],
384
- true,
385
- ),
386
- ],
387
- ),
388
- );
570
+ const create_throw_error =
571
+ (importer: FunctionImporter) =>
572
+ (expected: string) =>
573
+ (value: ts.Expression) =>
574
+ ts.factory.createExpressionStatement(
575
+ ts.factory.createCallExpression(
576
+ importer.use("throws"),
577
+ [],
578
+ [
579
+ ts.factory.createObjectLiteralExpression(
580
+ [
581
+ ts.factory.createPropertyAssignment(
582
+ "expected",
583
+ ts.factory.createStringLiteral(expected),
584
+ ),
585
+ ts.factory.createPropertyAssignment(
586
+ "value",
587
+ value,
588
+ ),
589
+ ],
590
+ true,
591
+ ),
592
+ ],
593
+ ),
594
+ );
389
595
  }