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
@@ -4,12 +4,16 @@ 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
  import { ValueFactory } from "../factories/ValueFactory";
9
10
 
11
+ import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
10
12
  import { IMetadataTag } from "../metadata/IMetadataTag";
11
13
  import { Metadata } from "../metadata/Metadata";
14
+ import { MetadataArray } from "../metadata/MetadataArray";
12
15
  import { MetadataObject } from "../metadata/MetadataObject";
16
+ import { MetadataTuple } from "../metadata/MetadataTuple";
13
17
 
14
18
  import { IProject } from "../transformers/IProject";
15
19
 
@@ -29,6 +33,7 @@ import { UnionExplorer } from "./helpers/UnionExplorer";
29
33
  import { check_native } from "./internal/check_native";
30
34
  import { decode_union_object } from "./internal/decode_union_object";
31
35
  import { feature_object_entries } from "./internal/feature_object_entries";
36
+ import { wrap_metadata_rest_tuple } from "./internal/wrap_metadata_rest_tuple";
32
37
 
33
38
  export namespace StringifyProgrammer {
34
39
  /* -----------------------------------------------------------
@@ -45,41 +50,96 @@ export namespace StringifyProgrammer {
45
50
  export const write =
46
51
  (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
47
52
  const importer: FunctionImporter = new FunctionImporter();
48
- return FeatureProgrammer.analyze(project)({
49
- ...configure(project)(importer),
50
- addition: (collection) => {
51
- const isFunctors =
52
- IsProgrammer.write_functors(project)(importer)(
53
- collection,
54
- );
55
- const isUnioners =
56
- IsProgrammer.write_unioners(project)(importer)(
57
- collection,
58
- );
53
+ const config: FeatureProgrammer.IConfig =
54
+ configure(project)(importer);
55
+
56
+ return FeatureProgrammer.write(project)({
57
+ ...config,
58
+ addition: (collection) => [
59
+ ...IsProgrammer.write_function_statements(project)(
60
+ importer,
61
+ )(collection),
62
+ ...importer.declare(modulo),
63
+ ],
64
+ })(importer);
65
+ };
59
66
 
60
- return [
61
- ...importer.declare(modulo),
62
- ...isFunctors.filter((_, i) =>
63
- importer.hasLocal(`$io${i}`),
67
+ const write_array_functions =
68
+ (config: FeatureProgrammer.IConfig) =>
69
+ (importer: FunctionImporter) =>
70
+ (collection: MetadataCollection): ts.VariableStatement[] =>
71
+ collection
72
+ .arrays()
73
+ .filter((a) => a.recursive)
74
+ .map((array, i) =>
75
+ StatementFactory.constant(
76
+ `${config.prefix}a${i}`,
77
+ ts.factory.createArrowFunction(
78
+ undefined,
79
+ undefined,
80
+ FeatureProgrammer.parameterDeclarations(config)(
81
+ TypeFactory.keyword("any"),
82
+ )(ts.factory.createIdentifier("input")),
83
+ TypeFactory.keyword("any"),
84
+ undefined,
85
+ decode_array_inline(config)(importer)(
86
+ ts.factory.createIdentifier("input"),
87
+ array,
88
+ {
89
+ tracable: config.trace,
90
+ source: "function",
91
+ from: "array",
92
+ postfix: "",
93
+ },
94
+ ),
64
95
  ),
65
- ...isUnioners.filter((_, i) =>
66
- importer.hasLocal(`$iu${i}`),
96
+ ),
97
+ );
98
+
99
+ const write_tuple_functions =
100
+ (project: IProject) =>
101
+ (config: FeatureProgrammer.IConfig) =>
102
+ (importer: FunctionImporter) =>
103
+ (collection: MetadataCollection): ts.VariableStatement[] =>
104
+ collection
105
+ .tuples()
106
+ .filter((t) => t.recursive)
107
+ .map((tuple, i) =>
108
+ StatementFactory.constant(
109
+ `${config.prefix}t${i}`,
110
+ ts.factory.createArrowFunction(
111
+ undefined,
112
+ undefined,
113
+ FeatureProgrammer.parameterDeclarations(config)(
114
+ TypeFactory.keyword("any"),
115
+ )(ts.factory.createIdentifier("input")),
116
+ TypeFactory.keyword("any"),
117
+ undefined,
118
+ decode_tuple_inline(project)(config)(importer)(
119
+ ts.factory.createIdentifier("input"),
120
+ tuple,
121
+ {
122
+ tracable: config.trace,
123
+ source: "function",
124
+ from: "array",
125
+ postfix: "",
126
+ },
127
+ ),
67
128
  ),
68
- ];
69
- },
70
- })(importer);
71
- };
129
+ ),
130
+ );
72
131
 
73
132
  /* -----------------------------------------------------------
74
133
  DECODERS
75
134
  ----------------------------------------------------------- */
76
135
  const decode =
77
- (project: IProject, importer: FunctionImporter) =>
136
+ (project: IProject) =>
137
+ (config: FeatureProgrammer.IConfig) =>
138
+ (importer: FunctionImporter) =>
78
139
  (
79
140
  input: ts.Expression,
80
141
  meta: Metadata,
81
142
  explore: FeatureProgrammer.IExplore,
82
- tags: IMetadataTag[],
83
143
  ): ts.Expression => {
84
144
  // ANY TYPE
85
145
  if (meta.any === true)
@@ -135,22 +195,20 @@ export namespace StringifyProgrammer {
135
195
  // toJSON() METHOD
136
196
  if (meta.resolved !== null)
137
197
  if (size === 1)
138
- return decode_to_json(project, importer)(
198
+ return decode_to_json(project)(config)(importer)(
139
199
  input,
140
200
  meta.resolved,
141
201
  explore,
142
- tags,
143
202
  );
144
203
  else
145
204
  unions.push({
146
205
  type: "resolved",
147
206
  is: () => IsProgrammer.decode_to_json(false)(input),
148
207
  value: () =>
149
- decode_to_json(project, importer)(
208
+ decode_to_json(project)(config)(importer)(
150
209
  input,
151
210
  meta.resolved!,
152
211
  explore,
153
- tags,
154
212
  ),
155
213
  });
156
214
  else if (meta.functional === true)
@@ -171,7 +229,7 @@ export namespace StringifyProgrammer {
171
229
  unions.push({
172
230
  type: "template literal",
173
231
  is: () =>
174
- IsProgrammer.decode(project, importer)(
232
+ IsProgrammer.decode(project)(importer)(
175
233
  input,
176
234
  partial,
177
235
  explore,
@@ -183,7 +241,6 @@ export namespace StringifyProgrammer {
183
241
  input,
184
242
  "string",
185
243
  explore,
186
- tags,
187
244
  ),
188
245
  });
189
246
  }
@@ -196,7 +253,7 @@ export namespace StringifyProgrammer {
196
253
  unions.push({
197
254
  type: "atomic",
198
255
  is: () =>
199
- IsProgrammer.decode(project, importer)(
256
+ IsProgrammer.decode(project)(importer)(
200
257
  input,
201
258
  (() => {
202
259
  const partial = Metadata.initialize();
@@ -212,14 +269,13 @@ export namespace StringifyProgrammer {
212
269
  input,
213
270
  constant.type,
214
271
  explore,
215
- tags,
216
272
  ),
217
273
  });
218
274
  else if (meta.templates.length === 0)
219
275
  unions.push({
220
276
  type: "const string",
221
277
  is: () =>
222
- IsProgrammer.decode(project, importer)(
278
+ IsProgrammer.decode(project)(importer)(
223
279
  input,
224
280
  (() => {
225
281
  const partial = Metadata.initialize();
@@ -244,7 +300,7 @@ export namespace StringifyProgrammer {
244
300
  unions.push({
245
301
  type: "atomic",
246
302
  is: () =>
247
- IsProgrammer.decode(project, importer)(
303
+ IsProgrammer.decode(project)(importer)(
248
304
  input,
249
305
  (() => {
250
306
  const partial = Metadata.initialize();
@@ -260,13 +316,12 @@ export namespace StringifyProgrammer {
260
316
  input,
261
317
  type,
262
318
  explore,
263
- tags,
264
319
  ),
265
320
  });
266
321
 
267
322
  // TUPLES
268
323
  for (const tuple of meta.tuples) {
269
- for (const child of tuple)
324
+ for (const child of tuple.elements)
270
325
  if (StringifyPredicator.undefindable(meta))
271
326
  throw new Error(
272
327
  `Error on typia.stringify(): tuple cannot contain undefined value - (${child.getName()}).`,
@@ -274,7 +329,7 @@ export namespace StringifyProgrammer {
274
329
  unions.push({
275
330
  type: "tuple",
276
331
  is: () =>
277
- IsProgrammer.decode(project, importer)(
332
+ IsProgrammer.decode(project)(importer)(
278
333
  input,
279
334
  (() => {
280
335
  const partial = Metadata.initialize();
@@ -286,11 +341,10 @@ export namespace StringifyProgrammer {
286
341
  [],
287
342
  ),
288
343
  value: () =>
289
- decode_tuple(project)(importer)(
344
+ decode_tuple(project)(config)(importer)(
290
345
  input,
291
346
  tuple,
292
347
  explore,
293
- tags,
294
348
  ),
295
349
  });
296
350
  }
@@ -298,30 +352,37 @@ export namespace StringifyProgrammer {
298
352
  // ARRAYS
299
353
  if (meta.arrays.length) {
300
354
  for (const child of meta.arrays)
301
- if (StringifyPredicator.undefindable(child))
355
+ if (StringifyPredicator.undefindable(child.value))
302
356
  throw new Error(
303
- `Error on typia.stringify(): array cannot contain undefined value (${child.getName()}).`,
357
+ `Error on typia.stringify(): array cannot contain undefined value (${child.value.getName()}).`,
304
358
  );
305
- const value: () => ts.Expression = meta.arrays.some(
306
- (elem) => elem.any,
307
- )
308
- ? () =>
309
- ts.factory.createCallExpression(
310
- ts.factory.createIdentifier("JSON.stringify"),
311
- undefined,
312
- [input],
313
- )
314
- : () =>
315
- explore_arrays(project)(importer)(
316
- input,
317
- meta.arrays,
318
- {
319
- ...explore,
320
- from: "array",
321
- },
322
- [],
323
- [],
324
- );
359
+ const value: () => ts.Expression =
360
+ meta.arrays.length === 1
361
+ ? () =>
362
+ decode_array(config)(importer)(
363
+ input,
364
+ meta.arrays[0]!,
365
+ {
366
+ ...explore,
367
+ from: "array",
368
+ },
369
+ )
370
+ : meta.arrays.some((elem) => elem.value.any)
371
+ ? () =>
372
+ ts.factory.createCallExpression(
373
+ ts.factory.createIdentifier("JSON.stringify"),
374
+ undefined,
375
+ [input],
376
+ )
377
+ : () =>
378
+ explore_arrays(project)(config)(importer)(
379
+ input,
380
+ meta.arrays,
381
+ {
382
+ ...explore,
383
+ from: "array",
384
+ },
385
+ );
325
386
 
326
387
  unions.push({
327
388
  type: "array",
@@ -342,7 +403,6 @@ export namespace StringifyProgrammer {
342
403
  input,
343
404
  native.toLowerCase() as Atomic.Literal,
344
405
  explore,
345
- tags,
346
406
  )
347
407
  : ts.factory.createStringLiteral("{}"),
348
408
  });
@@ -385,17 +445,26 @@ export namespace StringifyProgrammer {
385
445
  ? (() => {
386
446
  const obj: MetadataObject = meta.objects[0]!;
387
447
  const entries: IExpressionEntry<ts.Expression>[] =
388
- feature_object_entries<ts.Expression>({
389
- decoder: decode(project, importer),
448
+ feature_object_entries({
449
+ decoder: () =>
450
+ decode(project)(config)(importer),
390
451
  trace: false,
391
452
  path: false,
392
- })(importer)(obj)(input);
453
+ })(importer)(obj)(
454
+ ts.factory.createAsExpression(
455
+ input,
456
+ TypeFactory.keyword("any"),
457
+ ),
458
+ );
393
459
  return StringifyJoiner.object(importer)(
394
- input,
460
+ ts.factory.createAsExpression(
461
+ input,
462
+ TypeFactory.keyword("any"),
463
+ ),
395
464
  entries,
396
465
  );
397
466
  })()
398
- : explore_objects(importer)(input, meta, {
467
+ : explore_objects(config)(importer)(input, meta, {
399
468
  ...explore,
400
469
  from: "object",
401
470
  }),
@@ -438,61 +507,117 @@ export namespace StringifyProgrammer {
438
507
  );
439
508
  };
440
509
 
441
- const decode_array = (project: IProject) => (importer: FunctionImporter) =>
442
- FeatureProgrammer.decode_array(configure(project)(importer))(importer)(
443
- StringifyJoiner.array,
444
- );
445
-
446
510
  const decode_object = (importer: FunctionImporter) =>
447
511
  FeatureProgrammer.decode_object({
448
512
  trace: false,
449
513
  path: false,
450
- functors: FUNCTORS,
514
+ prefix: PREFIX,
451
515
  })(importer);
452
516
 
517
+ const decode_array =
518
+ (config: FeatureProgrammer.IConfig) =>
519
+ (importer: FunctionImporter) =>
520
+ (
521
+ input: ts.Expression,
522
+ array: MetadataArray,
523
+ explore: FeatureProgrammer.IExplore,
524
+ ) =>
525
+ array.recursive
526
+ ? ts.factory.createCallExpression(
527
+ ts.factory.createIdentifier(
528
+ importer.useLocal(`${config.prefix}a${array.index}`),
529
+ ),
530
+ undefined,
531
+ FeatureProgrammer.argumentsArray(config)({
532
+ ...explore,
533
+ source: "function",
534
+ from: "array",
535
+ })(input),
536
+ )
537
+ : decode_array_inline(config)(importer)(input, array, explore);
538
+
539
+ const decode_array_inline =
540
+ (config: FeatureProgrammer.IConfig) =>
541
+ (importer: FunctionImporter) =>
542
+ (
543
+ input: ts.Expression,
544
+ array: MetadataArray,
545
+ explore: FeatureProgrammer.IExplore,
546
+ ) =>
547
+ FeatureProgrammer.decode_array(config)(importer)(
548
+ StringifyJoiner.array,
549
+ )(input, array, explore, [], []);
550
+
453
551
  const decode_tuple =
454
552
  (project: IProject) =>
553
+ (config: FeatureProgrammer.IConfig) =>
554
+ (importer: FunctionImporter) =>
555
+ (
556
+ input: ts.Expression,
557
+ tuple: MetadataTuple,
558
+ explore: FeatureProgrammer.IExplore,
559
+ ): ts.Expression =>
560
+ tuple.recursive
561
+ ? ts.factory.createCallExpression(
562
+ ts.factory.createIdentifier(
563
+ importer.useLocal(`${config.prefix}t${tuple.index}`),
564
+ ),
565
+ undefined,
566
+ FeatureProgrammer.argumentsArray(config)({
567
+ ...explore,
568
+ source: "function",
569
+ })(input),
570
+ )
571
+ : decode_tuple_inline(project)(config)(importer)(
572
+ input,
573
+ tuple,
574
+ explore,
575
+ );
576
+
577
+ const decode_tuple_inline =
578
+ (project: IProject) =>
579
+ (config: FeatureProgrammer.IConfig) =>
455
580
  (importer: FunctionImporter) =>
456
581
  (
457
582
  input: ts.Expression,
458
- tuple: Metadata[],
583
+ tuple: MetadataTuple,
459
584
  explore: FeatureProgrammer.IExplore,
460
- tags: IMetadataTag[],
461
585
  ): ts.Expression => {
462
- const children: ts.Expression[] = tuple
586
+ const children: ts.Expression[] = tuple.elements
463
587
  .filter((elem) => elem.rest === null)
464
588
  .map((elem, index) =>
465
- decode(project, importer)(
589
+ decode(project)(config)(importer)(
466
590
  ts.factory.createElementAccessExpression(input, index),
467
591
  elem,
468
592
  {
469
593
  ...explore,
470
594
  from: "array",
595
+ postfix: explore.postfix.length
596
+ ? `${explore.postfix.slice(0, -1)}[${index}]"`
597
+ : `"[${index}]"`,
471
598
  },
472
- tags,
473
599
  ),
474
600
  );
475
601
  const rest = (() => {
476
- if (tuple.length === 0) return null;
477
- const last = tuple[tuple.length - 1]!;
602
+ if (tuple.elements.length === 0) return null;
603
+ const last = tuple.elements.at(-1)!;
478
604
  if (last.rest === null) return null;
479
605
 
480
- const code = decode(project, importer)(
606
+ const code = decode(project)(config)(importer)(
481
607
  ts.factory.createCallExpression(
482
608
  IdentifierFactory.access(input)("slice"),
483
609
  undefined,
484
- [ts.factory.createNumericLiteral(tuple.length - 1)],
610
+ [
611
+ ts.factory.createNumericLiteral(
612
+ tuple.elements.length - 1,
613
+ ),
614
+ ],
485
615
  ),
486
- (() => {
487
- const wrapper: Metadata = Metadata.initialize();
488
- wrapper.arrays.push(tuple[tuple.length - 1]!.rest!);
489
- return wrapper;
490
- })(),
616
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
491
617
  {
492
618
  ...explore,
493
- start: tuple.length - 1,
619
+ start: tuple.elements.length - 1,
494
620
  },
495
- tags,
496
621
  );
497
622
  return ts.factory.createCallExpression(
498
623
  importer.use("rest"),
@@ -510,21 +635,13 @@ export namespace StringifyProgrammer {
510
635
  input: ts.Expression,
511
636
  type: string,
512
637
  explore: FeatureProgrammer.IExplore,
513
- tagList: IMetadataTag[],
514
638
  ) => {
515
639
  if (type === "string")
516
- if (tagList.find((tag) => tag.kind === "format") !== undefined)
517
- return [
518
- ts.factory.createStringLiteral('"'),
519
- input,
520
- ts.factory.createStringLiteral('"'),
521
- ].reduce((x, y) => ts.factory.createAdd(x, y));
522
- else
523
- return ts.factory.createCallExpression(
524
- importer.use("string"),
525
- undefined,
526
- [input],
527
- );
640
+ return ts.factory.createCallExpression(
641
+ importer.use("string"),
642
+ undefined,
643
+ [input],
644
+ );
528
645
  else if (
529
646
  type === "number" &&
530
647
  OptionPredicator.numeric(project.options)
@@ -563,19 +680,19 @@ export namespace StringifyProgrammer {
563
680
  input,
564
681
  "string",
565
682
  explore,
566
- [],
567
683
  );
568
684
  };
569
685
 
570
686
  const decode_to_json =
571
- (project: IProject, importer: FunctionImporter) =>
687
+ (project: IProject) =>
688
+ (config: FeatureProgrammer.IConfig) =>
689
+ (importer: FunctionImporter) =>
572
690
  (
573
691
  input: ts.Expression,
574
692
  resolved: Metadata,
575
693
  explore: FeatureProgrammer.IExplore,
576
- tags: IMetadataTag[],
577
694
  ): ts.Expression => {
578
- return decode(project, importer)(
695
+ return decode(project)(config)(importer)(
579
696
  ts.factory.createCallExpression(
580
697
  IdentifierFactory.access(input)("toJSON"),
581
698
  undefined,
@@ -583,7 +700,6 @@ export namespace StringifyProgrammer {
583
700
  ),
584
701
  resolved,
585
702
  explore,
586
- tags,
587
703
  );
588
704
  };
589
705
 
@@ -595,35 +711,98 @@ export namespace StringifyProgrammer {
595
711
  /* -----------------------------------------------------------
596
712
  EXPLORERS
597
713
  ----------------------------------------------------------- */
598
- const explore_arrays =
599
- (project: IProject) => (importer: FunctionImporter) =>
600
- UnionExplorer.array({
601
- checker: IsProgrammer.decode(project, importer),
602
- decoder: decode_array(project)(importer),
603
- empty: ts.factory.createStringLiteral("[]"),
604
- success: ts.factory.createTrue(),
605
- failure: (input, expected) =>
606
- create_throw_error(importer, input, expected),
607
- });
608
-
609
714
  const explore_objects =
715
+ (config: FeatureProgrammer.IConfig) =>
610
716
  (importer: FunctionImporter) =>
611
717
  (
612
718
  input: ts.Expression,
613
719
  meta: Metadata,
614
720
  explore: FeatureProgrammer.IExplore,
615
- ) => {
616
- if (meta.objects.length === 1)
617
- return decode_object(importer)(
618
- input,
619
- meta.objects[0]!,
620
- explore,
721
+ ) =>
722
+ meta.objects.length === 1
723
+ ? decode_object(importer)(input, meta.objects[0]!, explore)
724
+ : ts.factory.createCallExpression(
725
+ ts.factory.createIdentifier(
726
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
727
+ ),
728
+ undefined,
729
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
730
+ );
731
+
732
+ const explore_arrays =
733
+ (project: IProject) =>
734
+ (config: FeatureProgrammer.IConfig) =>
735
+ (importer: FunctionImporter) =>
736
+ (
737
+ input: ts.Expression,
738
+ elements: MetadataArray[],
739
+ explore: FeatureProgrammer.IExplore,
740
+ ): ts.Expression =>
741
+ explore_array_like_union_types(config)(importer)(
742
+ UnionExplorer.array({
743
+ checker: IsProgrammer.decode(project)(importer),
744
+ decoder: decode_array(config)(importer),
745
+ empty: ts.factory.createStringLiteral("[]"),
746
+ success: ts.factory.createTrue(),
747
+ failure: (input, expected) =>
748
+ create_throw_error(importer)(expected)(input),
749
+ }),
750
+ )(input, elements, explore);
751
+
752
+ const explore_array_like_union_types =
753
+ (config: FeatureProgrammer.IConfig) =>
754
+ (importer: FunctionImporter) =>
755
+ <T extends MetadataArray | MetadataTuple>(
756
+ factory: (
757
+ parameters: ts.ParameterDeclaration[],
758
+ ) => (
759
+ input: ts.Expression,
760
+ elements: T[],
761
+ explore: FeatureProgrammer.IExplore,
762
+ tags: IMetadataTag[],
763
+ jsDocTags: IJsDocTagInfo[],
764
+ ) => ts.ArrowFunction,
765
+ ) =>
766
+ (
767
+ input: ts.Expression,
768
+ elements: T[],
769
+ explore: FeatureProgrammer.IExplore,
770
+ ): ts.Expression => {
771
+ const arrow =
772
+ (parameters: ts.ParameterDeclaration[]) =>
773
+ (explore: FeatureProgrammer.IExplore) =>
774
+ (input: ts.Expression): ts.ArrowFunction =>
775
+ factory(parameters)(input, elements, explore, [], []);
776
+ if (elements.every((e) => e.recursive === false))
777
+ ts.factory.createCallExpression(
778
+ arrow([])(explore)(input),
779
+ undefined,
780
+ [],
621
781
  );
622
782
 
783
+ explore = {
784
+ ...explore,
785
+ source: "function",
786
+ from: "array",
787
+ };
623
788
  return ts.factory.createCallExpression(
624
- ts.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
789
+ ts.factory.createIdentifier(
790
+ importer.emplaceUnion(
791
+ config.prefix,
792
+ elements.map((e) => e.name).join(" | "),
793
+ () =>
794
+ arrow(
795
+ FeatureProgrammer.parameterDeclarations(config)(
796
+ TypeFactory.keyword("any"),
797
+ )(ts.factory.createIdentifier("input")),
798
+ )({
799
+ ...explore,
800
+ postfix: "",
801
+ })(ts.factory.createIdentifier("input")),
802
+ ),
803
+ ),
625
804
  undefined,
626
- [input],
805
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
627
806
  );
628
807
  };
629
808
 
@@ -703,7 +882,7 @@ export namespace StringifyProgrammer {
703
882
  ts.factory.createReturnStatement(u.value()),
704
883
  ),
705
884
  ),
706
- create_throw_error(importer, input, expected),
885
+ create_throw_error(importer)(expected)(input),
707
886
  ],
708
887
  true,
709
888
  );
@@ -711,27 +890,53 @@ export namespace StringifyProgrammer {
711
890
  /* -----------------------------------------------------------
712
891
  CONFIGURATIONS
713
892
  ----------------------------------------------------------- */
714
- const FUNCTORS = "$so";
715
- const UNIONERS = "$su";
893
+ const PREFIX = "$s";
716
894
 
717
895
  const configure =
718
896
  (project: IProject) =>
719
- (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
720
- types: {
721
- input: (type, name) =>
722
- ts.factory.createTypeReferenceNode(
723
- name ?? TypeFactory.getFullName(project.checker)(type),
897
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
898
+ const config: FeatureProgrammer.IConfig = {
899
+ types: {
900
+ input: (type, name) =>
901
+ ts.factory.createTypeReferenceNode(
902
+ name ??
903
+ TypeFactory.getFullName(project.checker)(type),
904
+ ),
905
+ output: () => TypeFactory.keyword("string"),
906
+ },
907
+ prefix: PREFIX,
908
+ trace: false,
909
+ path: false,
910
+ initializer,
911
+ decoder: () => decode(project)(config)(importer),
912
+ objector: {
913
+ checker: () => (input, meta, explore) =>
914
+ IsProgrammer.decode(project)(importer)(
915
+ input,
916
+ meta,
917
+ explore,
918
+ [],
919
+ [],
920
+ ),
921
+ decoder: () => decode_object(importer),
922
+ joiner: StringifyJoiner.object(importer),
923
+ unionizer: decode_union_object(
924
+ IsProgrammer.decode_object(importer),
925
+ )(decode_object(importer))((exp) => exp)(
926
+ (value, expected) =>
927
+ create_throw_error(importer)(expected)(value),
724
928
  ),
725
- output: () => TypeFactory.keyword("string"),
726
- },
727
- functors: FUNCTORS,
728
- unioners: UNIONERS,
729
- trace: false,
730
- path: false,
731
- initializer,
732
- decoder: decode(project, importer),
733
- objector: OBJECTOR(project, importer),
734
- });
929
+ failure: (input, expected) =>
930
+ create_throw_error(importer)(expected)(input),
931
+ },
932
+ generator: {
933
+ arrays: () => write_array_functions(config)(importer),
934
+ tuples: () =>
935
+ write_tuple_functions(project)(config)(importer),
936
+ },
937
+ };
938
+ return config;
939
+ };
735
940
 
736
941
  const initializer: FeatureProgrammer.IConfig["initializer"] =
737
942
  ({ checker }) =>
@@ -740,6 +945,7 @@ export namespace StringifyProgrammer {
740
945
  const meta: Metadata = MetadataFactory.analyze(checker)({
741
946
  resolve: true,
742
947
  constant: true,
948
+ absorb: true,
743
949
  validate: (meta) => {
744
950
  if (meta.atomics.find((str) => str === "bigint"))
745
951
  throw new Error(NO_BIGINT);
@@ -748,45 +954,31 @@ export namespace StringifyProgrammer {
748
954
  return [collection, meta];
749
955
  };
750
956
 
751
- const OBJECTOR = (
752
- project: IProject,
753
- importer: FunctionImporter,
754
- ): FeatureProgrammer.IConfig.IObjector => ({
755
- checker: IsProgrammer.decode(project, importer),
756
- decoder: decode_object(importer),
757
- joiner: StringifyJoiner.object(importer),
758
- unionizer: decode_union_object(IsProgrammer.decode_object(importer))(
759
- decode_object(importer),
760
- )((exp) => exp)((value, expected) =>
761
- create_throw_error(importer, value, expected),
762
- ),
763
- failure: (input, expected) =>
764
- create_throw_error(importer, input, expected),
765
- });
766
-
767
- const create_throw_error = (
768
- importer: FunctionImporter,
769
- value: ts.Expression,
770
- expected: string,
771
- ) =>
772
- ts.factory.createExpressionStatement(
773
- ts.factory.createCallExpression(
774
- importer.use("throws"),
775
- [],
776
- [
777
- ts.factory.createObjectLiteralExpression(
778
- [
779
- ts.factory.createPropertyAssignment(
780
- "expected",
781
- ts.factory.createStringLiteral(expected),
782
- ),
783
- ts.factory.createPropertyAssignment("value", value),
784
- ],
785
- true,
786
- ),
787
- ],
788
- ),
789
- );
957
+ const create_throw_error =
958
+ (importer: FunctionImporter) =>
959
+ (expected: string) =>
960
+ (value: ts.Expression) =>
961
+ ts.factory.createExpressionStatement(
962
+ ts.factory.createCallExpression(
963
+ importer.use("throws"),
964
+ [],
965
+ [
966
+ ts.factory.createObjectLiteralExpression(
967
+ [
968
+ ts.factory.createPropertyAssignment(
969
+ "expected",
970
+ ts.factory.createStringLiteral(expected),
971
+ ),
972
+ ts.factory.createPropertyAssignment(
973
+ "value",
974
+ value,
975
+ ),
976
+ ],
977
+ true,
978
+ ),
979
+ ],
980
+ ),
981
+ );
790
982
  }
791
983
 
792
984
  interface IUnion {