typia 4.2.2 → 4.2.3

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 (250) hide show
  1. package/lib/factories/MetadataCollection.js +1 -0
  2. package/lib/factories/MetadataCollection.js.map +1 -1
  3. package/lib/factories/MetadataFactory.js +27 -0
  4. package/lib/factories/MetadataFactory.js.map +1 -1
  5. package/lib/factories/internal/metadata/explore_metadata.js +3 -7
  6. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  7. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +1 -0
  8. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  9. package/lib/programmers/CheckerProgrammer.js +0 -5
  10. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  11. package/lib/programmers/StringifyProgrammer.js +3 -0
  12. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  13. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +3 -0
  14. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  15. package/package.json +1 -1
  16. package/src/CustomValidatorMap.ts +126 -126
  17. package/src/IRandomGenerator.ts +34 -34
  18. package/src/IValidation.ts +21 -21
  19. package/src/Primitive.ts +131 -131
  20. package/src/TypeGuardError.ts +36 -36
  21. package/src/executable/TypiaGenerateWizard.ts +85 -85
  22. package/src/executable/TypiaSetupWizard.ts +153 -153
  23. package/src/executable/setup/ArgumentParser.ts +45 -45
  24. package/src/executable/setup/CommandExecutor.ts +8 -8
  25. package/src/executable/setup/FileRetriever.ts +22 -22
  26. package/src/executable/setup/PackageManager.ts +71 -71
  27. package/src/executable/setup/PluginConfigurator.ts +70 -70
  28. package/src/executable/typia.ts +52 -52
  29. package/src/factories/CommentFactory.ts +84 -84
  30. package/src/factories/ExpressionFactory.ts +70 -70
  31. package/src/factories/IdentifierFactory.ts +59 -59
  32. package/src/factories/LiteralFactory.ts +39 -39
  33. package/src/factories/MetadataCollection.ts +269 -264
  34. package/src/factories/MetadataFactory.ts +34 -30
  35. package/src/factories/MetadataTagFactory.ts +355 -355
  36. package/src/factories/StatementFactory.ts +24 -24
  37. package/src/factories/TemplateFactory.ts +58 -58
  38. package/src/factories/TypeFactory.ts +124 -124
  39. package/src/factories/ValueFactory.ts +12 -12
  40. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  41. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  42. package/src/factories/internal/metadata/emplace_metadata_alias.ts +40 -40
  43. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  44. package/src/factories/internal/metadata/emplace_metadata_object.ts +136 -136
  45. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  46. package/src/factories/internal/metadata/explore_metadata.ts +38 -40
  47. package/src/factories/internal/metadata/iterate_metadata.ts +81 -81
  48. package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
  49. package/src/factories/internal/metadata/iterate_metadata_array.ts +24 -24
  50. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  51. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  52. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  53. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  54. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +84 -83
  55. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  56. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  57. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  58. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  59. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  60. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  61. package/src/factories/internal/metadata/iterate_metadata_tag.ts +31 -31
  62. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  63. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  64. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  65. package/src/functional/$any.ts +2 -2
  66. package/src/functional/$dictionary.ts +25 -25
  67. package/src/functional/$every.ts +11 -11
  68. package/src/functional/$guard.ts +35 -35
  69. package/src/functional/$is_between.ts +2 -2
  70. package/src/functional/$is_custom.ts +14 -14
  71. package/src/functional/$is_date.ts +3 -3
  72. package/src/functional/$is_datetime.ts +2 -2
  73. package/src/functional/$is_email.ts +4 -4
  74. package/src/functional/$is_ipv4.ts +4 -4
  75. package/src/functional/$is_ipv6.ts +4 -4
  76. package/src/functional/$is_url.ts +4 -4
  77. package/src/functional/$is_uuid.ts +4 -4
  78. package/src/functional/$join.ts +46 -46
  79. package/src/functional/$number.ts +12 -12
  80. package/src/functional/$report.ts +15 -15
  81. package/src/functional/$rest.ts +3 -3
  82. package/src/functional/$string.ts +50 -50
  83. package/src/functional/$tail.ts +5 -5
  84. package/src/functional/Namespace.ts +127 -127
  85. package/src/index.ts +4 -4
  86. package/src/metadata/ICommentTag.ts +4 -4
  87. package/src/metadata/IJsDocTagInfo.ts +10 -10
  88. package/src/metadata/IMetadata.ts +28 -28
  89. package/src/metadata/IMetadataAlias.ts +14 -14
  90. package/src/metadata/IMetadataApplication.ts +7 -7
  91. package/src/metadata/IMetadataArray.ts +10 -10
  92. package/src/metadata/IMetadataCollection.ts +11 -11
  93. package/src/metadata/IMetadataConstant.ts +16 -16
  94. package/src/metadata/IMetadataDictionary.ts +14 -14
  95. package/src/metadata/IMetadataEntry.ts +6 -6
  96. package/src/metadata/IMetadataObject.ts +18 -18
  97. package/src/metadata/IMetadataProperty.ts +11 -11
  98. package/src/metadata/IMetadataResolved.ts +6 -6
  99. package/src/metadata/IMetadataTag.ts +105 -105
  100. package/src/metadata/IMetadataTuple.ts +10 -10
  101. package/src/metadata/Metadata.ts +607 -607
  102. package/src/metadata/MetadataAlias.ts +66 -66
  103. package/src/metadata/MetadataArray.ts +55 -55
  104. package/src/metadata/MetadataConstant.ts +3 -3
  105. package/src/metadata/MetadataObject.ts +129 -129
  106. package/src/metadata/MetadataProperty.ts +64 -64
  107. package/src/metadata/MetadataResolved.ts +51 -51
  108. package/src/metadata/MetadataTuple.ts +53 -53
  109. package/src/module.ts +2038 -2038
  110. package/src/programmers/ApplicationProgrammer.ts +47 -47
  111. package/src/programmers/AssertCloneProgrammer.ts +71 -71
  112. package/src/programmers/AssertParseProgrammer.ts +66 -66
  113. package/src/programmers/AssertProgrammer.ts +279 -279
  114. package/src/programmers/AssertPruneProgrammer.ts +68 -68
  115. package/src/programmers/AssertStringifyProgrammer.ts +66 -66
  116. package/src/programmers/CheckerProgrammer.ts +1173 -1182
  117. package/src/programmers/CloneProgrammer.ts +587 -587
  118. package/src/programmers/FeatureProgrammer.ts +495 -495
  119. package/src/programmers/IsCloneProgrammer.ts +78 -78
  120. package/src/programmers/IsParseProgrammer.ts +72 -72
  121. package/src/programmers/IsProgrammer.ts +239 -239
  122. package/src/programmers/IsPruneProgrammer.ts +73 -73
  123. package/src/programmers/IsStringifyProgrammer.ts +76 -76
  124. package/src/programmers/LiteralsProgrammer.ts +63 -63
  125. package/src/programmers/PruneProgrammer.ts +542 -542
  126. package/src/programmers/RandomProgrammer.ts +579 -579
  127. package/src/programmers/StringifyProgrammer.ts +986 -978
  128. package/src/programmers/TypiaProgrammer.ts +129 -129
  129. package/src/programmers/ValidateCloneProgrammer.ts +85 -85
  130. package/src/programmers/ValidateParseProgrammer.ts +70 -70
  131. package/src/programmers/ValidateProgrammer.ts +305 -305
  132. package/src/programmers/ValidatePruneProgrammer.ts +78 -78
  133. package/src/programmers/ValidateStringifyProgrammer.ts +84 -84
  134. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  135. package/src/programmers/helpers/CloneJoiner.ts +131 -131
  136. package/src/programmers/helpers/FunctionImporeter.ts +78 -78
  137. package/src/programmers/helpers/ICheckEntry.ts +12 -12
  138. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  139. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  140. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  141. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  142. package/src/programmers/helpers/RandomRanger.ts +216 -216
  143. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  144. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  145. package/src/programmers/helpers/UnionExplorer.ts +301 -301
  146. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  147. package/src/programmers/helpers/disable_function_importer_declare.ts +26 -26
  148. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  149. package/src/programmers/internal/application_alias.ts +66 -66
  150. package/src/programmers/internal/application_array.ts +30 -30
  151. package/src/programmers/internal/application_boolean.ts +15 -15
  152. package/src/programmers/internal/application_constant.ts +26 -26
  153. package/src/programmers/internal/application_default.ts +17 -17
  154. package/src/programmers/internal/application_default_string.ts +33 -33
  155. package/src/programmers/internal/application_native.ts +39 -39
  156. package/src/programmers/internal/application_number.ts +74 -74
  157. package/src/programmers/internal/application_object.ts +165 -165
  158. package/src/programmers/internal/application_resolved.ts +55 -55
  159. package/src/programmers/internal/application_schema.ts +157 -157
  160. package/src/programmers/internal/application_string.ts +44 -44
  161. package/src/programmers/internal/application_templates.ts +25 -25
  162. package/src/programmers/internal/application_tuple.ts +57 -57
  163. package/src/programmers/internal/check_array.ts +30 -30
  164. package/src/programmers/internal/check_array_length.ts +35 -35
  165. package/src/programmers/internal/check_bigint.ts +82 -82
  166. package/src/programmers/internal/check_custom.ts +31 -31
  167. package/src/programmers/internal/check_dynamic_properties.ts +195 -195
  168. package/src/programmers/internal/check_everything.ts +28 -28
  169. package/src/programmers/internal/check_native.ts +21 -21
  170. package/src/programmers/internal/check_number.ts +177 -177
  171. package/src/programmers/internal/check_object.ts +55 -55
  172. package/src/programmers/internal/check_string.ts +25 -25
  173. package/src/programmers/internal/check_string_tags.ts +67 -67
  174. package/src/programmers/internal/check_template.ts +56 -56
  175. package/src/programmers/internal/check_union_array_like.ts +329 -329
  176. package/src/programmers/internal/decode_union_object.ts +73 -73
  177. package/src/programmers/internal/feature_object_entries.ts +63 -63
  178. package/src/programmers/internal/get_comment_tags.ts +23 -23
  179. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  180. package/src/programmers/internal/prune_object_properties.ts +60 -60
  181. package/src/programmers/internal/random_custom.ts +29 -29
  182. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  183. package/src/programmers/internal/stringify_native.ts +7 -7
  184. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  185. package/src/programmers/internal/template_to_pattern.ts +15 -15
  186. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  187. package/src/schemas/IJsonApplication.ts +8 -8
  188. package/src/schemas/IJsonComponents.ts +33 -33
  189. package/src/schemas/IJsonSchema.ts +133 -133
  190. package/src/transform.ts +27 -27
  191. package/src/transformers/CallExpressionTransformer.ts +179 -179
  192. package/src/transformers/FileTransformer.ts +47 -47
  193. package/src/transformers/IProject.ts +11 -11
  194. package/src/transformers/ITransformOptions.ts +62 -62
  195. package/src/transformers/ImportTransformer.ts +66 -66
  196. package/src/transformers/NodeTransformer.ts +13 -13
  197. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +112 -104
  198. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  199. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  200. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  201. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  202. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  203. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  204. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  205. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  206. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  207. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +39 -39
  208. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  209. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  210. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  211. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  212. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +28 -28
  213. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +53 -53
  214. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  215. package/src/transformers/features/miscellaneous/RandomTransformer.ts +42 -42
  216. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  217. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  218. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  219. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  220. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  221. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  222. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  223. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  224. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  225. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +12 -12
  226. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  227. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  228. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +12 -12
  229. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  230. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  231. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  232. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  233. package/src/transformers/features/validators/CreateAssertTransformer.ts +13 -13
  234. package/src/transformers/features/validators/CreateIsTransformer.ts +11 -11
  235. package/src/transformers/features/validators/CreateValidateTransformer.ts +13 -13
  236. package/src/transformers/features/validators/IsTransformer.ts +11 -11
  237. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  238. package/src/transformers/internal/GenericTransformer.ts +97 -97
  239. package/src/typings/Atomic.ts +17 -17
  240. package/src/typings/ClassProperties.ts +5 -5
  241. package/src/typings/Customizable.ts +5 -5
  242. package/src/typings/OmitNever.ts +3 -3
  243. package/src/typings/SpecialFields.ts +3 -3
  244. package/src/typings/Writable.ts +11 -11
  245. package/src/utils/ArrayUtil.ts +45 -45
  246. package/src/utils/Escaper.ts +46 -46
  247. package/src/utils/MapUtil.ts +12 -12
  248. package/src/utils/PatternUtil.ts +33 -33
  249. package/src/utils/RandomGenerator.ts +81 -81
  250. package/src/utils/Singleton.ts +17 -17
@@ -1,13 +1,13 @@
1
- import { Metadata } from "../../metadata/Metadata";
2
-
3
- export namespace StringifyPredicator {
4
- export const require_escape = (value: string): boolean =>
5
- value.split("").some((ch) => ESCAPED.some((escaped) => escaped === ch));
6
-
7
- export const undefindable = (meta: Metadata): boolean =>
8
- meta.isRequired() === false ||
9
- (meta.resolved !== null &&
10
- meta.resolved.returns.isRequired() === false);
11
-
12
- const ESCAPED = ['"', "\\", "\b", "\f", "\n", "\n", "\r", "\t"];
13
- }
1
+ import { Metadata } from "../../metadata/Metadata";
2
+
3
+ export namespace StringifyPredicator {
4
+ export const require_escape = (value: string): boolean =>
5
+ value.split("").some((ch) => ESCAPED.some((escaped) => escaped === ch));
6
+
7
+ export const undefindable = (meta: Metadata): boolean =>
8
+ meta.isRequired() === false ||
9
+ (meta.resolved !== null &&
10
+ meta.resolved.returns.isRequired() === false);
11
+
12
+ const ESCAPED = ['"', "\\", "\b", "\f", "\n", "\n", "\r", "\t"];
13
+ }
@@ -1,301 +1,301 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
-
6
- import { IMetadataTag } from "../../metadata/IMetadataTag";
7
- import { Metadata } from "../../metadata/Metadata";
8
- import { MetadataArray } from "../../metadata/MetadataArray";
9
- import { MetadataObject } from "../../metadata/MetadataObject";
10
- import { MetadataTuple } from "../../metadata/MetadataTuple";
11
-
12
- import { FeatureProgrammer } from "../FeatureProgrammer";
13
- import { check_union_array_like } from "../internal/check_union_array_like";
14
- import { UnionPredicator } from "./UnionPredicator";
15
-
16
- export namespace UnionExplorer {
17
- export interface Decoder<T> {
18
- (
19
- input: ts.Expression,
20
- target: T,
21
- explore: FeatureProgrammer.IExplore,
22
- tags: IMetadataTag[],
23
- jsDocTags: ts.JSDocTagInfo[],
24
- ): ts.Expression;
25
- }
26
- export type ObjectCombiner = Decoder<MetadataObject[]>;
27
-
28
- /* -----------------------------------------------------------
29
- OBJECT
30
- ----------------------------------------------------------- */
31
- export const object =
32
- (config: FeatureProgrammer.IConfig, level: number = 0) =>
33
- (
34
- input: ts.Expression,
35
- targets: MetadataObject[],
36
- explore: FeatureProgrammer.IExplore,
37
- tags: IMetadataTag[],
38
- jsDocTags: ts.JSDocTagInfo[],
39
- ): ts.Expression => {
40
- // BREAKER
41
- if (targets.length === 1)
42
- return config.objector.decoder()(
43
- input,
44
- targets[0]!,
45
- explore,
46
- tags,
47
- jsDocTags,
48
- );
49
-
50
- const expected: string = `(${targets
51
- .map((t) => t.name)
52
- .join(" | ")})`;
53
-
54
- // POSSIBLE TO SPECIALIZE?
55
- const specList = UnionPredicator.object(targets);
56
- if (specList.length === 0) {
57
- const condition: ts.Expression = config.objector.unionizer(
58
- input,
59
- targets,
60
- {
61
- ...explore,
62
- tracable: false,
63
- },
64
- tags,
65
- jsDocTags,
66
- );
67
- return config.objector.full
68
- ? config.objector.full(condition)(input, expected, explore)
69
- : condition;
70
- }
71
- const remained: MetadataObject[] = targets.filter(
72
- (t) => specList.find((s) => s.object === t) === undefined,
73
- );
74
-
75
- // DO SPECIALIZE
76
- const conditions: ts.IfStatement[] = specList
77
- .filter((spec) => spec.property.key.getSoleLiteral() !== null)
78
- .map((spec) => {
79
- const key: string = spec.property.key.getSoleLiteral()!;
80
- const accessor: ts.Expression =
81
- IdentifierFactory.access(input)(key);
82
- const pred: ts.Expression = spec.neighbour
83
- ? config.objector.checker()(
84
- accessor,
85
- spec.property.value,
86
- {
87
- ...explore,
88
- tracable: false,
89
- postfix: IdentifierFactory.postfix(key),
90
- },
91
- tags,
92
- jsDocTags,
93
- )
94
- : (config.objector.required || ((exp) => exp))(
95
- ExpressionFactory.isRequired(accessor),
96
- );
97
- return ts.factory.createIfStatement(
98
- (config.objector.is || ((exp) => exp))(pred),
99
- ts.factory.createReturnStatement(
100
- config.objector.decoder()(
101
- input,
102
- spec.object,
103
- explore,
104
- tags,
105
- jsDocTags,
106
- ),
107
- ),
108
- );
109
- });
110
-
111
- // RETURNS WITH CONDITIONS
112
- return ts.factory.createCallExpression(
113
- ts.factory.createArrowFunction(
114
- undefined,
115
- undefined,
116
- [],
117
- undefined,
118
- undefined,
119
- ts.factory.createBlock(
120
- [
121
- ...conditions,
122
- remained.length
123
- ? ts.factory.createReturnStatement(
124
- object(config, level + 1)(
125
- input,
126
- remained,
127
- explore,
128
- tags,
129
- jsDocTags,
130
- ),
131
- )
132
- : config.objector.failure(
133
- input,
134
- expected,
135
- explore,
136
- ),
137
- ],
138
- true,
139
- ),
140
- ),
141
- undefined,
142
- undefined,
143
- );
144
- };
145
-
146
- /* -----------------------------------------------------------
147
- ARRAY LIKE
148
- ----------------------------------------------------------- */
149
- export const tuple = (
150
- props: check_union_array_like.IProps<MetadataTuple, MetadataTuple>,
151
- ) =>
152
- check_union_array_like<MetadataTuple, MetadataTuple, MetadataTuple>({
153
- transform: (x) => x,
154
- element: (x) => x,
155
- size: null!,
156
- front: (input) => input,
157
- array: (input) => input,
158
- name: (t) => t.name,
159
- })(props);
160
- export namespace tuple {
161
- export type IProps = check_union_array_like.IProps<
162
- MetadataTuple,
163
- MetadataTuple
164
- >;
165
- }
166
-
167
- export const array = (props: array.IProps) =>
168
- check_union_array_like<MetadataArray, MetadataArray, Metadata>({
169
- transform: (x) => x,
170
- element: (x) => x.value,
171
- size: (input) => IdentifierFactory.access(input)("length"),
172
- front: (input) =>
173
- ts.factory.createElementAccessExpression(input, 0),
174
- array: (input) => input,
175
- name: (t) => t.name,
176
- })(props);
177
- export namespace array {
178
- export type IProps = check_union_array_like.IProps<
179
- MetadataArray,
180
- Metadata
181
- >;
182
- }
183
-
184
- export const array_or_tuple = (props: array_or_tuple.IProps) =>
185
- check_union_array_like<
186
- MetadataArray | MetadataTuple,
187
- MetadataArray | MetadataTuple,
188
- Metadata | MetadataTuple
189
- >({
190
- transform: (x) => x,
191
- element: (x) => (x instanceof MetadataArray ? x.value : x),
192
- size: (input) => IdentifierFactory.access(input)("length"),
193
- front: (input) =>
194
- ts.factory.createElementAccessExpression(input, 0),
195
- array: (input) => input,
196
- name: (m) => m.name,
197
- })(props);
198
- export namespace array_or_tuple {
199
- export type IProps = check_union_array_like.IProps<
200
- MetadataArray | MetadataTuple,
201
- Metadata
202
- >;
203
- }
204
-
205
- export const set = (props: set.IProps) =>
206
- check_union_array_like<Metadata, MetadataArray, Metadata>({
207
- transform: (value: Metadata) =>
208
- MetadataArray.create({
209
- name: `Set<${value.getName()}>`,
210
- index: null,
211
- recursive: false,
212
- nullables: [],
213
- value,
214
- }),
215
- element: (array) => array.value,
216
- size: (input) => IdentifierFactory.access(input)("size"),
217
- front: (input) =>
218
- IdentifierFactory.access(
219
- ts.factory.createCallExpression(
220
- IdentifierFactory.access(
221
- ts.factory.createCallExpression(
222
- IdentifierFactory.access(input)("values"),
223
- undefined,
224
- undefined,
225
- ),
226
- )("next"),
227
- undefined,
228
- undefined,
229
- ),
230
- )("value"),
231
- array: (input) =>
232
- ts.factory.createArrayLiteralExpression(
233
- [ts.factory.createSpreadElement(input)],
234
- false,
235
- ),
236
- name: (_m, e) => `Set<${e.getName()}>`,
237
- })(props);
238
- export namespace set {
239
- export type IProps = check_union_array_like.IProps<
240
- MetadataArray,
241
- Metadata
242
- >;
243
- }
244
-
245
- export const map = (props: map.IProps) =>
246
- check_union_array_like<
247
- Metadata.Entry,
248
- MetadataArray,
249
- [Metadata, Metadata]
250
- >({
251
- element: (array) =>
252
- array.value.tuples[0]!.elements as [Metadata, Metadata],
253
- size: (input) => IdentifierFactory.access(input)("size"),
254
- front: (input) =>
255
- IdentifierFactory.access(
256
- ts.factory.createCallExpression(
257
- IdentifierFactory.access(
258
- ts.factory.createCallExpression(
259
- IdentifierFactory.access(input)("entries"),
260
- undefined,
261
- undefined,
262
- ),
263
- )("next"),
264
- undefined,
265
- undefined,
266
- ),
267
- )("value"),
268
- array: (input) =>
269
- ts.factory.createArrayLiteralExpression(
270
- [ts.factory.createSpreadElement(input)],
271
- false,
272
- ),
273
- name: (_m, [k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
274
- transform: (m: Metadata.Entry) =>
275
- MetadataArray.create({
276
- name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
277
- index: null,
278
- recursive: false,
279
- nullables: [],
280
- value: Metadata.create({
281
- ...Metadata.initialize(),
282
- tuples: [
283
- MetadataTuple.create({
284
- name: `[${m.key.getName()}, ${m.value.getName()}]`,
285
- index: null,
286
- recursive: false,
287
- nullables: [],
288
- elements: [m.key, m.value],
289
- }),
290
- ],
291
- }),
292
- }),
293
- })(props);
294
-
295
- export namespace map {
296
- export type IProps = check_union_array_like.IProps<
297
- MetadataArray,
298
- [Metadata, Metadata]
299
- >;
300
- }
301
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+
6
+ import { IMetadataTag } from "../../metadata/IMetadataTag";
7
+ import { Metadata } from "../../metadata/Metadata";
8
+ import { MetadataArray } from "../../metadata/MetadataArray";
9
+ import { MetadataObject } from "../../metadata/MetadataObject";
10
+ import { MetadataTuple } from "../../metadata/MetadataTuple";
11
+
12
+ import { FeatureProgrammer } from "../FeatureProgrammer";
13
+ import { check_union_array_like } from "../internal/check_union_array_like";
14
+ import { UnionPredicator } from "./UnionPredicator";
15
+
16
+ export namespace UnionExplorer {
17
+ export interface Decoder<T> {
18
+ (
19
+ input: ts.Expression,
20
+ target: T,
21
+ explore: FeatureProgrammer.IExplore,
22
+ tags: IMetadataTag[],
23
+ jsDocTags: ts.JSDocTagInfo[],
24
+ ): ts.Expression;
25
+ }
26
+ export type ObjectCombiner = Decoder<MetadataObject[]>;
27
+
28
+ /* -----------------------------------------------------------
29
+ OBJECT
30
+ ----------------------------------------------------------- */
31
+ export const object =
32
+ (config: FeatureProgrammer.IConfig, level: number = 0) =>
33
+ (
34
+ input: ts.Expression,
35
+ targets: MetadataObject[],
36
+ explore: FeatureProgrammer.IExplore,
37
+ tags: IMetadataTag[],
38
+ jsDocTags: ts.JSDocTagInfo[],
39
+ ): ts.Expression => {
40
+ // BREAKER
41
+ if (targets.length === 1)
42
+ return config.objector.decoder()(
43
+ input,
44
+ targets[0]!,
45
+ explore,
46
+ tags,
47
+ jsDocTags,
48
+ );
49
+
50
+ const expected: string = `(${targets
51
+ .map((t) => t.name)
52
+ .join(" | ")})`;
53
+
54
+ // POSSIBLE TO SPECIALIZE?
55
+ const specList = UnionPredicator.object(targets);
56
+ if (specList.length === 0) {
57
+ const condition: ts.Expression = config.objector.unionizer(
58
+ input,
59
+ targets,
60
+ {
61
+ ...explore,
62
+ tracable: false,
63
+ },
64
+ tags,
65
+ jsDocTags,
66
+ );
67
+ return config.objector.full
68
+ ? config.objector.full(condition)(input, expected, explore)
69
+ : condition;
70
+ }
71
+ const remained: MetadataObject[] = targets.filter(
72
+ (t) => specList.find((s) => s.object === t) === undefined,
73
+ );
74
+
75
+ // DO SPECIALIZE
76
+ const conditions: ts.IfStatement[] = specList
77
+ .filter((spec) => spec.property.key.getSoleLiteral() !== null)
78
+ .map((spec) => {
79
+ const key: string = spec.property.key.getSoleLiteral()!;
80
+ const accessor: ts.Expression =
81
+ IdentifierFactory.access(input)(key);
82
+ const pred: ts.Expression = spec.neighbour
83
+ ? config.objector.checker()(
84
+ accessor,
85
+ spec.property.value,
86
+ {
87
+ ...explore,
88
+ tracable: false,
89
+ postfix: IdentifierFactory.postfix(key),
90
+ },
91
+ tags,
92
+ jsDocTags,
93
+ )
94
+ : (config.objector.required || ((exp) => exp))(
95
+ ExpressionFactory.isRequired(accessor),
96
+ );
97
+ return ts.factory.createIfStatement(
98
+ (config.objector.is || ((exp) => exp))(pred),
99
+ ts.factory.createReturnStatement(
100
+ config.objector.decoder()(
101
+ input,
102
+ spec.object,
103
+ explore,
104
+ tags,
105
+ jsDocTags,
106
+ ),
107
+ ),
108
+ );
109
+ });
110
+
111
+ // RETURNS WITH CONDITIONS
112
+ return ts.factory.createCallExpression(
113
+ ts.factory.createArrowFunction(
114
+ undefined,
115
+ undefined,
116
+ [],
117
+ undefined,
118
+ undefined,
119
+ ts.factory.createBlock(
120
+ [
121
+ ...conditions,
122
+ remained.length
123
+ ? ts.factory.createReturnStatement(
124
+ object(config, level + 1)(
125
+ input,
126
+ remained,
127
+ explore,
128
+ tags,
129
+ jsDocTags,
130
+ ),
131
+ )
132
+ : config.objector.failure(
133
+ input,
134
+ expected,
135
+ explore,
136
+ ),
137
+ ],
138
+ true,
139
+ ),
140
+ ),
141
+ undefined,
142
+ undefined,
143
+ );
144
+ };
145
+
146
+ /* -----------------------------------------------------------
147
+ ARRAY LIKE
148
+ ----------------------------------------------------------- */
149
+ export const tuple = (
150
+ props: check_union_array_like.IProps<MetadataTuple, MetadataTuple>,
151
+ ) =>
152
+ check_union_array_like<MetadataTuple, MetadataTuple, MetadataTuple>({
153
+ transform: (x) => x,
154
+ element: (x) => x,
155
+ size: null!,
156
+ front: (input) => input,
157
+ array: (input) => input,
158
+ name: (t) => t.name,
159
+ })(props);
160
+ export namespace tuple {
161
+ export type IProps = check_union_array_like.IProps<
162
+ MetadataTuple,
163
+ MetadataTuple
164
+ >;
165
+ }
166
+
167
+ export const array = (props: array.IProps) =>
168
+ check_union_array_like<MetadataArray, MetadataArray, Metadata>({
169
+ transform: (x) => x,
170
+ element: (x) => x.value,
171
+ size: (input) => IdentifierFactory.access(input)("length"),
172
+ front: (input) =>
173
+ ts.factory.createElementAccessExpression(input, 0),
174
+ array: (input) => input,
175
+ name: (t) => t.name,
176
+ })(props);
177
+ export namespace array {
178
+ export type IProps = check_union_array_like.IProps<
179
+ MetadataArray,
180
+ Metadata
181
+ >;
182
+ }
183
+
184
+ export const array_or_tuple = (props: array_or_tuple.IProps) =>
185
+ check_union_array_like<
186
+ MetadataArray | MetadataTuple,
187
+ MetadataArray | MetadataTuple,
188
+ Metadata | MetadataTuple
189
+ >({
190
+ transform: (x) => x,
191
+ element: (x) => (x instanceof MetadataArray ? x.value : x),
192
+ size: (input) => IdentifierFactory.access(input)("length"),
193
+ front: (input) =>
194
+ ts.factory.createElementAccessExpression(input, 0),
195
+ array: (input) => input,
196
+ name: (m) => m.name,
197
+ })(props);
198
+ export namespace array_or_tuple {
199
+ export type IProps = check_union_array_like.IProps<
200
+ MetadataArray | MetadataTuple,
201
+ Metadata
202
+ >;
203
+ }
204
+
205
+ export const set = (props: set.IProps) =>
206
+ check_union_array_like<Metadata, MetadataArray, Metadata>({
207
+ transform: (value: Metadata) =>
208
+ MetadataArray.create({
209
+ name: `Set<${value.getName()}>`,
210
+ index: null,
211
+ recursive: false,
212
+ nullables: [],
213
+ value,
214
+ }),
215
+ element: (array) => array.value,
216
+ size: (input) => IdentifierFactory.access(input)("size"),
217
+ front: (input) =>
218
+ IdentifierFactory.access(
219
+ ts.factory.createCallExpression(
220
+ IdentifierFactory.access(
221
+ ts.factory.createCallExpression(
222
+ IdentifierFactory.access(input)("values"),
223
+ undefined,
224
+ undefined,
225
+ ),
226
+ )("next"),
227
+ undefined,
228
+ undefined,
229
+ ),
230
+ )("value"),
231
+ array: (input) =>
232
+ ts.factory.createArrayLiteralExpression(
233
+ [ts.factory.createSpreadElement(input)],
234
+ false,
235
+ ),
236
+ name: (_m, e) => `Set<${e.getName()}>`,
237
+ })(props);
238
+ export namespace set {
239
+ export type IProps = check_union_array_like.IProps<
240
+ MetadataArray,
241
+ Metadata
242
+ >;
243
+ }
244
+
245
+ export const map = (props: map.IProps) =>
246
+ check_union_array_like<
247
+ Metadata.Entry,
248
+ MetadataArray,
249
+ [Metadata, Metadata]
250
+ >({
251
+ element: (array) =>
252
+ array.value.tuples[0]!.elements as [Metadata, Metadata],
253
+ size: (input) => IdentifierFactory.access(input)("size"),
254
+ front: (input) =>
255
+ IdentifierFactory.access(
256
+ ts.factory.createCallExpression(
257
+ IdentifierFactory.access(
258
+ ts.factory.createCallExpression(
259
+ IdentifierFactory.access(input)("entries"),
260
+ undefined,
261
+ undefined,
262
+ ),
263
+ )("next"),
264
+ undefined,
265
+ undefined,
266
+ ),
267
+ )("value"),
268
+ array: (input) =>
269
+ ts.factory.createArrayLiteralExpression(
270
+ [ts.factory.createSpreadElement(input)],
271
+ false,
272
+ ),
273
+ name: (_m, [k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
274
+ transform: (m: Metadata.Entry) =>
275
+ MetadataArray.create({
276
+ name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
277
+ index: null,
278
+ recursive: false,
279
+ nullables: [],
280
+ value: Metadata.create({
281
+ ...Metadata.initialize(),
282
+ tuples: [
283
+ MetadataTuple.create({
284
+ name: `[${m.key.getName()}, ${m.value.getName()}]`,
285
+ index: null,
286
+ recursive: false,
287
+ nullables: [],
288
+ elements: [m.key, m.value],
289
+ }),
290
+ ],
291
+ }),
292
+ }),
293
+ })(props);
294
+
295
+ export namespace map {
296
+ export type IProps = check_union_array_like.IProps<
297
+ MetadataArray,
298
+ [Metadata, Metadata]
299
+ >;
300
+ }
301
+ }