typia 3.6.2 → 3.6.4

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 (73) hide show
  1. package/README.md +2 -1
  2. package/lib/factories/internal/metadata/emplace_metadata_object.js +8 -7
  3. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  4. package/lib/functional/$is_uuid.js +1 -1
  5. package/lib/functional/$is_uuid.js.map +1 -1
  6. package/lib/module.d.ts +2 -2
  7. package/package.json +1 -1
  8. package/src/executable/setup/ArgumentParser.ts +91 -91
  9. package/src/executable/setup/FileRetriever.ts +33 -33
  10. package/src/executable/setup/PackageManager.ts +92 -92
  11. package/src/executable/setup/PluginConfigurator.ts +99 -99
  12. package/src/factories/internal/metadata/emplace_metadata_object.ts +142 -140
  13. package/src/functional/$is_uuid.ts +1 -2
  14. package/src/module.ts +1946 -1946
  15. package/src/programmers/AssertCloneProgrammer.ts +70 -70
  16. package/src/programmers/AssertParseProgrammer.ts +65 -65
  17. package/src/programmers/AssertProgrammer.ts +232 -232
  18. package/src/programmers/AssertPruneProgrammer.ts +67 -67
  19. package/src/programmers/AssertStringifyProgrammer.ts +71 -71
  20. package/src/programmers/CheckerProgrammer.ts +893 -893
  21. package/src/programmers/CloneProgrammer.ts +386 -386
  22. package/src/programmers/FeatureProgrammer.ts +505 -505
  23. package/src/programmers/IsCloneProgrammer.ts +80 -80
  24. package/src/programmers/IsParseProgrammer.ts +74 -74
  25. package/src/programmers/IsPruneProgrammer.ts +75 -75
  26. package/src/programmers/IsStringifyProgrammer.ts +81 -81
  27. package/src/programmers/PruneProgrammer.ts +341 -341
  28. package/src/programmers/RandomProgrammer.ts +391 -391
  29. package/src/programmers/StringifyProgrammer.ts +795 -795
  30. package/src/programmers/ValidateCloneProgrammer.ts +90 -90
  31. package/src/programmers/ValidateParseProgrammer.ts +69 -69
  32. package/src/programmers/ValidateProgrammer.ts +266 -266
  33. package/src/programmers/ValidatePruneProgrammer.ts +83 -83
  34. package/src/programmers/ValidateStringifyProgrammer.ts +89 -89
  35. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  36. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  37. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  38. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  39. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  40. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  41. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  42. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  43. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  44. package/src/transformers/features/miscellaneous/CreateRandomGenerator.ts +42 -42
  45. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  46. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  47. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  48. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  49. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  50. package/src/transformers/features/miscellaneous/RandomTransformer.ts +48 -48
  51. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  52. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  53. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  54. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  55. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  56. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  57. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  58. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  59. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  60. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +9 -9
  61. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  62. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  63. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +11 -11
  64. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  65. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  66. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  67. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  68. package/src/transformers/features/validators/CreateAssertTransformer.ts +12 -12
  69. package/src/transformers/features/validators/CreateIsTransformer.ts +10 -10
  70. package/src/transformers/features/validators/CreateValidateTransformer.ts +12 -12
  71. package/src/transformers/features/validators/IsTransformer.ts +10 -10
  72. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  73. package/src/transformers/internal/GenericTransformer.ts +99 -99
@@ -1,391 +1,391 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../factories/MetadataCollection";
6
- import { MetadataFactory } from "../factories/MetadataFactory";
7
- import { StatementFactory } from "../factories/StatementFactory";
8
- import { TemplateFactory } from "../factories/TemplateFactory";
9
- import { TypeFactory } from "../factories/TypeFactory";
10
-
11
- import { IMetadataTag } from "../metadata/IMetadataTag";
12
- import { Metadata } from "../metadata/Metadata";
13
-
14
- import { IProject } from "../transformers/IProject";
15
-
16
- import { FunctionImporter } from "./helpers/FunctionImporeter";
17
- import { RandomJoiner } from "./helpers/RandomJoiner";
18
- import { RandomRanger } from "./helpers/RandomRanger";
19
-
20
- export namespace RandomProgrammer {
21
- export function generate(
22
- project: IProject,
23
- modulo: ts.LeftHandSideExpression,
24
- ) {
25
- const importer: FunctionImporter = new FunctionImporter();
26
- return (type: ts.Type, name?: string) => {
27
- // INITIALIZE METADATA
28
- const collection: MetadataCollection = new MetadataCollection();
29
- const meta: Metadata = MetadataFactory.generate(
30
- project.checker,
31
- collection,
32
- type,
33
- {
34
- resolve: true,
35
- constant: true,
36
- },
37
- );
38
-
39
- // GENERATE FUNCTION
40
- const functors: ts.VariableStatement[] =
41
- generate_functors(importer)(collection);
42
- const output: ts.Expression = decode(importer)({
43
- object: false,
44
- recursive: false,
45
- })(meta, []);
46
-
47
- return ts.factory.createArrowFunction(
48
- undefined,
49
- undefined,
50
- [
51
- IdentifierFactory.parameter(
52
- "generator",
53
- ts.factory.createTypeReferenceNode(
54
- "Partial<typia.IRandomGenerator>",
55
- ),
56
- IdentifierFactory.join(
57
- ts.factory.createParenthesizedExpression(
58
- ts.factory.createAsExpression(
59
- modulo,
60
- TypeFactory.keyword("any"),
61
- ),
62
- ),
63
- "generator",
64
- ),
65
- ),
66
- ],
67
- ts.factory.createTypeReferenceNode(
68
- `typia.Primitive<${
69
- name ?? TypeFactory.getFullName(project.checker, type)
70
- }>`,
71
- ),
72
- undefined,
73
- ts.factory.createBlock(
74
- [
75
- ...importer.declare(modulo),
76
- ...functors,
77
- ts.factory.createReturnStatement(output),
78
- ],
79
- true,
80
- ),
81
- );
82
- };
83
- }
84
-
85
- const generate_functors =
86
- (importer: FunctionImporter) => (collection: MetadataCollection) =>
87
- collection.objects().map((obj, i) =>
88
- StatementFactory.constant(
89
- FUNCTOR(i),
90
- ts.factory.createArrowFunction(
91
- undefined,
92
- undefined,
93
- [
94
- IdentifierFactory.parameter(
95
- "_recursive",
96
- TypeFactory.keyword("boolean"),
97
- ts.factory.createIdentifier(
98
- String(obj.recursive),
99
- ),
100
- ),
101
- IdentifierFactory.parameter(
102
- "_depth",
103
- TypeFactory.keyword("number"),
104
- ts.factory.createNumericLiteral(0),
105
- ),
106
- ],
107
- TypeFactory.keyword("any"),
108
- undefined,
109
- RandomJoiner.object(COALESCE(importer))(
110
- decode(importer)({
111
- recursive: obj.recursive,
112
- object: true,
113
- }),
114
- )(obj),
115
- ),
116
- ),
117
- );
118
-
119
- /* -----------------------------------------------------------
120
- DECODERS
121
- ----------------------------------------------------------- */
122
- const decode =
123
- (importer: FunctionImporter) =>
124
- (explore: IExplore) =>
125
- (meta: Metadata, tags: IMetadataTag[]): ts.Expression => {
126
- const expressions: ts.Expression[] = [];
127
- if (meta.any)
128
- expressions.push(
129
- ts.factory.createStringLiteral(
130
- "fucking any type exists...",
131
- ),
132
- );
133
-
134
- // NULL COALESCING
135
- if (meta.required === false)
136
- expressions.push(ts.factory.createIdentifier("undefined"));
137
- if (meta.nullable === true)
138
- expressions.push(ts.factory.createNull());
139
-
140
- // ATOMIC TYPES
141
- for (const constant of meta.constants)
142
- for (const value of constant.values)
143
- expressions.push(decode_atomic(value));
144
- for (const template of meta.templates)
145
- expressions.push(decode_template(importer)(explore)(template));
146
- for (const atomic of meta.atomics)
147
- if (atomic === "boolean")
148
- expressions.push(decode_boolean(importer));
149
- else if (atomic === "number")
150
- expressions.push(decode_number(importer)(tags));
151
- else if (atomic === "string")
152
- expressions.push(decode_string(importer)(tags));
153
- else if (atomic === "bigint")
154
- expressions.push(decode_bigint(importer)(tags));
155
-
156
- // INSTANCE TYPES
157
- if (meta.resolved)
158
- expressions.push(
159
- decode(importer)(explore)(meta.resolved, tags),
160
- );
161
- for (const t of meta.tuples)
162
- expressions.push(
163
- RandomJoiner.tuple(decode(importer)(explore))(t, tags),
164
- );
165
- for (const a of meta.arrays) {
166
- const array = RandomJoiner.array(COALESCE(importer))(
167
- decode(importer)(explore),
168
- )(a, tags);
169
- expressions.push(
170
- explore.recursive && a.objects.length
171
- ? ts.factory.createConditionalExpression(
172
- ts.factory.createLogicalAnd(
173
- ts.factory.createIdentifier("_recursive"),
174
- ts.factory.createLessThan(
175
- ts.factory.createNumericLiteral(5),
176
- ts.factory.createIdentifier("_depth"),
177
- ),
178
- ),
179
- undefined,
180
- ts.factory.createIdentifier("[]"),
181
- undefined,
182
- array,
183
- )
184
- : array,
185
- );
186
- }
187
- for (const o of meta.objects)
188
- expressions.push(
189
- ts.factory.createCallExpression(
190
- ts.factory.createIdentifier(FUNCTOR(o.index)),
191
- undefined,
192
- explore.object
193
- ? [
194
- explore.recursive
195
- ? ts.factory.createTrue()
196
- : ts.factory.createIdentifier(
197
- "_recursive",
198
- ),
199
- ts.factory.createConditionalExpression(
200
- ts.factory.createIdentifier("_recursive"),
201
- undefined,
202
- ts.factory.createAdd(
203
- ts.factory.createNumericLiteral(1),
204
- ts.factory.createIdentifier("_depth"),
205
- ),
206
- undefined,
207
- ts.factory.createIdentifier("_depth"),
208
- ),
209
- ]
210
- : undefined,
211
- ),
212
- );
213
- for (const native of meta.natives)
214
- if (native === "Boolean")
215
- expressions.push(decode_boolean(importer));
216
- else if (native === "Number")
217
- expressions.push(decode_number(importer)(tags));
218
- else if (native === "String")
219
- expressions.push(decode_string(importer)(tags));
220
- else expressions.push(ts.factory.createIdentifier("{}"));
221
- if (meta.sets.length || meta.maps.length)
222
- expressions.push(ts.factory.createIdentifier("{}"));
223
-
224
- // PRIMITIVE TYPES
225
- if (expressions.length === 1) return expressions[0]!;
226
- return ts.factory.createCallExpression(
227
- ts.factory.createCallExpression(
228
- importer.use("pick"),
229
- undefined,
230
- [
231
- ts.factory.createArrayLiteralExpression(
232
- expressions.map((expr) =>
233
- ts.factory.createArrowFunction(
234
- undefined,
235
- undefined,
236
- [],
237
- undefined,
238
- undefined,
239
- expr,
240
- ),
241
- ),
242
- true,
243
- ),
244
- ],
245
- ),
246
- undefined,
247
- undefined,
248
- );
249
- };
250
-
251
- const decode_boolean = (importer: FunctionImporter) =>
252
- ts.factory.createCallExpression(
253
- COALESCE(importer)("boolean"),
254
- undefined,
255
- undefined,
256
- );
257
-
258
- const decode_atomic = (value: Atomic) =>
259
- typeof value === "boolean"
260
- ? ts.factory.createIdentifier(value.toString())
261
- : typeof value === "number"
262
- ? ts.factory.createNumericLiteral(value)
263
- : typeof value === "string"
264
- ? ts.factory.createStringLiteral(value)
265
- : ts.factory.createBigIntLiteral(value.toString());
266
-
267
- const decode_template =
268
- (importer: FunctionImporter) =>
269
- (explore: IExplore) =>
270
- (template: Metadata[]) =>
271
- TemplateFactory.generate(
272
- template.map((meta) => decode(importer)(explore)(meta, [])),
273
- );
274
-
275
- const decode_number =
276
- (importer: FunctionImporter) =>
277
- (tags: IMetadataTag[]): ts.Expression => {
278
- const type = tags.find(
279
- (t) => t.kind === "type" && t.value === "uint",
280
- )
281
- ? "int"
282
- : tags.find((t) => t.kind === "type" && t.value === "int")
283
- ? "uint"
284
- : "double";
285
- return RandomRanger.number({
286
- type,
287
- transform: (value) => ts.factory.createNumericLiteral(value),
288
- setter: (args) =>
289
- ts.factory.createCallExpression(
290
- type === "double" &&
291
- tags.every(
292
- (t) =>
293
- t.kind !== "multipleOf" &&
294
- t.kind !== "step",
295
- )
296
- ? COALESCE(importer)("number")
297
- : COALESCE(importer)("integer"),
298
- undefined,
299
- args.map((val) => ts.factory.createNumericLiteral(val)),
300
- ),
301
- })({
302
- minimum: 0,
303
- maximum: 100,
304
- gap: 10,
305
- })(tags);
306
- };
307
-
308
- const decode_bigint =
309
- (importer: FunctionImporter) =>
310
- (tags: IMetadataTag[]): ts.Expression =>
311
- RandomRanger.number({
312
- type: tags.find((t) => t.kind === "type" && t.value === "uint")
313
- ? "uint"
314
- : "int",
315
- transform: (value) =>
316
- ts.factory.createCallExpression(
317
- ts.factory.createIdentifier("BigInt"),
318
- undefined,
319
- [ts.factory.createStringLiteral(value.toString())],
320
- ),
321
- setter: (args) =>
322
- ts.factory.createCallExpression(
323
- COALESCE(importer)("bigint"),
324
- undefined,
325
- args.map((value) =>
326
- ts.factory.createCallExpression(
327
- ts.factory.createIdentifier("BigInt"),
328
- undefined,
329
- [
330
- ts.factory.createStringLiteral(
331
- value.toString(),
332
- ),
333
- ],
334
- ),
335
- ),
336
- ),
337
- })({
338
- minimum: 0,
339
- maximum: 100,
340
- gap: 10,
341
- })(tags);
342
-
343
- const decode_string =
344
- (importer: FunctionImporter) =>
345
- (tags: IMetadataTag[]): ts.Expression => {
346
- for (const t of tags)
347
- if (
348
- t.kind === "format" &&
349
- ["uuid", "email", "url", "ipv4", "ipv6"].includes(t.value)
350
- )
351
- return ts.factory.createCallExpression(
352
- COALESCE(importer)(t.value),
353
- undefined,
354
- undefined,
355
- );
356
- else if (t.kind === "pattern")
357
- return ts.factory.createCallExpression(
358
- COALESCE(importer)("pattern"),
359
- undefined,
360
- [ts.factory.createIdentifier(`/${t.value}/`)],
361
- );
362
-
363
- const tail = RandomRanger.length(COALESCE(importer))({
364
- minimum: 5,
365
- maximum: 25,
366
- gap: 5,
367
- })({
368
- fixed: "length",
369
- minimum: "minLength",
370
- maximum: "maxLength",
371
- })(tags);
372
- return ts.factory.createCallExpression(
373
- COALESCE(importer)("string"),
374
- undefined,
375
- tail ? [tail] : undefined,
376
- );
377
- };
378
- }
379
-
380
- type Atomic = boolean | number | string | bigint;
381
- interface IExplore {
382
- object: boolean;
383
- recursive: boolean;
384
- }
385
-
386
- const FUNCTOR = (i: number) => `$ro${i}`;
387
- const COALESCE = (importer: FunctionImporter) => (name: string) =>
388
- ExpressionFactory.coalesce(
389
- ts.factory.createIdentifier(`generator.${name}`),
390
- IdentifierFactory.join(importer.use("generator"), name),
391
- );
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../factories/MetadataFactory";
7
+ import { StatementFactory } from "../factories/StatementFactory";
8
+ import { TemplateFactory } from "../factories/TemplateFactory";
9
+ import { TypeFactory } from "../factories/TypeFactory";
10
+
11
+ import { IMetadataTag } from "../metadata/IMetadataTag";
12
+ import { Metadata } from "../metadata/Metadata";
13
+
14
+ import { IProject } from "../transformers/IProject";
15
+
16
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
17
+ import { RandomJoiner } from "./helpers/RandomJoiner";
18
+ import { RandomRanger } from "./helpers/RandomRanger";
19
+
20
+ export namespace RandomProgrammer {
21
+ export function generate(
22
+ project: IProject,
23
+ modulo: ts.LeftHandSideExpression,
24
+ ) {
25
+ const importer: FunctionImporter = new FunctionImporter();
26
+ return (type: ts.Type, name?: string) => {
27
+ // INITIALIZE METADATA
28
+ const collection: MetadataCollection = new MetadataCollection();
29
+ const meta: Metadata = MetadataFactory.generate(
30
+ project.checker,
31
+ collection,
32
+ type,
33
+ {
34
+ resolve: true,
35
+ constant: true,
36
+ },
37
+ );
38
+
39
+ // GENERATE FUNCTION
40
+ const functors: ts.VariableStatement[] =
41
+ generate_functors(importer)(collection);
42
+ const output: ts.Expression = decode(importer)({
43
+ object: false,
44
+ recursive: false,
45
+ })(meta, []);
46
+
47
+ return ts.factory.createArrowFunction(
48
+ undefined,
49
+ undefined,
50
+ [
51
+ IdentifierFactory.parameter(
52
+ "generator",
53
+ ts.factory.createTypeReferenceNode(
54
+ "Partial<typia.IRandomGenerator>",
55
+ ),
56
+ IdentifierFactory.join(
57
+ ts.factory.createParenthesizedExpression(
58
+ ts.factory.createAsExpression(
59
+ modulo,
60
+ TypeFactory.keyword("any"),
61
+ ),
62
+ ),
63
+ "generator",
64
+ ),
65
+ ),
66
+ ],
67
+ ts.factory.createTypeReferenceNode(
68
+ `typia.Primitive<${
69
+ name ?? TypeFactory.getFullName(project.checker, type)
70
+ }>`,
71
+ ),
72
+ undefined,
73
+ ts.factory.createBlock(
74
+ [
75
+ ...importer.declare(modulo),
76
+ ...functors,
77
+ ts.factory.createReturnStatement(output),
78
+ ],
79
+ true,
80
+ ),
81
+ );
82
+ };
83
+ }
84
+
85
+ const generate_functors =
86
+ (importer: FunctionImporter) => (collection: MetadataCollection) =>
87
+ collection.objects().map((obj, i) =>
88
+ StatementFactory.constant(
89
+ FUNCTOR(i),
90
+ ts.factory.createArrowFunction(
91
+ undefined,
92
+ undefined,
93
+ [
94
+ IdentifierFactory.parameter(
95
+ "_recursive",
96
+ TypeFactory.keyword("boolean"),
97
+ ts.factory.createIdentifier(
98
+ String(obj.recursive),
99
+ ),
100
+ ),
101
+ IdentifierFactory.parameter(
102
+ "_depth",
103
+ TypeFactory.keyword("number"),
104
+ ts.factory.createNumericLiteral(0),
105
+ ),
106
+ ],
107
+ TypeFactory.keyword("any"),
108
+ undefined,
109
+ RandomJoiner.object(COALESCE(importer))(
110
+ decode(importer)({
111
+ recursive: obj.recursive,
112
+ object: true,
113
+ }),
114
+ )(obj),
115
+ ),
116
+ ),
117
+ );
118
+
119
+ /* -----------------------------------------------------------
120
+ DECODERS
121
+ ----------------------------------------------------------- */
122
+ const decode =
123
+ (importer: FunctionImporter) =>
124
+ (explore: IExplore) =>
125
+ (meta: Metadata, tags: IMetadataTag[]): ts.Expression => {
126
+ const expressions: ts.Expression[] = [];
127
+ if (meta.any)
128
+ expressions.push(
129
+ ts.factory.createStringLiteral(
130
+ "fucking any type exists...",
131
+ ),
132
+ );
133
+
134
+ // NULL COALESCING
135
+ if (meta.required === false)
136
+ expressions.push(ts.factory.createIdentifier("undefined"));
137
+ if (meta.nullable === true)
138
+ expressions.push(ts.factory.createNull());
139
+
140
+ // ATOMIC TYPES
141
+ for (const constant of meta.constants)
142
+ for (const value of constant.values)
143
+ expressions.push(decode_atomic(value));
144
+ for (const template of meta.templates)
145
+ expressions.push(decode_template(importer)(explore)(template));
146
+ for (const atomic of meta.atomics)
147
+ if (atomic === "boolean")
148
+ expressions.push(decode_boolean(importer));
149
+ else if (atomic === "number")
150
+ expressions.push(decode_number(importer)(tags));
151
+ else if (atomic === "string")
152
+ expressions.push(decode_string(importer)(tags));
153
+ else if (atomic === "bigint")
154
+ expressions.push(decode_bigint(importer)(tags));
155
+
156
+ // INSTANCE TYPES
157
+ if (meta.resolved)
158
+ expressions.push(
159
+ decode(importer)(explore)(meta.resolved, tags),
160
+ );
161
+ for (const t of meta.tuples)
162
+ expressions.push(
163
+ RandomJoiner.tuple(decode(importer)(explore))(t, tags),
164
+ );
165
+ for (const a of meta.arrays) {
166
+ const array = RandomJoiner.array(COALESCE(importer))(
167
+ decode(importer)(explore),
168
+ )(a, tags);
169
+ expressions.push(
170
+ explore.recursive && a.objects.length
171
+ ? ts.factory.createConditionalExpression(
172
+ ts.factory.createLogicalAnd(
173
+ ts.factory.createIdentifier("_recursive"),
174
+ ts.factory.createLessThan(
175
+ ts.factory.createNumericLiteral(5),
176
+ ts.factory.createIdentifier("_depth"),
177
+ ),
178
+ ),
179
+ undefined,
180
+ ts.factory.createIdentifier("[]"),
181
+ undefined,
182
+ array,
183
+ )
184
+ : array,
185
+ );
186
+ }
187
+ for (const o of meta.objects)
188
+ expressions.push(
189
+ ts.factory.createCallExpression(
190
+ ts.factory.createIdentifier(FUNCTOR(o.index)),
191
+ undefined,
192
+ explore.object
193
+ ? [
194
+ explore.recursive
195
+ ? ts.factory.createTrue()
196
+ : ts.factory.createIdentifier(
197
+ "_recursive",
198
+ ),
199
+ ts.factory.createConditionalExpression(
200
+ ts.factory.createIdentifier("_recursive"),
201
+ undefined,
202
+ ts.factory.createAdd(
203
+ ts.factory.createNumericLiteral(1),
204
+ ts.factory.createIdentifier("_depth"),
205
+ ),
206
+ undefined,
207
+ ts.factory.createIdentifier("_depth"),
208
+ ),
209
+ ]
210
+ : undefined,
211
+ ),
212
+ );
213
+ for (const native of meta.natives)
214
+ if (native === "Boolean")
215
+ expressions.push(decode_boolean(importer));
216
+ else if (native === "Number")
217
+ expressions.push(decode_number(importer)(tags));
218
+ else if (native === "String")
219
+ expressions.push(decode_string(importer)(tags));
220
+ else expressions.push(ts.factory.createIdentifier("{}"));
221
+ if (meta.sets.length || meta.maps.length)
222
+ expressions.push(ts.factory.createIdentifier("{}"));
223
+
224
+ // PRIMITIVE TYPES
225
+ if (expressions.length === 1) return expressions[0]!;
226
+ return ts.factory.createCallExpression(
227
+ ts.factory.createCallExpression(
228
+ importer.use("pick"),
229
+ undefined,
230
+ [
231
+ ts.factory.createArrayLiteralExpression(
232
+ expressions.map((expr) =>
233
+ ts.factory.createArrowFunction(
234
+ undefined,
235
+ undefined,
236
+ [],
237
+ undefined,
238
+ undefined,
239
+ expr,
240
+ ),
241
+ ),
242
+ true,
243
+ ),
244
+ ],
245
+ ),
246
+ undefined,
247
+ undefined,
248
+ );
249
+ };
250
+
251
+ const decode_boolean = (importer: FunctionImporter) =>
252
+ ts.factory.createCallExpression(
253
+ COALESCE(importer)("boolean"),
254
+ undefined,
255
+ undefined,
256
+ );
257
+
258
+ const decode_atomic = (value: Atomic) =>
259
+ typeof value === "boolean"
260
+ ? ts.factory.createIdentifier(value.toString())
261
+ : typeof value === "number"
262
+ ? ts.factory.createNumericLiteral(value)
263
+ : typeof value === "string"
264
+ ? ts.factory.createStringLiteral(value)
265
+ : ts.factory.createBigIntLiteral(value.toString());
266
+
267
+ const decode_template =
268
+ (importer: FunctionImporter) =>
269
+ (explore: IExplore) =>
270
+ (template: Metadata[]) =>
271
+ TemplateFactory.generate(
272
+ template.map((meta) => decode(importer)(explore)(meta, [])),
273
+ );
274
+
275
+ const decode_number =
276
+ (importer: FunctionImporter) =>
277
+ (tags: IMetadataTag[]): ts.Expression => {
278
+ const type = tags.find(
279
+ (t) => t.kind === "type" && t.value === "uint",
280
+ )
281
+ ? "int"
282
+ : tags.find((t) => t.kind === "type" && t.value === "int")
283
+ ? "uint"
284
+ : "double";
285
+ return RandomRanger.number({
286
+ type,
287
+ transform: (value) => ts.factory.createNumericLiteral(value),
288
+ setter: (args) =>
289
+ ts.factory.createCallExpression(
290
+ type === "double" &&
291
+ tags.every(
292
+ (t) =>
293
+ t.kind !== "multipleOf" &&
294
+ t.kind !== "step",
295
+ )
296
+ ? COALESCE(importer)("number")
297
+ : COALESCE(importer)("integer"),
298
+ undefined,
299
+ args.map((val) => ts.factory.createNumericLiteral(val)),
300
+ ),
301
+ })({
302
+ minimum: 0,
303
+ maximum: 100,
304
+ gap: 10,
305
+ })(tags);
306
+ };
307
+
308
+ const decode_bigint =
309
+ (importer: FunctionImporter) =>
310
+ (tags: IMetadataTag[]): ts.Expression =>
311
+ RandomRanger.number({
312
+ type: tags.find((t) => t.kind === "type" && t.value === "uint")
313
+ ? "uint"
314
+ : "int",
315
+ transform: (value) =>
316
+ ts.factory.createCallExpression(
317
+ ts.factory.createIdentifier("BigInt"),
318
+ undefined,
319
+ [ts.factory.createStringLiteral(value.toString())],
320
+ ),
321
+ setter: (args) =>
322
+ ts.factory.createCallExpression(
323
+ COALESCE(importer)("bigint"),
324
+ undefined,
325
+ args.map((value) =>
326
+ ts.factory.createCallExpression(
327
+ ts.factory.createIdentifier("BigInt"),
328
+ undefined,
329
+ [
330
+ ts.factory.createStringLiteral(
331
+ value.toString(),
332
+ ),
333
+ ],
334
+ ),
335
+ ),
336
+ ),
337
+ })({
338
+ minimum: 0,
339
+ maximum: 100,
340
+ gap: 10,
341
+ })(tags);
342
+
343
+ const decode_string =
344
+ (importer: FunctionImporter) =>
345
+ (tags: IMetadataTag[]): ts.Expression => {
346
+ for (const t of tags)
347
+ if (
348
+ t.kind === "format" &&
349
+ ["uuid", "email", "url", "ipv4", "ipv6"].includes(t.value)
350
+ )
351
+ return ts.factory.createCallExpression(
352
+ COALESCE(importer)(t.value),
353
+ undefined,
354
+ undefined,
355
+ );
356
+ else if (t.kind === "pattern")
357
+ return ts.factory.createCallExpression(
358
+ COALESCE(importer)("pattern"),
359
+ undefined,
360
+ [ts.factory.createIdentifier(`/${t.value}/`)],
361
+ );
362
+
363
+ const tail = RandomRanger.length(COALESCE(importer))({
364
+ minimum: 5,
365
+ maximum: 25,
366
+ gap: 5,
367
+ })({
368
+ fixed: "length",
369
+ minimum: "minLength",
370
+ maximum: "maxLength",
371
+ })(tags);
372
+ return ts.factory.createCallExpression(
373
+ COALESCE(importer)("string"),
374
+ undefined,
375
+ tail ? [tail] : undefined,
376
+ );
377
+ };
378
+ }
379
+
380
+ type Atomic = boolean | number | string | bigint;
381
+ interface IExplore {
382
+ object: boolean;
383
+ recursive: boolean;
384
+ }
385
+
386
+ const FUNCTOR = (i: number) => `$ro${i}`;
387
+ const COALESCE = (importer: FunctionImporter) => (name: string) =>
388
+ ExpressionFactory.coalesce(
389
+ ts.factory.createIdentifier(`generator.${name}`),
390
+ IdentifierFactory.join(importer.use("generator"), name),
391
+ );