typia 4.0.0-dev.20230520 → 4.0.0-dev.20230527

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 (220) hide show
  1. package/lib/transform.js +1 -1
  2. package/lib/transform.js.map +1 -1
  3. package/package.json +1 -1
  4. package/src/CustomValidatorMap.ts +126 -126
  5. package/src/IRandomGenerator.ts +33 -33
  6. package/src/IValidation.ts +21 -21
  7. package/src/Primitive.ts +123 -123
  8. package/src/TypeGuardError.ts +36 -36
  9. package/src/executable/TypiaGenerateWizard.ts +85 -85
  10. package/src/executable/TypiaSetupWizard.ts +133 -133
  11. package/src/executable/setup/ArgumentParser.ts +45 -45
  12. package/src/executable/setup/CommandExecutor.ts +8 -8
  13. package/src/executable/setup/FileRetriever.ts +22 -22
  14. package/src/executable/setup/PackageManager.ts +71 -71
  15. package/src/executable/setup/PluginConfigurator.ts +70 -70
  16. package/src/executable/typia.ts +52 -52
  17. package/src/factories/CommentFactory.ts +14 -14
  18. package/src/factories/ExpressionFactory.ts +77 -77
  19. package/src/factories/IdentifierFactory.ts +62 -62
  20. package/src/factories/LiteralFactory.ts +57 -57
  21. package/src/factories/MetadataCollection.ts +123 -123
  22. package/src/factories/MetadataFactory.ts +53 -53
  23. package/src/factories/MetadataTagFactory.ts +295 -295
  24. package/src/factories/StatementFactory.ts +20 -20
  25. package/src/factories/TemplateFactory.ts +64 -64
  26. package/src/factories/TypeFactory.ts +145 -145
  27. package/src/factories/ValueFactory.ts +15 -15
  28. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  29. package/src/factories/internal/metadata/emplace_metadata_object.ts +152 -152
  30. package/src/factories/internal/metadata/explore_metadata.ts +93 -93
  31. package/src/factories/internal/metadata/iterate_metadata.ts +63 -63
  32. package/src/factories/internal/metadata/iterate_metadata_array.ts +32 -32
  33. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  34. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  35. package/src/factories/internal/metadata/iterate_metadata_constant.ts +62 -62
  36. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  37. package/src/factories/internal/metadata/iterate_metadata_native.ts +217 -217
  38. package/src/factories/internal/metadata/iterate_metadata_object.ts +51 -51
  39. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +30 -30
  40. package/src/factories/internal/metadata/iterate_metadata_set.ts +36 -36
  41. package/src/factories/internal/metadata/iterate_metadata_template.ts +40 -40
  42. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +51 -51
  43. package/src/factories/internal/metadata/iterate_metadata_union.ts +59 -59
  44. package/src/functional/$any.ts +2 -2
  45. package/src/functional/$dictionary.ts +25 -25
  46. package/src/functional/$every.ts +11 -11
  47. package/src/functional/$guard.ts +35 -35
  48. package/src/functional/$is_between.ts +2 -2
  49. package/src/functional/$is_custom.ts +14 -14
  50. package/src/functional/$is_date.ts +3 -3
  51. package/src/functional/$is_datetime.ts +2 -2
  52. package/src/functional/$is_email.ts +4 -4
  53. package/src/functional/$is_ipv4.ts +4 -4
  54. package/src/functional/$is_ipv6.ts +4 -4
  55. package/src/functional/$is_url.ts +4 -4
  56. package/src/functional/$is_uuid.ts +4 -4
  57. package/src/functional/$join.ts +46 -46
  58. package/src/functional/$number.ts +12 -12
  59. package/src/functional/$report.ts +15 -15
  60. package/src/functional/$rest.ts +3 -3
  61. package/src/functional/$string.ts +37 -37
  62. package/src/functional/$tail.ts +5 -5
  63. package/src/functional/Namespace.ts +127 -127
  64. package/src/index.ts +4 -4
  65. package/src/metadata/ICommentTag.ts +4 -4
  66. package/src/metadata/IJsDocTagInfo.ts +10 -10
  67. package/src/metadata/IMetadata.ts +26 -26
  68. package/src/metadata/IMetadataApplication.ts +7 -7
  69. package/src/metadata/IMetadataConstant.ts +16 -16
  70. package/src/metadata/IMetadataEntry.ts +6 -6
  71. package/src/metadata/IMetadataObject.ts +29 -29
  72. package/src/metadata/IMetadataProperty.ts +11 -11
  73. package/src/metadata/IMetadataTag.ts +105 -105
  74. package/src/metadata/Metadata.ts +539 -539
  75. package/src/metadata/MetadataConstant.ts +3 -3
  76. package/src/metadata/MetadataObject.ts +127 -127
  77. package/src/metadata/MetadataProperty.ts +64 -64
  78. package/src/module.ts +2038 -2038
  79. package/src/programmers/ApplicationProgrammer.ts +48 -48
  80. package/src/programmers/AssertCloneProgrammer.ts +68 -68
  81. package/src/programmers/AssertParseProgrammer.ts +66 -66
  82. package/src/programmers/AssertProgrammer.ts +274 -274
  83. package/src/programmers/AssertPruneProgrammer.ts +73 -73
  84. package/src/programmers/AssertStringifyProgrammer.ts +66 -66
  85. package/src/programmers/CheckerProgrammer.ts +897 -897
  86. package/src/programmers/CloneProgrammer.ts +387 -387
  87. package/src/programmers/FeatureProgrammer.ts +510 -510
  88. package/src/programmers/IsCloneProgrammer.ts +79 -79
  89. package/src/programmers/IsParseProgrammer.ts +72 -72
  90. package/src/programmers/IsProgrammer.ts +223 -223
  91. package/src/programmers/IsPruneProgrammer.ts +83 -83
  92. package/src/programmers/IsStringifyProgrammer.ts +77 -77
  93. package/src/programmers/LiteralsProgrammer.ts +65 -65
  94. package/src/programmers/PruneProgrammer.ts +348 -348
  95. package/src/programmers/RandomProgrammer.ts +444 -444
  96. package/src/programmers/StringifyProgrammer.ts +758 -758
  97. package/src/programmers/TypiaProgrammer.ts +141 -141
  98. package/src/programmers/ValidateCloneProgrammer.ts +93 -93
  99. package/src/programmers/ValidateParseProgrammer.ts +78 -78
  100. package/src/programmers/ValidateProgrammer.ts +317 -317
  101. package/src/programmers/ValidatePruneProgrammer.ts +86 -86
  102. package/src/programmers/ValidateStringifyProgrammer.ts +93 -93
  103. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  104. package/src/programmers/helpers/CloneJoiner.ts +138 -138
  105. package/src/programmers/helpers/FunctionImporeter.ts +56 -56
  106. package/src/programmers/helpers/ICheckEntry.ts +12 -12
  107. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  108. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  109. package/src/programmers/helpers/PruneJoiner.ts +156 -156
  110. package/src/programmers/helpers/RandomJoiner.ts +165 -165
  111. package/src/programmers/helpers/RandomRanger.ts +218 -218
  112. package/src/programmers/helpers/StringifyJoinder.ts +118 -118
  113. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  114. package/src/programmers/helpers/UnionExplorer.ts +281 -281
  115. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  116. package/src/programmers/helpers/disable_function_importer_declare.ts +21 -21
  117. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  118. package/src/programmers/internal/application_array.ts +32 -32
  119. package/src/programmers/internal/application_boolean.ts +15 -15
  120. package/src/programmers/internal/application_constant.ts +26 -26
  121. package/src/programmers/internal/application_default.ts +17 -17
  122. package/src/programmers/internal/application_default_string.ts +33 -33
  123. package/src/programmers/internal/application_native.ts +36 -36
  124. package/src/programmers/internal/application_number.ts +71 -71
  125. package/src/programmers/internal/application_object.ts +162 -162
  126. package/src/programmers/internal/application_schema.ts +198 -198
  127. package/src/programmers/internal/application_string.ts +44 -44
  128. package/src/programmers/internal/application_templates.ts +25 -25
  129. package/src/programmers/internal/application_tuple.ts +27 -27
  130. package/src/programmers/internal/check_array.ts +31 -31
  131. package/src/programmers/internal/check_array_length.ts +35 -35
  132. package/src/programmers/internal/check_bigint.ts +95 -95
  133. package/src/programmers/internal/check_custom.ts +32 -32
  134. package/src/programmers/internal/check_dynamic_properties.ts +198 -198
  135. package/src/programmers/internal/check_everything.ts +28 -28
  136. package/src/programmers/internal/check_native.ts +22 -22
  137. package/src/programmers/internal/check_number.ts +177 -177
  138. package/src/programmers/internal/check_object.ts +65 -65
  139. package/src/programmers/internal/check_string.ts +27 -27
  140. package/src/programmers/internal/check_string_tags.ts +68 -68
  141. package/src/programmers/internal/check_template.ts +57 -57
  142. package/src/programmers/internal/check_union_array_like.ts +273 -273
  143. package/src/programmers/internal/check_union_tuple.ts +34 -34
  144. package/src/programmers/internal/decode_union_object.ts +75 -75
  145. package/src/programmers/internal/feature_object_entries.ts +64 -64
  146. package/src/programmers/internal/get_comment_tags.ts +23 -23
  147. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  148. package/src/programmers/internal/prune_object_properties.ts +63 -63
  149. package/src/programmers/internal/random_custom.ts +30 -30
  150. package/src/programmers/internal/stringify_dynamic_properties.ts +173 -173
  151. package/src/programmers/internal/stringify_native.ts +7 -7
  152. package/src/programmers/internal/stringify_regular_properties.ts +89 -89
  153. package/src/programmers/internal/template_to_pattern.ts +15 -15
  154. package/src/schemas/IJsonApplication.ts +13 -13
  155. package/src/schemas/IJsonComponents.ts +33 -33
  156. package/src/schemas/IJsonSchema.ts +134 -134
  157. package/src/transform.ts +39 -39
  158. package/src/transformers/CallExpressionTransformer.ts +183 -183
  159. package/src/transformers/FileTransformer.ts +50 -50
  160. package/src/transformers/IProject.ts +18 -18
  161. package/src/transformers/ITransformOptions.ts +62 -62
  162. package/src/transformers/ImportTransformer.ts +74 -74
  163. package/src/transformers/NodeTransformer.ts +13 -13
  164. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +107 -107
  165. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  166. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  167. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  168. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  169. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  170. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  171. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  172. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  173. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  174. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +43 -43
  175. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  176. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  177. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  178. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  179. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +31 -31
  180. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +56 -56
  181. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  182. package/src/transformers/features/miscellaneous/RandomTransformer.ts +46 -46
  183. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  184. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  185. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  186. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  187. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  188. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  189. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  190. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  191. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  192. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +12 -12
  193. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  194. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  195. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +12 -12
  196. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  197. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  198. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  199. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  200. package/src/transformers/features/validators/CreateAssertTransformer.ts +13 -13
  201. package/src/transformers/features/validators/CreateIsTransformer.ts +11 -11
  202. package/src/transformers/features/validators/CreateValidateTransformer.ts +13 -13
  203. package/src/transformers/features/validators/IsTransformer.ts +11 -11
  204. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  205. package/src/transformers/internal/GenericTransformer.ts +101 -101
  206. package/src/typings/Atomic.ts +17 -17
  207. package/src/typings/ClassProperties.ts +5 -5
  208. package/src/typings/Customizable.ts +5 -5
  209. package/src/typings/OmitNever.ts +3 -3
  210. package/src/typings/SpecialFields.ts +3 -3
  211. package/src/typings/Writable.ts +11 -11
  212. package/src/utils/ArrayUtil.ts +44 -44
  213. package/src/utils/Escaper.ts +45 -45
  214. package/src/utils/MapUtil.ts +12 -12
  215. package/src/utils/PatternUtil.ts +30 -30
  216. package/src/utils/RandomGenerator.ts +81 -81
  217. package/src/utils/Singleton.ts +17 -17
  218. package/src/utils/TsNodeUtil.ts +17 -17
  219. package/src/utils/TsSymbolUtil.ts +153 -153
  220. package/src/utils/TsTypeUtil.ts +38 -38
@@ -1,348 +1,348 @@
1
- import type ts from "typescript/lib/tsclibrary";
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 { TypeFactory } from "../factories/TypeFactory";
8
-
9
- import { Metadata } from "../metadata/Metadata";
10
-
11
- import { IProject } from "../transformers/IProject";
12
-
13
- import { FeatureProgrammer } from "./FeatureProgrammer";
14
- import { IsProgrammer } from "./IsProgrammer";
15
- import { FunctionImporter } from "./helpers/FunctionImporeter";
16
- import { PruneJoiner } from "./helpers/PruneJoiner";
17
- import { UnionExplorer } from "./helpers/UnionExplorer";
18
- import { decode_union_object } from "./internal/decode_union_object";
19
-
20
- export namespace PruneProgrammer {
21
- /**
22
- * @deprecated Use `write()` function instead
23
- */
24
- export const generate =
25
- (project: IProject, modulo: ts.LeftHandSideExpression) =>
26
- (type: ts.Type, name?: string) =>
27
- write(project)(modulo)(type, name);
28
-
29
- export const write =
30
- (p: IProject) => (modulo: ts.LeftHandSideExpression) => {
31
- const importer: FunctionImporter = new FunctionImporter(p.tsc);
32
- return FeatureProgrammer.analyze(p)({
33
- ...configure(p)(importer),
34
- addition: (collection) => {
35
- const isFunctors =
36
- IsProgrammer.write_functors(p)(importer)(collection);
37
- const isUnioners =
38
- IsProgrammer.write_unioners(p)(importer)(collection);
39
-
40
- return [
41
- ...importer.declare(modulo),
42
- ...isFunctors.filter((_, i) =>
43
- importer.hasLocal(`$io${i}`),
44
- ),
45
- ...isUnioners.filter((_, i) =>
46
- importer.hasLocal(`$iu${i}`),
47
- ),
48
- ];
49
- },
50
- })(importer);
51
- };
52
-
53
- /* -----------------------------------------------------------
54
- DECODERS
55
- ----------------------------------------------------------- */
56
- const decode =
57
- (p: IProject) =>
58
- (importer: FunctionImporter) =>
59
- (
60
- input: ts.Expression,
61
- meta: Metadata,
62
- explore: FeatureProgrammer.IExplore,
63
- ): ts.ConciseBody => {
64
- const tsc: typeof ts = p.tsc;
65
- if (filter(meta) === false) return tsc.factory.createBlock([]);
66
-
67
- interface IUnion {
68
- type: string;
69
- is: () => ts.Expression;
70
- value: () => ts.Expression | ts.Block | ts.ReturnStatement;
71
- }
72
- const unions: IUnion[] = [];
73
-
74
- //----
75
- // LIST UP UNION TYPES
76
- //----
77
- // TUPLES
78
- for (const tuple of meta.tuples.filter((t) =>
79
- t.some((e) => filter(e.rest ?? e)),
80
- ))
81
- unions.push({
82
- type: "tuple",
83
- is: () =>
84
- IsProgrammer.decode(p)(importer)(
85
- input,
86
- (() => {
87
- const partial = Metadata.initialize();
88
- partial.tuples.push(tuple);
89
- return partial;
90
- })(),
91
- explore,
92
- [],
93
- [],
94
- ),
95
- value: () =>
96
- decode_tuple(p)(importer)(input, tuple, explore),
97
- });
98
-
99
- // ARRAYS
100
- if (meta.arrays.filter(filter).length)
101
- unions.push({
102
- type: "array",
103
- is: () => ExpressionFactory.isArray(tsc)(input),
104
- value: () =>
105
- explore_arrays(p)(importer)(
106
- input,
107
- meta.arrays,
108
- {
109
- ...explore,
110
- from: "array",
111
- },
112
- [],
113
- [],
114
- ),
115
- });
116
-
117
- // BUILT-IN CLASSES
118
- if (meta.natives.length)
119
- for (const native of meta.natives)
120
- unions.push({
121
- type: "native",
122
- is: () =>
123
- ExpressionFactory.isInstanceOf(tsc)(native)(input),
124
- value: () => tsc.factory.createReturnStatement(),
125
- });
126
- if (meta.sets.length)
127
- unions.push({
128
- type: "set",
129
- is: () => ExpressionFactory.isInstanceOf(tsc)("Set")(input),
130
- value: () => tsc.factory.createReturnStatement(),
131
- });
132
- if (meta.maps.length)
133
- unions.push({
134
- type: "map",
135
- is: () => ExpressionFactory.isInstanceOf(tsc)("Map")(input),
136
- value: () => tsc.factory.createReturnStatement(),
137
- });
138
-
139
- // OBJECTS
140
- if (meta.objects.length)
141
- unions.push({
142
- type: "object",
143
- is: () =>
144
- ExpressionFactory.isObject(tsc)({
145
- checkNull: true,
146
- checkArray: false,
147
- })(input),
148
- value: () =>
149
- explore_objects(tsc)(importer)(input, meta, {
150
- ...explore,
151
- from: "object",
152
- }),
153
- });
154
-
155
- //----
156
- // STATEMENTS
157
- //----
158
- const converter = (
159
- v: ts.Expression | ts.Block | ts.ReturnStatement,
160
- ) =>
161
- tsc.isReturnStatement(v) || tsc.isBlock(v)
162
- ? v
163
- : tsc.factory.createExpressionStatement(v);
164
-
165
- const statements: ts.Statement[] = unions.map((u) =>
166
- tsc.factory.createIfStatement(u.is(), converter(u.value())),
167
- );
168
- return tsc.factory.createBlock(statements, true);
169
- };
170
-
171
- const decode_tuple =
172
- (p: IProject) =>
173
- (importer: FunctionImporter) =>
174
- (
175
- input: ts.Expression,
176
- tuple: Metadata[],
177
- explore: FeatureProgrammer.IExplore,
178
- ): ts.Block => {
179
- const children: ts.ConciseBody[] = tuple
180
- .map((elem, index) => [elem, index] as const)
181
- .filter(([elem]) => filter(elem) && elem.rest === null)
182
- .map(([elem, index]) =>
183
- decode(p)(importer)(
184
- p.tsc.factory.createElementAccessExpression(
185
- input,
186
- index,
187
- ),
188
- elem,
189
- {
190
- ...explore,
191
- from: "array",
192
- },
193
- ),
194
- );
195
- const rest = (() => {
196
- if (tuple.length === 0) return null;
197
-
198
- const last: Metadata = tuple[tuple.length - 1]!;
199
- const rest: Metadata | null = last.rest;
200
- if (rest === null || filter(rest) === false) return null;
201
-
202
- return decode(p)(importer)(
203
- p.tsc.factory.createCallExpression(
204
- IdentifierFactory.access(p.tsc)(input)("slice"),
205
- undefined,
206
- [p.tsc.factory.createNumericLiteral(tuple.length - 1)],
207
- ),
208
- (() => {
209
- const wrapper: Metadata = Metadata.initialize();
210
- wrapper.arrays.push(rest);
211
- return wrapper;
212
- })(),
213
- {
214
- ...explore,
215
- start: tuple.length - 1,
216
- },
217
- );
218
- })();
219
- return PruneJoiner.tuple(p.tsc)(children, rest);
220
- };
221
-
222
- const decode_array = (p: IProject) => (importer: FunctionImporter) =>
223
- FeatureProgrammer.decode_array(p.tsc)(configure(p)(importer))(importer)(
224
- PruneJoiner.array(p.tsc),
225
- );
226
-
227
- const decode_object = (tsc: typeof ts) => (importer: FunctionImporter) =>
228
- FeatureProgrammer.decode_object(tsc)({
229
- trace: false,
230
- path: false,
231
- functors: FUNCTORS,
232
- })(importer);
233
-
234
- const explore_arrays = (p: IProject) => (importer: FunctionImporter) =>
235
- UnionExplorer.array(p.tsc)({
236
- checker: IsProgrammer.decode(p)(importer),
237
- decoder: decode_array(p)(importer),
238
- empty: p.tsc.factory.createReturnStatement(),
239
- success: p.tsc.factory.createTrue(),
240
- failure: (input, expected) =>
241
- create_throw_error(p.tsc)(importer)(expected)(input),
242
- });
243
-
244
- const explore_objects =
245
- (tsc: typeof ts) =>
246
- (importer: FunctionImporter) =>
247
- (
248
- input: ts.Expression,
249
- meta: Metadata,
250
- explore: FeatureProgrammer.IExplore,
251
- ) => {
252
- if (meta.objects.length === 1)
253
- return decode_object(tsc)(importer)(
254
- input,
255
- meta.objects[0]!,
256
- explore,
257
- );
258
-
259
- return tsc.factory.createCallExpression(
260
- tsc.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
261
- undefined,
262
- [input],
263
- );
264
- };
265
-
266
- const filter = (meta: Metadata): boolean =>
267
- meta.any === false &&
268
- (meta.objects.length !== 0 ||
269
- meta.tuples.some((t) => t.some((e) => filter(e.rest ?? e))) ||
270
- meta.arrays.some((e) => filter(e)));
271
-
272
- /* -----------------------------------------------------------
273
- CONFIGURATIONS
274
- ----------------------------------------------------------- */
275
- const FUNCTORS = "$po";
276
- const UNIONERS = "$pu";
277
-
278
- const configure =
279
- (p: IProject) =>
280
- (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
281
- types: {
282
- input: (type, name) =>
283
- p.tsc.factory.createTypeReferenceNode(
284
- name ?? TypeFactory.getFullName(p)(type),
285
- ),
286
- output: () => TypeFactory.keyword(p.tsc)("void"),
287
- },
288
- functors: FUNCTORS,
289
- unioners: UNIONERS,
290
- trace: false,
291
- path: false,
292
- initializer,
293
- decoder: decode(p)(importer),
294
- objector: objector(p)(importer),
295
- });
296
-
297
- const objector =
298
- (p: IProject) =>
299
- (importer: FunctionImporter): FeatureProgrammer.IConfig.IObjector => ({
300
- checker: IsProgrammer.decode(p)(importer),
301
- decoder: decode_object(p.tsc)(importer),
302
- joiner: PruneJoiner.object(p.tsc),
303
- unionizer: decode_union_object(p.tsc)(
304
- IsProgrammer.decode_object(p.tsc)(importer),
305
- )(decode_object(p.tsc)(importer))((exp) => exp)((value, expected) =>
306
- create_throw_error(p.tsc)(importer)(expected)(value),
307
- ),
308
- failure: (input, expected) =>
309
- create_throw_error(p.tsc)(importer)(expected)(input),
310
- });
311
-
312
- const initializer: FeatureProgrammer.IConfig["initializer"] =
313
- (p) => (type) => {
314
- const collection = new MetadataCollection();
315
- const meta = MetadataFactory.analyze(p)({
316
- resolve: false,
317
- constant: true,
318
- })(collection)(type);
319
- return [collection, meta];
320
- };
321
-
322
- const create_throw_error =
323
- (tsc: typeof ts) =>
324
- (importer: FunctionImporter) =>
325
- (expected: string) =>
326
- (value: ts.Expression) =>
327
- tsc.factory.createExpressionStatement(
328
- tsc.factory.createCallExpression(
329
- importer.use("throws"),
330
- [],
331
- [
332
- tsc.factory.createObjectLiteralExpression(
333
- [
334
- tsc.factory.createPropertyAssignment(
335
- "expected",
336
- tsc.factory.createStringLiteral(expected),
337
- ),
338
- tsc.factory.createPropertyAssignment(
339
- "value",
340
- value,
341
- ),
342
- ],
343
- true,
344
- ),
345
- ],
346
- ),
347
- );
348
- }
1
+ import type ts from "typescript/lib/tsclibrary";
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 { TypeFactory } from "../factories/TypeFactory";
8
+
9
+ import { Metadata } from "../metadata/Metadata";
10
+
11
+ import { IProject } from "../transformers/IProject";
12
+
13
+ import { FeatureProgrammer } from "./FeatureProgrammer";
14
+ import { IsProgrammer } from "./IsProgrammer";
15
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
16
+ import { PruneJoiner } from "./helpers/PruneJoiner";
17
+ import { UnionExplorer } from "./helpers/UnionExplorer";
18
+ import { decode_union_object } from "./internal/decode_union_object";
19
+
20
+ export namespace PruneProgrammer {
21
+ /**
22
+ * @deprecated Use `write()` function instead
23
+ */
24
+ export const generate =
25
+ (project: IProject, modulo: ts.LeftHandSideExpression) =>
26
+ (type: ts.Type, name?: string) =>
27
+ write(project)(modulo)(type, name);
28
+
29
+ export const write =
30
+ (p: IProject) => (modulo: ts.LeftHandSideExpression) => {
31
+ const importer: FunctionImporter = new FunctionImporter(p.tsc);
32
+ return FeatureProgrammer.analyze(p)({
33
+ ...configure(p)(importer),
34
+ addition: (collection) => {
35
+ const isFunctors =
36
+ IsProgrammer.write_functors(p)(importer)(collection);
37
+ const isUnioners =
38
+ IsProgrammer.write_unioners(p)(importer)(collection);
39
+
40
+ return [
41
+ ...importer.declare(modulo),
42
+ ...isFunctors.filter((_, i) =>
43
+ importer.hasLocal(`$io${i}`),
44
+ ),
45
+ ...isUnioners.filter((_, i) =>
46
+ importer.hasLocal(`$iu${i}`),
47
+ ),
48
+ ];
49
+ },
50
+ })(importer);
51
+ };
52
+
53
+ /* -----------------------------------------------------------
54
+ DECODERS
55
+ ----------------------------------------------------------- */
56
+ const decode =
57
+ (p: IProject) =>
58
+ (importer: FunctionImporter) =>
59
+ (
60
+ input: ts.Expression,
61
+ meta: Metadata,
62
+ explore: FeatureProgrammer.IExplore,
63
+ ): ts.ConciseBody => {
64
+ const tsc: typeof ts = p.tsc;
65
+ if (filter(meta) === false) return tsc.factory.createBlock([]);
66
+
67
+ interface IUnion {
68
+ type: string;
69
+ is: () => ts.Expression;
70
+ value: () => ts.Expression | ts.Block | ts.ReturnStatement;
71
+ }
72
+ const unions: IUnion[] = [];
73
+
74
+ //----
75
+ // LIST UP UNION TYPES
76
+ //----
77
+ // TUPLES
78
+ for (const tuple of meta.tuples.filter((t) =>
79
+ t.some((e) => filter(e.rest ?? e)),
80
+ ))
81
+ unions.push({
82
+ type: "tuple",
83
+ is: () =>
84
+ IsProgrammer.decode(p)(importer)(
85
+ input,
86
+ (() => {
87
+ const partial = Metadata.initialize();
88
+ partial.tuples.push(tuple);
89
+ return partial;
90
+ })(),
91
+ explore,
92
+ [],
93
+ [],
94
+ ),
95
+ value: () =>
96
+ decode_tuple(p)(importer)(input, tuple, explore),
97
+ });
98
+
99
+ // ARRAYS
100
+ if (meta.arrays.filter(filter).length)
101
+ unions.push({
102
+ type: "array",
103
+ is: () => ExpressionFactory.isArray(tsc)(input),
104
+ value: () =>
105
+ explore_arrays(p)(importer)(
106
+ input,
107
+ meta.arrays,
108
+ {
109
+ ...explore,
110
+ from: "array",
111
+ },
112
+ [],
113
+ [],
114
+ ),
115
+ });
116
+
117
+ // BUILT-IN CLASSES
118
+ if (meta.natives.length)
119
+ for (const native of meta.natives)
120
+ unions.push({
121
+ type: "native",
122
+ is: () =>
123
+ ExpressionFactory.isInstanceOf(tsc)(native)(input),
124
+ value: () => tsc.factory.createReturnStatement(),
125
+ });
126
+ if (meta.sets.length)
127
+ unions.push({
128
+ type: "set",
129
+ is: () => ExpressionFactory.isInstanceOf(tsc)("Set")(input),
130
+ value: () => tsc.factory.createReturnStatement(),
131
+ });
132
+ if (meta.maps.length)
133
+ unions.push({
134
+ type: "map",
135
+ is: () => ExpressionFactory.isInstanceOf(tsc)("Map")(input),
136
+ value: () => tsc.factory.createReturnStatement(),
137
+ });
138
+
139
+ // OBJECTS
140
+ if (meta.objects.length)
141
+ unions.push({
142
+ type: "object",
143
+ is: () =>
144
+ ExpressionFactory.isObject(tsc)({
145
+ checkNull: true,
146
+ checkArray: false,
147
+ })(input),
148
+ value: () =>
149
+ explore_objects(tsc)(importer)(input, meta, {
150
+ ...explore,
151
+ from: "object",
152
+ }),
153
+ });
154
+
155
+ //----
156
+ // STATEMENTS
157
+ //----
158
+ const converter = (
159
+ v: ts.Expression | ts.Block | ts.ReturnStatement,
160
+ ) =>
161
+ tsc.isReturnStatement(v) || tsc.isBlock(v)
162
+ ? v
163
+ : tsc.factory.createExpressionStatement(v);
164
+
165
+ const statements: ts.Statement[] = unions.map((u) =>
166
+ tsc.factory.createIfStatement(u.is(), converter(u.value())),
167
+ );
168
+ return tsc.factory.createBlock(statements, true);
169
+ };
170
+
171
+ const decode_tuple =
172
+ (p: IProject) =>
173
+ (importer: FunctionImporter) =>
174
+ (
175
+ input: ts.Expression,
176
+ tuple: Metadata[],
177
+ explore: FeatureProgrammer.IExplore,
178
+ ): ts.Block => {
179
+ const children: ts.ConciseBody[] = tuple
180
+ .map((elem, index) => [elem, index] as const)
181
+ .filter(([elem]) => filter(elem) && elem.rest === null)
182
+ .map(([elem, index]) =>
183
+ decode(p)(importer)(
184
+ p.tsc.factory.createElementAccessExpression(
185
+ input,
186
+ index,
187
+ ),
188
+ elem,
189
+ {
190
+ ...explore,
191
+ from: "array",
192
+ },
193
+ ),
194
+ );
195
+ const rest = (() => {
196
+ if (tuple.length === 0) return null;
197
+
198
+ const last: Metadata = tuple[tuple.length - 1]!;
199
+ const rest: Metadata | null = last.rest;
200
+ if (rest === null || filter(rest) === false) return null;
201
+
202
+ return decode(p)(importer)(
203
+ p.tsc.factory.createCallExpression(
204
+ IdentifierFactory.access(p.tsc)(input)("slice"),
205
+ undefined,
206
+ [p.tsc.factory.createNumericLiteral(tuple.length - 1)],
207
+ ),
208
+ (() => {
209
+ const wrapper: Metadata = Metadata.initialize();
210
+ wrapper.arrays.push(rest);
211
+ return wrapper;
212
+ })(),
213
+ {
214
+ ...explore,
215
+ start: tuple.length - 1,
216
+ },
217
+ );
218
+ })();
219
+ return PruneJoiner.tuple(p.tsc)(children, rest);
220
+ };
221
+
222
+ const decode_array = (p: IProject) => (importer: FunctionImporter) =>
223
+ FeatureProgrammer.decode_array(p.tsc)(configure(p)(importer))(importer)(
224
+ PruneJoiner.array(p.tsc),
225
+ );
226
+
227
+ const decode_object = (tsc: typeof ts) => (importer: FunctionImporter) =>
228
+ FeatureProgrammer.decode_object(tsc)({
229
+ trace: false,
230
+ path: false,
231
+ functors: FUNCTORS,
232
+ })(importer);
233
+
234
+ const explore_arrays = (p: IProject) => (importer: FunctionImporter) =>
235
+ UnionExplorer.array(p.tsc)({
236
+ checker: IsProgrammer.decode(p)(importer),
237
+ decoder: decode_array(p)(importer),
238
+ empty: p.tsc.factory.createReturnStatement(),
239
+ success: p.tsc.factory.createTrue(),
240
+ failure: (input, expected) =>
241
+ create_throw_error(p.tsc)(importer)(expected)(input),
242
+ });
243
+
244
+ const explore_objects =
245
+ (tsc: typeof ts) =>
246
+ (importer: FunctionImporter) =>
247
+ (
248
+ input: ts.Expression,
249
+ meta: Metadata,
250
+ explore: FeatureProgrammer.IExplore,
251
+ ) => {
252
+ if (meta.objects.length === 1)
253
+ return decode_object(tsc)(importer)(
254
+ input,
255
+ meta.objects[0]!,
256
+ explore,
257
+ );
258
+
259
+ return tsc.factory.createCallExpression(
260
+ tsc.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
261
+ undefined,
262
+ [input],
263
+ );
264
+ };
265
+
266
+ const filter = (meta: Metadata): boolean =>
267
+ meta.any === false &&
268
+ (meta.objects.length !== 0 ||
269
+ meta.tuples.some((t) => t.some((e) => filter(e.rest ?? e))) ||
270
+ meta.arrays.some((e) => filter(e)));
271
+
272
+ /* -----------------------------------------------------------
273
+ CONFIGURATIONS
274
+ ----------------------------------------------------------- */
275
+ const FUNCTORS = "$po";
276
+ const UNIONERS = "$pu";
277
+
278
+ const configure =
279
+ (p: IProject) =>
280
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
281
+ types: {
282
+ input: (type, name) =>
283
+ p.tsc.factory.createTypeReferenceNode(
284
+ name ?? TypeFactory.getFullName(p)(type),
285
+ ),
286
+ output: () => TypeFactory.keyword(p.tsc)("void"),
287
+ },
288
+ functors: FUNCTORS,
289
+ unioners: UNIONERS,
290
+ trace: false,
291
+ path: false,
292
+ initializer,
293
+ decoder: decode(p)(importer),
294
+ objector: objector(p)(importer),
295
+ });
296
+
297
+ const objector =
298
+ (p: IProject) =>
299
+ (importer: FunctionImporter): FeatureProgrammer.IConfig.IObjector => ({
300
+ checker: IsProgrammer.decode(p)(importer),
301
+ decoder: decode_object(p.tsc)(importer),
302
+ joiner: PruneJoiner.object(p.tsc),
303
+ unionizer: decode_union_object(p.tsc)(
304
+ IsProgrammer.decode_object(p.tsc)(importer),
305
+ )(decode_object(p.tsc)(importer))((exp) => exp)((value, expected) =>
306
+ create_throw_error(p.tsc)(importer)(expected)(value),
307
+ ),
308
+ failure: (input, expected) =>
309
+ create_throw_error(p.tsc)(importer)(expected)(input),
310
+ });
311
+
312
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
313
+ (p) => (type) => {
314
+ const collection = new MetadataCollection();
315
+ const meta = MetadataFactory.analyze(p)({
316
+ resolve: false,
317
+ constant: true,
318
+ })(collection)(type);
319
+ return [collection, meta];
320
+ };
321
+
322
+ const create_throw_error =
323
+ (tsc: typeof ts) =>
324
+ (importer: FunctionImporter) =>
325
+ (expected: string) =>
326
+ (value: ts.Expression) =>
327
+ tsc.factory.createExpressionStatement(
328
+ tsc.factory.createCallExpression(
329
+ importer.use("throws"),
330
+ [],
331
+ [
332
+ tsc.factory.createObjectLiteralExpression(
333
+ [
334
+ tsc.factory.createPropertyAssignment(
335
+ "expected",
336
+ tsc.factory.createStringLiteral(expected),
337
+ ),
338
+ tsc.factory.createPropertyAssignment(
339
+ "value",
340
+ value,
341
+ ),
342
+ ],
343
+ true,
344
+ ),
345
+ ],
346
+ ),
347
+ );
348
+ }