typia 7.0.0-dev.20240929 → 7.0.0-dev.20241001

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 (172) hide show
  1. package/lib/index.mjs +25 -25
  2. package/lib/index.mjs.map +1 -1
  3. package/lib/programmers/AssertProgrammer.js +34 -27
  4. package/lib/programmers/AssertProgrammer.js.map +1 -1
  5. package/lib/programmers/CheckerProgrammer.d.ts +5 -1
  6. package/lib/programmers/CheckerProgrammer.js +432 -348
  7. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  8. package/lib/programmers/FeatureProgrammer.d.ts +91 -28
  9. package/lib/programmers/FeatureProgrammer.js +165 -138
  10. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  11. package/lib/programmers/IsProgrammer.d.ts +5 -1
  12. package/lib/programmers/IsProgrammer.js +87 -66
  13. package/lib/programmers/IsProgrammer.js.map +1 -1
  14. package/lib/programmers/RandomProgrammer.js +83 -68
  15. package/lib/programmers/RandomProgrammer.js.map +1 -1
  16. package/lib/programmers/TypiaProgrammer.d.ts +2 -2
  17. package/lib/programmers/TypiaProgrammer.js +79 -75
  18. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  19. package/lib/programmers/ValidateProgrammer.js +45 -19
  20. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  21. package/lib/programmers/helpers/CloneJoiner.js +4 -1
  22. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  23. package/lib/programmers/helpers/NotationJoiner.d.ts +2 -1
  24. package/lib/programmers/helpers/NotationJoiner.js +34 -33
  25. package/lib/programmers/helpers/NotationJoiner.js.map +1 -1
  26. package/lib/programmers/helpers/PruneJoiner.js +4 -1
  27. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  28. package/lib/programmers/helpers/RandomJoiner.d.ts +1 -1
  29. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  30. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  31. package/lib/programmers/helpers/StringifyJoinder.js +4 -1
  32. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  33. package/lib/programmers/helpers/StringifyPredicator.d.ts +1 -1
  34. package/lib/programmers/helpers/StringifyPredicator.js +4 -3
  35. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  36. package/lib/programmers/helpers/UnionExplorer.d.ts +52 -12
  37. package/lib/programmers/helpers/UnionExplorer.js +184 -120
  38. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  39. package/lib/programmers/helpers/UnionPredicator.d.ts +1 -1
  40. package/lib/programmers/helpers/UnionPredicator.js +7 -7
  41. package/lib/programmers/http/HttpFormDataProgrammer.js +77 -70
  42. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  43. package/lib/programmers/http/HttpHeadersProgrammer.js +69 -68
  44. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  45. package/lib/programmers/http/HttpQueryProgrammer.js +69 -62
  46. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  47. package/lib/programmers/internal/application_escaped.js +4 -4
  48. package/lib/programmers/internal/application_escaped.js.map +1 -1
  49. package/lib/programmers/internal/application_templates.js +8 -2
  50. package/lib/programmers/internal/application_templates.js.map +1 -1
  51. package/lib/programmers/internal/application_union_discriminator.d.ts +1 -1
  52. package/lib/programmers/internal/application_union_discriminator.js +6 -6
  53. package/lib/programmers/internal/application_union_discriminator.js.map +1 -1
  54. package/lib/programmers/internal/application_v30_object.js +6 -3
  55. package/lib/programmers/internal/application_v30_object.js.map +1 -1
  56. package/lib/programmers/internal/application_v31_object.js +4 -1
  57. package/lib/programmers/internal/application_v31_object.js.map +1 -1
  58. package/lib/programmers/internal/check_array_length.js +21 -26
  59. package/lib/programmers/internal/check_array_length.js.map +1 -1
  60. package/lib/programmers/internal/check_bigint.js +18 -26
  61. package/lib/programmers/internal/check_bigint.js.map +1 -1
  62. package/lib/programmers/internal/check_dynamic_key.d.ts +1 -5
  63. package/lib/programmers/internal/check_dynamic_key.js +109 -91
  64. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  65. package/lib/programmers/internal/check_dynamic_properties.js +88 -90
  66. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  67. package/lib/programmers/internal/check_native.js +8 -5
  68. package/lib/programmers/internal/check_native.js.map +1 -1
  69. package/lib/programmers/internal/check_number.js +59 -65
  70. package/lib/programmers/internal/check_number.js.map +1 -1
  71. package/lib/programmers/internal/check_object.js +31 -22
  72. package/lib/programmers/internal/check_object.js.map +1 -1
  73. package/lib/programmers/internal/check_string.js +18 -26
  74. package/lib/programmers/internal/check_string.js.map +1 -1
  75. package/lib/programmers/internal/check_template.js +20 -21
  76. package/lib/programmers/internal/check_template.js.map +1 -1
  77. package/lib/programmers/internal/check_union_array_like.js +68 -53
  78. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  79. package/lib/programmers/internal/decode_union_object.js +59 -49
  80. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  81. package/lib/programmers/internal/feature_object_entries.js +31 -33
  82. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  83. package/lib/programmers/internal/llm_schema_escaped.js +29 -11
  84. package/lib/programmers/internal/llm_schema_escaped.js.map +1 -1
  85. package/lib/programmers/internal/llm_schema_object.js +4 -1
  86. package/lib/programmers/internal/llm_schema_object.js.map +1 -1
  87. package/lib/programmers/internal/metadata_to_pattern.js +44 -41
  88. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  89. package/lib/programmers/internal/postfix_of_tuple.d.ts +1 -1
  90. package/lib/programmers/internal/postfix_of_tuple.js +3 -0
  91. package/lib/programmers/internal/postfix_of_tuple.js.map +1 -1
  92. package/lib/programmers/internal/prune_object_properties.js +6 -3
  93. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  94. package/lib/programmers/internal/random_custom.js +8 -14
  95. package/lib/programmers/internal/random_custom.js.map +1 -1
  96. package/lib/programmers/internal/stringify_dynamic_properties.js +4 -1
  97. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  98. package/lib/programmers/internal/stringify_regular_properties.js +4 -4
  99. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  100. package/lib/programmers/internal/template_to_pattern.js +10 -5
  101. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  102. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +1 -2
  103. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +3 -0
  104. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  105. package/lib/programmers/json/JsonStringifyProgrammer.js +154 -91
  106. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  107. package/lib/programmers/misc/MiscCloneProgrammer.js +221 -154
  108. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  109. package/lib/programmers/misc/MiscPruneProgrammer.js +139 -89
  110. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  111. package/lib/programmers/notations/NotationGeneralProgrammer.d.ts +4 -1
  112. package/lib/programmers/notations/NotationGeneralProgrammer.js +257 -148
  113. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  114. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +32 -24
  115. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  116. package/lib/utils/NamingConvention/NamingConvention.js +41 -47
  117. package/lib/utils/NamingConvention/NamingConvention.js.map +1 -1
  118. package/package.json +1 -1
  119. package/src/programmers/AssertProgrammer.ts +44 -37
  120. package/src/programmers/CheckerProgrammer.ts +394 -358
  121. package/src/programmers/FeatureProgrammer.ts +327 -267
  122. package/src/programmers/IsProgrammer.ts +93 -76
  123. package/src/programmers/RandomProgrammer.ts +18 -9
  124. package/src/programmers/TypiaProgrammer.ts +48 -34
  125. package/src/programmers/ValidateProgrammer.ts +56 -29
  126. package/src/programmers/helpers/CloneJoiner.ts +4 -1
  127. package/src/programmers/helpers/NotationJoiner.ts +85 -83
  128. package/src/programmers/helpers/ProtobufUtil.ts +2 -2
  129. package/src/programmers/helpers/PruneJoiner.ts +4 -1
  130. package/src/programmers/helpers/RandomJoiner.ts +5 -2
  131. package/src/programmers/helpers/RandomRanger.ts +8 -1
  132. package/src/programmers/helpers/StringifyJoinder.ts +4 -1
  133. package/src/programmers/helpers/StringifyPredicator.ts +4 -3
  134. package/src/programmers/helpers/UnionExplorer.ts +277 -179
  135. package/src/programmers/helpers/UnionPredicator.ts +5 -5
  136. package/src/programmers/http/HttpFormDataProgrammer.ts +135 -114
  137. package/src/programmers/http/HttpHeadersProgrammer.ts +145 -120
  138. package/src/programmers/http/HttpQueryProgrammer.ts +137 -116
  139. package/src/programmers/internal/application_escaped.ts +6 -6
  140. package/src/programmers/internal/application_templates.ts +8 -6
  141. package/src/programmers/internal/application_union_discriminator.ts +6 -6
  142. package/src/programmers/internal/application_v30_object.ts +6 -3
  143. package/src/programmers/internal/application_v31_object.ts +4 -1
  144. package/src/programmers/internal/application_v31_tuple.ts +1 -1
  145. package/src/programmers/internal/check_array_length.ts +31 -30
  146. package/src/programmers/internal/check_bigint.ts +31 -31
  147. package/src/programmers/internal/check_dynamic_key.ts +155 -126
  148. package/src/programmers/internal/check_dynamic_properties.ts +152 -154
  149. package/src/programmers/internal/check_native.ts +11 -5
  150. package/src/programmers/internal/check_number.ts +88 -84
  151. package/src/programmers/internal/check_object.ts +45 -31
  152. package/src/programmers/internal/check_string.ts +31 -30
  153. package/src/programmers/internal/check_template.ts +34 -32
  154. package/src/programmers/internal/check_union_array_like.ts +245 -228
  155. package/src/programmers/internal/decode_union_object.ts +92 -75
  156. package/src/programmers/internal/feature_object_entries.ts +36 -36
  157. package/src/programmers/internal/llm_schema_escaped.ts +36 -13
  158. package/src/programmers/internal/llm_schema_object.ts +4 -1
  159. package/src/programmers/internal/metadata_to_pattern.ts +31 -23
  160. package/src/programmers/internal/postfix_of_tuple.ts +3 -0
  161. package/src/programmers/internal/prune_object_properties.ts +6 -3
  162. package/src/programmers/internal/random_custom.ts +24 -23
  163. package/src/programmers/internal/stringify_dynamic_properties.ts +4 -1
  164. package/src/programmers/internal/stringify_regular_properties.ts +7 -7
  165. package/src/programmers/internal/template_to_pattern.ts +12 -4
  166. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +3 -0
  167. package/src/programmers/json/JsonStringifyProgrammer.ts +151 -104
  168. package/src/programmers/misc/MiscCloneProgrammer.ts +255 -204
  169. package/src/programmers/misc/MiscPruneProgrammer.ts +149 -116
  170. package/src/programmers/notations/NotationGeneralProgrammer.ts +307 -211
  171. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +25 -21
  172. package/src/utils/NamingConvention/NamingConvention.ts +40 -42
@@ -44,7 +44,11 @@ export namespace CheckerProgrammer {
44
44
  equals: boolean;
45
45
  numeric: boolean;
46
46
  addition?: () => ts.Statement[];
47
- decoder?: () => FeatureProgrammer.Decoder<Metadata, ts.Expression>;
47
+ decoder?: (props: {
48
+ metadata: Metadata;
49
+ input: ts.Expression;
50
+ explore: IExplore;
51
+ }) => ts.Expression;
48
52
  combiner: IConfig.Combiner;
49
53
  atomist: (props: {
50
54
  entry: ICheckEntry;
@@ -121,10 +125,13 @@ export namespace CheckerProgrammer {
121
125
  type: ts.Type;
122
126
  name?: string;
123
127
  }): ts.ArrowFunction =>
124
- FeatureProgrammer.write(props.context)(configure(props))(props.importer)(
125
- props.type,
126
- props.name,
127
- );
128
+ FeatureProgrammer.write({
129
+ config: configure(props),
130
+ context: props.context,
131
+ importer: props.importer,
132
+ type: props.type,
133
+ name: props.name,
134
+ });
128
135
 
129
136
  export const write_object_functions = (props: {
130
137
  context: ITypiaContext;
@@ -144,8 +151,8 @@ export namespace CheckerProgrammer {
144
151
  importer: FunctionImporter;
145
152
  collection: MetadataCollection;
146
153
  }): ts.VariableStatement[] =>
147
- FeatureProgrammer.write_union_functions(
148
- configure({
154
+ FeatureProgrammer.write_union_functions({
155
+ config: configure({
149
156
  context: props.context,
150
157
  config: {
151
158
  ...props.config,
@@ -153,7 +160,8 @@ export namespace CheckerProgrammer {
153
160
  },
154
161
  importer: props.importer,
155
162
  }),
156
- )(props.collection);
163
+ collection: props.collection,
164
+ });
157
165
 
158
166
  export const write_array_functions = (props: {
159
167
  context: ITypiaContext;
@@ -170,9 +178,11 @@ export namespace CheckerProgrammer {
170
178
  ts.factory.createArrowFunction(
171
179
  undefined,
172
180
  undefined,
173
- FeatureProgrammer.parameterDeclarations(props.config)(
174
- TypeFactory.keyword("any"),
175
- )(ts.factory.createIdentifier("input")),
181
+ FeatureProgrammer.parameterDeclarations({
182
+ config: props.config,
183
+ type: TypeFactory.keyword("any"),
184
+ input: ts.factory.createIdentifier("input"),
185
+ }),
176
186
  TypeFactory.keyword("any"),
177
187
  undefined,
178
188
  decode_array_inline({
@@ -208,9 +218,11 @@ export namespace CheckerProgrammer {
208
218
  ts.factory.createArrowFunction(
209
219
  undefined,
210
220
  undefined,
211
- FeatureProgrammer.parameterDeclarations(props.config)(
212
- TypeFactory.keyword("any"),
213
- )(ts.factory.createIdentifier("input")),
221
+ FeatureProgrammer.parameterDeclarations({
222
+ config: props.config,
223
+ type: TypeFactory.keyword("any"),
224
+ input: ts.factory.createIdentifier("input"),
225
+ }),
214
226
  TypeFactory.keyword("any"),
215
227
  undefined,
216
228
  decode_tuple_inline({
@@ -249,141 +261,135 @@ export namespace CheckerProgrammer {
249
261
  trace: props.config.trace,
250
262
  path: props.config.path,
251
263
  prefix: props.config.prefix,
252
- initializer: (context) => (importer) => (type) => {
264
+ initializer: (next) => {
253
265
  const collection: MetadataCollection = new MetadataCollection();
254
266
  const result = MetadataFactory.analyze({
255
- checker: context.checker,
256
- transformer: context.transformer,
267
+ checker: next.context.checker,
268
+ transformer: next.context.transformer,
257
269
  options: {
258
270
  escape: false,
259
271
  constant: true,
260
272
  absorb: true,
261
273
  },
262
274
  collection,
263
- type,
275
+ type: next.type,
264
276
  });
265
277
  if (result.success === false)
266
- throw TransformerError.from(`typia.${importer.method}`)(result.errors);
278
+ throw TransformerError.from(`typia.${next.importer.method}`)(
279
+ result.errors,
280
+ );
267
281
  return [collection, result.data];
268
282
  },
269
283
  addition: props.config.addition,
270
- decoder: () =>
271
- props.config.decoder
272
- ? (input, metadata, explore) =>
273
- props.config.decoder!()(input, metadata, explore)
274
- : (input, metadata, explore) =>
284
+ decoder: props.config.decoder
285
+ ? (next) => props.config.decoder!(next)
286
+ : (next) =>
287
+ decode({
288
+ context: props.context,
289
+ config: props.config,
290
+ importer: props.importer,
291
+ input: next.input,
292
+ metadata: next.metadata,
293
+ explore: next.explore,
294
+ }),
295
+ objector: {
296
+ checker: props.config.decoder
297
+ ? (next) => props.config.decoder!(next)
298
+ : (next) =>
275
299
  decode({
276
300
  context: props.context,
277
301
  config: props.config,
278
302
  importer: props.importer,
279
- input,
280
- metadata,
281
- explore,
303
+ input: next.input,
304
+ metadata: next.metadata,
305
+ explore: next.explore,
282
306
  }),
283
- objector: {
284
- checker: () => (input, metadata, explore) =>
285
- props.config.decoder?.()(input, metadata, explore) ??
286
- decode({
287
- context: props.context,
288
- config: props.config,
289
- importer: props.importer,
290
- input,
291
- metadata,
292
- explore,
293
- }),
294
- decoder: () => (input, object, explore) =>
307
+ decoder: (next) =>
295
308
  decode_object({
296
309
  config: props.config,
297
310
  importer: props.importer,
298
- input,
299
- object,
300
- explore,
311
+ input: next.input,
312
+ object: next.object,
313
+ explore: next.explore,
301
314
  }),
302
315
  joiner: props.config.joiner.object,
303
316
  unionizer: props.config.equals
304
- ? decode_union_object((input, object, explore) =>
305
- decode_object({
306
- config: props.config,
307
- importer: props.importer,
308
- object,
309
- input,
310
- explore,
311
- }),
312
- )((input, object, explore) =>
313
- decode_object({
314
- config: props.config,
315
- importer: props.importer,
316
- input,
317
- object,
318
- explore: {
319
- ...explore,
320
- tracable: true,
321
- },
322
- }),
323
- )(props.config.joiner.is ?? ((expr) => expr))((input, expected) =>
324
- ts.factory.createReturnStatement(
325
- props.config.joiner.failure({
326
- input,
327
- expected,
328
- }),
329
- ),
330
- )
331
- : (input, targets, explore) =>
317
+ ? (next) =>
318
+ decode_union_object({
319
+ checker: (v) =>
320
+ decode_object({
321
+ config: props.config,
322
+ importer: props.importer,
323
+ object: v.object,
324
+ input: v.input,
325
+ explore: v.explore,
326
+ }),
327
+ decoder: (v) =>
328
+ decode_object({
329
+ config: props.config,
330
+ importer: props.importer,
331
+ input: v.input,
332
+ object: v.object,
333
+ explore: {
334
+ ...v.explore,
335
+ tracable: true,
336
+ },
337
+ }),
338
+ success: props.config.joiner.is ?? ((expr) => expr),
339
+ escaper: (v) =>
340
+ ts.factory.createReturnStatement(
341
+ props.config.joiner.failure(v),
342
+ ),
343
+ input: next.input,
344
+ objects: next.objects,
345
+ explore: next.explore,
346
+ })
347
+ : (next) =>
332
348
  props.config.combiner({
333
- explore,
334
349
  logic: "or",
335
- input,
336
- binaries: targets.map((object) => ({
350
+ explore: next.explore,
351
+ input: next.input,
352
+ binaries: next.objects.map((object) => ({
337
353
  expression: decode_object({
338
354
  config: props.config,
339
355
  importer: props.importer,
340
- input,
341
356
  object,
342
- explore,
357
+ input: next.input,
358
+ explore: next.explore,
343
359
  }),
344
360
  combined: true,
345
361
  })),
346
- expected: `(${targets.map((t) => t.name).join(" | ")})`,
362
+ expected: `(${next.objects.map((t) => t.name).join(" | ")})`,
347
363
  }),
348
- failure: (input, expected) =>
349
- ts.factory.createReturnStatement(
350
- props.config.joiner.failure({
351
- input,
352
- expected,
353
- }),
354
- ),
364
+ failure: (next) =>
365
+ ts.factory.createReturnStatement(props.config.joiner.failure(next)),
355
366
  is: props.config.joiner.is,
356
367
  required: props.config.joiner.required,
357
368
  full: props.config.joiner.full
358
- ? (condition) => (input, expected, explore) =>
359
- props.config.joiner.full!({
360
- condition,
361
- input,
362
- expected,
363
- explore,
364
- })
369
+ ? (next) => props.config.joiner.full!(next)
365
370
  : undefined,
366
371
  type: TypeFactory.keyword("boolean"),
367
372
  },
368
373
  generator: {
369
374
  unions: props.config.numeric
370
- ? () =>
371
- FeatureProgrammer.write_union_functions(
372
- configure({
375
+ ? (collection) =>
376
+ FeatureProgrammer.write_union_functions({
377
+ config: configure({
373
378
  ...props,
374
379
  config: {
375
380
  ...props.config,
376
381
  numeric: false,
377
382
  },
378
383
  }),
379
- )
384
+ collection,
385
+ })
380
386
  : undefined,
381
- arrays: () => (collection) =>
387
+ arrays: (collection) =>
382
388
  write_array_functions({
383
389
  ...props,
384
390
  collection,
385
391
  }),
386
- tuples: () => (collection) =>
392
+ tuples: (collection) =>
387
393
  write_tuple_functions({
388
394
  ...props,
389
395
  collection,
@@ -556,9 +562,12 @@ export namespace CheckerProgrammer {
556
562
  binaries.push({
557
563
  expression: props.config.atomist({
558
564
  explore: props.explore,
559
- entry: check_number(props.context, props.config.numeric)(atom)(
560
- props.input,
561
- ),
565
+ entry: check_number({
566
+ context: props.context,
567
+ numeric: props.config.numeric,
568
+ atomic: atom,
569
+ input: props.input,
570
+ }),
562
571
  input: props.input,
563
572
  }),
564
573
  combined: false,
@@ -567,7 +576,11 @@ export namespace CheckerProgrammer {
567
576
  binaries.push({
568
577
  expression: props.config.atomist({
569
578
  explore: props.explore,
570
- entry: check_bigint(props.context)(atom)(props.input),
579
+ entry: check_bigint({
580
+ context: props.context,
581
+ atomic: atom,
582
+ input: props.input,
583
+ }),
571
584
  input: props.input,
572
585
  }),
573
586
  combined: false,
@@ -576,7 +589,11 @@ export namespace CheckerProgrammer {
576
589
  binaries.push({
577
590
  expression: props.config.atomist({
578
591
  explore: props.explore,
579
- entry: check_string(props.context)(atom)(props.input),
592
+ entry: check_string({
593
+ context: props.context,
594
+ atomic: atom,
595
+ input: props.input,
596
+ }),
580
597
  input: props.input,
581
598
  }),
582
599
  combined: false,
@@ -594,7 +611,10 @@ export namespace CheckerProgrammer {
594
611
  binaries.push({
595
612
  expression: props.config.atomist({
596
613
  explore: props.explore,
597
- entry: check_template(props.metadata.templates)(props.input),
614
+ entry: check_template({
615
+ templates: props.metadata.templates,
616
+ input: props.input,
617
+ }),
598
618
  input: props.input,
599
619
  }),
600
620
  combined: false,
@@ -603,7 +623,10 @@ export namespace CheckerProgrammer {
603
623
  // NATIVE CLASSES
604
624
  for (const native of props.metadata.natives)
605
625
  binaries.push({
606
- expression: check_native(native)(props.input),
626
+ expression: check_native({
627
+ type: native,
628
+ input: props.input,
629
+ }),
607
630
  combined: false,
608
631
  });
609
632
 
@@ -611,7 +634,7 @@ export namespace CheckerProgrammer {
611
634
  // INSTANCES
612
635
  //----
613
636
  interface IInstance {
614
- knock: ts.Expression;
637
+ head: ts.Expression;
615
638
  body: ts.Expression | null;
616
639
  expected: string;
617
640
  }
@@ -622,7 +645,10 @@ export namespace CheckerProgrammer {
622
645
  if (props.metadata.sets.length) {
623
646
  const install = (body: ts.Expression | null) =>
624
647
  prepare({
625
- knock: check_native("Set")(props.input),
648
+ head: check_native({
649
+ type: "Set",
650
+ input: props.input,
651
+ }),
626
652
  expected: props.metadata.sets
627
653
  .map((elem) => `Set<${elem.getName()}>`)
628
654
  .join(" | "),
@@ -649,7 +675,10 @@ export namespace CheckerProgrammer {
649
675
  if (props.metadata.maps.length) {
650
676
  const install = (body: ts.Expression | null) =>
651
677
  prepare({
652
- knock: check_native("Map")(props.input),
678
+ head: check_native({
679
+ type: "Map",
680
+ input: props.input,
681
+ }),
653
682
  expected: props.metadata.maps
654
683
  .map(({ key, value }) => `Map<${key}, ${value}>`)
655
684
  .join(" | "),
@@ -677,7 +706,7 @@ export namespace CheckerProgrammer {
677
706
  if (props.metadata.tuples.length + props.metadata.arrays.length > 0) {
678
707
  const install = (body: ts.Expression | null) =>
679
708
  prepare({
680
- knock: props.config.atomist({
709
+ head: props.config.atomist({
681
710
  explore: props.explore,
682
711
  entry: {
683
712
  expected: [
@@ -772,7 +801,7 @@ export namespace CheckerProgrammer {
772
801
  // OBJECT
773
802
  if (props.metadata.objects.length > 0)
774
803
  prepare({
775
- knock: ExpressionFactory.isObject({
804
+ head: ExpressionFactory.isObject({
776
805
  checkNull: true,
777
806
  checkArray: props.metadata.objects.some((obj) =>
778
807
  obj.properties.every(
@@ -799,23 +828,23 @@ export namespace CheckerProgrammer {
799
828
  (ins: IInstance) =>
800
829
  ins.body
801
830
  ? {
802
- expression: merger(ins.knock, ins.body),
831
+ expression: merger(ins.head, ins.body),
803
832
  combined: true,
804
833
  }
805
834
  : {
806
- expression: ins.knock,
835
+ expression: ins.head,
807
836
  combined: false,
808
837
  };
809
838
  if (instances.length === 1)
810
839
  binaries.push(
811
- transformer((pre, body) =>
840
+ transformer((head, body) =>
812
841
  props.config.combiner({
813
842
  explore: props.explore,
814
843
  logic: "and",
815
844
  input: props.input,
816
- binaries: [pre, body].map((expression) => ({
845
+ binaries: [head, body].map((expression) => ({
817
846
  expression,
818
- combined: expression !== pre,
847
+ combined: expression !== head,
819
848
  })),
820
849
  expected: props.metadata.getName(),
821
850
  }),
@@ -841,9 +870,10 @@ export namespace CheckerProgrammer {
841
870
  expression:
842
871
  props.metadata.escaped.original.size() === 1 &&
843
872
  props.metadata.escaped.original.natives.length === 1
844
- ? check_native(props.metadata.escaped.original.natives[0]!)(
845
- props.input,
846
- )
873
+ ? check_native({
874
+ type: props.metadata.escaped.original.natives[0]!,
875
+ input: props.input,
876
+ })
847
877
  : ts.factory.createLogicalAnd(
848
878
  decode({
849
879
  context: props.context,
@@ -912,11 +942,7 @@ export namespace CheckerProgrammer {
912
942
  explore: IExplore;
913
943
  }) => {
914
944
  props.object.validated ||= true;
915
- return FeatureProgrammer.decode_object(props.config)(props.importer)(
916
- props.input,
917
- props.object,
918
- props.explore,
919
- );
945
+ return FeatureProgrammer.decode_object(props);
920
946
  };
921
947
 
922
948
  const decode_array = (props: {
@@ -942,11 +968,15 @@ export namespace CheckerProgrammer {
942
968
  ),
943
969
  ),
944
970
  undefined,
945
- FeatureProgrammer.argumentsArray(props.config)({
946
- ...arrayExplore,
947
- source: "function",
948
- from: "array",
949
- })(props.input),
971
+ FeatureProgrammer.argumentsArray({
972
+ config: props.config,
973
+ explore: {
974
+ ...arrayExplore,
975
+ source: "function",
976
+ from: "array",
977
+ },
978
+ input: props.input,
979
+ }),
950
980
  ),
951
981
  props.config.joiner.failure({
952
982
  input: props.input,
@@ -964,25 +994,28 @@ export namespace CheckerProgrammer {
964
994
  input: ts.Expression;
965
995
  explore: IExplore;
966
996
  }): ts.Expression => {
967
- const length: ICheckEntry = check_array_length(props.context)(props.array)(
968
- props.input,
969
- );
997
+ const length: ICheckEntry = check_array_length({
998
+ context: props.context,
999
+ array: props.array,
1000
+ input: props.input,
1001
+ });
970
1002
  const main: ts.Expression = FeatureProgrammer.decode_array({
971
- prefix: props.config.prefix,
972
- trace: props.config.trace,
973
- path: props.config.path,
974
- decoder: () => (input, metadata, explore) =>
975
- decode({
976
- ...props,
977
- input,
978
- metadata,
979
- explore,
980
- }),
981
- })(props.importer)(props.config.joiner.array)(
982
- props.input,
983
- props.array,
984
- props.explore,
985
- );
1003
+ config: {
1004
+ prefix: props.config.prefix,
1005
+ trace: props.config.trace,
1006
+ path: props.config.path,
1007
+ decoder: (next) =>
1008
+ decode({
1009
+ ...props,
1010
+ ...next,
1011
+ }),
1012
+ },
1013
+ importer: props.importer,
1014
+ combiner: props.config.joiner.array,
1015
+ array: props.array,
1016
+ input: props.input,
1017
+ explore: props.explore,
1018
+ });
986
1019
  return length.expression === null && length.conditions.length === 0
987
1020
  ? main
988
1021
  : ts.factory.createLogicalAnd(
@@ -1021,10 +1054,14 @@ export namespace CheckerProgrammer {
1021
1054
  ),
1022
1055
  ),
1023
1056
  undefined,
1024
- FeatureProgrammer.argumentsArray(props.config)({
1025
- ...arrayExplore,
1026
- source: "function",
1027
- })(props.input),
1057
+ FeatureProgrammer.argumentsArray({
1058
+ config: props.config,
1059
+ explore: {
1060
+ ...arrayExplore,
1061
+ source: "function",
1062
+ },
1063
+ input: props.input,
1064
+ }),
1028
1065
  ),
1029
1066
  props.config.joiner.failure({
1030
1067
  input: props.input,
@@ -1188,35 +1225,35 @@ export namespace CheckerProgrammer {
1188
1225
  }): ts.Expression =>
1189
1226
  ts.factory.createCallExpression(
1190
1227
  UnionExplorer.set({
1191
- checker: (input, metadata, explore, _container) =>
1192
- decode({
1193
- context: props.context,
1194
- config: props.config,
1195
- importer: props.importer,
1196
- input,
1197
- metadata,
1198
- explore,
1199
- }),
1200
- decoder: (input, array, explore) =>
1201
- decode_array({
1202
- config: props.config,
1203
- context: props.context,
1204
- importer: props.importer,
1205
- array,
1206
- input,
1207
- explore,
1208
- }),
1209
- empty: props.config.success,
1210
- success: props.config.success,
1211
- failure: (input, expected, explore) =>
1212
- ts.factory.createReturnStatement(
1213
- props.config.joiner.failure({
1214
- input,
1215
- expected,
1216
- explore,
1228
+ config: {
1229
+ checker: (v) =>
1230
+ decode({
1231
+ context: props.context,
1232
+ config: props.config,
1233
+ importer: props.importer,
1234
+ input: v.input,
1235
+ metadata: v.definition,
1236
+ explore: v.explore,
1217
1237
  }),
1218
- ),
1219
- })([])(props.input, props.sets, props.explore),
1238
+ decoder: (v) =>
1239
+ decode_array({
1240
+ config: props.config,
1241
+ context: props.context,
1242
+ importer: props.importer,
1243
+ array: v.definition,
1244
+ input: v.input,
1245
+ explore: v.explore,
1246
+ }),
1247
+ empty: props.config.success,
1248
+ success: props.config.success,
1249
+ failure: (v) =>
1250
+ ts.factory.createReturnStatement(props.config.joiner.failure(v)),
1251
+ },
1252
+ parameters: [],
1253
+ input: props.input,
1254
+ sets: props.sets,
1255
+ explore: props.explore,
1256
+ }),
1220
1257
  undefined,
1221
1258
  undefined,
1222
1259
  );
@@ -1231,51 +1268,51 @@ export namespace CheckerProgrammer {
1231
1268
  }): ts.Expression =>
1232
1269
  ts.factory.createCallExpression(
1233
1270
  UnionExplorer.map({
1234
- checker: (input, entry, explore) =>
1235
- ts.factory.createLogicalAnd(
1236
- decode({
1237
- config: props.config,
1271
+ config: {
1272
+ checker: (v) =>
1273
+ ts.factory.createLogicalAnd(
1274
+ decode({
1275
+ config: props.config,
1276
+ context: props.context,
1277
+ importer: props.importer,
1278
+ input: ts.factory.createElementAccessExpression(v.input, 0),
1279
+ metadata: v.definition[0],
1280
+ explore: {
1281
+ ...v.explore,
1282
+ postfix: `${v.explore.postfix}[0]`,
1283
+ },
1284
+ }),
1285
+ decode({
1286
+ config: props.config,
1287
+ context: props.context,
1288
+ importer: props.importer,
1289
+ input: ts.factory.createElementAccessExpression(v.input, 1),
1290
+ metadata: v.definition[1],
1291
+ explore: {
1292
+ ...v.explore,
1293
+ postfix: `${v.explore.postfix}[1]`,
1294
+ },
1295
+ }),
1296
+ ),
1297
+ decoder: (v) =>
1298
+ decode_array({
1238
1299
  context: props.context,
1239
- importer: props.importer,
1240
- input: ts.factory.createElementAccessExpression(input, 0),
1241
- metadata: entry[0],
1242
- explore: {
1243
- ...explore,
1244
- postfix: `${explore.postfix}[0]`,
1245
- },
1246
- }),
1247
- decode({
1248
1300
  config: props.config,
1249
- context: props.context,
1250
1301
  importer: props.importer,
1251
- input: ts.factory.createElementAccessExpression(input, 1),
1252
- metadata: entry[1],
1253
- explore: {
1254
- ...explore,
1255
- postfix: `${explore.postfix}[1]`,
1256
- },
1257
- }),
1258
- ),
1259
- decoder: (input, array, explore) =>
1260
- decode_array({
1261
- context: props.context,
1262
- config: props.config,
1263
- importer: props.importer,
1264
- array,
1265
- input,
1266
- explore,
1267
- }),
1268
- empty: props.config.success,
1269
- success: props.config.success,
1270
- failure: (input, expected, explore) =>
1271
- ts.factory.createReturnStatement(
1272
- props.config.joiner.failure({
1273
- input,
1274
- expected,
1275
- explore,
1302
+ array: v.definition,
1303
+ input: v.input,
1304
+ explore: v.explore,
1276
1305
  }),
1277
- ),
1278
- })([])(props.input, props.maps, props.explore),
1306
+ empty: props.config.success,
1307
+ success: props.config.success,
1308
+ failure: (v) =>
1309
+ ts.factory.createReturnStatement(props.config.joiner.failure(v)),
1310
+ },
1311
+ parameters: [],
1312
+ input: props.input,
1313
+ maps: props.maps,
1314
+ explore: props.explore,
1315
+ }),
1279
1316
  undefined,
1280
1317
  undefined,
1281
1318
  );
@@ -1291,36 +1328,37 @@ export namespace CheckerProgrammer {
1291
1328
  explore_array_like_union_types<MetadataTuple>({
1292
1329
  config: props.config,
1293
1330
  importer: props.importer,
1294
- factory: UnionExplorer.tuple({
1295
- checker: (input, tuple, explore) =>
1296
- decode_tuple({
1297
- context: props.context,
1298
- config: props.config,
1299
- importer: props.importer,
1300
- input,
1301
- tuple,
1302
- explore,
1303
- }),
1304
- decoder: (input, tuple, explore) =>
1305
- decode_tuple({
1306
- context: props.context,
1307
- config: props.config,
1308
- importer: props.importer,
1309
- tuple,
1310
- input,
1311
- explore,
1312
- }),
1313
- empty: props.config.success,
1314
- success: props.config.success,
1315
- failure: (input, expected, explore) =>
1316
- ts.factory.createReturnStatement(
1317
- props.config.joiner.failure({
1318
- input,
1319
- expected,
1320
- explore,
1321
- }),
1322
- ),
1323
- }),
1331
+ factory: (next) =>
1332
+ UnionExplorer.tuple({
1333
+ config: {
1334
+ checker: (v) =>
1335
+ decode_tuple({
1336
+ context: props.context,
1337
+ config: props.config,
1338
+ importer: props.importer,
1339
+ input: v.input,
1340
+ tuple: v.definition,
1341
+ explore: v.explore,
1342
+ }),
1343
+ decoder: (v) =>
1344
+ decode_tuple({
1345
+ context: props.context,
1346
+ config: props.config,
1347
+ importer: props.importer,
1348
+ tuple: v.definition,
1349
+ input: v.input,
1350
+ explore: v.explore,
1351
+ }),
1352
+ empty: props.config.success,
1353
+ success: props.config.success,
1354
+ failure: (v) =>
1355
+ ts.factory.createReturnStatement(props.config.joiner.failure(v)),
1356
+ },
1357
+ parameters: next.parameters,
1358
+ tuples: next.definitions,
1359
+ input: next.input,
1360
+ explore: next.explore,
1361
+ }),
1324
1362
  definitions: props.tuples,
1325
1363
  input: props.input,
1326
1364
  explore: props.explore,
@@ -1337,36 +1375,37 @@ export namespace CheckerProgrammer {
1337
1375
  explore_array_like_union_types<MetadataArray>({
1338
1376
  config: props.config,
1339
1377
  importer: props.importer,
1340
- factory: UnionExplorer.array({
1341
- checker: (input, metadata, explore) =>
1342
- decode({
1343
- context: props.context,
1344
- config: props.config,
1345
- importer: props.importer,
1346
- metadata,
1347
- input,
1348
- explore,
1349
- }),
1350
- decoder: (input, array, explore) =>
1351
- decode_array({
1352
- context: props.context,
1353
- config: props.config,
1354
- importer: props.importer,
1355
- array,
1356
- input,
1357
- explore,
1358
- }),
1359
- empty: props.config.success,
1360
- success: props.config.success,
1361
- failure: (input, expected, explore) =>
1362
- ts.factory.createReturnStatement(
1363
- props.config.joiner.failure({
1364
- input,
1365
- expected,
1366
- explore,
1367
- }),
1368
- ),
1369
- }),
1378
+ factory: (next) =>
1379
+ UnionExplorer.array({
1380
+ config: {
1381
+ checker: (v) =>
1382
+ decode({
1383
+ context: props.context,
1384
+ config: props.config,
1385
+ importer: props.importer,
1386
+ metadata: v.definition,
1387
+ input: v.input,
1388
+ explore: v.explore,
1389
+ }),
1390
+ decoder: (v) =>
1391
+ decode_array({
1392
+ context: props.context,
1393
+ config: props.config,
1394
+ importer: props.importer,
1395
+ array: v.definition,
1396
+ input: v.input,
1397
+ explore: v.explore,
1398
+ }),
1399
+ empty: props.config.success,
1400
+ success: props.config.success,
1401
+ failure: (v) =>
1402
+ ts.factory.createReturnStatement(props.config.joiner.failure(v)),
1403
+ },
1404
+ parameters: next.parameters,
1405
+ arrays: next.definitions,
1406
+ input: next.input,
1407
+ explore: next.explore,
1408
+ }),
1370
1409
  definitions: props.arrays,
1371
1410
  input: props.input,
1372
1411
  explore: props.explore,
@@ -1383,68 +1422,69 @@ export namespace CheckerProgrammer {
1383
1422
  explore_array_like_union_types<MetadataArray | MetadataTuple>({
1384
1423
  config: props.config,
1385
1424
  importer: props.importer,
1386
- factory: UnionExplorer.array_or_tuple({
1387
- checker: (input, definition, explore, array) =>
1388
- definition instanceof MetadataTuple
1389
- ? decode_tuple({
1390
- config: props.config,
1391
- context: props.context,
1392
- importer: props.importer,
1393
- input,
1394
- tuple: definition,
1395
- explore,
1396
- })
1397
- : props.config.atomist({
1398
- explore,
1399
- entry: {
1400
- expected: props.definitions
1401
- .map((elem) =>
1402
- elem instanceof MetadataArray
1403
- ? elem.getName()
1404
- : elem.type.name,
1405
- )
1406
- .join(" | "),
1407
- expression: decode({
1425
+ factory: (next) =>
1426
+ UnionExplorer.array_or_tuple({
1427
+ config: {
1428
+ checker: (v) =>
1429
+ v.definition instanceof MetadataTuple
1430
+ ? decode_tuple({
1431
+ config: props.config,
1432
+ context: props.context,
1408
1433
  importer: props.importer,
1434
+ input: v.input,
1435
+ tuple: v.definition,
1436
+ explore: v.explore,
1437
+ })
1438
+ : props.config.atomist({
1439
+ explore: v.explore,
1440
+ entry: {
1441
+ expected: props.definitions
1442
+ .map((elem) =>
1443
+ elem instanceof MetadataArray
1444
+ ? elem.getName()
1445
+ : elem.type.name,
1446
+ )
1447
+ .join(" | "),
1448
+ expression: decode({
1449
+ importer: props.importer,
1450
+ context: props.context,
1451
+ config: props.config,
1452
+ metadata: v.definition,
1453
+ input: v.input,
1454
+ explore: v.explore,
1455
+ }),
1456
+ conditions: [],
1457
+ },
1458
+ input: v.container,
1459
+ }),
1460
+ decoder: (v) =>
1461
+ v.definition instanceof MetadataTuple
1462
+ ? decode_tuple({
1463
+ context: props.context,
1464
+ config: props.config,
1465
+ importer: props.importer,
1466
+ input: v.input,
1467
+ tuple: v.definition,
1468
+ explore: v.explore,
1469
+ })
1470
+ : decode_array({
1409
1471
  context: props.context,
1410
1472
  config: props.config,
1411
- input,
1412
- metadata: definition,
1413
- explore,
1473
+ importer: props.importer,
1474
+ input: v.input,
1475
+ array: v.definition,
1476
+ explore: v.explore,
1414
1477
  }),
1415
- conditions: [],
1416
- },
1417
- input: array,
1418
- }),
1419
- decoder: (input, definition, explore) =>
1420
- definition instanceof MetadataTuple
1421
- ? decode_tuple({
1422
- context: props.context,
1423
- config: props.config,
1424
- importer: props.importer,
1425
- input,
1426
- tuple: definition,
1427
- explore,
1428
- })
1429
- : decode_array({
1430
- context: props.context,
1431
- config: props.config,
1432
- importer: props.importer,
1433
- input,
1434
- array: definition,
1435
- explore,
1436
- }),
1437
- empty: props.config.success,
1438
- success: props.config.success,
1439
- failure: (input, expected, explore) =>
1440
- ts.factory.createReturnStatement(
1441
- props.config.joiner.failure({
1442
- input,
1443
- expected,
1444
- explore,
1445
- }),
1446
- ),
1447
- }),
1478
+ empty: props.config.success,
1479
+ success: props.config.success,
1480
+ failure: (v) =>
1481
+ ts.factory.createReturnStatement(props.config.joiner.failure(v)),
1482
+ },
1483
+ parameters: next.parameters,
1484
+ definitions: next.definitions,
1485
+ input: next.input,
1486
+ explore: next.explore,
1487
+ }),
1448
1488
  input: props.input,
1449
1489
  definitions: props.definitions,
1450
1490
  explore: props.explore,
@@ -1455,13 +1495,12 @@ export namespace CheckerProgrammer {
1455
1495
  >(props: {
1456
1496
  config: IConfig;
1457
1497
  importer: FunctionImporter;
1458
- factory: (
1459
- parameters: ts.ParameterDeclaration[],
1460
- ) => (
1461
- input: ts.Expression,
1462
- elements: T[],
1463
- explore: IExplore,
1464
- ) => ts.ArrowFunction;
1498
+ factory: (next: {
1499
+ parameters: ts.ParameterDeclaration[];
1500
+ definitions: T[];
1501
+ input: ts.Expression;
1502
+ explore: IExplore;
1503
+ }) => ts.ArrowFunction;
1465
1504
  input: ts.Expression;
1466
1505
  definitions: T[];
1467
1506
  explore: IExplore;
@@ -1471,11 +1510,12 @@ export namespace CheckerProgrammer {
1471
1510
  explore: IExplore;
1472
1511
  input: ts.Expression;
1473
1512
  }): ts.ArrowFunction =>
1474
- props.factory(next.parameters)(
1475
- next.input,
1476
- props.definitions,
1477
- next.explore,
1478
- );
1513
+ props.factory({
1514
+ parameters: next.parameters,
1515
+ definitions: props.definitions,
1516
+ input: next.input,
1517
+ explore: next.explore,
1518
+ });
1479
1519
  if (props.definitions.every((e) => e.type.recursive === false))
1480
1520
  ts.factory.createCallExpression(
1481
1521
  arrow({
@@ -1499,11 +1539,11 @@ export namespace CheckerProgrammer {
1499
1539
  props.definitions.map((e) => e.type.name).join(" | "),
1500
1540
  () =>
1501
1541
  arrow({
1502
- parameters: FeatureProgrammer.parameterDeclarations(
1503
- props.config,
1504
- )(TypeFactory.keyword("any"))(
1505
- ts.factory.createIdentifier("input"),
1506
- ),
1542
+ parameters: FeatureProgrammer.parameterDeclarations({
1543
+ config: props.config,
1544
+ type: TypeFactory.keyword("any"),
1545
+ input: ts.factory.createIdentifier("input"),
1546
+ }),
1507
1547
  explore: {
1508
1548
  ...arrayExplore,
1509
1549
  postfix: "",
@@ -1513,9 +1553,7 @@ export namespace CheckerProgrammer {
1513
1553
  ),
1514
1554
  ),
1515
1555
  undefined,
1516
- FeatureProgrammer.argumentsArray(props.config)(arrayExplore)(
1517
- props.input,
1518
- ),
1556
+ FeatureProgrammer.argumentsArray(props),
1519
1557
  ),
1520
1558
  props.config.joiner.failure({
1521
1559
  input: props.input,
@@ -1547,9 +1585,7 @@ export namespace CheckerProgrammer {
1547
1585
  ),
1548
1586
  ),
1549
1587
  undefined,
1550
- FeatureProgrammer.argumentsArray(props.config)(props.explore)(
1551
- props.input,
1552
- ),
1588
+ FeatureProgrammer.argumentsArray(props),
1553
1589
  );
1554
1590
  }
1555
1591