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,273 +1,273 @@
1
- import { JSDocTagInfo } from "typescript";
2
- import type ts from "typescript/lib/tsclibrary";
3
-
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
- import { StatementFactory } from "../../factories/StatementFactory";
6
- import { TypeFactory } from "../../factories/TypeFactory";
7
-
8
- import { IMetadataTag } from "../../metadata/IMetadataTag";
9
-
10
- import { CheckerProgrammer } from "../CheckerProgrammer";
11
- import { FeatureProgrammer } from "../FeatureProgrammer";
12
- import { UnionExplorer } from "../helpers/UnionExplorer";
13
-
14
- /**
15
- * @internal
16
- */
17
- export const check_union_array_like =
18
- (tsc: typeof ts) =>
19
- <T>(accessor: check_union_array_like.IAccessor<T>) =>
20
- (props: check_union_array_like.IProps<T>) =>
21
- (
22
- input: ts.Expression,
23
- targets: T[],
24
- explore: FeatureProgrammer.IExplore,
25
- tags: IMetadataTag[],
26
- jsDocTags: JSDocTagInfo[],
27
- ) => {
28
- // ONLY ONE TYPE
29
- if (targets.length === 1)
30
- return props.decoder(
31
- accessor.array(input),
32
- targets[0]!,
33
- explore,
34
- tags,
35
- jsDocTags,
36
- );
37
-
38
- //----
39
- // LIST UP VARIABLES
40
- //----
41
- // TUPLES
42
- const tupleListVariable: ts.VariableStatement =
43
- StatementFactory.constant(tsc)(
44
- "tupleList",
45
- tsc.factory.createArrayLiteralExpression(
46
- targets.map((meta) =>
47
- tsc.factory.createArrayLiteralExpression([
48
- tsc.factory.createArrowFunction(
49
- undefined,
50
- undefined,
51
- [
52
- IdentifierFactory.parameter(tsc)(
53
- "top",
54
- TypeFactory.keyword(tsc)("any"),
55
- ),
56
- ],
57
- undefined,
58
- undefined,
59
- props.checker(
60
- tsc.factory.createIdentifier("top"),
61
- meta,
62
- {
63
- ...explore,
64
- tracable: false,
65
- postfix: `"[0]"`,
66
- },
67
- tags,
68
- jsDocTags,
69
- input,
70
- ),
71
- ),
72
- tsc.factory.createArrowFunction(
73
- undefined,
74
- undefined,
75
- [
76
- IdentifierFactory.parameter(tsc)(
77
- "top",
78
- TypeFactory.keyword(tsc)("any"),
79
- ),
80
- ],
81
- undefined,
82
- undefined,
83
- props.decoder(
84
- tsc.factory.createIdentifier("top"),
85
- meta,
86
- {
87
- ...explore,
88
- tracable: true,
89
- },
90
- tags,
91
- jsDocTags,
92
- ),
93
- ),
94
- ]),
95
- ),
96
- ),
97
- );
98
-
99
- // FILTERED TUPLES
100
- const filteredVariable = StatementFactory.constant(tsc)(
101
- "filtered",
102
- tsc.factory.createCallExpression(
103
- tsc.factory.createIdentifier("tupleList.filter"),
104
- undefined,
105
- [
106
- tsc.factory.createArrowFunction(
107
- undefined,
108
- undefined,
109
- [IdentifierFactory.parameter(tsc)("tuple")],
110
- undefined,
111
- undefined,
112
- tsc.factory.createStrictEquality(
113
- props.success,
114
- tsc.factory.createCallExpression(
115
- tsc.factory.createIdentifier("tuple[0]"),
116
- undefined,
117
- [tsc.factory.createIdentifier("front")],
118
- ),
119
- ),
120
- ),
121
- ],
122
- ),
123
- );
124
-
125
- //----
126
- // STATEMENTS
127
- //----
128
- // ONLY ONE TYPE
129
- const uniqueStatement = tsc.factory.createIfStatement(
130
- tsc.factory.createStrictEquality(
131
- tsc.factory.createNumericLiteral(1),
132
- tsc.factory.createIdentifier("filtered.length"),
133
- ),
134
- tsc.factory.createReturnStatement(
135
- tsc.factory.createCallExpression(
136
- tsc.factory.createIdentifier(`filtered[0][1]`),
137
- undefined,
138
- [accessor.array(input)],
139
- ),
140
- ),
141
- );
142
-
143
- // UNION TYPE
144
- const forOfStatement = tsc.factory.createForOfStatement(
145
- undefined,
146
- tsc.factory.createVariableDeclarationList(
147
- [tsc.factory.createVariableDeclaration("tuple")],
148
- tsc.NodeFlags.Const,
149
- ),
150
- // StatementFactory.variable(ts.NodeFlags.Const, "tuple"),
151
- tsc.factory.createIdentifier("filtered"),
152
- tsc.factory.createIfStatement(
153
- tsc.factory.createCallExpression(
154
- IdentifierFactory.access(tsc)(
155
- tsc.factory.createIdentifier("array"),
156
- )("every"),
157
- undefined,
158
- [
159
- tsc.factory.createArrowFunction(
160
- undefined,
161
- undefined,
162
- [
163
- IdentifierFactory.parameter(tsc)(
164
- "value",
165
- TypeFactory.keyword(tsc)("any"),
166
- ),
167
- ],
168
- undefined,
169
- undefined,
170
- tsc.factory.createStrictEquality(
171
- props.success,
172
- tsc.factory.createCallExpression(
173
- tsc.factory.createIdentifier("tuple[0]"),
174
- undefined,
175
- [tsc.factory.createIdentifier("value")],
176
- ),
177
- ),
178
- ),
179
- ],
180
- ),
181
- tsc.factory.createReturnStatement(
182
- tsc.factory.createCallExpression(
183
- tsc.factory.createIdentifier(`tuple[1]`),
184
- undefined,
185
- [tsc.factory.createIdentifier("array")],
186
- ),
187
- ),
188
- ),
189
- );
190
- const unionStatement = tsc.factory.createIfStatement(
191
- tsc.factory.createLessThan(
192
- tsc.factory.createNumericLiteral(1),
193
- tsc.factory.createIdentifier("filtered.length"),
194
- ),
195
- forOfStatement,
196
- );
197
-
198
- const block = [
199
- // ARRAY.LENGTH := 0
200
- ...(accessor.size !== null
201
- ? [
202
- tsc.factory.createIfStatement(
203
- tsc.factory.createStrictEquality(
204
- tsc.factory.createNumericLiteral(0),
205
- accessor.size(input),
206
- ),
207
- tsc.isReturnStatement(props.empty)
208
- ? props.empty
209
- : tsc.factory.createReturnStatement(props.empty),
210
- ),
211
- ]
212
- : []),
213
-
214
- // UNION PREDICATORS
215
- tupleListVariable,
216
- StatementFactory.constant(tsc)("front", accessor.front(input)),
217
- filteredVariable,
218
- uniqueStatement,
219
-
220
- // CONDITIONAL STATEMENTS
221
- StatementFactory.constant(tsc)("array", accessor.array(input)),
222
- unionStatement,
223
- props.failure(
224
- input,
225
- `(${targets.map((t) => accessor.name(t)).join(" | ")})`,
226
- explore,
227
- ),
228
- ];
229
-
230
- return tsc.factory.createCallExpression(
231
- tsc.factory.createArrowFunction(
232
- undefined,
233
- undefined,
234
- [],
235
- undefined,
236
- undefined,
237
- tsc.factory.createBlock(block, true),
238
- ),
239
- undefined,
240
- undefined,
241
- );
242
- };
243
-
244
- /**
245
- * @internal
246
- */
247
- export namespace check_union_array_like {
248
- export interface IProps<T> {
249
- checker(
250
- front: ts.Expression,
251
- target: T,
252
- explore: FeatureProgrammer.IExplore,
253
- tags: IMetadataTag[],
254
- jsDocTags: JSDocTagInfo[],
255
- array: ts.Expression,
256
- ): ts.Expression;
257
- decoder: UnionExplorer.Decoder<T>;
258
- empty: ts.ReturnStatement | ts.Expression;
259
- success: ts.Expression;
260
- failure(
261
- input: ts.Expression,
262
- expected: string,
263
- explore: CheckerProgrammer.IExplore,
264
- ): ts.Statement;
265
- }
266
-
267
- export interface IAccessor<T> {
268
- name(target: T): string;
269
- front(input: ts.Expression): ts.Expression;
270
- array(input: ts.Expression): ts.Expression;
271
- size: null | ((input: ts.Expression) => ts.Expression);
272
- }
273
- }
1
+ import { JSDocTagInfo } from "typescript";
2
+ import type ts from "typescript/lib/tsclibrary";
3
+
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+ import { StatementFactory } from "../../factories/StatementFactory";
6
+ import { TypeFactory } from "../../factories/TypeFactory";
7
+
8
+ import { IMetadataTag } from "../../metadata/IMetadataTag";
9
+
10
+ import { CheckerProgrammer } from "../CheckerProgrammer";
11
+ import { FeatureProgrammer } from "../FeatureProgrammer";
12
+ import { UnionExplorer } from "../helpers/UnionExplorer";
13
+
14
+ /**
15
+ * @internal
16
+ */
17
+ export const check_union_array_like =
18
+ (tsc: typeof ts) =>
19
+ <T>(accessor: check_union_array_like.IAccessor<T>) =>
20
+ (props: check_union_array_like.IProps<T>) =>
21
+ (
22
+ input: ts.Expression,
23
+ targets: T[],
24
+ explore: FeatureProgrammer.IExplore,
25
+ tags: IMetadataTag[],
26
+ jsDocTags: JSDocTagInfo[],
27
+ ) => {
28
+ // ONLY ONE TYPE
29
+ if (targets.length === 1)
30
+ return props.decoder(
31
+ accessor.array(input),
32
+ targets[0]!,
33
+ explore,
34
+ tags,
35
+ jsDocTags,
36
+ );
37
+
38
+ //----
39
+ // LIST UP VARIABLES
40
+ //----
41
+ // TUPLES
42
+ const tupleListVariable: ts.VariableStatement =
43
+ StatementFactory.constant(tsc)(
44
+ "tupleList",
45
+ tsc.factory.createArrayLiteralExpression(
46
+ targets.map((meta) =>
47
+ tsc.factory.createArrayLiteralExpression([
48
+ tsc.factory.createArrowFunction(
49
+ undefined,
50
+ undefined,
51
+ [
52
+ IdentifierFactory.parameter(tsc)(
53
+ "top",
54
+ TypeFactory.keyword(tsc)("any"),
55
+ ),
56
+ ],
57
+ undefined,
58
+ undefined,
59
+ props.checker(
60
+ tsc.factory.createIdentifier("top"),
61
+ meta,
62
+ {
63
+ ...explore,
64
+ tracable: false,
65
+ postfix: `"[0]"`,
66
+ },
67
+ tags,
68
+ jsDocTags,
69
+ input,
70
+ ),
71
+ ),
72
+ tsc.factory.createArrowFunction(
73
+ undefined,
74
+ undefined,
75
+ [
76
+ IdentifierFactory.parameter(tsc)(
77
+ "top",
78
+ TypeFactory.keyword(tsc)("any"),
79
+ ),
80
+ ],
81
+ undefined,
82
+ undefined,
83
+ props.decoder(
84
+ tsc.factory.createIdentifier("top"),
85
+ meta,
86
+ {
87
+ ...explore,
88
+ tracable: true,
89
+ },
90
+ tags,
91
+ jsDocTags,
92
+ ),
93
+ ),
94
+ ]),
95
+ ),
96
+ ),
97
+ );
98
+
99
+ // FILTERED TUPLES
100
+ const filteredVariable = StatementFactory.constant(tsc)(
101
+ "filtered",
102
+ tsc.factory.createCallExpression(
103
+ tsc.factory.createIdentifier("tupleList.filter"),
104
+ undefined,
105
+ [
106
+ tsc.factory.createArrowFunction(
107
+ undefined,
108
+ undefined,
109
+ [IdentifierFactory.parameter(tsc)("tuple")],
110
+ undefined,
111
+ undefined,
112
+ tsc.factory.createStrictEquality(
113
+ props.success,
114
+ tsc.factory.createCallExpression(
115
+ tsc.factory.createIdentifier("tuple[0]"),
116
+ undefined,
117
+ [tsc.factory.createIdentifier("front")],
118
+ ),
119
+ ),
120
+ ),
121
+ ],
122
+ ),
123
+ );
124
+
125
+ //----
126
+ // STATEMENTS
127
+ //----
128
+ // ONLY ONE TYPE
129
+ const uniqueStatement = tsc.factory.createIfStatement(
130
+ tsc.factory.createStrictEquality(
131
+ tsc.factory.createNumericLiteral(1),
132
+ tsc.factory.createIdentifier("filtered.length"),
133
+ ),
134
+ tsc.factory.createReturnStatement(
135
+ tsc.factory.createCallExpression(
136
+ tsc.factory.createIdentifier(`filtered[0][1]`),
137
+ undefined,
138
+ [accessor.array(input)],
139
+ ),
140
+ ),
141
+ );
142
+
143
+ // UNION TYPE
144
+ const forOfStatement = tsc.factory.createForOfStatement(
145
+ undefined,
146
+ tsc.factory.createVariableDeclarationList(
147
+ [tsc.factory.createVariableDeclaration("tuple")],
148
+ tsc.NodeFlags.Const,
149
+ ),
150
+ // StatementFactory.variable(ts.NodeFlags.Const, "tuple"),
151
+ tsc.factory.createIdentifier("filtered"),
152
+ tsc.factory.createIfStatement(
153
+ tsc.factory.createCallExpression(
154
+ IdentifierFactory.access(tsc)(
155
+ tsc.factory.createIdentifier("array"),
156
+ )("every"),
157
+ undefined,
158
+ [
159
+ tsc.factory.createArrowFunction(
160
+ undefined,
161
+ undefined,
162
+ [
163
+ IdentifierFactory.parameter(tsc)(
164
+ "value",
165
+ TypeFactory.keyword(tsc)("any"),
166
+ ),
167
+ ],
168
+ undefined,
169
+ undefined,
170
+ tsc.factory.createStrictEquality(
171
+ props.success,
172
+ tsc.factory.createCallExpression(
173
+ tsc.factory.createIdentifier("tuple[0]"),
174
+ undefined,
175
+ [tsc.factory.createIdentifier("value")],
176
+ ),
177
+ ),
178
+ ),
179
+ ],
180
+ ),
181
+ tsc.factory.createReturnStatement(
182
+ tsc.factory.createCallExpression(
183
+ tsc.factory.createIdentifier(`tuple[1]`),
184
+ undefined,
185
+ [tsc.factory.createIdentifier("array")],
186
+ ),
187
+ ),
188
+ ),
189
+ );
190
+ const unionStatement = tsc.factory.createIfStatement(
191
+ tsc.factory.createLessThan(
192
+ tsc.factory.createNumericLiteral(1),
193
+ tsc.factory.createIdentifier("filtered.length"),
194
+ ),
195
+ forOfStatement,
196
+ );
197
+
198
+ const block = [
199
+ // ARRAY.LENGTH := 0
200
+ ...(accessor.size !== null
201
+ ? [
202
+ tsc.factory.createIfStatement(
203
+ tsc.factory.createStrictEquality(
204
+ tsc.factory.createNumericLiteral(0),
205
+ accessor.size(input),
206
+ ),
207
+ tsc.isReturnStatement(props.empty)
208
+ ? props.empty
209
+ : tsc.factory.createReturnStatement(props.empty),
210
+ ),
211
+ ]
212
+ : []),
213
+
214
+ // UNION PREDICATORS
215
+ tupleListVariable,
216
+ StatementFactory.constant(tsc)("front", accessor.front(input)),
217
+ filteredVariable,
218
+ uniqueStatement,
219
+
220
+ // CONDITIONAL STATEMENTS
221
+ StatementFactory.constant(tsc)("array", accessor.array(input)),
222
+ unionStatement,
223
+ props.failure(
224
+ input,
225
+ `(${targets.map((t) => accessor.name(t)).join(" | ")})`,
226
+ explore,
227
+ ),
228
+ ];
229
+
230
+ return tsc.factory.createCallExpression(
231
+ tsc.factory.createArrowFunction(
232
+ undefined,
233
+ undefined,
234
+ [],
235
+ undefined,
236
+ undefined,
237
+ tsc.factory.createBlock(block, true),
238
+ ),
239
+ undefined,
240
+ undefined,
241
+ );
242
+ };
243
+
244
+ /**
245
+ * @internal
246
+ */
247
+ export namespace check_union_array_like {
248
+ export interface IProps<T> {
249
+ checker(
250
+ front: ts.Expression,
251
+ target: T,
252
+ explore: FeatureProgrammer.IExplore,
253
+ tags: IMetadataTag[],
254
+ jsDocTags: JSDocTagInfo[],
255
+ array: ts.Expression,
256
+ ): ts.Expression;
257
+ decoder: UnionExplorer.Decoder<T>;
258
+ empty: ts.ReturnStatement | ts.Expression;
259
+ success: ts.Expression;
260
+ failure(
261
+ input: ts.Expression,
262
+ expected: string,
263
+ explore: CheckerProgrammer.IExplore,
264
+ ): ts.Statement;
265
+ }
266
+
267
+ export interface IAccessor<T> {
268
+ name(target: T): string;
269
+ front(input: ts.Expression): ts.Expression;
270
+ array(input: ts.Expression): ts.Expression;
271
+ size: null | ((input: ts.Expression) => ts.Expression);
272
+ }
273
+ }
@@ -1,34 +1,34 @@
1
- import { JSDocTagInfo } from "typescript";
2
- import type ts from "typescript/lib/tsclibrary";
3
-
4
- import { IMetadataTag } from "../../metadata/IMetadataTag";
5
- import { Metadata } from "../../metadata/Metadata";
6
-
7
- import { IProject } from "../../transformers/IProject";
8
-
9
- import { CheckerProgrammer } from "../CheckerProgrammer";
10
- import { FunctionImporter } from "../helpers/FunctionImporeter";
11
-
12
- /**
13
- * @internal
14
- * @todo Faster union checking logic is required
15
- */
16
- export const check_union_tuple =
17
- (project: IProject) =>
18
- (config: CheckerProgrammer.IConfig) =>
19
- (importer: FunctionImporter) =>
20
- (
21
- _front: ts.Expression,
22
- elements: Metadata[],
23
- explore: CheckerProgrammer.IExplore,
24
- tags: IMetadataTag[],
25
- jsDocTags: JSDocTagInfo[],
26
- array: ts.Expression,
27
- ) =>
28
- CheckerProgrammer.decode_tuple(project)(config)(importer)(true)(
29
- array,
30
- elements,
31
- explore,
32
- tags,
33
- jsDocTags,
34
- );
1
+ import { JSDocTagInfo } from "typescript";
2
+ import type ts from "typescript/lib/tsclibrary";
3
+
4
+ import { IMetadataTag } from "../../metadata/IMetadataTag";
5
+ import { Metadata } from "../../metadata/Metadata";
6
+
7
+ import { IProject } from "../../transformers/IProject";
8
+
9
+ import { CheckerProgrammer } from "../CheckerProgrammer";
10
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
11
+
12
+ /**
13
+ * @internal
14
+ * @todo Faster union checking logic is required
15
+ */
16
+ export const check_union_tuple =
17
+ (project: IProject) =>
18
+ (config: CheckerProgrammer.IConfig) =>
19
+ (importer: FunctionImporter) =>
20
+ (
21
+ _front: ts.Expression,
22
+ elements: Metadata[],
23
+ explore: CheckerProgrammer.IExplore,
24
+ tags: IMetadataTag[],
25
+ jsDocTags: JSDocTagInfo[],
26
+ array: ts.Expression,
27
+ ) =>
28
+ CheckerProgrammer.decode_tuple(project)(config)(importer)(true)(
29
+ array,
30
+ elements,
31
+ explore,
32
+ tags,
33
+ jsDocTags,
34
+ );