typia 3.5.0-dev.20230211 → 3.5.0-dev.20230213

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 (65) hide show
  1. package/README.md +7 -0
  2. package/lib/module.d.ts +197 -4
  3. package/lib/module.js +74 -2
  4. package/lib/module.js.map +1 -1
  5. package/lib/programmers/AssertPruneProgrammer.d.ts +5 -0
  6. package/lib/programmers/AssertPruneProgrammer.js +37 -0
  7. package/lib/programmers/AssertPruneProgrammer.js.map +1 -0
  8. package/lib/programmers/CloneProgrammer.d.ts +5 -0
  9. package/lib/programmers/CloneProgrammer.js +287 -0
  10. package/lib/programmers/CloneProgrammer.js.map +1 -0
  11. package/lib/programmers/IsPruneProgrammer.d.ts +5 -0
  12. package/lib/programmers/IsPruneProgrammer.js +37 -0
  13. package/lib/programmers/IsPruneProgrammer.js.map +1 -0
  14. package/lib/programmers/PruneProgrammer.js +2 -2
  15. package/lib/programmers/PruneProgrammer.js.map +1 -1
  16. package/lib/programmers/ValidatePruneProgrammer.d.ts +5 -0
  17. package/lib/programmers/ValidatePruneProgrammer.js +37 -0
  18. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -0
  19. package/lib/programmers/helpers/CloneJoiner.d.ts +8 -0
  20. package/lib/programmers/helpers/CloneJoiner.js +80 -0
  21. package/lib/programmers/helpers/CloneJoiner.js.map +1 -0
  22. package/lib/programmers/internal/feature_object_entries.d.ts +1 -1
  23. package/lib/transformers/CallExpressionTransformer.js +17 -1
  24. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  25. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.d.ts +5 -0
  26. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js +23 -0
  27. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js.map +1 -0
  28. package/lib/transformers/features/miscellaneous/CloneTransformer.d.ts +5 -0
  29. package/lib/transformers/features/miscellaneous/CloneTransformer.js +34 -0
  30. package/lib/transformers/features/miscellaneous/CloneTransformer.js.map +1 -0
  31. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.d.ts +5 -0
  32. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js +17 -0
  33. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js.map +1 -0
  34. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.d.ts +5 -0
  35. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js +17 -0
  36. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js.map +1 -0
  37. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.d.ts +5 -0
  38. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js +17 -0
  39. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js.map +1 -0
  40. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.d.ts +5 -0
  41. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js +17 -0
  42. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js.map +1 -0
  43. package/lib/transformers/features/miscellaneous/IsPruneTransformer.d.ts +5 -0
  44. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js +23 -0
  45. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js.map +1 -0
  46. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.d.ts +5 -0
  47. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js +23 -0
  48. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js.map +1 -0
  49. package/package.json +1 -1
  50. package/src/module.ts +311 -5
  51. package/src/programmers/AssertPruneProgrammer.ts +59 -0
  52. package/src/programmers/CloneProgrammer.ts +357 -0
  53. package/src/programmers/IsPruneProgrammer.ts +63 -0
  54. package/src/programmers/PruneProgrammer.ts +5 -2
  55. package/src/programmers/ValidatePruneProgrammer.ts +73 -0
  56. package/src/programmers/helpers/CloneJoiner.ts +126 -0
  57. package/src/transformers/CallExpressionTransformer.ts +17 -1
  58. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +38 -0
  59. package/src/transformers/features/miscellaneous/CloneTransformer.ts +46 -0
  60. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +32 -0
  61. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +31 -0
  62. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +32 -0
  63. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +32 -0
  64. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +38 -0
  65. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +38 -0
@@ -0,0 +1,357 @@
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
+
8
+ import { Metadata } from "../metadata/Metadata";
9
+
10
+ import { IProject } from "../transformers/IProject";
11
+
12
+ import { FeatureProgrammer } from "./FeatureProgrammer";
13
+ import { IsProgrammer } from "./IsProgrammer";
14
+ import { CloneJoiner } from "./helpers/CloneJoiner";
15
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
16
+ import { UnionExplorer } from "./helpers/UnionExplorer";
17
+ import { decode_union_object } from "./internal/decode_union_object";
18
+
19
+ export namespace CloneProgrammer {
20
+ export function generate(
21
+ project: IProject,
22
+ modulo: ts.LeftHandSideExpression,
23
+ ) {
24
+ const importer: FunctionImporter = new FunctionImporter();
25
+ return FeatureProgrammer.generate(
26
+ project,
27
+ CONFIG(project, importer),
28
+ importer,
29
+ (collection) => {
30
+ const isFunctors = IsProgrammer.generate_functors(
31
+ project,
32
+ importer,
33
+ )(collection);
34
+ const isUnioners = IsProgrammer.generate_unioners(
35
+ project,
36
+ importer,
37
+ )(collection);
38
+
39
+ return [
40
+ ...importer.declare(modulo),
41
+ ...isFunctors,
42
+ ...isUnioners,
43
+ ];
44
+ },
45
+ );
46
+ }
47
+
48
+ /* -----------------------------------------------------------
49
+ DECODERS
50
+ ----------------------------------------------------------- */
51
+ const decode =
52
+ (project: IProject, importer: FunctionImporter) =>
53
+ (
54
+ input: ts.Expression,
55
+ meta: Metadata,
56
+ explore: FeatureProgrammer.IExplore,
57
+ ): ts.Expression => {
58
+ // ANY TYPE
59
+ if (
60
+ meta.any ||
61
+ meta.arrays.some((a) => a.any) ||
62
+ meta.tuples.some((t) => t.every((e) => e.any))
63
+ )
64
+ return ts.factory.createCallExpression(
65
+ ts.factory.createIdentifier("JSON.parse"),
66
+ undefined,
67
+ [
68
+ ts.factory.createCallExpression(
69
+ ts.factory.createIdentifier("JSON.stringify"),
70
+ undefined,
71
+ [input],
72
+ ),
73
+ ],
74
+ );
75
+
76
+ interface IUnion {
77
+ type: string;
78
+ is: () => ts.Expression;
79
+ value: () => ts.Expression;
80
+ }
81
+ const unions: IUnion[] = [];
82
+
83
+ //----
84
+ // LIST UP UNION TYPES
85
+ //----
86
+ // toJSON() METHOD
87
+ if (meta.resolved !== null)
88
+ unions.push({
89
+ type: "resolved",
90
+ is: () => IsProgrammer.decode_to_json(input),
91
+ value: () =>
92
+ decode_to_json(project, importer)(
93
+ input,
94
+ meta.resolved!,
95
+ explore,
96
+ ),
97
+ });
98
+
99
+ // TUPLES
100
+ for (const tuple of meta.tuples)
101
+ unions.push({
102
+ type: "tuple",
103
+ is: () =>
104
+ IsProgrammer.decode(project, importer)(
105
+ input,
106
+ (() => {
107
+ const partial = Metadata.initialize();
108
+ partial.tuples.push(tuple);
109
+ return partial;
110
+ })(),
111
+ explore,
112
+ [],
113
+ ),
114
+ value: () =>
115
+ decode_tuple(project, importer)(input, tuple, explore),
116
+ });
117
+
118
+ // ARRAYS
119
+ if (meta.arrays.length)
120
+ unions.push({
121
+ type: "array",
122
+ is: () => ExpressionFactory.isArray(input),
123
+ value: () =>
124
+ explore_arrays(project, importer)(
125
+ input,
126
+ meta.arrays,
127
+ {
128
+ ...explore,
129
+ from: "array",
130
+ },
131
+ [],
132
+ ),
133
+ });
134
+
135
+ // NATIVE TYPES
136
+ if (meta.sets.length)
137
+ unions.push({
138
+ type: "set",
139
+ is: () => ExpressionFactory.isInstanceOf(input, "Set"),
140
+ value: () => ts.factory.createIdentifier("{}"),
141
+ });
142
+ if (meta.maps.length)
143
+ unions.push({
144
+ type: "map",
145
+ is: () => ExpressionFactory.isInstanceOf(input, "Map"),
146
+ value: () => ts.factory.createIdentifier("{}"),
147
+ });
148
+ for (const native of meta.natives)
149
+ unions.push({
150
+ type: "native",
151
+ is: () => ExpressionFactory.isInstanceOf(input, native),
152
+ value: () => ts.factory.createIdentifier("{}"),
153
+ });
154
+
155
+ // OBJECTS
156
+ if (meta.objects.length)
157
+ unions.push({
158
+ type: "object",
159
+ is: () =>
160
+ ExpressionFactory.isObject(input, {
161
+ checkNull: true,
162
+ checkArray: false,
163
+ }),
164
+ value: () =>
165
+ explore_objects(input, meta, {
166
+ ...explore,
167
+ from: "object",
168
+ }),
169
+ });
170
+
171
+ // COMPOSITION
172
+ let last: ts.Expression = input;
173
+ for (const u of unions.reverse())
174
+ last = ts.factory.createConditionalExpression(
175
+ u.is(),
176
+ undefined,
177
+ u.value(),
178
+ undefined,
179
+ last,
180
+ );
181
+ return last;
182
+ };
183
+
184
+ const decode_to_json =
185
+ (project: IProject, importer: FunctionImporter) =>
186
+ (
187
+ input: ts.Expression,
188
+ resolved: Metadata,
189
+ explore: FeatureProgrammer.IExplore,
190
+ ): ts.Expression => {
191
+ return decode(project, importer)(
192
+ ts.factory.createCallExpression(
193
+ IdentifierFactory.join(input, "toJSON"),
194
+ undefined,
195
+ [],
196
+ ),
197
+ resolved,
198
+ explore,
199
+ );
200
+ };
201
+
202
+ const decode_tuple =
203
+ (project: IProject, importer: FunctionImporter) =>
204
+ (
205
+ input: ts.Expression,
206
+ tuple: Metadata[],
207
+ explore: FeatureProgrammer.IExplore,
208
+ ): ts.Expression => {
209
+ const children: ts.Expression[] = tuple
210
+ .filter((m) => m.rest === null)
211
+ .map((elem, index) =>
212
+ decode(project, importer)(
213
+ ts.factory.createElementAccessExpression(input, index),
214
+ elem,
215
+ {
216
+ ...explore,
217
+ from: "array",
218
+ },
219
+ ),
220
+ );
221
+ const rest = (() => {
222
+ if (tuple.length === 0) return null;
223
+
224
+ const last: Metadata = tuple[tuple.length - 1]!;
225
+ const rest: Metadata | null = last.rest;
226
+ if (rest === null) return null;
227
+
228
+ return decode(project, importer)(
229
+ ts.factory.createCallExpression(
230
+ IdentifierFactory.join(input, "slice"),
231
+ undefined,
232
+ [ts.factory.createNumericLiteral(tuple.length - 1)],
233
+ ),
234
+ (() => {
235
+ const wrapper: Metadata = Metadata.initialize();
236
+ wrapper.arrays.push(rest);
237
+ return wrapper;
238
+ })(),
239
+ {
240
+ ...explore,
241
+ start: tuple.length - 1,
242
+ },
243
+ );
244
+ })();
245
+ return CloneJoiner.tuple(children, rest);
246
+ };
247
+
248
+ const decode_array = (project: IProject, importer: FunctionImporter) =>
249
+ FeatureProgrammer.decode_array(
250
+ CONFIG(project, importer),
251
+ importer,
252
+ CloneJoiner.array,
253
+ );
254
+
255
+ const decode_object = () =>
256
+ FeatureProgrammer.decode_object({
257
+ trace: false,
258
+ path: false,
259
+ functors: FUNCTORS,
260
+ });
261
+
262
+ const explore_arrays = (project: IProject, importer: FunctionImporter) =>
263
+ UnionExplorer.array({
264
+ checker: IsProgrammer.decode(project, importer),
265
+ decoder: decode_array(project, importer),
266
+ empty: ts.factory.createReturnStatement(),
267
+ success: ts.factory.createTrue(),
268
+ failure: (input, expected) =>
269
+ create_throw_error(importer, input, expected),
270
+ });
271
+
272
+ const explore_objects = (
273
+ input: ts.Expression,
274
+ meta: Metadata,
275
+ explore: FeatureProgrammer.IExplore,
276
+ ) => {
277
+ if (meta.objects.length === 1)
278
+ return decode_object()(input, meta.objects[0]!, explore);
279
+
280
+ return ts.factory.createCallExpression(
281
+ ts.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
282
+ undefined,
283
+ [input],
284
+ );
285
+ };
286
+
287
+ /* -----------------------------------------------------------
288
+ CONFIGURATIONS
289
+ ----------------------------------------------------------- */
290
+ const FUNCTORS = "$co";
291
+ const UNIONERS = "$cu";
292
+
293
+ const CONFIG = (
294
+ project: IProject,
295
+ importer: FunctionImporter,
296
+ ): FeatureProgrammer.IConfig => ({
297
+ functors: FUNCTORS,
298
+ unioners: UNIONERS,
299
+ trace: false,
300
+ path: false,
301
+ initializer,
302
+ decoder: decode(project, importer),
303
+ objector: OBJECTOR(project, importer),
304
+ });
305
+
306
+ const OBJECTOR = (
307
+ project: IProject,
308
+ importer: FunctionImporter,
309
+ ): FeatureProgrammer.IConfig.IObjector => ({
310
+ checker: IsProgrammer.decode(project, importer),
311
+ decoder: decode_object(),
312
+ joiner: CloneJoiner.object,
313
+ unionizer: decode_union_object(IsProgrammer.decode_object(importer))(
314
+ decode_object(),
315
+ )((exp) => exp)((value, expected) =>
316
+ create_throw_error(importer, value, expected),
317
+ ),
318
+ failure: (input, expected) =>
319
+ create_throw_error(importer, input, expected),
320
+ });
321
+
322
+ const initializer: FeatureProgrammer.IConfig["initializer"] = (
323
+ { checker },
324
+ type,
325
+ ) => {
326
+ const collection = new MetadataCollection();
327
+ const meta = MetadataFactory.generate(checker, collection, type, {
328
+ resolve: true,
329
+ constant: true,
330
+ });
331
+ return [collection, meta];
332
+ };
333
+
334
+ const create_throw_error = (
335
+ importer: FunctionImporter,
336
+ value: ts.Expression,
337
+ expected: string,
338
+ ) =>
339
+ ts.factory.createExpressionStatement(
340
+ ts.factory.createCallExpression(
341
+ importer.use("throws"),
342
+ [],
343
+ [
344
+ ts.factory.createObjectLiteralExpression(
345
+ [
346
+ ts.factory.createPropertyAssignment(
347
+ "expected",
348
+ ts.factory.createStringLiteral(expected),
349
+ ),
350
+ ts.factory.createPropertyAssignment("value", value),
351
+ ],
352
+ true,
353
+ ),
354
+ ],
355
+ ),
356
+ );
357
+ }
@@ -0,0 +1,63 @@
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { StatementFactory } from "../factories/StatementFactory";
5
+
6
+ import { IProject } from "../transformers/IProject";
7
+
8
+ import { IsProgrammer } from "./IsProgrammer";
9
+ import { PruneProgrammer } from "./PruneProgrammer";
10
+
11
+ export namespace IsPruneProgrammer {
12
+ export const generate =
13
+ (project: IProject, modulo: ts.LeftHandSideExpression) =>
14
+ (type: ts.Type) =>
15
+ ts.factory.createArrowFunction(
16
+ undefined,
17
+ undefined,
18
+ [IdentifierFactory.parameter("input")],
19
+ undefined,
20
+ undefined,
21
+ ts.factory.createBlock([
22
+ StatementFactory.constant(
23
+ "is",
24
+ IsProgrammer.generate(project, modulo)(type),
25
+ ),
26
+ StatementFactory.constant(
27
+ "prune",
28
+ PruneProgrammer.generate(
29
+ {
30
+ ...project,
31
+ options: {
32
+ ...project.options,
33
+ functional: false,
34
+ numeric: false,
35
+ },
36
+ },
37
+ modulo,
38
+ )(type),
39
+ ),
40
+ ts.factory.createIfStatement(
41
+ ts.factory.createPrefixUnaryExpression(
42
+ ts.SyntaxKind.ExclamationToken,
43
+ ts.factory.createCallExpression(
44
+ ts.factory.createIdentifier("is"),
45
+ undefined,
46
+ [ts.factory.createIdentifier("input")],
47
+ ),
48
+ ),
49
+ ts.factory.createReturnStatement(
50
+ ts.factory.createFalse(),
51
+ ),
52
+ ),
53
+ ts.factory.createExpressionStatement(
54
+ ts.factory.createCallExpression(
55
+ ts.factory.createIdentifier("prune"),
56
+ undefined,
57
+ [ts.factory.createIdentifier("input")],
58
+ ),
59
+ ),
60
+ ts.factory.createReturnStatement(ts.factory.createTrue()),
61
+ ]),
62
+ );
63
+ }
@@ -145,12 +145,15 @@ export namespace PruneProgrammer {
145
145
  //----
146
146
  // STATEMENTS
147
147
  //----
148
- const value = (v: ts.Expression | ts.Block | ts.ReturnStatement) =>
148
+ const converter = (
149
+ v: ts.Expression | ts.Block | ts.ReturnStatement,
150
+ ) =>
149
151
  ts.isReturnStatement(v) || ts.isBlock(v)
150
152
  ? v
151
153
  : ts.factory.createExpressionStatement(v);
154
+
152
155
  const statements: ts.Statement[] = unions.map((u) =>
153
- ts.factory.createIfStatement(u.is(), value(u.value())),
156
+ ts.factory.createIfStatement(u.is(), converter(u.value())),
154
157
  );
155
158
  return ts.factory.createBlock(statements, true);
156
159
  };
@@ -0,0 +1,73 @@
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { StatementFactory } from "../factories/StatementFactory";
5
+
6
+ import { IProject } from "../transformers/IProject";
7
+
8
+ import { PruneProgrammer } from "./PruneProgrammer";
9
+ import { ValidateProgrammer } from "./ValidateProgrammer";
10
+
11
+ export namespace ValidatePruneProgrammer {
12
+ export const generate =
13
+ (project: IProject, modulo: ts.LeftHandSideExpression) =>
14
+ (type: ts.Type) =>
15
+ ts.factory.createArrowFunction(
16
+ undefined,
17
+ undefined,
18
+ [IdentifierFactory.parameter("input")],
19
+ undefined,
20
+ undefined,
21
+ ts.factory.createBlock([
22
+ StatementFactory.constant(
23
+ "validate",
24
+ ValidateProgrammer.generate(
25
+ {
26
+ ...project,
27
+ options: {
28
+ ...project.options,
29
+ functional: false,
30
+ numeric: true,
31
+ },
32
+ },
33
+ modulo,
34
+ )(type),
35
+ ),
36
+ StatementFactory.constant(
37
+ "prune",
38
+ PruneProgrammer.generate(
39
+ {
40
+ ...project,
41
+ options: {
42
+ ...project.options,
43
+ functional: false,
44
+ numeric: false,
45
+ },
46
+ },
47
+ modulo,
48
+ )(type),
49
+ ),
50
+ StatementFactory.constant(
51
+ "output",
52
+ ts.factory.createCallExpression(
53
+ ts.factory.createIdentifier("validate"),
54
+ undefined,
55
+ [ts.factory.createIdentifier("input")],
56
+ ),
57
+ ),
58
+ ts.factory.createIfStatement(
59
+ ts.factory.createIdentifier("output.success"),
60
+ ts.factory.createExpressionStatement(
61
+ ts.factory.createCallExpression(
62
+ ts.factory.createIdentifier("prune"),
63
+ undefined,
64
+ [ts.factory.createIdentifier("input")],
65
+ ),
66
+ ),
67
+ ),
68
+ ts.factory.createReturnStatement(
69
+ ts.factory.createIdentifier("output"),
70
+ ),
71
+ ]),
72
+ );
73
+ }
@@ -0,0 +1,126 @@
1
+ import ts from "typescript";
2
+
3
+ import { StatementFactory } from "../../factories/StatementFactory";
4
+
5
+ import { MetadataObject } from "../../metadata/MetadataObject";
6
+
7
+ import { Escaper } from "../../utils/Escaper";
8
+
9
+ import { metadata_to_pattern } from "../internal/metadata_to_pattern";
10
+ import { IExpressionEntry } from "./IExpressionEntry";
11
+
12
+ export namespace CloneJoiner {
13
+ export const object = (
14
+ input: ts.Expression,
15
+ entries: IExpressionEntry<ts.Expression>[],
16
+ _obj: MetadataObject,
17
+ ): ts.ConciseBody => {
18
+ const regular = entries.filter((e) => e.key.isSoleLiteral());
19
+ const dynamic = entries.filter((e) => !e.key.isSoleLiteral());
20
+
21
+ if (regular.length === 0 && dynamic.length === 0)
22
+ return ts.factory.createIdentifier("{}");
23
+
24
+ const literal = ts.factory.createObjectLiteralExpression(
25
+ regular.map((entry) => {
26
+ const str: string = entry.key.getSoleLiteral()!;
27
+ return ts.factory.createPropertyAssignment(
28
+ Escaper.variable(str)
29
+ ? str
30
+ : ts.factory.createStringLiteral(str),
31
+ entry.expression,
32
+ );
33
+ }),
34
+ true,
35
+ );
36
+ if (dynamic.length === 0) return literal;
37
+
38
+ const key = ts.factory.createIdentifier("key");
39
+ const value = ts.factory.createIdentifier("value");
40
+ const output = ts.factory.createIdentifier("output");
41
+
42
+ const statements: ts.Statement[] = dynamic.map((entry) =>
43
+ ts.factory.createIfStatement(
44
+ ts.factory.createCallExpression(
45
+ ts.factory.createIdentifier(
46
+ `RegExp(/${metadata_to_pattern(true)(
47
+ entry.key,
48
+ )}/).test`,
49
+ ),
50
+ undefined,
51
+ [key],
52
+ ),
53
+ ts.factory.createBlock([
54
+ ts.factory.createExpressionStatement(
55
+ ts.factory.createBinaryExpression(
56
+ ts.factory.createElementAccessExpression(
57
+ output,
58
+ key,
59
+ ),
60
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
61
+ entry.expression,
62
+ ),
63
+ ),
64
+ ts.factory.createContinueStatement(),
65
+ ]),
66
+ ),
67
+ );
68
+
69
+ return ts.factory.createBlock([
70
+ StatementFactory.constant("output", literal),
71
+ ts.factory.createForOfStatement(
72
+ undefined,
73
+ ts.factory.createVariableDeclarationList(
74
+ [
75
+ ts.factory.createVariableDeclaration(
76
+ ts.factory.createArrayBindingPattern([
77
+ ts.factory.createBindingElement(
78
+ undefined,
79
+ undefined,
80
+ key,
81
+ undefined,
82
+ ),
83
+ ts.factory.createBindingElement(
84
+ undefined,
85
+ undefined,
86
+ value,
87
+ undefined,
88
+ ),
89
+ ]),
90
+ undefined,
91
+ undefined,
92
+ undefined,
93
+ ),
94
+ ],
95
+ ts.NodeFlags.Const,
96
+ ),
97
+ ts.factory.createCallExpression(
98
+ ts.factory.createIdentifier("Object.entries"),
99
+ undefined,
100
+ [input],
101
+ ),
102
+ ts.factory.createBlock(statements),
103
+ ),
104
+ ts.factory.createReturnStatement(output),
105
+ ]);
106
+ };
107
+
108
+ export const tuple = (
109
+ children: ts.Expression[],
110
+ rest: ts.Expression | null,
111
+ ): ts.Expression => {
112
+ if (rest === null)
113
+ return ts.factory.createArrayLiteralExpression(children, true);
114
+ return ts.factory.createArrayLiteralExpression(
115
+ [...children, ts.factory.createSpreadElement(rest)],
116
+ true,
117
+ );
118
+ };
119
+
120
+ export const array = (input: ts.Expression, arrow: ts.Expression) =>
121
+ ts.factory.createCallExpression(
122
+ ts.factory.createPropertyAccessExpression(input, "map"),
123
+ undefined,
124
+ [arrow],
125
+ );
126
+ }
@@ -3,9 +3,17 @@ import ts from "typescript";
3
3
 
4
4
  import { IProject } from "./IProject";
5
5
  import { ApplicationTransformer } from "./features/miscellaneous/ApplicationTransformer";
6
+ import { AssertPruneTransformer } from "./features/miscellaneous/AssertPruneTransformer";
7
+ import { CloneTransformer } from "./features/miscellaneous/CloneTransformer";
8
+ import { CreateAssertPruneTransformer } from "./features/miscellaneous/CreateAssertPruneTransformer";
9
+ import { CreateCloneTransformer } from "./features/miscellaneous/CreateCloneTransformer";
10
+ import { CreateIsPruneTransformer } from "./features/miscellaneous/CreateIsPruneTransformer";
6
11
  import { CreatePruneTransformer } from "./features/miscellaneous/CreatePruneTransformer";
12
+ import { CreateValidatePruneTransformer } from "./features/miscellaneous/CreateValidatePruneTransformer";
13
+ import { IsPruneTransformer } from "./features/miscellaneous/IsPruneTransformer";
7
14
  import { MetadataTransformer } from "./features/miscellaneous/MetadataTransformer";
8
15
  import { PruneTransformer } from "./features/miscellaneous/PruneTransformer";
16
+ import { ValidatePruneTransformer } from "./features/miscellaneous/ValidatePruneTransformer";
9
17
  import { AssertParseTransformer } from "./features/parsers/AssertParseTransformer";
10
18
  import { CreateAssertParseTransformer } from "./features/parsers/CreateAssertParseTransformer";
11
19
  import { CreateIsParseTransformer } from "./features/parsers/CreateIsParseTransformer";
@@ -90,15 +98,19 @@ const FUNCTORS: Record<string, () => Task> = {
90
98
  validateParse: () => ValidateParseTransformer.transform,
91
99
 
92
100
  // STRINGIFY FUNCTIONS
101
+ application: () => ApplicationTransformer.transform,
93
102
  stringify: () => StringifyTransformer.transform,
94
103
  assertStringify: () => AssertStringifyTransformer.transform,
95
104
  isStringify: () => IsStringifyTransformer.transform,
96
105
  validateStringify: () => ValidateStringifyTransformer.transform,
97
106
 
98
107
  // MISC
99
- application: () => ApplicationTransformer.transform,
100
108
  metadata: () => MetadataTransformer.transform,
109
+ clone: () => CloneTransformer.transform,
101
110
  prune: () => PruneTransformer.transform,
111
+ assertPrune: () => AssertPruneTransformer.transform,
112
+ isPrune: () => IsPruneTransformer.transform,
113
+ validatePrune: () => ValidatePruneTransformer.transform,
102
114
 
103
115
  //----
104
116
  // FACTORY FUNCTIONS
@@ -126,5 +138,9 @@ const FUNCTORS: Record<string, () => Task> = {
126
138
  createValidateStringify: () => CreateValidateStringifyTransformer.transform,
127
139
 
128
140
  // MISC
141
+ createClone: () => CreateCloneTransformer.transform,
129
142
  createPrune: () => CreatePruneTransformer.transform,
143
+ createAssertPrune: () => CreateAssertPruneTransformer.transform,
144
+ createIsPrune: () => CreateIsPruneTransformer.transform,
145
+ createValidatePrune: () => CreateValidatePruneTransformer.transform,
130
146
  };