typia 7.0.0-dev.20241011 → 7.0.0-dev.20241012

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.d.ts +4 -4
  2. package/lib/factories/MetadataCollection.js +6 -4
  3. package/lib/factories/MetadataCollection.js.map +1 -1
  4. package/lib/factories/MetadataFactory.d.ts +2 -2
  5. package/lib/factories/MetadataFactory.js +8 -2
  6. package/lib/factories/MetadataFactory.js.map +1 -1
  7. package/lib/factories/MetadataTypeTagFactory.d.ts +2 -2
  8. package/lib/factories/MetadataTypeTagFactory.js +6 -6
  9. package/lib/factories/MetadataTypeTagFactory.js.map +1 -1
  10. package/lib/factories/MetadataTypeTagSchemaFactory.d.ts +2 -2
  11. package/lib/factories/MetadataTypeTagSchemaFactory.js +1 -1
  12. package/lib/factories/MetadataTypeTagSchemaFactory.js.map +1 -1
  13. package/lib/factories/ProtobufFactory.js +12 -22
  14. package/lib/factories/ProtobufFactory.js.map +1 -1
  15. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +2 -2
  16. package/lib/factories/internal/metadata/iterate_metadata_collection.js +2 -1
  17. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  18. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +2 -2
  19. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +5 -2
  20. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  21. package/lib/factories/internal/metadata/iterate_metadata_object.js +5 -1
  22. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  23. package/lib/factories/internal/metadata/iterate_metadata_sort.js +6 -2
  24. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  25. package/lib/internal/$ProtobufSizer.js +1 -8
  26. package/lib/internal/$ProtobufSizer.js.map +1 -1
  27. package/lib/json.d.ts +1 -1
  28. package/lib/module.d.ts +1 -1
  29. package/lib/module.js +1 -1
  30. package/lib/module.js.map +1 -1
  31. package/lib/programmers/CheckerProgrammer.d.ts +2 -2
  32. package/lib/programmers/CheckerProgrammer.js +5 -3
  33. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  34. package/lib/programmers/FeatureProgrammer.d.ts +5 -5
  35. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  36. package/lib/programmers/IsProgrammer.d.ts +2 -2
  37. package/lib/programmers/RandomProgrammer.js +1 -1
  38. package/lib/programmers/RandomProgrammer.js.map +1 -1
  39. package/lib/programmers/helpers/ProtobufUtil.d.ts +2 -2
  40. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  41. package/lib/programmers/helpers/PruneJoiner.d.ts +2 -2
  42. package/lib/programmers/helpers/RandomJoiner.d.ts +2 -2
  43. package/lib/programmers/helpers/UnionExplorer.d.ts +3 -3
  44. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  45. package/lib/programmers/helpers/UnionPredicator.d.ts +3 -3
  46. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  47. package/lib/programmers/http/HttpFormDataProgrammer.js +1 -1
  48. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  49. package/lib/programmers/http/HttpHeadersProgrammer.js +1 -1
  50. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  51. package/lib/programmers/http/HttpQueryProgrammer.js +2 -2
  52. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  53. package/lib/programmers/internal/application_union_discriminator.js +2 -2
  54. package/lib/programmers/internal/application_union_discriminator.js.map +1 -1
  55. package/lib/programmers/internal/application_v30_alias.js +1 -1
  56. package/lib/programmers/internal/application_v30_alias.js.map +1 -1
  57. package/lib/programmers/internal/application_v30_schema.js +1 -1
  58. package/lib/programmers/internal/application_v30_schema.js.map +1 -1
  59. package/lib/programmers/internal/application_v31_alias.js +1 -1
  60. package/lib/programmers/internal/application_v31_alias.js.map +1 -1
  61. package/lib/programmers/internal/application_v31_schema.js +1 -1
  62. package/lib/programmers/internal/application_v31_schema.js.map +1 -1
  63. package/lib/programmers/internal/llm_schema_object.js +1 -1
  64. package/lib/programmers/internal/llm_schema_object.js.map +1 -1
  65. package/lib/programmers/internal/llm_schema_station.js +2 -2
  66. package/lib/programmers/internal/llm_schema_station.js.map +1 -1
  67. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  68. package/lib/programmers/json/JsonApplicationProgrammer.js +6 -5
  69. package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
  70. package/lib/programmers/json/JsonSchemasProgrammer.d.ts +1 -1
  71. package/lib/programmers/json/JsonStringifyProgrammer.js +3 -3
  72. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  73. package/lib/programmers/llm/LlmApplicationProgrammer.js +7 -6
  74. package/lib/programmers/llm/LlmApplicationProgrammer.js.map +1 -1
  75. package/lib/programmers/llm/LlmSchemaProgrammer.js +1 -1
  76. package/lib/programmers/llm/LlmSchemaProgrammer.js.map +1 -1
  77. package/lib/programmers/misc/MiscCloneProgrammer.js +1 -1
  78. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  79. package/lib/programmers/misc/MiscPruneProgrammer.js +1 -1
  80. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  81. package/lib/programmers/notations/NotationGeneralProgrammer.js +1 -1
  82. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  83. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +6 -6
  84. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  85. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +1 -1
  86. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  87. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +3 -3
  88. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  89. package/lib/schemas/json/IJsonSchemaCollection.js +3 -0
  90. package/lib/schemas/json/IJsonSchemaCollection.js.map +1 -0
  91. package/lib/schemas/metadata/IMetadata.d.ts +4 -1
  92. package/lib/schemas/metadata/IMetadataArray.d.ts +1 -2
  93. package/lib/schemas/metadata/IMetadataComponents.d.ts +2 -2
  94. package/lib/schemas/metadata/IMetadataDictionary.d.ts +2 -2
  95. package/lib/schemas/metadata/IMetadataObject.d.ts +2 -8
  96. package/lib/schemas/metadata/IMetadataObjectType.d.ts +11 -0
  97. package/lib/schemas/{json/IJsonSchemaList.js → metadata/IMetadataObjectType.js} +1 -1
  98. package/lib/schemas/metadata/IMetadataObjectType.js.map +1 -0
  99. package/lib/schemas/metadata/IMetadataTuple.d.ts +1 -2
  100. package/lib/schemas/metadata/Metadata.js +14 -15
  101. package/lib/schemas/metadata/Metadata.js.map +1 -1
  102. package/lib/schemas/metadata/MetadataArray.js +1 -1
  103. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  104. package/lib/schemas/metadata/MetadataComponents.d.ts +2 -2
  105. package/lib/schemas/metadata/MetadataComponents.js +2 -2
  106. package/lib/schemas/metadata/MetadataComponents.js.map +1 -1
  107. package/lib/schemas/metadata/MetadataObject.d.ts +8 -12
  108. package/lib/schemas/metadata/MetadataObject.js +44 -82
  109. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  110. package/lib/schemas/metadata/MetadataObjectType.d.ts +20 -0
  111. package/lib/schemas/metadata/MetadataObjectType.js +106 -0
  112. package/lib/schemas/metadata/MetadataObjectType.js.map +1 -0
  113. package/lib/schemas/metadata/MetadataTuple.js +1 -1
  114. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  115. package/lib/transformers/TransformerError.js.map +1 -1
  116. package/package.json +2 -2
  117. package/src/executable/TypiaGenerateWizard.ts +83 -83
  118. package/src/executable/TypiaSetupWizard.ts +174 -174
  119. package/src/executable/setup/ArgumentParser.ts +42 -42
  120. package/src/executable/setup/FileRetriever.ts +19 -19
  121. package/src/executable/setup/PackageManager.ts +87 -87
  122. package/src/factories/IdentifierFactory.ts +89 -89
  123. package/src/factories/MetadataCollection.ts +280 -278
  124. package/src/factories/MetadataFactory.ts +11 -5
  125. package/src/factories/MetadataTypeTagFactory.ts +386 -385
  126. package/src/factories/MetadataTypeTagSchemaFactory.ts +82 -82
  127. package/src/factories/NumericRangeFactory.ts +72 -72
  128. package/src/factories/ProtobufFactory.ts +14 -28
  129. package/src/factories/StatementFactory.ts +90 -90
  130. package/src/factories/TemplateFactory.ts +64 -64
  131. package/src/factories/TypeFactory.ts +140 -140
  132. package/src/factories/internal/metadata/emplace_metadata_alias.ts +32 -32
  133. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +39 -39
  134. package/src/factories/internal/metadata/emplace_metadata_object.ts +2 -2
  135. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +56 -56
  136. package/src/factories/internal/metadata/explore_metadata.ts +30 -30
  137. package/src/factories/internal/metadata/iterate_metadata.ts +54 -54
  138. package/src/factories/internal/metadata/iterate_metadata_alias.ts +28 -28
  139. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  140. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  141. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  142. package/src/factories/internal/metadata/iterate_metadata_collection.ts +4 -3
  143. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +2 -2
  144. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  145. package/src/factories/internal/metadata/iterate_metadata_escape.ts +49 -49
  146. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +219 -216
  147. package/src/factories/internal/metadata/iterate_metadata_map.ts +52 -52
  148. package/src/factories/internal/metadata/iterate_metadata_native.ts +236 -236
  149. package/src/factories/internal/metadata/iterate_metadata_object.ts +35 -27
  150. package/src/factories/internal/metadata/iterate_metadata_set.ts +39 -39
  151. package/src/factories/internal/metadata/iterate_metadata_sort.ts +87 -83
  152. package/src/factories/internal/metadata/iterate_metadata_template.ts +42 -42
  153. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +26 -26
  154. package/src/factories/internal/metadata/iterate_metadata_union.ts +19 -19
  155. package/src/internal/$ProtobufSizer.ts +1 -7
  156. package/src/json.ts +1 -1
  157. package/src/module.ts +1 -1
  158. package/src/programmers/CheckerProgrammer.ts +7 -5
  159. package/src/programmers/FeatureProgrammer.ts +9 -6
  160. package/src/programmers/IsProgrammer.ts +2 -2
  161. package/src/programmers/RandomProgrammer.ts +3 -3
  162. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  163. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +113 -113
  164. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +116 -116
  165. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  166. package/src/programmers/helpers/AtomicPredicator.ts +35 -35
  167. package/src/programmers/helpers/CloneJoiner.ts +143 -143
  168. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  169. package/src/programmers/helpers/NotationJoiner.ts +144 -144
  170. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  171. package/src/programmers/helpers/PruneJoiner.ts +148 -148
  172. package/src/programmers/helpers/RandomJoiner.ts +2 -2
  173. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  174. package/src/programmers/helpers/UnionExplorer.ts +372 -372
  175. package/src/programmers/helpers/UnionPredicator.ts +79 -77
  176. package/src/programmers/http/HttpFormDataProgrammer.ts +3 -3
  177. package/src/programmers/http/HttpHeadersProgrammer.ts +3 -3
  178. package/src/programmers/http/HttpQueryProgrammer.ts +4 -4
  179. package/src/programmers/internal/application_array.ts +56 -56
  180. package/src/programmers/internal/application_bigint.ts +25 -25
  181. package/src/programmers/internal/application_boolean.ts +25 -25
  182. package/src/programmers/internal/application_escaped.ts +96 -96
  183. package/src/programmers/internal/application_number.ts +25 -25
  184. package/src/programmers/internal/application_plugin.ts +19 -19
  185. package/src/programmers/internal/application_string.ts +25 -25
  186. package/src/programmers/internal/application_templates.ts +64 -64
  187. package/src/programmers/internal/application_union_discriminator.ts +35 -35
  188. package/src/programmers/internal/application_v30_alias.ts +59 -59
  189. package/src/programmers/internal/application_v30_native.ts +29 -29
  190. package/src/programmers/internal/application_v30_object.ts +165 -165
  191. package/src/programmers/internal/application_v30_schema.ts +220 -220
  192. package/src/programmers/internal/application_v30_tuple.ts +33 -33
  193. package/src/programmers/internal/application_v31_alias.ts +47 -47
  194. package/src/programmers/internal/application_v31_constant.ts +29 -29
  195. package/src/programmers/internal/application_v31_native.ts +25 -25
  196. package/src/programmers/internal/application_v31_object.ts +147 -147
  197. package/src/programmers/internal/application_v31_schema.ts +215 -215
  198. package/src/programmers/internal/application_v31_tuple.ts +22 -22
  199. package/src/programmers/internal/check_array_length.ts +46 -46
  200. package/src/programmers/internal/check_bigint.ts +49 -49
  201. package/src/programmers/internal/check_everything.ts +23 -23
  202. package/src/programmers/internal/check_native.ts +27 -27
  203. package/src/programmers/internal/check_number.ts +111 -111
  204. package/src/programmers/internal/check_string.ts +49 -49
  205. package/src/programmers/internal/check_template.ts +48 -48
  206. package/src/programmers/internal/check_union_array_like.ts +334 -334
  207. package/src/programmers/internal/decode_union_object.ts +116 -116
  208. package/src/programmers/internal/feature_object_entries.ts +2 -2
  209. package/src/programmers/internal/llm_schema_array.ts +22 -22
  210. package/src/programmers/internal/llm_schema_escaped.ts +84 -84
  211. package/src/programmers/internal/llm_schema_object.ts +132 -132
  212. package/src/programmers/internal/llm_schema_station.ts +190 -190
  213. package/src/programmers/internal/metadata_to_pattern.ts +42 -42
  214. package/src/programmers/internal/postfix_of_tuple.ts +5 -5
  215. package/src/programmers/internal/prune_object_properties.ts +2 -2
  216. package/src/programmers/internal/stringify_dynamic_properties.ts +162 -162
  217. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  218. package/src/programmers/internal/template_to_pattern.ts +23 -23
  219. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +23 -23
  220. package/src/programmers/json/JsonApplicationProgrammer.ts +3 -3
  221. package/src/programmers/json/JsonSchemasProgrammer.ts +1 -1
  222. package/src/programmers/json/JsonStringifyProgrammer.ts +5 -5
  223. package/src/programmers/llm/LlmApplicationProgrammer.ts +4 -4
  224. package/src/programmers/llm/LlmSchemaProgrammer.ts +1 -1
  225. package/src/programmers/misc/MiscCloneProgrammer.ts +3 -3
  226. package/src/programmers/misc/MiscPruneProgrammer.ts +3 -3
  227. package/src/programmers/notations/NotationGeneralProgrammer.ts +3 -3
  228. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +11 -11
  229. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +8 -8
  230. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +201 -201
  231. package/src/schemas/json/{IJsonSchemaList.ts → IJsonSchemaCollection.ts} +22 -22
  232. package/src/schemas/metadata/IMetadata.ts +4 -1
  233. package/src/schemas/metadata/IMetadataArray.ts +1 -2
  234. package/src/schemas/metadata/IMetadataComponents.ts +2 -2
  235. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  236. package/src/schemas/metadata/IMetadataObject.ts +6 -13
  237. package/src/schemas/metadata/IMetadataObjectType.ts +13 -0
  238. package/src/schemas/metadata/IMetadataTuple.ts +1 -2
  239. package/src/schemas/metadata/Metadata.ts +616 -616
  240. package/src/schemas/metadata/MetadataArray.ts +1 -1
  241. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  242. package/src/schemas/metadata/MetadataObject.ts +48 -139
  243. package/src/schemas/metadata/MetadataObjectType.ts +149 -0
  244. package/src/schemas/metadata/MetadataTuple.ts +1 -1
  245. package/src/transformers/TransformerError.ts +8 -7
  246. package/src/transformers/features/json/JsonSchemasTransformer.ts +1 -1
  247. package/src/utils/MapUtil.ts +14 -14
  248. package/src/utils/NameEncoder.ts +32 -32
  249. package/lib/schemas/json/IJsonSchemaList.js.map +0 -1
  250. /package/lib/schemas/json/{IJsonSchemaList.d.ts → IJsonSchemaCollection.d.ts} +0 -0
@@ -1,334 +1,334 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
- import { StatementFactory } from "../../factories/StatementFactory";
6
- import { TypeFactory } from "../../factories/TypeFactory";
7
-
8
- import { Metadata } from "../../schemas/metadata/Metadata";
9
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
10
- import { MetadataArrayType } from "../../schemas/metadata/MetadataArrayType";
11
- import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
12
-
13
- import { CheckerProgrammer } from "../CheckerProgrammer";
14
- import { FeatureProgrammer } from "../FeatureProgrammer";
15
- import { UnionExplorer } from "../helpers/UnionExplorer";
16
-
17
- /**
18
- * @internal
19
- */
20
- export const check_union_array_like = <
21
- Origin extends Metadata | MetadataArray | MetadataTuple | Metadata.Entry,
22
- Category extends MetadataArray | MetadataTuple,
23
- Element,
24
- >(props: {
25
- config: check_union_array_like.IConfig<Category, Element>;
26
- accessor: check_union_array_like.IAccessor<Origin, Category, Element>;
27
- parameters: ts.ParameterDeclaration[];
28
- input: ts.Expression;
29
- definitions: Origin[];
30
- explore: FeatureProgrammer.IExplore;
31
- }): ts.ArrowFunction => {
32
- // ONLY ONE TYPE
33
- const targets: Array<Category> = props.definitions.map(
34
- props.accessor.transform,
35
- );
36
- if (targets.length === 1)
37
- return ts.factory.createArrowFunction(
38
- undefined,
39
- undefined,
40
- props.parameters,
41
- undefined,
42
- undefined,
43
- props.config.decoder({
44
- input: props.accessor.array(props.input),
45
- definition: targets[0]!,
46
- explore: props.explore,
47
- }),
48
- );
49
-
50
- const array = ts.factory.createIdentifier("array");
51
- const top = ts.factory.createIdentifier("top");
52
-
53
- const statements: ts.Statement[] = [];
54
- const tupleList: MetadataTuple[] = targets.filter(
55
- (t) => t instanceof MetadataTuple,
56
- ) as MetadataTuple[];
57
- const arrayList: MetadataArray[] = targets.filter(
58
- (t) => t instanceof MetadataArray,
59
- ) as MetadataArray[];
60
-
61
- const predicate = (meta: Category): ts.Expression =>
62
- ts.factory.createAsExpression(
63
- ts.factory.createArrayLiteralExpression(
64
- [
65
- ts.factory.createArrowFunction(
66
- undefined,
67
- undefined,
68
- [
69
- IdentifierFactory.parameter(
70
- "top",
71
- meta instanceof MetadataArrayType
72
- ? TypeFactory.keyword("any")
73
- : ts.factory.createTypeReferenceNode("any[]"),
74
- ),
75
- ],
76
- TypeFactory.keyword("any"),
77
- undefined,
78
- props.config.checker({
79
- input: ts.factory.createIdentifier("top"),
80
- definition: props.accessor.element(meta),
81
- explore: {
82
- ...props.explore,
83
- tracable: false,
84
- postfix: meta instanceof MetadataArrayType ? `"[0]"` : "",
85
- },
86
- container: array,
87
- }),
88
- ),
89
- ts.factory.createArrowFunction(
90
- undefined,
91
- undefined,
92
- [
93
- IdentifierFactory.parameter(
94
- "entire",
95
- ts.factory.createTypeReferenceNode("any[]"),
96
- ),
97
- ],
98
- TypeFactory.keyword("any"),
99
- undefined,
100
- props.config.decoder({
101
- input: ts.factory.createIdentifier("entire"),
102
- definition: meta,
103
- explore: {
104
- ...props.explore,
105
- tracable: true,
106
- },
107
- }),
108
- ),
109
- ],
110
- true,
111
- ),
112
- ts.factory.createTypeReferenceNode("const"),
113
- );
114
- const iterate = (props: {
115
- init: string;
116
- from: ts.Expression;
117
- if: ts.IfStatement;
118
- }): ts.ForOfStatement =>
119
- ts.factory.createForOfStatement(
120
- undefined,
121
- ts.factory.createVariableDeclarationList(
122
- [ts.factory.createVariableDeclaration(props.init)],
123
- ts.NodeFlags.Const,
124
- ),
125
- props.from,
126
- props.if,
127
- );
128
-
129
- if (tupleList.length)
130
- statements.push(
131
- StatementFactory.constant({
132
- name: "array",
133
- value: props.accessor.array(props.input),
134
- }),
135
- StatementFactory.constant({
136
- name: "tuplePredicators",
137
- value: ts.factory.createArrayLiteralExpression(
138
- tupleList.map((x) => predicate(x as Category)),
139
- true,
140
- ),
141
- }),
142
- iterate({
143
- init: "pred",
144
- from: ts.factory.createIdentifier("tuplePredicators"),
145
- if: ts.factory.createIfStatement(
146
- ts.factory.createCallExpression(
147
- ts.factory.createIdentifier("pred[0]"),
148
- undefined,
149
- [array],
150
- ),
151
- ts.factory.createReturnStatement(
152
- ts.factory.createCallExpression(
153
- ts.factory.createIdentifier(`pred[1]`),
154
- undefined,
155
- [array],
156
- ),
157
- ),
158
- ),
159
- }),
160
- );
161
- if (arrayList.length) {
162
- if (tupleList.length === 0)
163
- statements.push(
164
- StatementFactory.constant({
165
- name: "array",
166
- value: props.accessor.array(props.input),
167
- }),
168
- );
169
- statements.push(
170
- StatementFactory.constant({
171
- name: "top",
172
- value: props.accessor.front(props.input),
173
- }),
174
- ts.factory.createIfStatement(
175
- ts.factory.createStrictEquality(
176
- ExpressionFactory.number(0),
177
- props.accessor.size(props.input),
178
- ),
179
- ts.isReturnStatement(props.config.empty)
180
- ? props.config.empty
181
- : ts.factory.createReturnStatement(props.config.empty),
182
- ),
183
- StatementFactory.constant({
184
- name: "arrayPredicators",
185
- value: ts.factory.createArrayLiteralExpression(
186
- arrayList.map((x) => predicate(x as Category)),
187
- true,
188
- ),
189
- }),
190
- StatementFactory.constant({
191
- name: "passed",
192
- value: ts.factory.createCallExpression(
193
- IdentifierFactory.access(
194
- ts.factory.createIdentifier("arrayPredicators"),
195
- "filter",
196
- ),
197
- undefined,
198
- [
199
- ts.factory.createArrowFunction(
200
- undefined,
201
- undefined,
202
- [IdentifierFactory.parameter("pred")],
203
- undefined,
204
- undefined,
205
- ts.factory.createCallExpression(
206
- ts.factory.createIdentifier("pred[0]"),
207
- undefined,
208
- [top],
209
- ),
210
- ),
211
- ],
212
- ),
213
- }),
214
- ts.factory.createIfStatement(
215
- ts.factory.createStrictEquality(
216
- ExpressionFactory.number(1),
217
- ts.factory.createIdentifier("passed.length"),
218
- ),
219
- ts.factory.createReturnStatement(
220
- ts.factory.createCallExpression(
221
- ts.factory.createElementAccessExpression(
222
- ts.factory.createNonNullExpression(
223
- ts.factory.createIdentifier("passed[0]"),
224
- ),
225
- 1,
226
- ),
227
- undefined,
228
- [array],
229
- ),
230
- ),
231
- ts.factory.createIfStatement(
232
- ts.factory.createLessThan(
233
- ExpressionFactory.number(1),
234
- ts.factory.createIdentifier("passed.length"),
235
- ),
236
- iterate({
237
- init: "pred",
238
- from: ts.factory.createIdentifier("passed"),
239
- if: ts.factory.createIfStatement(
240
- ts.factory.createCallExpression(
241
- IdentifierFactory.access(array, "every"),
242
- undefined,
243
- [
244
- ts.factory.createArrowFunction(
245
- undefined,
246
- undefined,
247
- [
248
- IdentifierFactory.parameter(
249
- "value",
250
- TypeFactory.keyword("any"),
251
- ),
252
- ],
253
- undefined,
254
- undefined,
255
- ts.factory.createStrictEquality(
256
- props.config.success,
257
- ts.factory.createCallExpression(
258
- ts.factory.createIdentifier("pred[0]"),
259
- undefined,
260
- [ts.factory.createIdentifier("value")],
261
- ),
262
- ),
263
- ),
264
- ],
265
- ),
266
- ts.factory.createReturnStatement(
267
- ts.factory.createCallExpression(
268
- ts.factory.createIdentifier(`pred[1]`),
269
- undefined,
270
- [ts.factory.createIdentifier("array")],
271
- ),
272
- ),
273
- ),
274
- }),
275
- ),
276
- ),
277
- );
278
- }
279
- statements.push(
280
- props.config.failure({
281
- input: props.input,
282
- expected: `(${targets
283
- .map((t) => props.accessor.name(t, props.accessor.element(t)))
284
- .join(" | ")})`,
285
- explore: props.explore,
286
- }),
287
- );
288
- return ts.factory.createArrowFunction(
289
- undefined,
290
- undefined,
291
- props.parameters,
292
- undefined,
293
- undefined,
294
- ts.factory.createBlock(statements, true),
295
- );
296
- };
297
-
298
- /**
299
- * @internal
300
- */
301
- export namespace check_union_array_like {
302
- export interface IConfig<
303
- Category extends MetadataArray | MetadataTuple,
304
- Element,
305
- > {
306
- checker(props: {
307
- input: ts.Expression;
308
- definition: Element;
309
- explore: FeatureProgrammer.IExplore;
310
- container: ts.Expression;
311
- }): ts.Expression;
312
- decoder: UnionExplorer.Decoder<Category>;
313
- empty: ts.ReturnStatement | ts.Expression;
314
- success: ts.Expression;
315
- failure(props: {
316
- input: ts.Expression;
317
- expected: string;
318
- explore: CheckerProgrammer.IExplore;
319
- }): ts.Statement;
320
- }
321
-
322
- export interface IAccessor<
323
- Origin,
324
- Category extends MetadataArray | MetadataTuple,
325
- Element,
326
- > {
327
- transform(origin: Origin): Category;
328
- element(meta: Category): Element;
329
- name(meta: Category, elem: Element): string;
330
- front(input: ts.Expression): ts.Expression;
331
- array(input: ts.Expression): ts.Expression;
332
- size(input: ts.Expression): ts.Expression;
333
- }
334
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+ import { StatementFactory } from "../../factories/StatementFactory";
6
+ import { TypeFactory } from "../../factories/TypeFactory";
7
+
8
+ import { Metadata } from "../../schemas/metadata/Metadata";
9
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
10
+ import { MetadataArrayType } from "../../schemas/metadata/MetadataArrayType";
11
+ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
12
+
13
+ import { CheckerProgrammer } from "../CheckerProgrammer";
14
+ import { FeatureProgrammer } from "../FeatureProgrammer";
15
+ import { UnionExplorer } from "../helpers/UnionExplorer";
16
+
17
+ /**
18
+ * @internal
19
+ */
20
+ export const check_union_array_like = <
21
+ Origin extends Metadata | MetadataArray | MetadataTuple | Metadata.Entry,
22
+ Category extends MetadataArray | MetadataTuple,
23
+ Element,
24
+ >(props: {
25
+ config: check_union_array_like.IConfig<Category, Element>;
26
+ accessor: check_union_array_like.IAccessor<Origin, Category, Element>;
27
+ parameters: ts.ParameterDeclaration[];
28
+ input: ts.Expression;
29
+ definitions: Origin[];
30
+ explore: FeatureProgrammer.IExplore;
31
+ }): ts.ArrowFunction => {
32
+ // ONLY ONE TYPE
33
+ const targets: Array<Category> = props.definitions.map(
34
+ props.accessor.transform,
35
+ );
36
+ if (targets.length === 1)
37
+ return ts.factory.createArrowFunction(
38
+ undefined,
39
+ undefined,
40
+ props.parameters,
41
+ undefined,
42
+ undefined,
43
+ props.config.decoder({
44
+ input: props.accessor.array(props.input),
45
+ definition: targets[0]!,
46
+ explore: props.explore,
47
+ }),
48
+ );
49
+
50
+ const array = ts.factory.createIdentifier("array");
51
+ const top = ts.factory.createIdentifier("top");
52
+
53
+ const statements: ts.Statement[] = [];
54
+ const tupleList: MetadataTuple[] = targets.filter(
55
+ (t) => t instanceof MetadataTuple,
56
+ ) as MetadataTuple[];
57
+ const arrayList: MetadataArray[] = targets.filter(
58
+ (t) => t instanceof MetadataArray,
59
+ ) as MetadataArray[];
60
+
61
+ const predicate = (meta: Category): ts.Expression =>
62
+ ts.factory.createAsExpression(
63
+ ts.factory.createArrayLiteralExpression(
64
+ [
65
+ ts.factory.createArrowFunction(
66
+ undefined,
67
+ undefined,
68
+ [
69
+ IdentifierFactory.parameter(
70
+ "top",
71
+ meta instanceof MetadataArrayType
72
+ ? TypeFactory.keyword("any")
73
+ : ts.factory.createTypeReferenceNode("any[]"),
74
+ ),
75
+ ],
76
+ TypeFactory.keyword("any"),
77
+ undefined,
78
+ props.config.checker({
79
+ input: ts.factory.createIdentifier("top"),
80
+ definition: props.accessor.element(meta),
81
+ explore: {
82
+ ...props.explore,
83
+ tracable: false,
84
+ postfix: meta instanceof MetadataArrayType ? `"[0]"` : "",
85
+ },
86
+ container: array,
87
+ }),
88
+ ),
89
+ ts.factory.createArrowFunction(
90
+ undefined,
91
+ undefined,
92
+ [
93
+ IdentifierFactory.parameter(
94
+ "entire",
95
+ ts.factory.createTypeReferenceNode("any[]"),
96
+ ),
97
+ ],
98
+ TypeFactory.keyword("any"),
99
+ undefined,
100
+ props.config.decoder({
101
+ input: ts.factory.createIdentifier("entire"),
102
+ definition: meta,
103
+ explore: {
104
+ ...props.explore,
105
+ tracable: true,
106
+ },
107
+ }),
108
+ ),
109
+ ],
110
+ true,
111
+ ),
112
+ ts.factory.createTypeReferenceNode("const"),
113
+ );
114
+ const iterate = (props: {
115
+ init: string;
116
+ from: ts.Expression;
117
+ if: ts.IfStatement;
118
+ }): ts.ForOfStatement =>
119
+ ts.factory.createForOfStatement(
120
+ undefined,
121
+ ts.factory.createVariableDeclarationList(
122
+ [ts.factory.createVariableDeclaration(props.init)],
123
+ ts.NodeFlags.Const,
124
+ ),
125
+ props.from,
126
+ props.if,
127
+ );
128
+
129
+ if (tupleList.length)
130
+ statements.push(
131
+ StatementFactory.constant({
132
+ name: "array",
133
+ value: props.accessor.array(props.input),
134
+ }),
135
+ StatementFactory.constant({
136
+ name: "tuplePredicators",
137
+ value: ts.factory.createArrayLiteralExpression(
138
+ tupleList.map((x) => predicate(x as Category)),
139
+ true,
140
+ ),
141
+ }),
142
+ iterate({
143
+ init: "pred",
144
+ from: ts.factory.createIdentifier("tuplePredicators"),
145
+ if: ts.factory.createIfStatement(
146
+ ts.factory.createCallExpression(
147
+ ts.factory.createIdentifier("pred[0]"),
148
+ undefined,
149
+ [array],
150
+ ),
151
+ ts.factory.createReturnStatement(
152
+ ts.factory.createCallExpression(
153
+ ts.factory.createIdentifier(`pred[1]`),
154
+ undefined,
155
+ [array],
156
+ ),
157
+ ),
158
+ ),
159
+ }),
160
+ );
161
+ if (arrayList.length) {
162
+ if (tupleList.length === 0)
163
+ statements.push(
164
+ StatementFactory.constant({
165
+ name: "array",
166
+ value: props.accessor.array(props.input),
167
+ }),
168
+ );
169
+ statements.push(
170
+ StatementFactory.constant({
171
+ name: "top",
172
+ value: props.accessor.front(props.input),
173
+ }),
174
+ ts.factory.createIfStatement(
175
+ ts.factory.createStrictEquality(
176
+ ExpressionFactory.number(0),
177
+ props.accessor.size(props.input),
178
+ ),
179
+ ts.isReturnStatement(props.config.empty)
180
+ ? props.config.empty
181
+ : ts.factory.createReturnStatement(props.config.empty),
182
+ ),
183
+ StatementFactory.constant({
184
+ name: "arrayPredicators",
185
+ value: ts.factory.createArrayLiteralExpression(
186
+ arrayList.map((x) => predicate(x as Category)),
187
+ true,
188
+ ),
189
+ }),
190
+ StatementFactory.constant({
191
+ name: "passed",
192
+ value: ts.factory.createCallExpression(
193
+ IdentifierFactory.access(
194
+ ts.factory.createIdentifier("arrayPredicators"),
195
+ "filter",
196
+ ),
197
+ undefined,
198
+ [
199
+ ts.factory.createArrowFunction(
200
+ undefined,
201
+ undefined,
202
+ [IdentifierFactory.parameter("pred")],
203
+ undefined,
204
+ undefined,
205
+ ts.factory.createCallExpression(
206
+ ts.factory.createIdentifier("pred[0]"),
207
+ undefined,
208
+ [top],
209
+ ),
210
+ ),
211
+ ],
212
+ ),
213
+ }),
214
+ ts.factory.createIfStatement(
215
+ ts.factory.createStrictEquality(
216
+ ExpressionFactory.number(1),
217
+ ts.factory.createIdentifier("passed.length"),
218
+ ),
219
+ ts.factory.createReturnStatement(
220
+ ts.factory.createCallExpression(
221
+ ts.factory.createElementAccessExpression(
222
+ ts.factory.createNonNullExpression(
223
+ ts.factory.createIdentifier("passed[0]"),
224
+ ),
225
+ 1,
226
+ ),
227
+ undefined,
228
+ [array],
229
+ ),
230
+ ),
231
+ ts.factory.createIfStatement(
232
+ ts.factory.createLessThan(
233
+ ExpressionFactory.number(1),
234
+ ts.factory.createIdentifier("passed.length"),
235
+ ),
236
+ iterate({
237
+ init: "pred",
238
+ from: ts.factory.createIdentifier("passed"),
239
+ if: ts.factory.createIfStatement(
240
+ ts.factory.createCallExpression(
241
+ IdentifierFactory.access(array, "every"),
242
+ undefined,
243
+ [
244
+ ts.factory.createArrowFunction(
245
+ undefined,
246
+ undefined,
247
+ [
248
+ IdentifierFactory.parameter(
249
+ "value",
250
+ TypeFactory.keyword("any"),
251
+ ),
252
+ ],
253
+ undefined,
254
+ undefined,
255
+ ts.factory.createStrictEquality(
256
+ props.config.success,
257
+ ts.factory.createCallExpression(
258
+ ts.factory.createIdentifier("pred[0]"),
259
+ undefined,
260
+ [ts.factory.createIdentifier("value")],
261
+ ),
262
+ ),
263
+ ),
264
+ ],
265
+ ),
266
+ ts.factory.createReturnStatement(
267
+ ts.factory.createCallExpression(
268
+ ts.factory.createIdentifier(`pred[1]`),
269
+ undefined,
270
+ [ts.factory.createIdentifier("array")],
271
+ ),
272
+ ),
273
+ ),
274
+ }),
275
+ ),
276
+ ),
277
+ );
278
+ }
279
+ statements.push(
280
+ props.config.failure({
281
+ input: props.input,
282
+ expected: `(${targets
283
+ .map((t) => props.accessor.name(t, props.accessor.element(t)))
284
+ .join(" | ")})`,
285
+ explore: props.explore,
286
+ }),
287
+ );
288
+ return ts.factory.createArrowFunction(
289
+ undefined,
290
+ undefined,
291
+ props.parameters,
292
+ undefined,
293
+ undefined,
294
+ ts.factory.createBlock(statements, true),
295
+ );
296
+ };
297
+
298
+ /**
299
+ * @internal
300
+ */
301
+ export namespace check_union_array_like {
302
+ export interface IConfig<
303
+ Category extends MetadataArray | MetadataTuple,
304
+ Element,
305
+ > {
306
+ checker(props: {
307
+ input: ts.Expression;
308
+ definition: Element;
309
+ explore: FeatureProgrammer.IExplore;
310
+ container: ts.Expression;
311
+ }): ts.Expression;
312
+ decoder: UnionExplorer.Decoder<Category>;
313
+ empty: ts.ReturnStatement | ts.Expression;
314
+ success: ts.Expression;
315
+ failure(props: {
316
+ input: ts.Expression;
317
+ expected: string;
318
+ explore: CheckerProgrammer.IExplore;
319
+ }): ts.Statement;
320
+ }
321
+
322
+ export interface IAccessor<
323
+ Origin,
324
+ Category extends MetadataArray | MetadataTuple,
325
+ Element,
326
+ > {
327
+ transform(origin: Origin): Category;
328
+ element(meta: Category): Element;
329
+ name(meta: Category, elem: Element): string;
330
+ front(input: ts.Expression): ts.Expression;
331
+ array(input: ts.Expression): ts.Expression;
332
+ size(input: ts.Expression): ts.Expression;
333
+ }
334
+ }