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,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
 
@@ -27,19 +31,18 @@ import { check_native } from "./internal/check_native";
27
31
  import { check_number } from "./internal/check_number";
28
32
  import { check_string } from "./internal/check_string";
29
33
  import { check_template } from "./internal/check_template";
30
- import { check_union_tuple } from "./internal/check_union_tuple";
31
34
  import { decode_union_object } from "./internal/decode_union_object";
35
+ import { wrap_metadata_rest_tuple } from "./internal/wrap_metadata_rest_tuple";
32
36
 
33
37
  export namespace CheckerProgrammer {
34
38
  export interface IConfig {
35
- functors: string;
36
- unioners: string;
39
+ prefix: string;
37
40
  path: boolean;
38
41
  trace: boolean;
39
42
  equals: boolean;
40
43
  numeric: boolean;
41
44
  addition?: () => ts.Statement[];
42
- decoder?: FeatureProgrammer.Decoder<Metadata, ts.Expression>;
45
+ decoder?: () => FeatureProgrammer.Decoder<Metadata, ts.Expression>;
43
46
  combiner: IConfig.Combiner;
44
47
  atomist: (
45
48
  explore: IExplore,
@@ -97,114 +100,192 @@ export namespace CheckerProgrammer {
97
100
  (project: IProject) =>
98
101
  (config: IConfig) =>
99
102
  (importer: FunctionImporter) =>
100
- FeatureProgrammer.analyze(project)(
103
+ FeatureProgrammer.write(project)(
101
104
  configure(project)(config)(importer),
102
105
  )(importer);
103
106
 
104
- export const write_functors =
107
+ export const write_object_functions =
105
108
  (project: IProject) =>
106
109
  (config: IConfig) =>
107
110
  (importer: FunctionImporter) =>
108
- FeatureProgrammer.write_functors(
111
+ FeatureProgrammer.write_object_functions(
109
112
  configure(project)(config)(importer),
110
113
  )(importer);
111
114
 
112
- export const write_unioners = (
113
- project: IProject,
114
- config: IConfig,
115
- importer: FunctionImporter,
116
- ) =>
117
- FeatureProgrammer.write_unioners(
118
- configure(project)({ ...config, numeric: false })(importer),
119
- )(importer);
115
+ export const write_union_functions =
116
+ (project: IProject) =>
117
+ (config: IConfig) =>
118
+ (importer: FunctionImporter) =>
119
+ FeatureProgrammer.write_union_functions(
120
+ configure(project)({ ...config, numeric: false })(importer),
121
+ );
120
122
 
121
- const configure =
123
+ export const write_array_functions =
122
124
  (project: IProject) =>
123
125
  (config: IConfig) =>
124
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
125
- const output: FeatureProgrammer.IConfig = {
126
- types: {
127
- input: () => TypeFactory.keyword("any"),
128
- output: (type, name) =>
129
- ts.factory.createTypePredicateNode(
126
+ (importer: FunctionImporter) =>
127
+ (collection: MetadataCollection): ts.VariableStatement[] =>
128
+ collection
129
+ .arrays()
130
+ .filter((a) => a.recursive)
131
+ .map((array, i) =>
132
+ StatementFactory.constant(
133
+ `${config.prefix}a${i}`,
134
+ ts.factory.createArrowFunction(
130
135
  undefined,
131
- "input",
132
- ts.factory.createTypeReferenceNode(
133
- name ??
134
- TypeFactory.getFullName(project.checker)(
135
- type,
136
- ),
136
+ undefined,
137
+ FeatureProgrammer.parameterDeclarations(config)(
138
+ TypeFactory.keyword("any"),
139
+ )(ts.factory.createIdentifier("input")),
140
+ TypeFactory.keyword("any"),
141
+ undefined,
142
+ decode_array_inline(project)(config)(importer)(
143
+ ts.factory.createIdentifier("input"),
144
+ array,
145
+ {
146
+ tracable: config.trace,
147
+ source: "function",
148
+ from: "array",
149
+ postfix: "",
150
+ },
151
+ [],
152
+ [],
153
+ ),
154
+ ),
155
+ ),
156
+ );
157
+
158
+ export const write_tuple_functions =
159
+ (project: IProject) =>
160
+ (config: IConfig) =>
161
+ (importer: FunctionImporter) =>
162
+ (collection: MetadataCollection): ts.VariableStatement[] =>
163
+ collection
164
+ .tuples()
165
+ .filter((t) => t.recursive)
166
+ .map((tuple, i) =>
167
+ StatementFactory.constant(
168
+ `${config.prefix}t${i}`,
169
+ ts.factory.createArrowFunction(
170
+ undefined,
171
+ undefined,
172
+ FeatureProgrammer.parameterDeclarations(config)(
173
+ TypeFactory.keyword("any"),
174
+ )(ts.factory.createIdentifier("input")),
175
+ TypeFactory.keyword("any"),
176
+ undefined,
177
+ decode_tuple_inline(project)(config)(importer)(
178
+ ts.factory.createIdentifier("input"),
179
+ tuple,
180
+ {
181
+ tracable: config.trace,
182
+ source: "function",
183
+ from: "array",
184
+ postfix: "",
185
+ },
186
+ [],
187
+ [],
137
188
  ),
138
189
  ),
190
+ ),
191
+ );
192
+
193
+ const configure =
194
+ (project: IProject) =>
195
+ (config: IConfig) =>
196
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
197
+ types: {
198
+ input: () => TypeFactory.keyword("any"),
199
+ output: (type, name) =>
200
+ ts.factory.createTypePredicateNode(
201
+ undefined,
202
+ "input",
203
+ ts.factory.createTypeReferenceNode(
204
+ name ??
205
+ TypeFactory.getFullName(project.checker)(type),
206
+ ),
207
+ ),
208
+ },
209
+ trace: config.trace,
210
+ path: config.path,
211
+ prefix: config.prefix,
212
+ initializer:
213
+ ({ checker }) =>
214
+ (type) => {
215
+ const collection: MetadataCollection =
216
+ new MetadataCollection();
217
+ const meta: Metadata = MetadataFactory.analyze(checker)({
218
+ resolve: false,
219
+ constant: true,
220
+ absorb: true,
221
+ validate: (meta) => {
222
+ if (
223
+ meta.arrays.length > 1 &&
224
+ meta.arrays.some((a) => a.recursive)
225
+ )
226
+ throw new Error(
227
+ `Repeated union array types are not supported yet.`,
228
+ );
229
+ },
230
+ })(collection)(type);
231
+ return [collection, meta];
139
232
  },
140
- trace: config.trace,
141
- path: config.path,
142
- functors: config.functors,
143
- unioners: config.unioners,
144
- initializer:
145
- ({ checker }) =>
146
- (type) => {
147
- const collection: MetadataCollection =
148
- new MetadataCollection();
149
- const meta: Metadata = MetadataFactory.analyze(checker)(
150
- {
151
- resolve: false,
152
- constant: true,
153
- },
154
- )(collection)(type);
155
- return [collection, meta];
156
- },
157
- addition: config.addition,
158
- decoder: config.decoder ?? decode(project)(config)(importer),
159
- objector: {
160
- checker:
161
- config.decoder ?? decode(project)(config)(importer),
162
- decoder: decode_object(config)(importer),
163
- joiner: config.joiner.object,
164
- unionizer: config.equals
165
- ? decode_union_object(decode_object(config)(importer))(
166
- (input, obj, explore) =>
167
- decode_object(config)(importer)(input, obj, {
168
- ...explore,
169
- tracable: true,
170
- }),
171
- )(config.joiner.is ?? ((expr) => expr))(
172
- (value, expected) =>
173
- ts.factory.createReturnStatement(
174
- config.joiner.failure(value, expected),
233
+ addition: config.addition,
234
+ decoder: () =>
235
+ config.decoder?.() ?? decode(project)(config)(importer),
236
+ objector: {
237
+ checker: () =>
238
+ config.decoder?.() ?? decode(project)(config)(importer),
239
+ decoder: () => decode_object(config)(importer),
240
+ joiner: config.joiner.object,
241
+ unionizer: config.equals
242
+ ? decode_union_object(decode_object(config)(importer))(
243
+ (input, obj, explore) =>
244
+ decode_object(config)(importer)(input, obj, {
245
+ ...explore,
246
+ tracable: true,
247
+ }),
248
+ )(config.joiner.is ?? ((expr) => expr))(
249
+ (value, expected) =>
250
+ ts.factory.createReturnStatement(
251
+ config.joiner.failure(value, expected),
252
+ ),
253
+ )
254
+ : (input, targets, explore) =>
255
+ config.combiner(explore)("or")(
256
+ input,
257
+ targets.map((obj) => ({
258
+ expression: decode_object(config)(importer)(
259
+ input,
260
+ obj,
261
+ explore,
175
262
  ),
176
- )
177
- : (input, targets, explore) =>
178
- config.combiner(explore)("or")(
179
- input,
180
- targets.map((obj) => ({
181
- expression: decode_object(config)(
182
- importer,
183
- )(input, obj, explore),
184
- combined: true,
185
- })),
186
- `(${targets.map((t) => t.name).join(" | ")})`,
263
+ combined: true,
264
+ })),
265
+ `(${targets.map((t) => t.name).join(" | ")})`,
266
+ ),
267
+ failure: (value, expected) =>
268
+ ts.factory.createReturnStatement(
269
+ config.joiner.failure(value, expected),
270
+ ),
271
+ is: config.joiner.is,
272
+ required: config.joiner.required,
273
+ full: config.joiner.full,
274
+ type: TypeFactory.keyword("boolean"),
275
+ },
276
+ generator: {
277
+ unions: config.numeric
278
+ ? () =>
279
+ FeatureProgrammer.write_union_functions(
280
+ configure(project)({ ...config, numeric: false })(
281
+ importer,
187
282
  ),
188
- failure: (value, expected) =>
189
- ts.factory.createReturnStatement(
190
- config.joiner.failure(value, expected),
191
- ),
192
- is: config.joiner.is,
193
- required: config.joiner.required,
194
- full: config.joiner.full,
195
- type: TypeFactory.keyword("boolean"),
196
- },
197
- };
198
- if (config.numeric === true)
199
- output.generator = {
200
- unioners: FeatureProgrammer.write_unioners(
201
- configure(project)({ ...config, numeric: false })(
202
- importer,
203
- ),
204
- )(importer),
205
- };
206
- return output;
207
- };
283
+ )
284
+ : undefined,
285
+ arrays: () => write_array_functions(project)(config)(importer),
286
+ tuples: () => write_tuple_functions(project)(config)(importer),
287
+ },
288
+ });
208
289
 
209
290
  /* -----------------------------------------------------------
210
291
  DECODERS
@@ -242,11 +323,7 @@ export namespace CheckerProgrammer {
242
323
  const checkOptional: boolean = meta.empty() || meta.isUnionBucket();
243
324
 
244
325
  // NULLABLE
245
- if (
246
- checkOptional ||
247
- meta.nullable
248
- // || (meta.objects.length && meta.size() !== meta.objects.length)
249
- )
326
+ if (checkOptional || meta.nullable)
250
327
  (meta.nullable ? add : create_add(top)(input))(
251
328
  meta.nullable,
252
329
  ValueFactory.NULL(),
@@ -393,7 +470,7 @@ export namespace CheckerProgrammer {
393
470
  install(
394
471
  explore_maps(project)(config)(importer)(
395
472
  input,
396
- meta.maps.map((m) => [m.key, m.value]),
473
+ meta.maps,
397
474
  {
398
475
  ...explore,
399
476
  from: "array",
@@ -413,46 +490,70 @@ export namespace CheckerProgrammer {
413
490
  )(jsDocTags)(input),
414
491
  )(input),
415
492
  [...meta.tuples, ...meta.arrays]
416
- .map((elem) =>
417
- Array.isArray(elem)
418
- ? `[${elem
419
- .map((elem) => elem.getName())
420
- .join(", ")}]`
421
- : `Array<${elem.getName()}>`,
422
- )
493
+ .map((elem) => elem.name)
423
494
  .join(" | "),
424
495
  );
425
496
  if (meta.arrays.length === 0)
426
- install(
427
- explore_tuples(project)(config)(importer)(
428
- input,
429
- meta.tuples,
430
- {
431
- ...explore,
432
- from: "array",
433
- },
434
- metaTags,
435
- jsDocTags,
436
- ),
437
- );
438
- else if (meta.arrays.some((elem) => elem.any)) install(null);
497
+ if (meta.tuples.length === 1)
498
+ install(
499
+ decode_tuple(project)(config)(importer)(
500
+ input,
501
+ meta.tuples[0]!,
502
+ {
503
+ ...explore,
504
+ from: "array",
505
+ },
506
+ metaTags,
507
+ jsDocTags,
508
+ ),
509
+ );
510
+ // TUPLE ONLY
511
+ else
512
+ install(
513
+ explore_tuples(project)(config)(importer)(
514
+ input,
515
+ meta.tuples,
516
+ {
517
+ ...explore,
518
+ from: "array",
519
+ },
520
+ metaTags,
521
+ jsDocTags,
522
+ ),
523
+ );
524
+ else if (meta.arrays.some((elem) => elem.value.any))
525
+ install(null);
439
526
  else if (meta.tuples.length === 0)
440
- // ARRAY ONLY
441
- install(
442
- explore_arrays(project, config, importer)(
443
- input,
444
- meta.arrays,
445
- {
446
- ...explore,
447
- from: "array",
448
- },
449
- metaTags,
450
- jsDocTags,
451
- ),
452
- );
527
+ if (meta.arrays.length === 1)
528
+ // ARRAY ONLY
529
+ install(
530
+ decode_array(project)(config)(importer)(
531
+ input,
532
+ meta.arrays[0]!,
533
+ {
534
+ ...explore,
535
+ from: "array",
536
+ },
537
+ metaTags,
538
+ jsDocTags,
539
+ ),
540
+ );
541
+ else
542
+ install(
543
+ explore_arrays(project)(config)(importer)(
544
+ input,
545
+ meta.arrays,
546
+ {
547
+ ...explore,
548
+ from: "array",
549
+ },
550
+ metaTags,
551
+ jsDocTags,
552
+ ),
553
+ );
453
554
  else
454
555
  install(
455
- explore_arrays_and_tuples(project, config, importer)(
556
+ explore_arrays_and_tuples(project)(config)(importer)(
456
557
  input,
457
558
  [...meta.tuples, ...meta.arrays],
458
559
  explore,
@@ -555,19 +656,122 @@ export namespace CheckerProgrammer {
555
656
  : config.success;
556
657
  };
557
658
 
558
- export const decode_tuple =
659
+ export const decode_object =
660
+ (config: IConfig) => (importer: FunctionImporter) => {
661
+ const func = FeatureProgrammer.decode_object(config)(importer);
662
+ return (
663
+ input: ts.Expression,
664
+ obj: MetadataObject,
665
+ explore: IExplore,
666
+ ) => {
667
+ obj.validated = true;
668
+ return func(input, obj, explore);
669
+ };
670
+ };
671
+
672
+ const decode_array =
673
+ (project: IProject) =>
674
+ (config: IConfig) =>
675
+ (importer: FunctionImporter) =>
676
+ (
677
+ input: ts.Expression,
678
+ array: MetadataArray,
679
+ explore: IExplore,
680
+ metaTags: IMetadataTag[],
681
+ jsDocTags: IJsDocTagInfo[],
682
+ ) => {
683
+ if (array.recursive === false)
684
+ return decode_array_inline(project)(config)(importer)(
685
+ input,
686
+ array,
687
+ explore,
688
+ metaTags,
689
+ jsDocTags,
690
+ );
691
+
692
+ explore = {
693
+ ...explore,
694
+ source: "function",
695
+ from: "array",
696
+ };
697
+ return ts.factory.createLogicalOr(
698
+ ts.factory.createCallExpression(
699
+ ts.factory.createIdentifier(
700
+ importer.useLocal(`${config.prefix}a${array.index}`),
701
+ ),
702
+ undefined,
703
+ FeatureProgrammer.argumentsArray(config)({
704
+ ...explore,
705
+ source: "function",
706
+ from: "array",
707
+ })(input),
708
+ ),
709
+ config.joiner.failure(input, array.name, explore),
710
+ );
711
+ };
712
+
713
+ const decode_array_inline =
714
+ (project: IProject) =>
715
+ (config: IConfig) =>
716
+ (importer: FunctionImporter) =>
717
+ FeatureProgrammer.decode_array({
718
+ prefix: config.prefix,
719
+ trace: config.trace,
720
+ path: config.path,
721
+ decoder: () => decode(project)(config)(importer),
722
+ })(importer)(config.joiner.array);
723
+
724
+ const decode_tuple =
559
725
  (project: IProject) =>
560
726
  (config: IConfig) =>
561
727
  (importer: FunctionImporter) =>
562
- (checkLength: boolean) =>
563
728
  (
564
729
  input: ts.Expression,
565
- tuple: Array<Metadata>,
730
+ tuple: MetadataTuple,
566
731
  explore: IExplore,
567
732
  tagList: IMetadataTag[],
568
733
  jsDocTags: ts.JSDocTagInfo[],
569
734
  ): ts.Expression => {
570
- const binaries: ts.Expression[] = tuple
735
+ if (tuple.recursive === false)
736
+ return decode_tuple_inline(project)(config)(importer)(
737
+ input,
738
+ tuple,
739
+ explore,
740
+ tagList,
741
+ jsDocTags,
742
+ );
743
+ explore = {
744
+ ...explore,
745
+ source: "function",
746
+ from: "array",
747
+ };
748
+ return ts.factory.createLogicalOr(
749
+ ts.factory.createCallExpression(
750
+ ts.factory.createIdentifier(
751
+ importer.useLocal(`${config.prefix}t${tuple.index}`),
752
+ ),
753
+ undefined,
754
+ FeatureProgrammer.argumentsArray(config)({
755
+ ...explore,
756
+ source: "function",
757
+ })(input),
758
+ ),
759
+ config.joiner.failure(input, tuple.name, explore),
760
+ );
761
+ };
762
+
763
+ const decode_tuple_inline =
764
+ (project: IProject) =>
765
+ (config: IConfig) =>
766
+ (importer: FunctionImporter) =>
767
+ (
768
+ input: ts.Expression,
769
+ tuple: MetadataTuple,
770
+ explore: IExplore,
771
+ tagList: IMetadataTag[],
772
+ jsDocTags: ts.JSDocTagInfo[],
773
+ ): ts.Expression => {
774
+ const binaries: ts.Expression[] = tuple.elements
571
775
  .filter((meta) => meta.rest === null)
572
776
  .map((meta, index) =>
573
777
  decode(project)(config)(importer)(
@@ -578,34 +782,30 @@ export namespace CheckerProgrammer {
578
782
  from: "array",
579
783
  postfix: explore.postfix.length
580
784
  ? `${explore.postfix.slice(0, -1)}[${index}]"`
581
- : `[${index}]`,
785
+ : `"[${index}]"`,
582
786
  },
583
787
  tagList,
584
788
  jsDocTags,
585
789
  ),
586
790
  );
587
791
  const rest: ts.Expression | null =
588
- tuple.length && tuple[tuple.length - 1]!.rest !== null
792
+ tuple.elements.length && tuple.elements.at(-1)!.rest !== null
589
793
  ? decode(project)(config)(importer)(
590
794
  ts.factory.createCallExpression(
591
795
  IdentifierFactory.access(input)("slice"),
592
796
  undefined,
593
797
  [
594
798
  ts.factory.createNumericLiteral(
595
- tuple.length - 1,
799
+ tuple.elements.length - 1,
596
800
  ),
597
801
  ],
598
802
  ),
599
- (() => {
600
- const wrapper: Metadata = Metadata.initialize();
601
- wrapper.arrays.push(
602
- tuple[tuple.length - 1]!.rest!,
603
- );
604
- return wrapper;
605
- })(),
803
+ wrap_metadata_rest_tuple(
804
+ tuple.elements.at(-1)!.rest!,
805
+ ),
606
806
  {
607
807
  ...explore,
608
- start: tuple.length - 1,
808
+ start: tuple.elements.length - 1,
609
809
  },
610
810
  tagList,
611
811
  jsDocTags,
@@ -619,8 +819,8 @@ export namespace CheckerProgrammer {
619
819
  return config.combiner(explore)("and")(
620
820
  input,
621
821
  [
622
- ...(checkLength && rest === null
623
- ? tuple.every((t) => t.optional === false)
822
+ ...(rest === null
823
+ ? tuple.elements.every((t) => t.optional === false)
624
824
  ? [
625
825
  {
626
826
  combined: false,
@@ -628,7 +828,7 @@ export namespace CheckerProgrammer {
628
828
  ts.factory.createStrictEquality(
629
829
  arrayLength,
630
830
  ts.factory.createNumericLiteral(
631
- tuple.length,
831
+ tuple.elements.length,
632
832
  ),
633
833
  ),
634
834
  },
@@ -639,7 +839,7 @@ export namespace CheckerProgrammer {
639
839
  expression: ts.factory.createLogicalAnd(
640
840
  ts.factory.createLessThanEquals(
641
841
  ts.factory.createNumericLiteral(
642
- tuple.filter(
842
+ tuple.elements.filter(
643
843
  (t) =>
644
844
  t.optional === false,
645
845
  ).length,
@@ -648,7 +848,7 @@ export namespace CheckerProgrammer {
648
848
  ),
649
849
  ts.factory.createGreaterThanEquals(
650
850
  ts.factory.createNumericLiteral(
651
- tuple.length,
851
+ tuple.elements.length,
652
852
  ),
653
853
  arrayLength,
654
854
  ),
@@ -676,211 +876,292 @@ export namespace CheckerProgrammer {
676
876
  ]
677
877
  : []),
678
878
  ],
679
- `[${tuple.map((t) => t.getName()).join(", ")}]`,
879
+ `[${tuple.elements.map((t) => t.getName()).join(", ")}]`,
680
880
  );
681
881
  };
682
882
 
683
- const decode_array =
684
- (project: IProject) =>
685
- (config: IConfig) =>
686
- (importer: FunctionImporter) =>
687
- FeatureProgrammer.decode_array({
688
- trace: config.trace,
689
- path: config.path,
690
- decoder: decode(project)(config)(importer),
691
- })(importer)(config.joiner.array);
692
-
693
- export const decode_object =
694
- (config: IConfig) => (importer: FunctionImporter) => {
695
- const func = FeatureProgrammer.decode_object(config)(importer);
696
- return (
697
- input: ts.Expression,
698
- obj: MetadataObject,
699
- explore: IExplore,
700
- ) => {
701
- obj.validated = true;
702
- return func(input, obj, explore);
703
- };
704
- };
705
-
883
+ /* -----------------------------------------------------------
884
+ UNION TYPE EXPLORERS
885
+ ----------------------------------------------------------- */
706
886
  const explore_sets =
707
887
  (project: IProject) =>
708
888
  (config: IConfig) =>
709
889
  (importer: FunctionImporter) =>
710
- UnionExplorer.set({
711
- checker: decode(project)(config)(importer),
712
- decoder: decode_array(project)(config)(importer),
713
- empty: config.success,
714
- success: config.success,
715
- failure: (input, expected, explore) =>
716
- ts.factory.createReturnStatement(
717
- config.joiner.failure(input, expected, explore),
718
- ),
719
- });
890
+ (
891
+ input: ts.Expression,
892
+ sets: Metadata[],
893
+ explore: IExplore,
894
+ tags: IMetadataTag[],
895
+ jsDocTags: IJsDocTagInfo[],
896
+ ): ts.Expression =>
897
+ ts.factory.createCallExpression(
898
+ UnionExplorer.set({
899
+ checker: decode(project)(config)(importer),
900
+ decoder: decode_array(project)(config)(importer),
901
+ empty: config.success,
902
+ success: config.success,
903
+ failure: (input, expected, explore) =>
904
+ ts.factory.createReturnStatement(
905
+ config.joiner.failure(input, expected, explore),
906
+ ),
907
+ })([])(input, sets, explore, tags, jsDocTags),
908
+ undefined,
909
+ undefined,
910
+ );
720
911
 
721
912
  const explore_maps =
722
913
  (project: IProject) =>
723
914
  (config: IConfig) =>
724
915
  (importer: FunctionImporter) =>
725
- UnionExplorer.map({
726
- checker: (input, entry, explore) => {
727
- const func = decode(project)(config)(importer);
728
- return ts.factory.createLogicalAnd(
729
- func(
730
- ts.factory.createElementAccessExpression(input, 0),
731
- entry[0],
732
- { ...explore, postfix: `${explore.postfix}[0]` },
733
- [],
734
- [],
735
- ),
736
- func(
737
- ts.factory.createElementAccessExpression(input, 1),
738
- entry[1],
739
- { ...explore, postfix: `${explore.postfix}[1]` },
740
- [],
741
- [],
916
+ (
917
+ input: ts.Expression,
918
+ maps: Metadata.Entry[],
919
+ explore: IExplore,
920
+ tags: IMetadataTag[],
921
+ jsDocTags: IJsDocTagInfo[],
922
+ ): ts.Expression =>
923
+ ts.factory.createCallExpression(
924
+ UnionExplorer.map({
925
+ checker: (input, entry, explore) => {
926
+ const func = decode(project)(config)(importer);
927
+ return ts.factory.createLogicalAnd(
928
+ func(
929
+ ts.factory.createElementAccessExpression(
930
+ input,
931
+ 0,
932
+ ),
933
+ entry[0],
934
+ {
935
+ ...explore,
936
+ postfix: `${explore.postfix}[0]`,
937
+ },
938
+ [],
939
+ [],
940
+ ),
941
+ func(
942
+ ts.factory.createElementAccessExpression(
943
+ input,
944
+ 1,
945
+ ),
946
+ entry[1],
947
+ {
948
+ ...explore,
949
+ postfix: `${explore.postfix}[1]`,
950
+ },
951
+ [],
952
+ [],
953
+ ),
954
+ );
955
+ },
956
+ decoder: decode_array(project)(config)(importer),
957
+ empty: config.success,
958
+ success: config.success,
959
+ failure: (input, expected, explore) =>
960
+ ts.factory.createReturnStatement(
961
+ config.joiner.failure(input, expected, explore),
742
962
  ),
743
- );
744
- },
745
- decoder: (input, target, explore) =>
746
- decode_array(project)(config)(importer)(
747
- input,
748
- Metadata.create({
749
- any: false,
750
- nullable: false,
751
- required: true,
752
- optional: false,
753
- functional: false,
754
- resolved: null,
755
- constants: [],
756
- atomics: [],
757
- templates: [],
758
- rest: null,
759
- arrays: [],
760
- tuples: [target],
761
- objects: [],
762
- natives: [],
763
- sets: [],
764
- maps: [],
765
- }),
766
- explore,
767
- [],
768
- [],
769
- ),
770
- empty: config.success,
771
- success: config.success,
772
- failure: (input, expected, explore) =>
773
- ts.factory.createReturnStatement(
774
- config.joiner.failure(input, expected, explore),
775
- ),
776
- });
963
+ })([])(input, maps, explore, tags, jsDocTags),
964
+ undefined,
965
+ undefined,
966
+ );
777
967
 
778
968
  const explore_tuples =
779
969
  (project: IProject) =>
780
970
  (config: IConfig) =>
781
971
  (importer: FunctionImporter) =>
782
- UnionExplorer.tuple({
783
- checker: check_union_tuple(project)(config)(importer),
784
- decoder: decode_tuple(project)(config)(importer)(true),
785
- empty: config.success,
786
- success: config.success,
787
- failure: (input, expected, explore) =>
788
- ts.factory.createReturnStatement(
789
- config.joiner.failure(input, expected, explore),
790
- ),
791
- });
792
-
793
- const explore_arrays = (
794
- project: IProject,
795
- config: IConfig,
796
- importer: FunctionImporter,
797
- ) =>
798
- UnionExplorer.array({
799
- checker: decode(project)(config)(importer),
800
- decoder: decode_array(project)(config)(importer),
801
- empty: config.success,
802
- success: config.success,
803
- failure: (input, expected, explore) =>
804
- ts.factory.createReturnStatement(
805
- config.joiner.failure(input, expected, explore),
806
- ),
807
- });
972
+ (
973
+ input: ts.Expression,
974
+ tuples: MetadataTuple[],
975
+ explore: IExplore,
976
+ tags: IMetadataTag[],
977
+ jsDocTags: IJsDocTagInfo[],
978
+ ): ts.Expression =>
979
+ explore_array_like_union_types(config)(importer)(
980
+ UnionExplorer.tuple({
981
+ checker: decode_tuple(project)(config)(importer),
982
+ decoder: decode_tuple(project)(config)(importer),
983
+ empty: config.success,
984
+ success: config.success,
985
+ failure: (input, expected, explore) =>
986
+ ts.factory.createReturnStatement(
987
+ config.joiner.failure(input, expected, explore),
988
+ ),
989
+ }),
990
+ )(input, tuples, explore, tags, jsDocTags);
808
991
 
809
- const explore_arrays_and_tuples = (
810
- project: IProject,
811
- config: IConfig,
812
- importer: FunctionImporter,
813
- ) =>
814
- UnionExplorer.array_or_tuple({
815
- checker: (front, target, explore, tags, jsDocTags, array) =>
816
- Array.isArray(target)
817
- ? check_union_tuple(project)(config)(importer)(
818
- front,
819
- target,
820
- explore,
821
- tags,
822
- jsDocTags,
823
- array,
824
- )
825
- : config.atomist(explore)({
826
- expression: decode(project)(config)(importer)(
827
- front,
828
- target,
829
- explore,
830
- tags,
831
- jsDocTags,
832
- ),
833
- tags: check_array_length(tags)(array),
834
- })(array),
835
- decoder: (input, target, explore, tags, jsDocTags) =>
836
- Array.isArray(target)
837
- ? decode_tuple(project)(config)(importer)(true)(
838
- input,
839
- target,
840
- explore,
841
- tags,
842
- jsDocTags,
843
- )
844
- : decode_array(project)(config)(importer)(
845
- input,
846
- target,
847
- explore,
848
- tags,
849
- jsDocTags,
850
- ),
851
- empty: config.success,
852
- success: config.success,
853
- failure: (input, expected, explore) =>
854
- ts.factory.createReturnStatement(
855
- config.joiner.failure(input, expected, explore),
856
- ),
857
- });
992
+ const explore_arrays =
993
+ (project: IProject) =>
994
+ (config: IConfig) =>
995
+ (importer: FunctionImporter) =>
996
+ (
997
+ input: ts.Expression,
998
+ arrays: MetadataArray[],
999
+ explore: IExplore,
1000
+ tags: IMetadataTag[],
1001
+ jsDocTags: IJsDocTagInfo[],
1002
+ ): ts.Expression =>
1003
+ explore_array_like_union_types(config)(importer)(
1004
+ UnionExplorer.array({
1005
+ checker: decode(project)(config)(importer),
1006
+ decoder: decode_array(project)(config)(importer),
1007
+ empty: config.success,
1008
+ success: config.success,
1009
+ failure: (input, expected, explore) =>
1010
+ ts.factory.createReturnStatement(
1011
+ config.joiner.failure(input, expected, explore),
1012
+ ),
1013
+ }),
1014
+ )(input, arrays, explore, tags, jsDocTags);
858
1015
 
859
- const explore_objects =
860
- (config: IConfig) => (importer: FunctionImporter) => {
861
- const objector = decode_object(config)(importer);
1016
+ const explore_arrays_and_tuples =
1017
+ (project: IProject) =>
1018
+ (config: IConfig) =>
1019
+ (importer: FunctionImporter) =>
1020
+ (
1021
+ input: ts.Expression,
1022
+ elements: Array<MetadataArray | MetadataTuple>,
1023
+ explore: IExplore,
1024
+ tags: IMetadataTag[],
1025
+ jsDocTags: IJsDocTagInfo[],
1026
+ ): ts.Expression =>
1027
+ explore_array_like_union_types(config)(importer)(
1028
+ UnionExplorer.array_or_tuple({
1029
+ checker: (front, target, explore, tags, jsDocTags, array) =>
1030
+ target instanceof MetadataTuple
1031
+ ? decode_tuple(project)(config)(importer)(
1032
+ front,
1033
+ target,
1034
+ explore,
1035
+ tags,
1036
+ jsDocTags,
1037
+ )
1038
+ : config.atomist(explore)({
1039
+ expression: decode(project)(config)(importer)(
1040
+ front,
1041
+ target,
1042
+ explore,
1043
+ tags,
1044
+ jsDocTags,
1045
+ ),
1046
+ tags: check_array_length(tags)(array),
1047
+ })(array),
1048
+ decoder: (input, target, explore, tags, jsDocTags) =>
1049
+ target instanceof MetadataTuple
1050
+ ? decode_tuple(project)(config)(importer)(
1051
+ input,
1052
+ target,
1053
+ explore,
1054
+ tags,
1055
+ jsDocTags,
1056
+ )
1057
+ : decode_array(project)(config)(importer)(
1058
+ input,
1059
+ target,
1060
+ explore,
1061
+ tags,
1062
+ jsDocTags,
1063
+ ),
1064
+ empty: config.success,
1065
+ success: config.success,
1066
+ failure: (input, expected, explore) =>
1067
+ ts.factory.createReturnStatement(
1068
+ config.joiner.failure(input, expected, explore),
1069
+ ),
1070
+ }),
1071
+ )(input, elements, explore, tags, jsDocTags);
862
1072
 
863
- return (
1073
+ const explore_array_like_union_types =
1074
+ (config: IConfig) =>
1075
+ (importer: FunctionImporter) =>
1076
+ <T extends MetadataArray | MetadataTuple>(
1077
+ factory: (
1078
+ parameters: ts.ParameterDeclaration[],
1079
+ ) => (
864
1080
  input: ts.Expression,
865
- meta: Metadata,
1081
+ elements: T[],
866
1082
  explore: IExplore,
867
- ) => {
868
- if (meta.objects.length === 1)
869
- return objector(input, meta.objects[0]!, explore);
870
-
871
- return ts.factory.createCallExpression(
1083
+ tags: IMetadataTag[],
1084
+ jsDocTags: IJsDocTagInfo[],
1085
+ ) => ts.ArrowFunction,
1086
+ ) =>
1087
+ (
1088
+ input: ts.Expression,
1089
+ elements: T[],
1090
+ explore: IExplore,
1091
+ tags: IMetadataTag[],
1092
+ jsDocTags: IJsDocTagInfo[],
1093
+ ): ts.Expression => {
1094
+ const arrow =
1095
+ (parameters: ts.ParameterDeclaration[]) =>
1096
+ (explore: IExplore) =>
1097
+ (input: ts.Expression): ts.ArrowFunction =>
1098
+ factory(parameters)(
1099
+ input,
1100
+ elements,
1101
+ explore,
1102
+ tags,
1103
+ jsDocTags,
1104
+ );
1105
+ if (elements.every((e) => e.recursive === false))
1106
+ ts.factory.createCallExpression(
1107
+ arrow([])(explore)(input),
1108
+ undefined,
1109
+ [],
1110
+ );
1111
+ explore = {
1112
+ ...explore,
1113
+ source: "function",
1114
+ from: "array",
1115
+ };
1116
+ return ts.factory.createLogicalOr(
1117
+ ts.factory.createCallExpression(
872
1118
  ts.factory.createIdentifier(
873
- importer.useLocal(
874
- `${config.unioners}${meta.union_index!}`,
1119
+ importer.emplaceUnion(
1120
+ config.prefix,
1121
+ elements.map((e) => e.name).join(" | "),
1122
+ () =>
1123
+ arrow(
1124
+ FeatureProgrammer.parameterDeclarations(
1125
+ config,
1126
+ )(TypeFactory.keyword("any"))(
1127
+ ts.factory.createIdentifier("input"),
1128
+ ),
1129
+ )({
1130
+ ...explore,
1131
+ postfix: "",
1132
+ })(ts.factory.createIdentifier("input")),
875
1133
  ),
876
1134
  ),
877
1135
  undefined,
878
- FeatureProgrammer.get_object_arguments(config)(explore)(
879
- input,
880
- ),
881
- );
882
- };
1136
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
1137
+ ),
1138
+ config.joiner.failure(
1139
+ input,
1140
+ elements.map((e) => e.name).join(" | "),
1141
+ explore,
1142
+ ),
1143
+ );
883
1144
  };
1145
+
1146
+ const explore_objects =
1147
+ (config: IConfig) =>
1148
+ (importer: FunctionImporter) =>
1149
+ (input: ts.Expression, meta: Metadata, explore: IExplore) =>
1150
+ meta.objects.length === 1
1151
+ ? decode_object(config)(importer)(
1152
+ input,
1153
+ meta.objects[0]!,
1154
+ explore,
1155
+ )
1156
+ : ts.factory.createCallExpression(
1157
+ ts.factory.createIdentifier(
1158
+ importer.useLocal(
1159
+ `${config.prefix}u${meta.union_index!}`,
1160
+ ),
1161
+ ),
1162
+ undefined,
1163
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
1164
+ );
884
1165
  }
885
1166
 
886
1167
  const create_add =