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,216 +1,219 @@
1
- import ts from "typescript";
2
-
3
- import { IMetadataTypeTag } from "../../../schemas/metadata/IMetadataTypeTag";
4
- import { Metadata } from "../../../schemas/metadata/Metadata";
5
- import { MetadataAtomic } from "../../../schemas/metadata/MetadataAtomic";
6
- import { MetadataConstant } from "../../../schemas/metadata/MetadataConstant";
7
- import { MetadataConstantValue } from "../../../schemas/metadata/MetadataConstantValue";
8
- import { MetadataTemplate } from "../../../schemas/metadata/MetadataTemplate";
9
-
10
- import { ArrayUtil } from "../../../utils/ArrayUtil";
11
-
12
- import { MetadataCollection } from "../../MetadataCollection";
13
- import { MetadataFactory } from "../../MetadataFactory";
14
- import { MetadataTypeTagFactory } from "../../MetadataTypeTagFactory";
15
- import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
16
- import { explore_metadata } from "./explore_metadata";
17
- import { iterate_metadata } from "./iterate_metadata";
18
- import { iterate_metadata_array } from "./iterate_metadata_array";
19
-
20
- export const iterate_metadata_intersection = (
21
- props: IMetadataIteratorProps,
22
- ): boolean => {
23
- if (!props.type.isIntersection()) return false;
24
- if (
25
- // ONLY OBJECT TYPED INTERSECTION
26
- props.type.types.every(
27
- (child) =>
28
- (child.getFlags() & ts.TypeFlags.Object) !== 0 &&
29
- !props.checker.isArrayType(child) &&
30
- !props.checker.isTupleType(child),
31
- )
32
- )
33
- return false;
34
-
35
- // COSTRUCT FAKE METADATA LIST
36
- const fakeCollection: MetadataCollection = props.collection.clone();
37
- const fakeErrors: MetadataFactory.IError[] = [];
38
- const children: Metadata[] = [
39
- ...new Map(
40
- props.type.types.map((t) => {
41
- const m: Metadata = explore_metadata({
42
- ...props,
43
- options: {
44
- ...props.options,
45
- absorb: true,
46
- },
47
- collection: fakeCollection,
48
- errors: fakeErrors,
49
- type: t,
50
- explore: {
51
- ...props.explore,
52
- aliased: false,
53
- },
54
- });
55
- return [m.getName(), m] as const;
56
- }),
57
- ).values(),
58
- ];
59
- if (fakeErrors.length) {
60
- props.errors.push(...fakeErrors);
61
- return true;
62
- }
63
-
64
- // ONLY ONE CHILD AFTER REMOVING DUPLICATES
65
- if (children.length === 1) {
66
- iterate_metadata({
67
- ...props,
68
- type: props.type.types[0]!,
69
- });
70
- return true;
71
- } else if (children.every((c) => c.objects.length === c.size()))
72
- // ONLY OBJECT TYPED INTERSECTION (DETAILED)
73
- return false;
74
-
75
- // VALIDATE EACH TYPES
76
- const nonsensible = () => {
77
- props.errors.push({
78
- name: children.map((c) => c.getName()).join(" & "),
79
- explore: { ...props.explore },
80
- messages: ["nonsensible intersection"],
81
- });
82
- return true;
83
- };
84
- const individuals: (readonly [Metadata, number])[] = children
85
- .map((child, i) => [child, i] as const)
86
- .filter(
87
- ([c]) =>
88
- (c.size() === 1 &&
89
- (c.atomics.length === 1 ||
90
- (c.constants.length === 1 && c.constants[0]!.values.length === 1) ||
91
- c.arrays.length === 1)) ||
92
- c.templates.length === 1,
93
- );
94
- if (individuals.length !== 1) return nonsensible();
95
-
96
- const objects: Metadata[] = children.filter(
97
- (c) =>
98
- c.nullable === false &&
99
- c.isRequired() === true &&
100
- c.objects.length &&
101
- c.objects.length === c.size() &&
102
- c.objects.every((o) => o.properties.every((p) => p.value.optional)),
103
- );
104
- const arrays: Set<string> = new Set(
105
- individuals.map(([c]) => c.arrays.map((a) => a.type.name)).flat(),
106
- );
107
- const atomics: Set<"boolean" | "bigint" | "number" | "string"> = new Set(
108
- individuals.map(([c]) => [...c.atomics.map((a) => a.type)]).flat(),
109
- );
110
- const constants: Metadata[] = individuals
111
- .filter((i) => i[0].constants.length === 1)
112
- .map(([m]) => m);
113
- const templates: Metadata[] = individuals
114
- .filter((i) => i[0].templates.length === 1)
115
- .map(([m]) => m);
116
-
117
- // ESCAPE WHEN ONLY CONSTANT TYPES EXIST
118
- if (
119
- atomics.size + constants.length + arrays.size + templates.length > 1 ||
120
- individuals.length + objects.length !== children.length
121
- )
122
- return nonsensible();
123
-
124
- // RE-GENERATE TYPE
125
- const target: "boolean" | "bigint" | "number" | "string" | "array" =
126
- arrays.size
127
- ? "array"
128
- : atomics.size
129
- ? atomics.values().next().value!
130
- : constants.length
131
- ? constants[0]!.constants[0]!.type
132
- : "string";
133
- if (target === "array") {
134
- const name: string = arrays.values().next().value!;
135
- if (!props.metadata.arrays.some((a) => a.type.name === name)) {
136
- iterate_metadata_array({
137
- ...props,
138
- type: props.type.types[
139
- individuals.find((i) => i[0].arrays.length === 1)![1]
140
- ]!,
141
- explore: {
142
- ...props.explore,
143
- aliased: false,
144
- escaped: false,
145
- },
146
- });
147
- }
148
- } else if (atomics.size)
149
- ArrayUtil.add(
150
- props.metadata.atomics,
151
- MetadataAtomic.create({
152
- type: atomics.values().next().value as "string",
153
- tags: [],
154
- }),
155
- (a, b) => a.type === b.type,
156
- );
157
- else if (constants.length)
158
- ArrayUtil.take(
159
- ArrayUtil.take(
160
- props.metadata.constants,
161
- (o) => o.type === target,
162
- () =>
163
- MetadataConstant.create({
164
- type: target,
165
- values: [],
166
- }),
167
- ).values,
168
- (o) => o.value === constants[0]!.constants[0]!.values[0]!.value,
169
- () =>
170
- MetadataConstantValue.create({
171
- value: constants[0]!.constants[0]!.values[0]!.value,
172
- tags: [],
173
- }),
174
- );
175
- else if (templates.length)
176
- ArrayUtil.take(
177
- props.metadata.templates,
178
- (o) => o.getBaseName() === templates[0]!.templates[0]!.getBaseName(),
179
- () =>
180
- MetadataTemplate.create({
181
- row: templates[0]!.templates[0]!.row,
182
- tags: [],
183
- }),
184
- );
185
-
186
- // ASSIGN TAGS
187
- if (objects.length) {
188
- const tags: IMetadataTypeTag[] = MetadataTypeTagFactory.analyze({
189
- errors: props.errors,
190
- type: target,
191
- objects: objects.map((om) => om.objects).flat(),
192
- explore: props.explore,
193
- });
194
- if (tags.length)
195
- if (target === "array") props.metadata.arrays.at(-1)!.tags.push(tags);
196
- else if (atomics.size)
197
- props.metadata.atomics.find((a) => a.type === target)!.tags.push(tags);
198
- else if (constants.length) {
199
- const constant: MetadataConstant = props.metadata.constants.find(
200
- (c) => c.type === target,
201
- )!;
202
- const value: MetadataConstantValue = constant.values.find(
203
- (v) => v.value === constants[0]!.constants[0]!.values[0]!.value,
204
- )!;
205
- value.tags ??= [];
206
- value.tags.push(tags);
207
- } else if (templates.length) {
208
- const template: MetadataTemplate = props.metadata.templates.find(
209
- (t) => t.getBaseName() === templates[0]!.templates[0]!.getBaseName(),
210
- )!;
211
- template.tags ??= [];
212
- template.tags.push(tags);
213
- }
214
- }
215
- return true;
216
- };
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTypeTag } from "../../../schemas/metadata/IMetadataTypeTag";
4
+ import { Metadata } from "../../../schemas/metadata/Metadata";
5
+ import { MetadataAtomic } from "../../../schemas/metadata/MetadataAtomic";
6
+ import { MetadataConstant } from "../../../schemas/metadata/MetadataConstant";
7
+ import { MetadataConstantValue } from "../../../schemas/metadata/MetadataConstantValue";
8
+ import { MetadataTemplate } from "../../../schemas/metadata/MetadataTemplate";
9
+
10
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
11
+
12
+ import { MetadataCollection } from "../../MetadataCollection";
13
+ import { MetadataFactory } from "../../MetadataFactory";
14
+ import { MetadataTypeTagFactory } from "../../MetadataTypeTagFactory";
15
+ import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
16
+ import { explore_metadata } from "./explore_metadata";
17
+ import { iterate_metadata } from "./iterate_metadata";
18
+ import { iterate_metadata_array } from "./iterate_metadata_array";
19
+
20
+ export const iterate_metadata_intersection = (
21
+ props: IMetadataIteratorProps,
22
+ ): boolean => {
23
+ if (!props.type.isIntersection()) return false;
24
+ if (
25
+ // ONLY OBJECT TYPED INTERSECTION
26
+ props.type.types.every(
27
+ (child) =>
28
+ (child.getFlags() & ts.TypeFlags.Object) !== 0 &&
29
+ !props.checker.isArrayType(child) &&
30
+ !props.checker.isTupleType(child),
31
+ )
32
+ )
33
+ return false;
34
+
35
+ // COSTRUCT FAKE METADATA LIST
36
+ const fakeCollection: MetadataCollection = props.collection.clone();
37
+ const fakeErrors: MetadataFactory.IError[] = [];
38
+ const children: Metadata[] = [
39
+ ...new Map(
40
+ props.type.types.map((t) => {
41
+ const m: Metadata = explore_metadata({
42
+ ...props,
43
+ options: {
44
+ ...props.options,
45
+ absorb: true,
46
+ },
47
+ collection: fakeCollection,
48
+ errors: fakeErrors,
49
+ type: t,
50
+ explore: {
51
+ ...props.explore,
52
+ aliased: false,
53
+ },
54
+ });
55
+ return [m.getName(), m] as const;
56
+ }),
57
+ ).values(),
58
+ ];
59
+ if (fakeErrors.length) {
60
+ props.errors.push(...fakeErrors);
61
+ return true;
62
+ }
63
+
64
+ // ONLY ONE CHILD AFTER REMOVING DUPLICATES
65
+ if (children.length === 1) {
66
+ iterate_metadata({
67
+ ...props,
68
+ type: props.type.types[0]!,
69
+ });
70
+ return true;
71
+ } else if (children.every((c) => c.objects.length === c.size()))
72
+ // ONLY OBJECT TYPED INTERSECTION (DETAILED)
73
+ return false;
74
+
75
+ // VALIDATE EACH TYPES
76
+ const nonsensible = () => {
77
+ props.errors.push({
78
+ name: children.map((c) => c.getName()).join(" & "),
79
+ explore: { ...props.explore },
80
+ messages: ["nonsensible intersection"],
81
+ });
82
+ return true;
83
+ };
84
+ const individuals: (readonly [Metadata, number])[] = children
85
+ .map((child, i) => [child, i] as const)
86
+ .filter(
87
+ ([c]) =>
88
+ (c.size() === 1 &&
89
+ (c.atomics.length === 1 ||
90
+ (c.constants.length === 1 && c.constants[0]!.values.length === 1) ||
91
+ c.arrays.length === 1)) ||
92
+ c.templates.length === 1,
93
+ );
94
+ if (individuals.length !== 1) return nonsensible();
95
+
96
+ const objects: Metadata[] = children.filter(
97
+ (c) =>
98
+ c.nullable === false &&
99
+ c.isRequired() === true &&
100
+ c.objects.length &&
101
+ c.objects.length === c.size() &&
102
+ c.objects.every((o) => o.type.properties.every((p) => p.value.optional)),
103
+ );
104
+ const arrays: Set<string> = new Set(
105
+ individuals.map(([c]) => c.arrays.map((a) => a.type.name)).flat(),
106
+ );
107
+ const atomics: Set<"boolean" | "bigint" | "number" | "string"> = new Set(
108
+ individuals.map(([c]) => [...c.atomics.map((a) => a.type)]).flat(),
109
+ );
110
+ const constants: Metadata[] = individuals
111
+ .filter((i) => i[0].constants.length === 1)
112
+ .map(([m]) => m);
113
+ const templates: Metadata[] = individuals
114
+ .filter((i) => i[0].templates.length === 1)
115
+ .map(([m]) => m);
116
+
117
+ // ESCAPE WHEN ONLY CONSTANT TYPES EXIST
118
+ if (
119
+ atomics.size + constants.length + arrays.size + templates.length > 1 ||
120
+ individuals.length + objects.length !== children.length
121
+ )
122
+ return nonsensible();
123
+
124
+ // RE-GENERATE TYPE
125
+ const target: "boolean" | "bigint" | "number" | "string" | "array" =
126
+ arrays.size
127
+ ? "array"
128
+ : atomics.size
129
+ ? atomics.values().next().value!
130
+ : constants.length
131
+ ? constants[0]!.constants[0]!.type
132
+ : "string";
133
+ if (target === "array") {
134
+ const name: string = arrays.values().next().value!;
135
+ if (!props.metadata.arrays.some((a) => a.type.name === name)) {
136
+ iterate_metadata_array({
137
+ ...props,
138
+ type: props.type.types[
139
+ individuals.find((i) => i[0].arrays.length === 1)![1]
140
+ ]!,
141
+ explore: {
142
+ ...props.explore,
143
+ aliased: false,
144
+ escaped: false,
145
+ },
146
+ });
147
+ }
148
+ } else if (atomics.size)
149
+ ArrayUtil.add(
150
+ props.metadata.atomics,
151
+ MetadataAtomic.create({
152
+ type: atomics.values().next().value as "string",
153
+ tags: [],
154
+ }),
155
+ (a, b) => a.type === b.type,
156
+ );
157
+ else if (constants.length)
158
+ ArrayUtil.take(
159
+ ArrayUtil.take(
160
+ props.metadata.constants,
161
+ (o) => o.type === target,
162
+ () =>
163
+ MetadataConstant.create({
164
+ type: target,
165
+ values: [],
166
+ }),
167
+ ).values,
168
+ (o) => o.value === constants[0]!.constants[0]!.values[0]!.value,
169
+ () =>
170
+ MetadataConstantValue.create({
171
+ value: constants[0]!.constants[0]!.values[0]!.value,
172
+ tags: [],
173
+ }),
174
+ );
175
+ else if (templates.length)
176
+ ArrayUtil.take(
177
+ props.metadata.templates,
178
+ (o) => o.getBaseName() === templates[0]!.templates[0]!.getBaseName(),
179
+ () =>
180
+ MetadataTemplate.create({
181
+ row: templates[0]!.templates[0]!.row,
182
+ tags: [],
183
+ }),
184
+ );
185
+
186
+ // ASSIGN TAGS
187
+ if (objects.length) {
188
+ const tags: IMetadataTypeTag[] = MetadataTypeTagFactory.analyze({
189
+ errors: props.errors,
190
+ type: target,
191
+ objects: objects
192
+ .map((om) => om.objects)
193
+ .flat()
194
+ .map((om) => om.type),
195
+ explore: props.explore,
196
+ });
197
+ if (tags.length)
198
+ if (target === "array") props.metadata.arrays.at(-1)!.tags.push(tags);
199
+ else if (atomics.size)
200
+ props.metadata.atomics.find((a) => a.type === target)!.tags.push(tags);
201
+ else if (constants.length) {
202
+ const constant: MetadataConstant = props.metadata.constants.find(
203
+ (c) => c.type === target,
204
+ )!;
205
+ const value: MetadataConstantValue = constant.values.find(
206
+ (v) => v.value === constants[0]!.constants[0]!.values[0]!.value,
207
+ )!;
208
+ value.tags ??= [];
209
+ value.tags.push(tags);
210
+ } else if (templates.length) {
211
+ const template: MetadataTemplate = props.metadata.templates.find(
212
+ (t) => t.getBaseName() === templates[0]!.templates[0]!.getBaseName(),
213
+ )!;
214
+ template.tags ??= [];
215
+ template.tags.push(tags);
216
+ }
217
+ }
218
+ return true;
219
+ };
@@ -1,52 +1,52 @@
1
- import ts from "typescript";
2
-
3
- import { ArrayUtil } from "../../../utils/ArrayUtil";
4
-
5
- import { TypeFactory } from "../../TypeFactory";
6
- import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
7
- import { explore_metadata } from "./explore_metadata";
8
-
9
- export const iterate_metadata_map = (
10
- props: IMetadataIteratorProps,
11
- ): boolean => {
12
- const type: ts.Type = props.checker.getApparentType(props.type);
13
-
14
- const name: string = TypeFactory.getFullName({
15
- checker: props.checker,
16
- type,
17
- symbol: type.getSymbol(),
18
- });
19
- const generic: readonly ts.Type[] | undefined = type.aliasSymbol
20
- ? type.aliasTypeArguments
21
- : props.checker.getTypeArguments(type as ts.TypeReference);
22
- if (name.substring(0, 4) !== "Map<" || generic?.length !== 2) return false;
23
-
24
- const key: ts.Type = generic[0]!;
25
- const value: ts.Type = generic[1]!;
26
-
27
- ArrayUtil.set(
28
- props.metadata.maps,
29
- {
30
- key: explore_metadata({
31
- ...props,
32
- type: key,
33
- explore: {
34
- ...props.explore,
35
- escaped: false,
36
- aliased: false,
37
- },
38
- }),
39
- value: explore_metadata({
40
- ...props,
41
- type: value,
42
- explore: {
43
- ...props.explore,
44
- escaped: false,
45
- aliased: false,
46
- },
47
- }),
48
- },
49
- (elem) => `Map<${elem.key.getName()}, ${elem.value.getName()}>`,
50
- );
51
- return true;
52
- };
1
+ import ts from "typescript";
2
+
3
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
4
+
5
+ import { TypeFactory } from "../../TypeFactory";
6
+ import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
7
+ import { explore_metadata } from "./explore_metadata";
8
+
9
+ export const iterate_metadata_map = (
10
+ props: IMetadataIteratorProps,
11
+ ): boolean => {
12
+ const type: ts.Type = props.checker.getApparentType(props.type);
13
+
14
+ const name: string = TypeFactory.getFullName({
15
+ checker: props.checker,
16
+ type,
17
+ symbol: type.getSymbol(),
18
+ });
19
+ const generic: readonly ts.Type[] | undefined = type.aliasSymbol
20
+ ? type.aliasTypeArguments
21
+ : props.checker.getTypeArguments(type as ts.TypeReference);
22
+ if (name.substring(0, 4) !== "Map<" || generic?.length !== 2) return false;
23
+
24
+ const key: ts.Type = generic[0]!;
25
+ const value: ts.Type = generic[1]!;
26
+
27
+ ArrayUtil.set(
28
+ props.metadata.maps,
29
+ {
30
+ key: explore_metadata({
31
+ ...props,
32
+ type: key,
33
+ explore: {
34
+ ...props.explore,
35
+ escaped: false,
36
+ aliased: false,
37
+ },
38
+ }),
39
+ value: explore_metadata({
40
+ ...props,
41
+ type: value,
42
+ explore: {
43
+ ...props.explore,
44
+ escaped: false,
45
+ aliased: false,
46
+ },
47
+ }),
48
+ },
49
+ (elem) => `Map<${elem.key.getName()}, ${elem.value.getName()}>`,
50
+ );
51
+ return true;
52
+ };