typia 7.0.0-dev.20240923 → 7.0.0-dev.20240928

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 (57) hide show
  1. package/lib/index.mjs +1 -0
  2. package/lib/index.mjs.map +1 -1
  3. package/lib/programmers/AssertProgrammer.d.ts +1 -1
  4. package/lib/programmers/AssertProgrammer.js +169 -127
  5. package/lib/programmers/AssertProgrammer.js.map +1 -1
  6. package/lib/programmers/CheckerProgrammer.d.ts +70 -15
  7. package/lib/programmers/CheckerProgrammer.js +998 -638
  8. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  9. package/lib/programmers/FeatureProgrammer.d.ts +7 -3
  10. package/lib/programmers/FeatureProgrammer.js +17 -17
  11. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  12. package/lib/programmers/IsProgrammer.d.ts +25 -4
  13. package/lib/programmers/IsProgrammer.js +54 -39
  14. package/lib/programmers/IsProgrammer.js.map +1 -1
  15. package/lib/programmers/ValidateProgrammer.js +110 -97
  16. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  17. package/lib/programmers/helpers/UnionExplorer.d.ts +1 -1
  18. package/lib/programmers/json/JsonStringifyProgrammer.js +71 -38
  19. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  20. package/lib/programmers/llm/LlmApplicationProgrammer.js +16 -2
  21. package/lib/programmers/llm/LlmApplicationProgrammer.js.map +1 -1
  22. package/lib/programmers/misc/MiscCloneProgrammer.js +504 -406
  23. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  24. package/lib/programmers/misc/MiscLiteralsProgrammer.js +3 -3
  25. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  26. package/lib/programmers/misc/MiscPruneProgrammer.js +365 -301
  27. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  28. package/lib/programmers/notations/NotationGeneralProgrammer.js +62 -15
  29. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  30. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +17 -3
  31. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  32. package/lib/tags/Example.d.ts +14 -0
  33. package/lib/tags/Example.js +3 -0
  34. package/lib/tags/Example.js.map +1 -0
  35. package/lib/tags/Examples.d.ts +10 -0
  36. package/lib/tags/Examples.js +3 -0
  37. package/lib/tags/Examples.js.map +1 -0
  38. package/lib/tags/index.d.ts +2 -0
  39. package/lib/tags/index.js +2 -0
  40. package/lib/tags/index.js.map +1 -1
  41. package/package.json +2 -2
  42. package/src/programmers/AssertProgrammer.ts +185 -143
  43. package/src/programmers/CheckerProgrammer.ts +1380 -998
  44. package/src/programmers/FeatureProgrammer.ts +40 -34
  45. package/src/programmers/IsProgrammer.ts +94 -66
  46. package/src/programmers/ValidateProgrammer.ts +149 -137
  47. package/src/programmers/helpers/UnionExplorer.ts +1 -1
  48. package/src/programmers/json/JsonStringifyProgrammer.ts +60 -38
  49. package/src/programmers/llm/LlmApplicationProgrammer.ts +51 -32
  50. package/src/programmers/misc/MiscCloneProgrammer.ts +775 -600
  51. package/src/programmers/misc/MiscLiteralsProgrammer.ts +4 -4
  52. package/src/programmers/misc/MiscPruneProgrammer.ts +532 -415
  53. package/src/programmers/notations/NotationGeneralProgrammer.ts +64 -26
  54. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +16 -9
  55. package/src/tags/Example.ts +17 -0
  56. package/src/tags/Examples.ts +16 -0
  57. package/src/tags/index.ts +20 -18
@@ -9,6 +9,7 @@ import { TypeFactory } from "../../factories/TypeFactory";
9
9
 
10
10
  import { Metadata } from "../../schemas/metadata/Metadata";
11
11
  import { MetadataArray } from "../../schemas/metadata/MetadataArray";
12
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
12
13
  import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
13
14
  import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
14
15
 
@@ -33,12 +34,14 @@ export namespace MiscCloneProgrammer {
33
34
  type: ts.Type;
34
35
  name: string | undefined;
35
36
  }): FeatureProgrammer.IDecomposed => {
36
- const config = configure(props.context)(props.importer);
37
+ const config: FeatureProgrammer.IConfig = configure(props);
37
38
  if (props.validated === false)
38
39
  config.addition = (collection) =>
39
- IsProgrammer.write_function_statements(props.context)(props.importer)(
40
+ IsProgrammer.write_function_statements({
41
+ context: props.context,
42
+ importer: props.importer,
40
43
  collection,
41
- );
44
+ });
42
45
  const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({
43
46
  ...props,
44
47
  config,
@@ -73,423 +76,467 @@ export namespace MiscCloneProgrammer {
73
76
  });
74
77
  };
75
78
 
76
- const write_array_functions =
77
- (config: FeatureProgrammer.IConfig) =>
78
- (importer: FunctionImporter) =>
79
- (collection: MetadataCollection): ts.VariableStatement[] =>
80
- collection
81
- .arrays()
82
- .filter((a) => a.recursive)
83
- .map((type, i) =>
84
- StatementFactory.constant(
85
- `${config.prefix}a${i}`,
86
- ts.factory.createArrowFunction(
87
- undefined,
88
- undefined,
89
- FeatureProgrammer.parameterDeclarations(config)(
90
- TypeFactory.keyword("any"),
91
- )(ts.factory.createIdentifier("input")),
79
+ const write_array_functions = (props: {
80
+ config: FeatureProgrammer.IConfig;
81
+ importer: FunctionImporter;
82
+ collection: MetadataCollection;
83
+ }): ts.VariableStatement[] =>
84
+ props.collection
85
+ .arrays()
86
+ .filter((a) => a.recursive)
87
+ .map((type, i) =>
88
+ StatementFactory.constant(
89
+ `${props.config.prefix}a${i}`,
90
+ ts.factory.createArrowFunction(
91
+ undefined,
92
+ undefined,
93
+ FeatureProgrammer.parameterDeclarations(props.config)(
92
94
  TypeFactory.keyword("any"),
93
- undefined,
94
- decode_array_inline(config)(importer)(
95
- ts.factory.createIdentifier("input"),
96
- MetadataArray.create({
97
- type,
98
- tags: [],
99
- }),
100
- {
101
- tracable: config.trace,
102
- source: "function",
103
- from: "array",
104
- postfix: "",
105
- },
106
- ),
107
- ),
95
+ )(ts.factory.createIdentifier("input")),
96
+ TypeFactory.keyword("any"),
97
+ undefined,
98
+ decode_array_inline({
99
+ config: props.config,
100
+ importer: props.importer,
101
+ input: ts.factory.createIdentifier("input"),
102
+ array: MetadataArray.create({
103
+ type,
104
+ tags: [],
105
+ }),
106
+ explore: {
107
+ tracable: props.config.trace,
108
+ source: "function",
109
+ from: "array",
110
+ postfix: "",
111
+ },
112
+ }),
108
113
  ),
109
- );
114
+ ),
115
+ );
110
116
 
111
- const write_tuple_functions =
112
- (project: ITypiaContext) =>
113
- (config: FeatureProgrammer.IConfig) =>
114
- (importer: FunctionImporter) =>
115
- (collection: MetadataCollection): ts.VariableStatement[] =>
116
- collection
117
- .tuples()
118
- .filter((t) => t.recursive)
119
- .map((tuple, i) =>
120
- StatementFactory.constant(
121
- `${config.prefix}t${i}`,
122
- ts.factory.createArrowFunction(
123
- undefined,
124
- undefined,
125
- FeatureProgrammer.parameterDeclarations(config)(
126
- TypeFactory.keyword("any"),
127
- )(ts.factory.createIdentifier("input")),
117
+ const write_tuple_functions = (props: {
118
+ context: ITypiaContext;
119
+ config: FeatureProgrammer.IConfig;
120
+ importer: FunctionImporter;
121
+ collection: MetadataCollection;
122
+ }): ts.VariableStatement[] =>
123
+ props.collection
124
+ .tuples()
125
+ .filter((t) => t.recursive)
126
+ .map((tuple, i) =>
127
+ StatementFactory.constant(
128
+ `${props.config.prefix}t${i}`,
129
+ ts.factory.createArrowFunction(
130
+ undefined,
131
+ undefined,
132
+ FeatureProgrammer.parameterDeclarations(props.config)(
128
133
  TypeFactory.keyword("any"),
129
- undefined,
130
- decode_tuple_inline(project)(config)(importer)(
131
- ts.factory.createIdentifier("input"),
132
- tuple,
133
- {
134
- tracable: config.trace,
135
- source: "function",
136
- from: "array",
137
- postfix: "",
138
- },
139
- ),
140
- ),
134
+ )(ts.factory.createIdentifier("input")),
135
+ TypeFactory.keyword("any"),
136
+ undefined,
137
+ decode_tuple_inline({
138
+ config: props.config,
139
+ context: props.context,
140
+ importer: props.importer,
141
+ input: ts.factory.createIdentifier("input"),
142
+ tuple,
143
+ explore: {
144
+ tracable: props.config.trace,
145
+ source: "function",
146
+ from: "array",
147
+ postfix: "",
148
+ },
149
+ }),
141
150
  ),
142
- );
151
+ ),
152
+ );
143
153
 
144
154
  /* -----------------------------------------------------------
145
155
  DECODERS
146
156
  ----------------------------------------------------------- */
147
- const decode =
148
- (project: ITypiaContext) =>
149
- (config: FeatureProgrammer.IConfig) =>
150
- (importer: FunctionImporter) =>
151
- (
152
- input: ts.Expression,
153
- meta: Metadata,
154
- explore: FeatureProgrammer.IExplore,
155
- ): ts.Expression => {
156
- // ANY TYPE
157
- if (
158
- meta.any ||
159
- meta.arrays.some((a) => a.type.value.any) ||
160
- meta.tuples.some(
161
- (t) =>
162
- !!t.type.elements.length && t.type.elements.every((e) => e.any),
163
- )
157
+ const decode = (props: {
158
+ context: ITypiaContext;
159
+ config: FeatureProgrammer.IConfig;
160
+ importer: FunctionImporter;
161
+ input: ts.Expression;
162
+ metadata: Metadata;
163
+ explore: FeatureProgrammer.IExplore;
164
+ }): ts.Expression => {
165
+ // ANY TYPE
166
+ if (
167
+ props.metadata.any ||
168
+ props.metadata.arrays.some((a) => a.type.value.any) ||
169
+ props.metadata.tuples.some(
170
+ (t) => !!t.type.elements.length && t.type.elements.every((e) => e.any),
164
171
  )
165
- return ts.factory.createCallExpression(importer.use("any"), undefined, [
166
- input,
167
- ]);
168
-
169
- interface IUnion {
170
- type: string;
171
- is: () => ts.Expression;
172
- value: () => ts.Expression;
173
- }
174
- const unions: IUnion[] = [];
175
-
176
- //----
177
- // LIST UP UNION TYPES
178
- //----
179
- // FUNCTIONAL
180
- if (meta.functions.length)
181
- unions.push({
182
- type: "functional",
183
- is: () =>
184
- ts.factory.createStrictEquality(
185
- ts.factory.createStringLiteral("function"),
186
- ts.factory.createTypeOfExpression(input),
187
- ),
188
- value: () => ts.factory.createIdentifier("undefined"),
189
- });
172
+ )
173
+ return ts.factory.createCallExpression(
174
+ props.importer.use("any"),
175
+ undefined,
176
+ [props.input],
177
+ );
190
178
 
191
- // TUPLES
192
- for (const tuple of meta.tuples)
193
- unions.push({
194
- type: "tuple",
195
- is: () =>
196
- IsProgrammer.decode(project)(importer)(
197
- input,
198
- (() => {
199
- const partial = Metadata.initialize();
200
- partial.tuples.push(tuple);
201
- return partial;
202
- })(),
203
- explore,
204
- ),
205
- value: () =>
206
- decode_tuple(project)(config)(importer)(input, tuple, explore),
207
- });
179
+ interface IUnion {
180
+ type: string;
181
+ is: () => ts.Expression;
182
+ value: () => ts.Expression;
183
+ }
184
+ const unions: IUnion[] = [];
185
+
186
+ //----
187
+ // LIST UP UNION TYPES
188
+ //----
189
+ // FUNCTIONAL
190
+ if (props.metadata.functions.length)
191
+ unions.push({
192
+ type: "functional",
193
+ is: () =>
194
+ ts.factory.createStrictEquality(
195
+ ts.factory.createStringLiteral("function"),
196
+ ts.factory.createTypeOfExpression(props.input),
197
+ ),
198
+ value: () => ts.factory.createIdentifier("undefined"),
199
+ });
208
200
 
209
- // ARRAYS
210
- if (meta.arrays.length)
211
- unions.push({
212
- type: "array",
213
- is: () => ExpressionFactory.isArray(input),
214
- value: () =>
215
- explore_arrays(project)(config)(importer)(input, meta.arrays, {
216
- ...explore,
201
+ // TUPLES
202
+ for (const tuple of props.metadata.tuples)
203
+ unions.push({
204
+ type: "tuple",
205
+ is: () =>
206
+ IsProgrammer.decode({
207
+ ...props,
208
+ metadata: (() => {
209
+ const partial = Metadata.initialize();
210
+ partial.tuples.push(tuple);
211
+ return partial;
212
+ })(),
213
+ }),
214
+ value: () =>
215
+ decode_tuple({
216
+ ...props,
217
+ tuple,
218
+ }),
219
+ });
220
+
221
+ // ARRAYS
222
+ if (props.metadata.arrays.length)
223
+ unions.push({
224
+ type: "array",
225
+ is: () => ExpressionFactory.isArray(props.input),
226
+ value: () =>
227
+ explore_arrays({
228
+ ...props,
229
+ arrays: props.metadata.arrays,
230
+ explore: {
231
+ ...props.explore,
217
232
  from: "array",
218
- }),
219
- });
233
+ },
234
+ }),
235
+ });
220
236
 
221
- // NATIVE TYPES
222
- if (meta.sets.length)
223
- unions.push({
224
- type: "set",
225
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
226
- value: () =>
227
- explore_sets(project)(config)(importer)(input, meta.sets, {
228
- ...explore,
237
+ // NATIVE TYPES
238
+ if (props.metadata.sets.length)
239
+ unions.push({
240
+ type: "set",
241
+ is: () => ExpressionFactory.isInstanceOf("Set")(props.input),
242
+ value: () =>
243
+ explore_sets({
244
+ ...props,
245
+ sets: props.metadata.sets,
246
+ explore: {
247
+ ...props.explore,
229
248
  from: "array",
230
- }),
231
- });
232
- if (meta.maps.length)
233
- unions.push({
234
- type: "map",
235
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
236
- value: () =>
237
- explore_maps(project)(config)(importer)(input, meta.maps, {
238
- ...explore,
249
+ },
250
+ }),
251
+ });
252
+ if (props.metadata.maps.length)
253
+ unions.push({
254
+ type: "map",
255
+ is: () => ExpressionFactory.isInstanceOf("Map")(props.input),
256
+ value: () =>
257
+ explore_maps({
258
+ ...props,
259
+ maps: props.metadata.maps,
260
+ explore: {
261
+ ...props.explore,
239
262
  from: "array",
240
- }),
241
- });
242
- for (const native of meta.natives)
243
- unions.push({
244
- type: "native",
245
- is: () => ExpressionFactory.isInstanceOf(native)(input),
246
- value: () =>
247
- native === "Boolean" || native === "Number" || native === "String"
248
- ? ts.factory.createCallExpression(
249
- IdentifierFactory.access(input)("valueOf"),
250
- undefined,
251
- undefined,
252
- )
253
- : decode_native(native)(input),
254
- });
255
-
256
- // OBJECTS
257
- if (meta.objects.length)
258
- unions.push({
259
- type: "object",
260
- is: () =>
261
- ExpressionFactory.isObject({
262
- checkNull: true,
263
- checkArray: false,
264
- })(input),
265
- value: () =>
266
- explore_objects(config)(importer)(input, meta, {
267
- ...explore,
268
- from: "object",
269
- }),
270
- });
271
-
272
- // COMPOSITION
273
- if (unions.length === 0) return input;
274
- else if (unions.length === 1 && meta.size() === 1) {
275
- const value: ts.Expression =
276
- (meta.nullable || meta.isRequired() === false) && is_instance(meta)
277
- ? ts.factory.createConditionalExpression(
278
- input,
263
+ },
264
+ }),
265
+ });
266
+ for (const native of props.metadata.natives)
267
+ unions.push({
268
+ type: "native",
269
+ is: () => ExpressionFactory.isInstanceOf(native)(props.input),
270
+ value: () =>
271
+ native === "Boolean" || native === "Number" || native === "String"
272
+ ? ts.factory.createCallExpression(
273
+ IdentifierFactory.access(props.input)("valueOf"),
279
274
  undefined,
280
- unions[0]!.value(),
281
275
  undefined,
282
- input,
283
276
  )
284
- : unions[0]!.value();
285
- return ts.factory.createAsExpression(value, TypeFactory.keyword("any"));
286
- } else {
287
- let last: ts.Expression = input;
288
- for (const u of unions.reverse())
289
- last = ts.factory.createConditionalExpression(
290
- u.is(),
291
- undefined,
292
- u.value(),
293
- undefined,
294
- last,
295
- );
296
- return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
297
- }
298
- };
277
+ : decode_native({
278
+ type: native,
279
+ input: props.input,
280
+ }),
281
+ });
282
+
283
+ // OBJECTS
284
+ if (props.metadata.objects.length)
285
+ unions.push({
286
+ type: "object",
287
+ is: () =>
288
+ ExpressionFactory.isObject({
289
+ checkNull: true,
290
+ checkArray: false,
291
+ })(props.input),
292
+ value: () =>
293
+ explore_objects({
294
+ ...props,
295
+ explore: {
296
+ ...props.explore,
297
+ from: "object",
298
+ },
299
+ }),
300
+ });
301
+
302
+ // COMPOSITION
303
+ if (unions.length === 0) return props.input;
304
+ else if (unions.length === 1 && props.metadata.size() === 1) {
305
+ const value: ts.Expression =
306
+ (props.metadata.nullable || props.metadata.isRequired() === false) &&
307
+ is_instance(props.metadata)
308
+ ? ts.factory.createConditionalExpression(
309
+ props.input,
310
+ undefined,
311
+ unions[0]!.value(),
312
+ undefined,
313
+ props.input,
314
+ )
315
+ : unions[0]!.value();
316
+ return ts.factory.createAsExpression(value, TypeFactory.keyword("any"));
317
+ } else {
318
+ let last: ts.Expression = props.input;
319
+ for (const u of unions.reverse())
320
+ last = ts.factory.createConditionalExpression(
321
+ u.is(),
322
+ undefined,
323
+ u.value(),
324
+ undefined,
325
+ last,
326
+ );
327
+ return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
328
+ }
329
+ };
299
330
 
300
- const decode_object = (importer: FunctionImporter) =>
331
+ const decode_object = (props: {
332
+ importer: FunctionImporter;
333
+ input: ts.Expression;
334
+ object: MetadataObject;
335
+ explore: FeatureProgrammer.IExplore;
336
+ }) =>
301
337
  FeatureProgrammer.decode_object({
302
338
  trace: false,
303
339
  path: false,
304
340
  prefix: PREFIX,
305
- })(importer);
306
-
307
- const decode_array =
308
- (config: FeatureProgrammer.IConfig) =>
309
- (importer: FunctionImporter) =>
310
- (
311
- input: ts.Expression,
312
- array: MetadataArray,
313
- explore: FeatureProgrammer.IExplore,
314
- ) =>
315
- array.type.recursive
316
- ? ts.factory.createCallExpression(
317
- ts.factory.createIdentifier(
318
- importer.useLocal(`${config.prefix}a${array.type.index}`),
319
- ),
320
- undefined,
321
- FeatureProgrammer.argumentsArray(config)({
322
- ...explore,
323
- source: "function",
324
- from: "array",
325
- })(input),
326
- )
327
- : decode_array_inline(config)(importer)(input, array, explore);
328
-
329
- const decode_array_inline =
330
- (config: FeatureProgrammer.IConfig) =>
331
- (importer: FunctionImporter) =>
332
- (
333
- input: ts.Expression,
334
- array: MetadataArray,
335
- explore: FeatureProgrammer.IExplore,
336
- ) =>
337
- FeatureProgrammer.decode_array(config)(importer)(CloneJoiner.array)(
338
- input,
339
- array,
340
- explore,
341
- );
341
+ })(props.importer)(props.input, props.object, props.explore);
342
342
 
343
- const decode_tuple =
344
- (project: ITypiaContext) =>
345
- (config: FeatureProgrammer.IConfig) =>
346
- (importer: FunctionImporter) =>
347
- (
348
- input: ts.Expression,
349
- tuple: MetadataTuple,
350
- explore: FeatureProgrammer.IExplore,
351
- ): ts.Expression =>
352
- tuple.type.recursive
353
- ? ts.factory.createCallExpression(
354
- ts.factory.createIdentifier(
355
- importer.useLocal(`${config.prefix}t${tuple.type.index}`),
343
+ const decode_array = (props: {
344
+ config: FeatureProgrammer.IConfig;
345
+ importer: FunctionImporter;
346
+ input: ts.Expression;
347
+ array: MetadataArray;
348
+ explore: FeatureProgrammer.IExplore;
349
+ }) =>
350
+ props.array.type.recursive
351
+ ? ts.factory.createCallExpression(
352
+ ts.factory.createIdentifier(
353
+ props.importer.useLocal(
354
+ `${props.config.prefix}a${props.array.type.index}`,
356
355
  ),
357
- undefined,
358
- FeatureProgrammer.argumentsArray(config)({
359
- ...explore,
360
- source: "function",
361
- })(input),
362
- )
363
- : decode_tuple_inline(project)(config)(importer)(
364
- input,
365
- tuple.type,
366
- explore,
367
- );
368
-
369
- const decode_tuple_inline =
370
- (project: ITypiaContext) =>
371
- (config: FeatureProgrammer.IConfig) =>
372
- (importer: FunctionImporter) =>
373
- (
374
- input: ts.Expression,
375
- tuple: MetadataTupleType,
376
- explore: FeatureProgrammer.IExplore,
377
- ): ts.Expression => {
378
- const elements: ts.Expression[] = tuple.elements
379
- .filter((m) => m.rest === null)
380
- .map((elem, index) =>
381
- decode(project)(config)(importer)(
382
- ts.factory.createElementAccessExpression(input, index),
383
- elem,
384
- {
385
- ...explore,
386
- from: "array",
387
- postfix: explore.postfix.length
388
- ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
389
- : `"[${index}]"`,
390
- },
391
356
  ),
392
- );
393
- const rest = (() => {
394
- if (tuple.elements.length === 0) return null;
395
-
396
- const last: Metadata = tuple.elements.at(-1)!;
397
- const rest: Metadata | null = last.rest;
398
- if (rest === null) return null;
357
+ undefined,
358
+ FeatureProgrammer.argumentsArray(props.config)({
359
+ ...props.explore,
360
+ source: "function",
361
+ from: "array",
362
+ })(props.input),
363
+ )
364
+ : decode_array_inline(props);
399
365
 
400
- return decode(project)(config)(importer)(
401
- ts.factory.createCallExpression(
402
- IdentifierFactory.access(input)("slice"),
403
- undefined,
404
- [ExpressionFactory.number(tuple.elements.length - 1)],
366
+ const decode_array_inline = (props: {
367
+ config: FeatureProgrammer.IConfig;
368
+ importer: FunctionImporter;
369
+ input: ts.Expression;
370
+ array: MetadataArray;
371
+ explore: FeatureProgrammer.IExplore;
372
+ }) =>
373
+ FeatureProgrammer.decode_array(props.config)(props.importer)(
374
+ CloneJoiner.array,
375
+ )(props.input, props.array, props.explore);
376
+
377
+ const decode_tuple = (props: {
378
+ context: ITypiaContext;
379
+ config: FeatureProgrammer.IConfig;
380
+ importer: FunctionImporter;
381
+ input: ts.Expression;
382
+ tuple: MetadataTuple;
383
+ explore: FeatureProgrammer.IExplore;
384
+ }): ts.Expression =>
385
+ props.tuple.type.recursive
386
+ ? ts.factory.createCallExpression(
387
+ ts.factory.createIdentifier(
388
+ props.importer.useLocal(
389
+ `${props.config.prefix}t${props.tuple.type.index}`,
390
+ ),
405
391
  ),
406
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
407
- {
408
- ...explore,
409
- start: tuple.elements.length - 1,
392
+ undefined,
393
+ FeatureProgrammer.argumentsArray(props.config)({
394
+ ...props.explore,
395
+ source: "function",
396
+ })(props.input),
397
+ )
398
+ : decode_tuple_inline({
399
+ ...props,
400
+ tuple: props.tuple.type,
401
+ });
402
+
403
+ const decode_tuple_inline = (props: {
404
+ context: ITypiaContext;
405
+ config: FeatureProgrammer.IConfig;
406
+ importer: FunctionImporter;
407
+ input: ts.Expression;
408
+ tuple: MetadataTupleType;
409
+ explore: FeatureProgrammer.IExplore;
410
+ }): ts.Expression => {
411
+ const elements: ts.Expression[] = props.tuple.elements
412
+ .filter((m) => m.rest === null)
413
+ .map((elem, index) =>
414
+ decode({
415
+ context: props.context,
416
+ config: props.config,
417
+ importer: props.importer,
418
+ input: ts.factory.createElementAccessExpression(props.input, index),
419
+ metadata: elem,
420
+ explore: {
421
+ ...props.explore,
422
+ from: "array",
423
+ postfix: props.explore.postfix.length
424
+ ? `${postfix_of_tuple(props.explore.postfix)}[${index}]"`
425
+ : `"[${index}]"`,
410
426
  },
411
- );
412
- })();
413
- return CloneJoiner.tuple({
414
- elements,
415
- rest,
427
+ }),
428
+ );
429
+ const rest = (() => {
430
+ if (props.tuple.elements.length === 0) return null;
431
+
432
+ const last: Metadata = props.tuple.elements.at(-1)!;
433
+ const rest: Metadata | null = last.rest;
434
+ if (rest === null) return null;
435
+
436
+ return decode({
437
+ context: props.context,
438
+ config: props.config,
439
+ importer: props.importer,
440
+ input: ts.factory.createCallExpression(
441
+ IdentifierFactory.access(props.input)("slice"),
442
+ undefined,
443
+ [ExpressionFactory.number(props.tuple.elements.length - 1)],
444
+ ),
445
+ metadata: wrap_metadata_rest_tuple(props.tuple.elements.at(-1)!.rest!),
446
+ explore: {
447
+ ...props.explore,
448
+ start: props.tuple.elements.length - 1,
449
+ },
416
450
  });
417
- };
451
+ })();
452
+ return CloneJoiner.tuple({
453
+ elements,
454
+ rest,
455
+ });
456
+ };
418
457
 
419
458
  /* -----------------------------------------------------------
420
459
  NATIVE CLASSES
421
460
  ----------------------------------------------------------- */
422
- const decode_native = (type: string) => (input: ts.Expression) =>
423
- type === "Date" ||
424
- type === "Uint8Array" ||
425
- type === "Uint8ClampedArray" ||
426
- type === "Uint16Array" ||
427
- type === "Uint32Array" ||
428
- type === "BigUint64Array" ||
429
- type === "Int8Array" ||
430
- type === "Int16Array" ||
431
- type === "Int32Array" ||
432
- type === "BigInt64Array" ||
433
- type === "Float32Array" ||
434
- type === "Float64Array" ||
435
- type === "RegExp"
436
- ? decode_native_copyable(type)(input)
437
- : type === "ArrayBuffer" || type === "SharedArrayBuffer"
438
- ? decode_native_buffer(type)(input)
439
- : type === "DataView"
440
- ? decode_native_data_view(input)
461
+ const decode_native = (props: { type: string; input: ts.Expression }) =>
462
+ props.type === "Date" ||
463
+ props.type === "Uint8Array" ||
464
+ props.type === "Uint8ClampedArray" ||
465
+ props.type === "Uint16Array" ||
466
+ props.type === "Uint32Array" ||
467
+ props.type === "BigUint64Array" ||
468
+ props.type === "Int8Array" ||
469
+ props.type === "Int16Array" ||
470
+ props.type === "Int32Array" ||
471
+ props.type === "BigInt64Array" ||
472
+ props.type === "Float32Array" ||
473
+ props.type === "Float64Array" ||
474
+ props.type === "RegExp"
475
+ ? decode_native_copyable(props)
476
+ : props.type === "ArrayBuffer" || props.type === "SharedArrayBuffer"
477
+ ? decode_native_buffer({
478
+ type: props.type,
479
+ input: props.input,
480
+ })
481
+ : props.type === "DataView"
482
+ ? decode_native_data_view(props.input)
441
483
  : ts.factory.createCallExpression(
442
- ts.factory.createIdentifier(type),
484
+ ts.factory.createIdentifier(props.type),
443
485
  undefined,
444
486
  [],
445
487
  );
446
488
 
447
- const decode_native_copyable = (type: string) => (input: ts.Expression) =>
489
+ const decode_native_copyable = (props: {
490
+ type: string;
491
+ input: ts.Expression;
492
+ }) =>
448
493
  ts.factory.createNewExpression(
449
- ts.factory.createIdentifier(type),
494
+ ts.factory.createIdentifier(props.type),
450
495
  undefined,
451
- [input],
496
+ [props.input],
452
497
  );
453
498
 
454
- const decode_native_buffer =
455
- (type: "ArrayBuffer" | "SharedArrayBuffer") => (input: ts.Expression) =>
456
- ExpressionFactory.selfCall(
457
- ts.factory.createBlock(
458
- [
459
- StatementFactory.constant(
460
- "buffer",
461
- ts.factory.createNewExpression(
462
- ts.factory.createIdentifier(type),
463
- undefined,
464
- [IdentifierFactory.access(input)("byteLength")],
465
- ),
466
- ),
467
- ts.factory.createExpressionStatement(
468
- ts.factory.createCallExpression(
469
- IdentifierFactory.access(
470
- ts.factory.createNewExpression(
471
- ts.factory.createIdentifier("Uint8Array"),
472
- undefined,
473
- [ts.factory.createIdentifier("buffer")],
474
- ),
475
- )("set"),
476
- undefined,
477
- [
478
- ts.factory.createNewExpression(
479
- ts.factory.createIdentifier("Uint8Array"),
480
- undefined,
481
- [input],
482
- ),
483
- ],
484
- ),
499
+ const decode_native_buffer = (props: {
500
+ type: "ArrayBuffer" | "SharedArrayBuffer";
501
+ input: ts.Expression;
502
+ }) =>
503
+ ExpressionFactory.selfCall(
504
+ ts.factory.createBlock(
505
+ [
506
+ StatementFactory.constant(
507
+ "buffer",
508
+ ts.factory.createNewExpression(
509
+ ts.factory.createIdentifier(props.type),
510
+ undefined,
511
+ [IdentifierFactory.access(props.input)("byteLength")],
485
512
  ),
486
- ts.factory.createReturnStatement(
487
- ts.factory.createIdentifier("buffer"),
513
+ ),
514
+ ts.factory.createExpressionStatement(
515
+ ts.factory.createCallExpression(
516
+ IdentifierFactory.access(
517
+ ts.factory.createNewExpression(
518
+ ts.factory.createIdentifier("Uint8Array"),
519
+ undefined,
520
+ [ts.factory.createIdentifier("buffer")],
521
+ ),
522
+ )("set"),
523
+ undefined,
524
+ [
525
+ ts.factory.createNewExpression(
526
+ ts.factory.createIdentifier("Uint8Array"),
527
+ undefined,
528
+ [props.input],
529
+ ),
530
+ ],
488
531
  ),
489
- ],
490
- true,
491
- ),
492
- );
532
+ ),
533
+ ts.factory.createReturnStatement(
534
+ ts.factory.createIdentifier("buffer"),
535
+ ),
536
+ ],
537
+ true,
538
+ ),
539
+ );
493
540
 
494
541
  const decode_native_data_view = (input: ts.Expression) =>
495
542
  ts.factory.createNewExpression(
@@ -501,242 +548,369 @@ export namespace MiscCloneProgrammer {
501
548
  /* -----------------------------------------------------------
502
549
  EXPLORERS FOR UNION TYPES
503
550
  ----------------------------------------------------------- */
504
- const explore_sets =
505
- (project: ITypiaContext) =>
506
- (config: FeatureProgrammer.IConfig) =>
507
- (importer: FunctionImporter) =>
508
- (
509
- input: ts.Expression,
510
- sets: Metadata[],
511
- explore: FeatureProgrammer.IExplore,
512
- ): ts.Expression =>
513
- ts.factory.createCallExpression(
514
- UnionExplorer.set({
515
- checker: IsProgrammer.decode(project)(importer),
516
- decoder: (input, array, explore) =>
517
- ts.factory.createNewExpression(
518
- ts.factory.createIdentifier("Set"),
519
- [TypeFactory.keyword("any")],
520
- [decode_array(config)(importer)(input, array, explore)],
521
- ),
522
- empty: ts.factory.createNewExpression(
551
+ const explore_sets = (props: {
552
+ context: ITypiaContext;
553
+ config: FeatureProgrammer.IConfig;
554
+ importer: FunctionImporter;
555
+ input: ts.Expression;
556
+ sets: Metadata[];
557
+ explore: FeatureProgrammer.IExplore;
558
+ }): ts.Expression =>
559
+ ts.factory.createCallExpression(
560
+ UnionExplorer.set({
561
+ checker: (input, metadata, explore) =>
562
+ IsProgrammer.decode({
563
+ context: props.context,
564
+ importer: props.importer,
565
+ input,
566
+ metadata,
567
+ explore,
568
+ }),
569
+ decoder: (input, array, explore) =>
570
+ ts.factory.createNewExpression(
523
571
  ts.factory.createIdentifier("Set"),
524
572
  [TypeFactory.keyword("any")],
525
- [],
573
+ [
574
+ decode_array({
575
+ config: props.config,
576
+ importer: props.importer,
577
+ input,
578
+ array,
579
+ explore,
580
+ }),
581
+ ],
526
582
  ),
527
- success: ts.factory.createTrue(),
528
- failure: (input, expected) =>
529
- create_throw_error(importer)(expected)(input),
530
- })([])(input, sets, explore),
531
- undefined,
532
- undefined,
533
- );
583
+ empty: ts.factory.createNewExpression(
584
+ ts.factory.createIdentifier("Set"),
585
+ [TypeFactory.keyword("any")],
586
+ [],
587
+ ),
588
+ success: ts.factory.createTrue(),
589
+ failure: (input, expected) =>
590
+ create_throw_error({
591
+ importer: props.importer,
592
+ expected,
593
+ input,
594
+ }),
595
+ })([])(props.input, props.sets, props.explore),
596
+ undefined,
597
+ undefined,
598
+ );
534
599
 
535
- const explore_maps =
536
- (project: ITypiaContext) =>
537
- (config: FeatureProgrammer.IConfig) =>
538
- (importer: FunctionImporter) =>
539
- (
540
- input: ts.Expression,
541
- maps: Metadata.Entry[],
542
- explore: FeatureProgrammer.IExplore,
543
- ): ts.Expression =>
544
- ts.factory.createCallExpression(
545
- UnionExplorer.map({
546
- checker: (top, entry, explore) => {
547
- const func = IsProgrammer.decode(project)(importer);
548
- return ts.factory.createLogicalAnd(
549
- func(ts.factory.createElementAccessExpression(top, 0), entry[0], {
600
+ const explore_maps = (props: {
601
+ context: ITypiaContext;
602
+ config: FeatureProgrammer.IConfig;
603
+ importer: FunctionImporter;
604
+ input: ts.Expression;
605
+ maps: Metadata.Entry[];
606
+ explore: FeatureProgrammer.IExplore;
607
+ }): ts.Expression =>
608
+ ts.factory.createCallExpression(
609
+ UnionExplorer.map({
610
+ checker: (top, entry, explore) =>
611
+ ts.factory.createLogicalAnd(
612
+ IsProgrammer.decode({
613
+ context: props.context,
614
+ importer: props.importer,
615
+ input: ts.factory.createElementAccessExpression(top, 0),
616
+ metadata: entry[0],
617
+ explore: {
550
618
  ...explore,
551
619
  postfix: `${explore.postfix}[0]`,
552
- }),
553
- func(ts.factory.createElementAccessExpression(top, 1), entry[1], {
620
+ },
621
+ }),
622
+ IsProgrammer.decode({
623
+ context: props.context,
624
+ importer: props.importer,
625
+ input: ts.factory.createElementAccessExpression(top, 1),
626
+ metadata: entry[1],
627
+ explore: {
554
628
  ...explore,
555
629
  postfix: `${explore.postfix}[1]`,
556
- }),
557
- );
558
- },
559
- decoder: (input, array, explore) =>
560
- ts.factory.createNewExpression(
561
- ts.factory.createIdentifier("Map"),
562
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
563
- [decode_array(config)(importer)(input, array, explore)],
564
- ),
565
- empty: ts.factory.createNewExpression(
630
+ },
631
+ }),
632
+ ),
633
+ decoder: (input, array, explore) =>
634
+ ts.factory.createNewExpression(
566
635
  ts.factory.createIdentifier("Map"),
567
636
  [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
568
- [],
637
+ [
638
+ decode_array({
639
+ config: props.config,
640
+ importer: props.importer,
641
+ input,
642
+ array,
643
+ explore,
644
+ }),
645
+ ],
569
646
  ),
570
- success: ts.factory.createTrue(),
571
- failure: (input, expected) =>
572
- create_throw_error(importer)(expected)(input),
573
- })([])(input, maps, explore),
574
- undefined,
575
- undefined,
576
- );
647
+ empty: ts.factory.createNewExpression(
648
+ ts.factory.createIdentifier("Map"),
649
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
650
+ [],
651
+ ),
652
+ success: ts.factory.createTrue(),
653
+ failure: (input, expected) =>
654
+ create_throw_error({
655
+ importer: props.importer,
656
+ expected,
657
+ input,
658
+ }),
659
+ })([])(props.input, props.maps, props.explore),
660
+ undefined,
661
+ undefined,
662
+ );
577
663
 
578
- const explore_objects =
579
- (config: FeatureProgrammer.IConfig) =>
580
- (importer: FunctionImporter) =>
581
- (
582
- input: ts.Expression,
583
- meta: Metadata,
584
- explore: FeatureProgrammer.IExplore,
585
- ) =>
586
- meta.objects.length === 1
587
- ? decode_object(importer)(input, meta.objects[0]!, explore)
588
- : ts.factory.createCallExpression(
589
- ts.factory.createIdentifier(
590
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
591
- ),
592
- undefined,
593
- FeatureProgrammer.argumentsArray(config)(explore)(input),
594
- );
595
-
596
- const explore_arrays =
597
- (project: ITypiaContext) =>
598
- (config: FeatureProgrammer.IConfig) =>
599
- (importer: FunctionImporter) =>
600
- (
601
- input: ts.Expression,
602
- elements: MetadataArray[],
603
- explore: FeatureProgrammer.IExplore,
604
- ): ts.Expression =>
605
- explore_array_like_union_types(config)(importer)(
664
+ const explore_objects = (props: {
665
+ config: FeatureProgrammer.IConfig;
666
+ importer: FunctionImporter;
667
+ input: ts.Expression;
668
+ metadata: Metadata;
669
+ explore: FeatureProgrammer.IExplore;
670
+ }) =>
671
+ props.metadata.objects.length === 1
672
+ ? decode_object({
673
+ ...props,
674
+ object: props.metadata.objects[0]!,
675
+ })
676
+ : ts.factory.createCallExpression(
677
+ ts.factory.createIdentifier(
678
+ props.importer.useLocal(`${PREFIX}u${props.metadata.union_index!}`),
679
+ ),
680
+ undefined,
681
+ FeatureProgrammer.argumentsArray(props.config)(props.explore)(
682
+ props.input,
683
+ ),
684
+ );
685
+
686
+ const explore_arrays = (props: {
687
+ context: ITypiaContext;
688
+ config: FeatureProgrammer.IConfig;
689
+ importer: FunctionImporter;
690
+ input: ts.Expression;
691
+ arrays: MetadataArray[];
692
+ explore: FeatureProgrammer.IExplore;
693
+ }): ts.Expression =>
694
+ explore_array_like_union_types({
695
+ ...props,
696
+ elements: props.arrays,
697
+ factory: (next) =>
606
698
  UnionExplorer.array({
607
- checker: IsProgrammer.decode(project)(importer),
608
- decoder: decode_array(config)(importer),
699
+ checker: (input, metadata, explore) =>
700
+ IsProgrammer.decode({
701
+ context: props.context,
702
+ importer: props.importer,
703
+ input,
704
+ metadata,
705
+ explore,
706
+ }),
707
+ decoder: (input, array, explore) =>
708
+ decode_array({
709
+ config: props.config,
710
+ importer: props.importer,
711
+ input,
712
+ array,
713
+ explore,
714
+ }),
609
715
  empty: ts.factory.createIdentifier("[]"),
610
716
  success: ts.factory.createTrue(),
611
717
  failure: (input, expected) =>
612
- create_throw_error(importer)(expected)(input),
613
- }),
614
- )(input, elements, explore);
615
-
616
- const explore_array_like_union_types =
617
- (config: FeatureProgrammer.IConfig) =>
618
- (importer: FunctionImporter) =>
619
- <T extends MetadataArray | MetadataTuple>(
620
- factory: (
621
- parameters: ts.ParameterDeclaration[],
622
- ) => (
623
- input: ts.Expression,
624
- elements: T[],
625
- explore: FeatureProgrammer.IExplore,
626
- ) => ts.ArrowFunction,
627
- ) =>
628
- (
629
- input: ts.Expression,
630
- elements: T[],
631
- explore: FeatureProgrammer.IExplore,
632
- ): ts.Expression => {
633
- const arrow =
634
- (parameters: ts.ParameterDeclaration[]) =>
635
- (explore: FeatureProgrammer.IExplore) =>
636
- (input: ts.Expression): ts.ArrowFunction =>
637
- factory(parameters)(input, elements, explore);
638
- if (elements.every((e) => e.type.recursive === false))
639
- ts.factory.createCallExpression(
640
- arrow([])(explore)(input),
641
- undefined,
642
- [],
643
- );
718
+ create_throw_error({
719
+ importer: props.importer,
720
+ expected,
721
+ input,
722
+ }),
723
+ })(next.parameters)(next.input, next.elements, next.explore),
724
+ });
644
725
 
645
- explore = {
646
- ...explore,
647
- source: "function",
648
- from: "array",
649
- };
650
- return ts.factory.createCallExpression(
651
- ts.factory.createIdentifier(
652
- importer.emplaceUnion(
653
- config.prefix,
654
- elements.map((e) => e.type.name).join(" | "),
655
- () =>
656
- arrow(
657
- FeatureProgrammer.parameterDeclarations(config)(
658
- TypeFactory.keyword("any"),
659
- )(ts.factory.createIdentifier("input")),
660
- )({
661
- ...explore,
662
- postfix: "",
663
- })(ts.factory.createIdentifier("input")),
664
- ),
665
- ),
726
+ const explore_array_like_union_types = <
727
+ T extends MetadataArray | MetadataTuple,
728
+ >(props: {
729
+ config: FeatureProgrammer.IConfig;
730
+ importer: FunctionImporter;
731
+ factory: (next: {
732
+ parameters: ts.ParameterDeclaration[];
733
+ input: ts.Expression;
734
+ elements: T[];
735
+ explore: FeatureProgrammer.IExplore;
736
+ }) => ts.ArrowFunction;
737
+ input: ts.Expression;
738
+ elements: T[];
739
+ explore: FeatureProgrammer.IExplore;
740
+ }): ts.Expression => {
741
+ const arrow = (next: {
742
+ parameters: ts.ParameterDeclaration[];
743
+ explore: FeatureProgrammer.IExplore;
744
+ input: ts.Expression;
745
+ }): ts.ArrowFunction =>
746
+ props.factory({
747
+ elements: props.elements,
748
+ parameters: next.parameters,
749
+ input: next.input,
750
+ explore: next.explore,
751
+ });
752
+ if (props.elements.every((e) => e.type.recursive === false))
753
+ ts.factory.createCallExpression(
754
+ arrow({
755
+ parameters: [],
756
+ explore: props.explore,
757
+ input: props.input,
758
+ }),
666
759
  undefined,
667
- FeatureProgrammer.argumentsArray(config)(explore)(input),
760
+ [],
668
761
  );
762
+
763
+ const arrayExplore: FeatureProgrammer.IExplore = {
764
+ ...props.explore,
765
+ source: "function",
766
+ from: "array",
669
767
  };
768
+ return ts.factory.createCallExpression(
769
+ ts.factory.createIdentifier(
770
+ props.importer.emplaceUnion(
771
+ props.config.prefix,
772
+ props.elements.map((e) => e.type.name).join(" | "),
773
+ () =>
774
+ arrow({
775
+ parameters: FeatureProgrammer.parameterDeclarations(props.config)(
776
+ TypeFactory.keyword("any"),
777
+ )(ts.factory.createIdentifier("input")),
778
+ explore: {
779
+ ...arrayExplore,
780
+ postfix: "",
781
+ },
782
+ input: ts.factory.createIdentifier("input"),
783
+ }),
784
+ ),
785
+ ),
786
+ undefined,
787
+ FeatureProgrammer.argumentsArray(props.config)(arrayExplore)(props.input),
788
+ );
789
+ };
670
790
 
671
791
  /* -----------------------------------------------------------
672
792
  CONFIGURATIONS
673
793
  ----------------------------------------------------------- */
674
794
  const PREFIX = "$c";
675
795
 
676
- const configure =
677
- (project: ITypiaContext) =>
678
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
679
- const config: FeatureProgrammer.IConfig = {
680
- types: {
681
- input: (type, name) =>
682
- ts.factory.createTypeReferenceNode(
683
- name ?? TypeFactory.getFullName(project.checker)(type),
796
+ const configure = (props: {
797
+ context: ITypiaContext;
798
+ importer: FunctionImporter;
799
+ }): FeatureProgrammer.IConfig => {
800
+ const config: FeatureProgrammer.IConfig = {
801
+ types: {
802
+ input: (type, name) =>
803
+ ts.factory.createTypeReferenceNode(
804
+ name ?? TypeFactory.getFullName(props.context.checker)(type),
805
+ ),
806
+ output: (type, name) =>
807
+ ts.factory.createImportTypeNode(
808
+ ts.factory.createLiteralTypeNode(
809
+ ts.factory.createStringLiteral("typia"),
684
810
  ),
685
- output: (type, name) =>
686
- ts.factory.createImportTypeNode(
687
- ts.factory.createLiteralTypeNode(
688
- ts.factory.createStringLiteral("typia"),
811
+ undefined,
812
+ ts.factory.createIdentifier("Resolved"),
813
+ [
814
+ ts.factory.createTypeReferenceNode(
815
+ name ?? TypeFactory.getFullName(props.context.checker)(type),
689
816
  ),
690
- undefined,
691
- ts.factory.createIdentifier("Resolved"),
692
- [
693
- ts.factory.createTypeReferenceNode(
694
- name ?? TypeFactory.getFullName(project.checker)(type),
695
- ),
696
- ],
697
- false,
698
- ),
699
- },
700
- prefix: PREFIX,
701
- trace: false,
702
- path: false,
703
- initializer,
704
- decoder: () => decode(project)(config)(importer),
705
- objector: {
706
- checker: () => IsProgrammer.decode(project)(importer),
707
- decoder: () => decode_object(importer),
708
- joiner: CloneJoiner.object,
709
- unionizer: decode_union_object(
710
- IsProgrammer.decode_object(project)(importer),
711
- )(decode_object(importer))((exp) => exp)((input, expected) =>
712
- create_throw_error(importer)(expected)(input),
817
+ ],
818
+ false,
713
819
  ),
714
- failure: (input, expected) =>
715
- create_throw_error(importer)(expected)(input),
716
- },
717
- generator: {
718
- arrays: () => write_array_functions(config)(importer),
719
- tuples: () => write_tuple_functions(project)(config)(importer),
720
- },
721
- };
722
- return config;
820
+ },
821
+ prefix: PREFIX,
822
+ trace: false,
823
+ path: false,
824
+ initializer,
825
+ decoder: () => (input, metadata, explore) =>
826
+ decode({
827
+ context: props.context,
828
+ importer: props.importer,
829
+ config,
830
+ input,
831
+ metadata,
832
+ explore,
833
+ }),
834
+ objector: {
835
+ checker: () => (input, metadata, explore) =>
836
+ IsProgrammer.decode({
837
+ context: props.context,
838
+ importer: props.importer,
839
+ input,
840
+ metadata,
841
+ explore,
842
+ }),
843
+ decoder: () => (input, object, explore) =>
844
+ decode_object({
845
+ importer: props.importer,
846
+ input,
847
+ object,
848
+ explore,
849
+ }),
850
+ joiner: CloneJoiner.object,
851
+ unionizer: decode_union_object((input, object, explore) =>
852
+ IsProgrammer.decode_object({
853
+ context: props.context,
854
+ importer: props.importer,
855
+ input,
856
+ object,
857
+ explore,
858
+ }),
859
+ )((input, object, explore) =>
860
+ decode_object({
861
+ importer: props.importer,
862
+ input,
863
+ object,
864
+ explore,
865
+ }),
866
+ )((exp) => exp)((input, expected) =>
867
+ create_throw_error({
868
+ importer: props.importer,
869
+ expected,
870
+ input,
871
+ }),
872
+ ),
873
+ failure: (input, expected) =>
874
+ create_throw_error({
875
+ importer: props.importer,
876
+ expected,
877
+ input,
878
+ }),
879
+ },
880
+ generator: {
881
+ arrays: () => (collection) =>
882
+ write_array_functions({
883
+ importer: props.importer,
884
+ config,
885
+ collection,
886
+ }),
887
+ tuples: () => (collection) =>
888
+ write_tuple_functions({
889
+ context: props.context,
890
+ importer: props.importer,
891
+ config,
892
+ collection,
893
+ }),
894
+ },
723
895
  };
896
+ return config;
897
+ };
724
898
 
725
899
  const initializer: FeatureProgrammer.IConfig["initializer"] =
726
- (project) => (importer) => (type) => {
900
+ (context) => (importer) => (type) => {
727
901
  const collection = new MetadataCollection();
728
902
  const result = MetadataFactory.analyze({
729
- checker: project.checker,
730
- transformer: project.transformer,
903
+ checker: context.checker,
904
+ transformer: context.transformer,
731
905
  options: {
732
906
  escape: false,
733
907
  constant: true,
734
908
  absorb: true,
735
- validate: (meta) => {
909
+ validate: (metadata) => {
736
910
  const output: string[] = [];
737
- if (meta.natives.some((n) => n === "WeakSet"))
911
+ if (metadata.natives.some((n) => n === "WeakSet"))
738
912
  output.push("unable to clone WeakSet");
739
- else if (meta.natives.some((n) => n === "WeakMap"))
913
+ else if (metadata.natives.some((n) => n === "WeakMap"))
740
914
  output.push("unable to clone WeakMap");
741
915
  return output;
742
916
  },
@@ -751,35 +925,36 @@ export namespace MiscCloneProgrammer {
751
925
  return [collection, result.data];
752
926
  };
753
927
 
754
- const create_throw_error =
755
- (importer: FunctionImporter) =>
756
- (expected: string) =>
757
- (value: ts.Expression) =>
758
- ts.factory.createExpressionStatement(
759
- ts.factory.createCallExpression(
760
- importer.use("throws"),
761
- [],
762
- [
763
- ts.factory.createObjectLiteralExpression(
764
- [
765
- ts.factory.createPropertyAssignment(
766
- "expected",
767
- ts.factory.createStringLiteral(expected),
768
- ),
769
- ts.factory.createPropertyAssignment("value", value),
770
- ],
771
- true,
772
- ),
773
- ],
774
- ),
775
- );
928
+ const create_throw_error = (props: {
929
+ importer: FunctionImporter;
930
+ expected: string;
931
+ input: ts.Expression;
932
+ }) =>
933
+ ts.factory.createExpressionStatement(
934
+ ts.factory.createCallExpression(
935
+ props.importer.use("throws"),
936
+ [],
937
+ [
938
+ ts.factory.createObjectLiteralExpression(
939
+ [
940
+ ts.factory.createPropertyAssignment(
941
+ "expected",
942
+ ts.factory.createStringLiteral(props.expected),
943
+ ),
944
+ ts.factory.createPropertyAssignment("value", props.input),
945
+ ],
946
+ true,
947
+ ),
948
+ ],
949
+ ),
950
+ );
776
951
 
777
- const is_instance = (meta: Metadata): boolean =>
778
- !!meta.objects.length ||
779
- !!meta.arrays.length ||
780
- !!meta.tuples.length ||
781
- !!meta.sets.length ||
782
- !!meta.maps.length ||
783
- !!meta.natives.length ||
784
- (meta.rest !== null && is_instance(meta.rest));
952
+ const is_instance = (metadata: Metadata): boolean =>
953
+ !!metadata.objects.length ||
954
+ !!metadata.arrays.length ||
955
+ !!metadata.tuples.length ||
956
+ !!metadata.sets.length ||
957
+ !!metadata.maps.length ||
958
+ !!metadata.natives.length ||
959
+ (metadata.rest !== null && is_instance(metadata.rest));
785
960
  }