typia 5.0.0-dev.20230821 → 5.0.0-dev.20230822

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 (236) hide show
  1. package/lib/factories/MetadataFactory.js +9 -0
  2. package/lib/factories/MetadataFactory.js.map +1 -1
  3. package/lib/factories/ProtobufFactory.js +8 -0
  4. package/lib/factories/ProtobufFactory.js.map +1 -1
  5. package/lib/functional/$ProtobufReader.d.ts +2 -0
  6. package/lib/functional/$ProtobufReader.js +14 -3
  7. package/lib/functional/$ProtobufReader.js.map +1 -1
  8. package/lib/functional/$ProtobufSizer.js +1 -1
  9. package/lib/functional/$ProtobufSizer.js.map +1 -1
  10. package/lib/functional/$ProtobufWriter.js +0 -1
  11. package/lib/functional/$ProtobufWriter.js.map +1 -1
  12. package/lib/programmers/helpers/ProtobufUtil.d.ts +3 -1
  13. package/lib/programmers/helpers/ProtobufUtil.js +5 -1
  14. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  15. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -3
  16. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  17. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +2 -3
  18. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  19. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +357 -6
  20. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  21. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +15 -60
  22. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  23. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js +1 -1
  24. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  25. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +1 -1
  26. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  27. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +3 -4
  28. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  29. package/lib/protobuf.d.ts +8 -9
  30. package/lib/protobuf.js +7 -0
  31. package/lib/protobuf.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/factories/ExpressionFactory.ts +115 -115
  34. package/src/factories/MetadataCollection.ts +269 -269
  35. package/src/factories/MetadataFactory.ts +46 -34
  36. package/src/factories/MetadataTagFactory.ts +364 -364
  37. package/src/factories/ProtobufFactory.ts +266 -251
  38. package/src/factories/StatementFactory.ts +72 -72
  39. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  40. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  41. package/src/factories/internal/metadata/emplace_metadata_alias.ts +40 -40
  42. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  43. package/src/factories/internal/metadata/emplace_metadata_object.ts +136 -136
  44. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  45. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  46. package/src/factories/internal/metadata/iterate_metadata.ts +81 -81
  47. package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
  48. package/src/factories/internal/metadata/iterate_metadata_array.ts +24 -24
  49. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  50. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  51. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  52. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  53. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +84 -84
  54. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  55. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  56. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  57. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  58. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  59. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  60. package/src/factories/internal/metadata/iterate_metadata_tag.ts +31 -31
  61. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  62. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  63. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  64. package/src/functional/$ProtobufReader.ts +201 -188
  65. package/src/functional/$ProtobufSizer.ts +147 -144
  66. package/src/functional/$ProtobufWriter.ts +152 -152
  67. package/src/functional/$number.ts +13 -13
  68. package/src/functional/$strlen.ts +7 -7
  69. package/src/functional/$varint.ts +130 -130
  70. package/src/functional/$zigzag.ts +39 -39
  71. package/src/functional/IProtobufWriter.ts +18 -18
  72. package/src/functional/Namespace.ts +149 -149
  73. package/src/json.ts +648 -648
  74. package/src/misc.ts +651 -651
  75. package/src/module.ts +708 -708
  76. package/src/programmers/CheckerProgrammer.ts +1173 -1173
  77. package/src/programmers/FeatureProgrammer.ts +497 -497
  78. package/src/programmers/IsProgrammer.ts +239 -239
  79. package/src/programmers/IsPruneProgrammer.ts +73 -73
  80. package/src/programmers/RandomProgrammer.ts +578 -578
  81. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  82. package/src/programmers/helpers/CloneJoiner.ts +107 -107
  83. package/src/programmers/helpers/FunctionImporeter.ts +89 -89
  84. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  85. package/src/programmers/helpers/ProtobufUtil.ts +29 -24
  86. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  87. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  88. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  89. package/src/programmers/helpers/RandomRanger.ts +208 -208
  90. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  91. package/src/programmers/helpers/UnionExplorer.ts +310 -310
  92. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  93. package/src/programmers/helpers/disable_function_importer_declare.ts +27 -27
  94. package/src/programmers/internal/application_alias.ts +66 -66
  95. package/src/programmers/internal/application_array.ts +30 -30
  96. package/src/programmers/internal/application_constant.ts +26 -26
  97. package/src/programmers/internal/application_default.ts +17 -17
  98. package/src/programmers/internal/application_default_string.ts +33 -33
  99. package/src/programmers/internal/application_native.ts +39 -39
  100. package/src/programmers/internal/application_number.ts +81 -81
  101. package/src/programmers/internal/application_object.ts +165 -165
  102. package/src/programmers/internal/application_resolved.ts +55 -55
  103. package/src/programmers/internal/application_schema.ts +157 -157
  104. package/src/programmers/internal/application_string.ts +44 -44
  105. package/src/programmers/internal/application_templates.ts +25 -25
  106. package/src/programmers/internal/application_tuple.ts +57 -57
  107. package/src/programmers/internal/check_array.ts +30 -30
  108. package/src/programmers/internal/check_array_length.ts +35 -35
  109. package/src/programmers/internal/check_bigint.ts +110 -110
  110. package/src/programmers/internal/check_custom.ts +31 -31
  111. package/src/programmers/internal/check_number.ts +258 -258
  112. package/src/programmers/internal/check_string.ts +25 -25
  113. package/src/programmers/internal/check_string_tags.ts +67 -67
  114. package/src/programmers/internal/check_template.ts +56 -56
  115. package/src/programmers/internal/check_union_array_like.ts +329 -329
  116. package/src/programmers/internal/decode_union_object.ts +84 -84
  117. package/src/programmers/internal/feature_object_entries.ts +63 -63
  118. package/src/programmers/internal/get_comment_tags.ts +23 -23
  119. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  120. package/src/programmers/internal/prune_object_properties.ts +60 -60
  121. package/src/programmers/internal/random_custom.ts +29 -29
  122. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  123. package/src/programmers/internal/template_to_pattern.ts +15 -15
  124. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  125. package/src/programmers/json/JsonApplicationProgrammer.ts +47 -47
  126. package/src/programmers/json/JsonAssertParseProgrammer.ts +66 -66
  127. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  128. package/src/programmers/json/JsonIsParseProgrammer.ts +72 -72
  129. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  130. package/src/programmers/json/JsonStringifyProgrammer.ts +987 -987
  131. package/src/programmers/json/JsonValidateParseProgrammer.ts +63 -70
  132. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  133. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  134. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  135. package/src/programmers/misc/MiscCloneProgrammer.ts +587 -587
  136. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  137. package/src/programmers/misc/MiscLiteralsProgrammer.ts +64 -64
  138. package/src/programmers/misc/MiscPruneProgrammer.ts +542 -542
  139. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  140. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  141. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +66 -69
  142. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  143. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +653 -38
  144. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +812 -920
  145. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +75 -75
  146. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  147. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +178 -178
  148. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -83
  149. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  150. package/src/protobuf.ts +249 -239
  151. package/src/schemas/json/IJsonApplication.ts +8 -8
  152. package/src/schemas/json/IJsonComponents.ts +33 -33
  153. package/src/schemas/json/IJsonSchema.ts +133 -133
  154. package/src/schemas/metadata/ICommentTag.ts +4 -4
  155. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  156. package/src/schemas/metadata/IMetadata.ts +28 -28
  157. package/src/schemas/metadata/IMetadataAlias.ts +14 -14
  158. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  159. package/src/schemas/metadata/IMetadataArray.ts +10 -10
  160. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  161. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  162. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  163. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  164. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  165. package/src/schemas/metadata/IMetadataProperty.ts +11 -11
  166. package/src/schemas/metadata/IMetadataResolved.ts +6 -6
  167. package/src/schemas/metadata/IMetadataTag.ts +112 -112
  168. package/src/schemas/metadata/IMetadataTuple.ts +10 -10
  169. package/src/schemas/metadata/Metadata.ts +637 -637
  170. package/src/schemas/metadata/MetadataAlias.ts +66 -66
  171. package/src/schemas/metadata/MetadataArray.ts +55 -55
  172. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  173. package/src/schemas/metadata/MetadataObject.ts +139 -139
  174. package/src/schemas/metadata/MetadataProperty.ts +64 -64
  175. package/src/schemas/metadata/MetadataResolved.ts +51 -51
  176. package/src/schemas/metadata/MetadataTuple.ts +58 -58
  177. package/src/transformers/CallExpressionTransformer.ts +240 -240
  178. package/src/transformers/features/AssertTransformer.ts +11 -11
  179. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  180. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  181. package/src/transformers/features/CreateRandomTransformer.ts +39 -39
  182. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  183. package/src/transformers/features/IsTransformer.ts +11 -11
  184. package/src/transformers/features/RandomTransformer.ts +42 -42
  185. package/src/transformers/features/ValidateTransformer.ts +11 -11
  186. package/src/transformers/features/json/JsonApplicationTransformer.ts +111 -111
  187. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  188. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  189. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  190. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  191. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  192. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  193. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  194. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  195. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  196. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  197. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  198. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  199. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  200. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  201. package/src/transformers/features/misc/MetadataTransformer.ts +53 -53
  202. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  203. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  204. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  205. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  206. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  207. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  208. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  209. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  210. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  211. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  212. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  213. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  214. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  215. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +28 -28
  216. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  217. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  218. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  219. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  220. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  221. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  222. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  223. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  224. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  225. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  226. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  227. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  228. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  229. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  230. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  231. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  232. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  233. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +31 -31
  234. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  235. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  236. package/src/utils/NameEncoder.ts +32 -32
@@ -1,310 +1,310 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
-
6
- import { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
7
- import { Metadata } from "../../schemas/metadata/Metadata";
8
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
9
- import { MetadataObject } from "../../schemas/metadata/MetadataObject";
10
- import { MetadataTuple } from "../../schemas/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 condition: ts.IfStatement = specList
77
- .filter((spec) => spec.property.key.getSoleLiteral() !== null)
78
- .map((spec, i, array) => {
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
- i === array.length - 1
109
- ? remained.length
110
- ? ts.factory.createReturnStatement(
111
- object(config, level + 1)(
112
- input,
113
- remained,
114
- explore,
115
- tags,
116
- jsDocTags,
117
- ),
118
- )
119
- : config.objector.failure(
120
- input,
121
- expected,
122
- explore,
123
- )
124
- : undefined,
125
- );
126
- })
127
- .reverse()
128
- .reduce((a, b) =>
129
- ts.factory.createIfStatement(
130
- b.expression,
131
- b.thenStatement,
132
- a,
133
- ),
134
- );
135
-
136
- // RETURNS WITH CONDITIONS
137
- return ts.factory.createCallExpression(
138
- ts.factory.createArrowFunction(
139
- undefined,
140
- undefined,
141
- [],
142
- undefined,
143
- undefined,
144
- ts.factory.createBlock([condition], true),
145
- ),
146
- undefined,
147
- undefined,
148
- );
149
- };
150
-
151
- /* -----------------------------------------------------------
152
- ARRAY LIKE
153
- ----------------------------------------------------------- */
154
- export const tuple = (
155
- props: check_union_array_like.IProps<MetadataTuple, MetadataTuple>,
156
- ) =>
157
- check_union_array_like<MetadataTuple, MetadataTuple, MetadataTuple>({
158
- transform: (x) => x,
159
- element: (x) => x,
160
- size: null!,
161
- front: (input) => input,
162
- array: (input) => input,
163
- name: (t) => t.name,
164
- })(props);
165
- export namespace tuple {
166
- export type IProps = check_union_array_like.IProps<
167
- MetadataTuple,
168
- MetadataTuple
169
- >;
170
- }
171
-
172
- export const array = (props: array.IProps) =>
173
- check_union_array_like<MetadataArray, MetadataArray, Metadata>({
174
- transform: (x) => x,
175
- element: (x) => x.value,
176
- size: (input) => IdentifierFactory.access(input)("length"),
177
- front: (input) =>
178
- ts.factory.createElementAccessExpression(input, 0),
179
- array: (input) => input,
180
- name: (t) => t.name,
181
- })(props);
182
- export namespace array {
183
- export type IProps = check_union_array_like.IProps<
184
- MetadataArray,
185
- Metadata
186
- >;
187
- }
188
-
189
- export const array_or_tuple = (props: array_or_tuple.IProps) =>
190
- check_union_array_like<
191
- MetadataArray | MetadataTuple,
192
- MetadataArray | MetadataTuple,
193
- Metadata | MetadataTuple
194
- >({
195
- transform: (x) => x,
196
- element: (x) => (x instanceof MetadataArray ? x.value : x),
197
- size: (input) => IdentifierFactory.access(input)("length"),
198
- front: (input) =>
199
- ts.factory.createElementAccessExpression(input, 0),
200
- array: (input) => input,
201
- name: (m) => m.name,
202
- })(props);
203
- export namespace array_or_tuple {
204
- export type IProps = check_union_array_like.IProps<
205
- MetadataArray | MetadataTuple,
206
- Metadata
207
- >;
208
- }
209
-
210
- export const set = (props: set.IProps) =>
211
- check_union_array_like<Metadata, MetadataArray, Metadata>({
212
- transform: (value: Metadata) =>
213
- MetadataArray.create({
214
- name: `Set<${value.getName()}>`,
215
- index: null,
216
- recursive: false,
217
- nullables: [],
218
- value,
219
- }),
220
- element: (array) => array.value,
221
- size: (input) => IdentifierFactory.access(input)("size"),
222
- front: (input) =>
223
- IdentifierFactory.access(
224
- ts.factory.createCallExpression(
225
- IdentifierFactory.access(
226
- ts.factory.createCallExpression(
227
- IdentifierFactory.access(input)("values"),
228
- undefined,
229
- undefined,
230
- ),
231
- )("next"),
232
- undefined,
233
- undefined,
234
- ),
235
- )("value"),
236
- array: (input) =>
237
- ts.factory.createArrayLiteralExpression(
238
- [ts.factory.createSpreadElement(input)],
239
- false,
240
- ),
241
- name: (_m, e) => `Set<${e.getName()}>`,
242
- })(props);
243
- export namespace set {
244
- export type IProps = check_union_array_like.IProps<
245
- MetadataArray,
246
- Metadata
247
- >;
248
- }
249
-
250
- export const map = (props: map.IProps) =>
251
- check_union_array_like<
252
- Metadata.Entry,
253
- MetadataArray,
254
- [Metadata, Metadata]
255
- >({
256
- element: (array) =>
257
- array.value.tuples[0]!.elements as [Metadata, Metadata],
258
- size: (input) => IdentifierFactory.access(input)("size"),
259
- front: (input) =>
260
- IdentifierFactory.access(
261
- ts.factory.createCallExpression(
262
- IdentifierFactory.access(
263
- ts.factory.createCallExpression(
264
- IdentifierFactory.access(input)("entries"),
265
- undefined,
266
- undefined,
267
- ),
268
- )("next"),
269
- undefined,
270
- undefined,
271
- ),
272
- )("value"),
273
- array: (input) =>
274
- ts.factory.createArrayLiteralExpression(
275
- [ts.factory.createSpreadElement(input)],
276
- false,
277
- ),
278
- name: (_m, [k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
279
- transform: (m: Metadata.Entry) =>
280
- MetadataArray.create({
281
- name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
282
- index: null,
283
- recursive: false,
284
- nullables: [],
285
- value: Metadata.create({
286
- ...Metadata.initialize(),
287
- tuples: [
288
- (() => {
289
- const tuple = MetadataTuple.create({
290
- name: `[${m.key.getName()}, ${m.value.getName()}]`,
291
- index: null,
292
- recursive: false,
293
- nullables: [],
294
- elements: [m.key, m.value],
295
- });
296
- tuple.of_map = true;
297
- return tuple;
298
- })(),
299
- ],
300
- }),
301
- }),
302
- })(props);
303
-
304
- export namespace map {
305
- export type IProps = check_union_array_like.IProps<
306
- MetadataArray,
307
- [Metadata, Metadata]
308
- >;
309
- }
310
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+
6
+ import { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
7
+ import { Metadata } from "../../schemas/metadata/Metadata";
8
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
9
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
10
+ import { MetadataTuple } from "../../schemas/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 condition: ts.IfStatement = specList
77
+ .filter((spec) => spec.property.key.getSoleLiteral() !== null)
78
+ .map((spec, i, array) => {
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
+ i === array.length - 1
109
+ ? remained.length
110
+ ? ts.factory.createReturnStatement(
111
+ object(config, level + 1)(
112
+ input,
113
+ remained,
114
+ explore,
115
+ tags,
116
+ jsDocTags,
117
+ ),
118
+ )
119
+ : config.objector.failure(
120
+ input,
121
+ expected,
122
+ explore,
123
+ )
124
+ : undefined,
125
+ );
126
+ })
127
+ .reverse()
128
+ .reduce((a, b) =>
129
+ ts.factory.createIfStatement(
130
+ b.expression,
131
+ b.thenStatement,
132
+ a,
133
+ ),
134
+ );
135
+
136
+ // RETURNS WITH CONDITIONS
137
+ return ts.factory.createCallExpression(
138
+ ts.factory.createArrowFunction(
139
+ undefined,
140
+ undefined,
141
+ [],
142
+ undefined,
143
+ undefined,
144
+ ts.factory.createBlock([condition], true),
145
+ ),
146
+ undefined,
147
+ undefined,
148
+ );
149
+ };
150
+
151
+ /* -----------------------------------------------------------
152
+ ARRAY LIKE
153
+ ----------------------------------------------------------- */
154
+ export const tuple = (
155
+ props: check_union_array_like.IProps<MetadataTuple, MetadataTuple>,
156
+ ) =>
157
+ check_union_array_like<MetadataTuple, MetadataTuple, MetadataTuple>({
158
+ transform: (x) => x,
159
+ element: (x) => x,
160
+ size: null!,
161
+ front: (input) => input,
162
+ array: (input) => input,
163
+ name: (t) => t.name,
164
+ })(props);
165
+ export namespace tuple {
166
+ export type IProps = check_union_array_like.IProps<
167
+ MetadataTuple,
168
+ MetadataTuple
169
+ >;
170
+ }
171
+
172
+ export const array = (props: array.IProps) =>
173
+ check_union_array_like<MetadataArray, MetadataArray, Metadata>({
174
+ transform: (x) => x,
175
+ element: (x) => x.value,
176
+ size: (input) => IdentifierFactory.access(input)("length"),
177
+ front: (input) =>
178
+ ts.factory.createElementAccessExpression(input, 0),
179
+ array: (input) => input,
180
+ name: (t) => t.name,
181
+ })(props);
182
+ export namespace array {
183
+ export type IProps = check_union_array_like.IProps<
184
+ MetadataArray,
185
+ Metadata
186
+ >;
187
+ }
188
+
189
+ export const array_or_tuple = (props: array_or_tuple.IProps) =>
190
+ check_union_array_like<
191
+ MetadataArray | MetadataTuple,
192
+ MetadataArray | MetadataTuple,
193
+ Metadata | MetadataTuple
194
+ >({
195
+ transform: (x) => x,
196
+ element: (x) => (x instanceof MetadataArray ? x.value : x),
197
+ size: (input) => IdentifierFactory.access(input)("length"),
198
+ front: (input) =>
199
+ ts.factory.createElementAccessExpression(input, 0),
200
+ array: (input) => input,
201
+ name: (m) => m.name,
202
+ })(props);
203
+ export namespace array_or_tuple {
204
+ export type IProps = check_union_array_like.IProps<
205
+ MetadataArray | MetadataTuple,
206
+ Metadata
207
+ >;
208
+ }
209
+
210
+ export const set = (props: set.IProps) =>
211
+ check_union_array_like<Metadata, MetadataArray, Metadata>({
212
+ transform: (value: Metadata) =>
213
+ MetadataArray.create({
214
+ name: `Set<${value.getName()}>`,
215
+ index: null,
216
+ recursive: false,
217
+ nullables: [],
218
+ value,
219
+ }),
220
+ element: (array) => array.value,
221
+ size: (input) => IdentifierFactory.access(input)("size"),
222
+ front: (input) =>
223
+ IdentifierFactory.access(
224
+ ts.factory.createCallExpression(
225
+ IdentifierFactory.access(
226
+ ts.factory.createCallExpression(
227
+ IdentifierFactory.access(input)("values"),
228
+ undefined,
229
+ undefined,
230
+ ),
231
+ )("next"),
232
+ undefined,
233
+ undefined,
234
+ ),
235
+ )("value"),
236
+ array: (input) =>
237
+ ts.factory.createArrayLiteralExpression(
238
+ [ts.factory.createSpreadElement(input)],
239
+ false,
240
+ ),
241
+ name: (_m, e) => `Set<${e.getName()}>`,
242
+ })(props);
243
+ export namespace set {
244
+ export type IProps = check_union_array_like.IProps<
245
+ MetadataArray,
246
+ Metadata
247
+ >;
248
+ }
249
+
250
+ export const map = (props: map.IProps) =>
251
+ check_union_array_like<
252
+ Metadata.Entry,
253
+ MetadataArray,
254
+ [Metadata, Metadata]
255
+ >({
256
+ element: (array) =>
257
+ array.value.tuples[0]!.elements as [Metadata, Metadata],
258
+ size: (input) => IdentifierFactory.access(input)("size"),
259
+ front: (input) =>
260
+ IdentifierFactory.access(
261
+ ts.factory.createCallExpression(
262
+ IdentifierFactory.access(
263
+ ts.factory.createCallExpression(
264
+ IdentifierFactory.access(input)("entries"),
265
+ undefined,
266
+ undefined,
267
+ ),
268
+ )("next"),
269
+ undefined,
270
+ undefined,
271
+ ),
272
+ )("value"),
273
+ array: (input) =>
274
+ ts.factory.createArrayLiteralExpression(
275
+ [ts.factory.createSpreadElement(input)],
276
+ false,
277
+ ),
278
+ name: (_m, [k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
279
+ transform: (m: Metadata.Entry) =>
280
+ MetadataArray.create({
281
+ name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
282
+ index: null,
283
+ recursive: false,
284
+ nullables: [],
285
+ value: Metadata.create({
286
+ ...Metadata.initialize(),
287
+ tuples: [
288
+ (() => {
289
+ const tuple = MetadataTuple.create({
290
+ name: `[${m.key.getName()}, ${m.value.getName()}]`,
291
+ index: null,
292
+ recursive: false,
293
+ nullables: [],
294
+ elements: [m.key, m.value],
295
+ });
296
+ tuple.of_map = true;
297
+ return tuple;
298
+ })(),
299
+ ],
300
+ }),
301
+ }),
302
+ })(props);
303
+
304
+ export namespace map {
305
+ export type IProps = check_union_array_like.IProps<
306
+ MetadataArray,
307
+ [Metadata, Metadata]
308
+ >;
309
+ }
310
+ }