typia 5.0.5 → 5.1.0-dev.20230922

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 (292) hide show
  1. package/lib/factories/MetadataCollection.js +25 -9
  2. package/lib/factories/MetadataCollection.js.map +1 -1
  3. package/package.json +1 -1
  4. package/src/IRandomGenerator.ts +35 -35
  5. package/src/IValidation.ts +21 -21
  6. package/src/Primitive.ts +135 -135
  7. package/src/Resolved.ts +116 -116
  8. package/src/TypeGuardError.ts +36 -36
  9. package/src/executable/TypiaGenerateWizard.ts +85 -85
  10. package/src/executable/TypiaSetupWizard.ts +153 -153
  11. package/src/executable/setup/ArgumentParser.ts +45 -45
  12. package/src/executable/setup/CommandExecutor.ts +8 -8
  13. package/src/executable/setup/FileRetriever.ts +22 -22
  14. package/src/executable/setup/PackageManager.ts +71 -71
  15. package/src/executable/setup/PluginConfigurator.ts +70 -70
  16. package/src/executable/typia.ts +52 -52
  17. package/src/factories/CommentFactory.ts +84 -84
  18. package/src/factories/ExpressionFactory.ts +159 -159
  19. package/src/factories/IdentifierFactory.ts +74 -74
  20. package/src/factories/JsonMetadataFactory.ts +43 -43
  21. package/src/factories/LiteralFactory.ts +47 -47
  22. package/src/factories/MetadataCollection.ts +274 -269
  23. package/src/factories/MetadataCommentTagFactory.ts +629 -629
  24. package/src/factories/MetadataFactory.ts +214 -214
  25. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  26. package/src/factories/NumericRangeFactory.ts +33 -33
  27. package/src/factories/ProtobufFactory.ts +272 -272
  28. package/src/factories/StatementFactory.ts +72 -72
  29. package/src/factories/TemplateFactory.ts +58 -58
  30. package/src/factories/TypeFactory.ts +119 -119
  31. package/src/factories/ValueFactory.ts +12 -12
  32. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  33. package/src/factories/internal/metadata/emend_metadata_atomics.ts +40 -40
  34. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  35. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +41 -41
  36. package/src/factories/internal/metadata/emplace_metadata_object.ts +150 -150
  37. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +60 -60
  38. package/src/factories/internal/metadata/explore_metadata.ts +32 -32
  39. package/src/factories/internal/metadata/iterate_metadata.ts +101 -101
  40. package/src/factories/internal/metadata/iterate_metadata_alias.ts +35 -35
  41. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  42. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  43. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  44. package/src/factories/internal/metadata/iterate_metadata_collection.ts +141 -141
  45. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  46. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  47. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +197 -197
  48. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  49. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -210
  50. package/src/factories/internal/metadata/iterate_metadata_object.ts +44 -44
  51. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  52. package/src/factories/internal/metadata/iterate_metadata_set.ts +42 -42
  53. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  54. package/src/factories/internal/metadata/iterate_metadata_template.ts +47 -47
  55. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  56. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  57. package/src/functional/$ProtobufReader.ts +201 -201
  58. package/src/functional/$ProtobufSizer.ts +147 -147
  59. package/src/functional/$ProtobufWriter.ts +151 -151
  60. package/src/functional/$any.ts +4 -4
  61. package/src/functional/$clone.ts +4 -4
  62. package/src/functional/$dictionary.ts +25 -25
  63. package/src/functional/$every.ts +11 -11
  64. package/src/functional/$guard.ts +35 -35
  65. package/src/functional/$is_between.ts +2 -2
  66. package/src/functional/$join.ts +46 -46
  67. package/src/functional/$number.ts +13 -13
  68. package/src/functional/$report.ts +15 -15
  69. package/src/functional/$rest.ts +3 -3
  70. package/src/functional/$string.ts +50 -50
  71. package/src/functional/$strlen.ts +7 -7
  72. package/src/functional/$tail.ts +5 -5
  73. package/src/functional/$varint.ts +130 -130
  74. package/src/functional/$zigzag.ts +39 -39
  75. package/src/functional/IProtobufWriter.ts +18 -18
  76. package/src/functional/Namespace.ts +133 -133
  77. package/src/index.ts +4 -4
  78. package/src/json.ts +648 -648
  79. package/src/misc.ts +651 -651
  80. package/src/module.ts +656 -656
  81. package/src/programmers/AssertProgrammer.ts +317 -317
  82. package/src/programmers/CheckerProgrammer.ts +1137 -1137
  83. package/src/programmers/FeatureProgrammer.ts +478 -478
  84. package/src/programmers/IsProgrammer.ts +252 -252
  85. package/src/programmers/RandomProgrammer.ts +878 -878
  86. package/src/programmers/TypiaProgrammer.ts +169 -169
  87. package/src/programmers/ValidateProgrammer.ts +346 -346
  88. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  89. package/src/programmers/helpers/CloneJoiner.ts +144 -144
  90. package/src/programmers/helpers/FunctionImporeter.ts +91 -91
  91. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  92. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  93. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  94. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  95. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  96. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  97. package/src/programmers/helpers/RandomJoiner.ts +151 -151
  98. package/src/programmers/helpers/RandomRanger.ts +173 -173
  99. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  100. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  101. package/src/programmers/helpers/UnionExplorer.ts +305 -305
  102. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  103. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  104. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  105. package/src/programmers/internal/application_alias.ts +65 -65
  106. package/src/programmers/internal/application_array.ts +53 -53
  107. package/src/programmers/internal/application_boolean.ts +15 -15
  108. package/src/programmers/internal/application_constant.ts +26 -26
  109. package/src/programmers/internal/application_default.ts +17 -17
  110. package/src/programmers/internal/application_default_string.ts +37 -37
  111. package/src/programmers/internal/application_escaped.ts +55 -55
  112. package/src/programmers/internal/application_native.ts +39 -39
  113. package/src/programmers/internal/application_number.ts +88 -88
  114. package/src/programmers/internal/application_object.ts +162 -162
  115. package/src/programmers/internal/application_schema.ts +175 -175
  116. package/src/programmers/internal/application_string.ts +51 -51
  117. package/src/programmers/internal/application_templates.ts +25 -25
  118. package/src/programmers/internal/application_tuple.ts +58 -58
  119. package/src/programmers/internal/check_array_length.ts +41 -41
  120. package/src/programmers/internal/check_bigint.ts +45 -45
  121. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  122. package/src/programmers/internal/check_everything.ts +28 -28
  123. package/src/programmers/internal/check_native.ts +21 -21
  124. package/src/programmers/internal/check_number.ts +105 -105
  125. package/src/programmers/internal/check_object.ts +55 -55
  126. package/src/programmers/internal/check_string.ts +45 -45
  127. package/src/programmers/internal/check_template.ts +61 -61
  128. package/src/programmers/internal/check_union_array_like.ts +323 -323
  129. package/src/programmers/internal/decode_union_object.ts +84 -84
  130. package/src/programmers/internal/feature_object_entries.ts +58 -58
  131. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  132. package/src/programmers/internal/prune_object_properties.ts +60 -60
  133. package/src/programmers/internal/random_custom.ts +37 -37
  134. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  135. package/src/programmers/internal/stringify_native.ts +7 -7
  136. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  137. package/src/programmers/internal/template_to_pattern.ts +15 -15
  138. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  139. package/src/programmers/json/JsonApplicationProgrammer.ts +50 -50
  140. package/src/programmers/json/JsonAssertParseProgrammer.ts +71 -71
  141. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  142. package/src/programmers/json/JsonIsParseProgrammer.ts +77 -77
  143. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  144. package/src/programmers/json/JsonStringifyProgrammer.ts +964 -964
  145. package/src/programmers/json/JsonValidateParseProgrammer.ts +68 -68
  146. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  147. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  148. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  149. package/src/programmers/misc/MiscCloneProgrammer.ts +774 -774
  150. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  151. package/src/programmers/misc/MiscIsPruneProgrammer.ts +73 -73
  152. package/src/programmers/misc/MiscLiteralsProgrammer.ts +69 -69
  153. package/src/programmers/misc/MiscPruneProgrammer.ts +550 -550
  154. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  155. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  156. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  157. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  158. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +655 -655
  159. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +883 -883
  160. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -85
  161. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  162. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +165 -165
  163. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  164. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  165. package/src/protobuf.ts +881 -881
  166. package/src/schemas/json/IJsonApplication.ts +8 -8
  167. package/src/schemas/json/IJsonComponents.ts +33 -33
  168. package/src/schemas/json/IJsonSchema.ts +110 -110
  169. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  170. package/src/schemas/metadata/IMetadata.ts +34 -34
  171. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  172. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  173. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  174. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  175. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  176. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  177. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  178. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  179. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  180. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  181. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  182. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  183. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  184. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  185. package/src/schemas/metadata/IMetadataTypeTag.ts +8 -8
  186. package/src/schemas/metadata/Metadata.ts +685 -685
  187. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  188. package/src/schemas/metadata/MetadataArray.ts +49 -49
  189. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  190. package/src/schemas/metadata/MetadataAtomic.ts +42 -42
  191. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  192. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  193. package/src/schemas/metadata/MetadataObject.ts +139 -139
  194. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  195. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  196. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  197. package/src/tags/ExclusiveMaximum.ts +13 -13
  198. package/src/tags/ExclusiveMinimum.ts +13 -13
  199. package/src/tags/Format.ts +30 -30
  200. package/src/tags/MaxItems.ts +9 -9
  201. package/src/tags/MaxLength.ts +9 -9
  202. package/src/tags/Maximum.ts +13 -13
  203. package/src/tags/MinItems.ts +9 -9
  204. package/src/tags/MinLength.ts +9 -9
  205. package/src/tags/Minimum.ts +13 -13
  206. package/src/tags/MultipleOf.ts +15 -15
  207. package/src/tags/Pattern.ts +8 -8
  208. package/src/tags/TagBase.ts +68 -68
  209. package/src/tags/Type.ts +27 -27
  210. package/src/tags/index.ts +13 -13
  211. package/src/transform.ts +35 -35
  212. package/src/transformers/CallExpressionTransformer.ts +243 -243
  213. package/src/transformers/FileTransformer.ts +57 -57
  214. package/src/transformers/IProject.ts +15 -15
  215. package/src/transformers/ITransformOptions.ts +62 -62
  216. package/src/transformers/ImportTransformer.ts +66 -66
  217. package/src/transformers/NodeTransformer.ts +13 -13
  218. package/src/transformers/TransformerError.ts +55 -55
  219. package/src/transformers/features/AssertTransformer.ts +11 -11
  220. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  221. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  222. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  223. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  224. package/src/transformers/features/IsTransformer.ts +11 -11
  225. package/src/transformers/features/RandomTransformer.ts +46 -46
  226. package/src/transformers/features/ValidateTransformer.ts +11 -11
  227. package/src/transformers/features/json/JsonApplicationTransformer.ts +118 -118
  228. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  229. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  230. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  231. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  232. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  233. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  234. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  235. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  236. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  237. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  238. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  239. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  240. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  241. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  242. package/src/transformers/features/misc/MetadataTransformer.ts +61 -61
  243. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  244. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  245. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  246. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  247. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  248. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  249. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  250. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  251. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  252. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  253. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  254. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  255. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  256. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  257. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  258. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  259. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  260. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  261. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  262. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  263. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  264. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  265. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  266. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  267. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  268. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  269. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  270. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  271. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  272. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  273. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  274. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  275. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  276. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  277. package/src/transformers/internal/GenericTransformer.ts +104 -104
  278. package/src/typings/Atomic.ts +18 -18
  279. package/src/typings/ClassProperties.ts +5 -5
  280. package/src/typings/Customizable.ts +5 -5
  281. package/src/typings/OmitNever.ts +3 -3
  282. package/src/typings/ProtobufAtomic.ts +19 -19
  283. package/src/typings/SpecialFields.ts +3 -3
  284. package/src/typings/ValidationPipe.ts +9 -9
  285. package/src/typings/Writable.ts +11 -11
  286. package/src/utils/ArrayUtil.ts +45 -45
  287. package/src/utils/Escaper.ts +46 -46
  288. package/src/utils/MapUtil.ts +12 -12
  289. package/src/utils/NameEncoder.ts +32 -32
  290. package/src/utils/PatternUtil.ts +33 -33
  291. package/src/utils/RandomGenerator.ts +83 -83
  292. package/src/utils/Singleton.ts +17 -17
@@ -1,313 +1,313 @@
1
- import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
2
- import { Metadata } from "../schemas/metadata/Metadata";
3
- import { MetadataObject } from "../schemas/metadata/MetadataObject";
4
- import { MetadataProperty } from "../schemas/metadata/MetadataProperty";
5
-
6
- import { MetadataFactory } from "./MetadataFactory";
7
-
8
- export namespace MetadataTypeTagFactory {
9
- export const analyze =
10
- (errors: MetadataFactory.IError[]) =>
11
- (type: "bigint" | "number" | "string" | "array") =>
12
- (
13
- objects: MetadataObject[],
14
- explore: MetadataFactory.IExplore,
15
- ): IMetadataTypeTag[] => {
16
- const messages: string[] = [];
17
- const report =
18
- (property: string | null) =>
19
- (msg: string): false => {
20
- messages.push(
21
- `the property ${
22
- property === null
23
- ? `["typia.tag"]`
24
- : `["typia.tag.${property}"]`
25
- } ${msg}.`,
26
- );
27
- return false;
28
- };
29
-
30
- //----
31
- // VALIDATION PROCESS
32
- //----
33
- const filtered: MetadataObject[] = objects.filter((obj) => {
34
- // ONLY ONE PROPERTY
35
- if (obj.properties.length !== 1) return false;
36
-
37
- // THE TAG.TYPE PROPERTY MUST BE
38
- const top: MetadataProperty = obj.properties[0]!;
39
- if (
40
- top.key.getSoleLiteral() !== "typia.tag" ||
41
- top.value.size() !== 1 ||
42
- top.value.objects.length !== 1
43
- )
44
- return false;
45
- else if (top.value.optional === false)
46
- return report(null)("must be optional object");
47
-
48
- // CHECK LIST OF PROPERTIES
49
- const tag: MetadataObject = top.value.objects[0]!;
50
- const statics: string[] = tag.properties
51
- .map((p) => p.key.getSoleLiteral()!)
52
- .filter((str) => str !== null);
53
- if (FIELDS.some((f) => !statics.includes(f)))
54
- return report(null)(
55
- `must have four properties - ${FIELDS.map(
56
- (str) => `'${str}'`,
57
- ).join(", ")}`,
58
- );
59
-
60
- const each: boolean[] = tag.properties.map((p) => {
61
- const key: string | null = p.key.getSoleLiteral();
62
- if (key === null) return true;
63
- else if (FIELDS.includes(key) === false) return true;
64
- return validate_property(report)(key, p.value);
65
- });
66
- return each.every((v) => v === true);
67
- });
68
- if (filtered.length === 0) return [];
69
-
70
- //----
71
- // CONSTRUCT TYPE TAGS
72
- //----
73
- // CREATE 1ST
74
- const tagList: Array<ITypeTag | null> = filtered.map(
75
- create_metadata_type_tag(report),
76
- );
77
-
78
- const output: IMetadataTypeTag[] = [];
79
- for (const tag of tagList)
80
- if (tag !== null)
81
- output.push({
82
- target: tag.target.some((str) => str === type)
83
- ? type
84
- : null!,
85
- name: tag.name,
86
- kind: tag.kind,
87
- value: tag.value,
88
- validate: tag.validate[type]!,
89
- exclusive: tag.exclusive,
90
- });
91
- validate(report)(type)(output);
92
-
93
- if (messages.length > 0) {
94
- errors.push({
95
- name: [type, ...objects.map((o) => o.name)].join(" & "),
96
- explore,
97
- messages,
98
- });
99
- return [];
100
- }
101
- return output;
102
- };
103
-
104
- export const validate =
105
- (report: (property: string | null) => (msg: string) => false) =>
106
- (type: "bigint" | "number" | "string" | "array") =>
107
- (tagList: IMetadataTypeTag[]): boolean => {
108
- let success: boolean = true;
109
- for (const tag of tagList)
110
- if (tag.target !== type) {
111
- success &&= report(null)(
112
- `target must constains ${type} type`,
113
- );
114
- }
115
-
116
- tagList.forEach((tag, i) => {
117
- if (tag.exclusive === false) return;
118
- else if (tag.exclusive === true) {
119
- const some: boolean = tagList.some(
120
- (opposite, j) => i !== j && opposite.kind === tag.kind,
121
- );
122
- if (some === true)
123
- success &&= report(null)(
124
- `kind '${tag.kind}' can't be duplicated`,
125
- );
126
- } else if (Array.isArray(tag.exclusive)) {
127
- const some: IMetadataTypeTag | undefined = tagList.find(
128
- (opposite, j) =>
129
- i !== j &&
130
- opposite.kind === tag.kind &&
131
- (tag.exclusive as string[]).includes(opposite.name),
132
- );
133
- if (some !== undefined)
134
- success ??= report(null)(
135
- `kind '${tag.kind}' can't be used with '${some.name}'`,
136
- );
137
- }
138
- });
139
- return success;
140
- };
141
-
142
- const validate_property =
143
- (report: (property: string | null) => (msg: string) => false) =>
144
- (key: string, value: Metadata): boolean => {
145
- if (
146
- // TARGET
147
- key === "target" &&
148
- (value.constants.length !== 1 ||
149
- value.constants[0]!.values.length !== value.size() ||
150
- value.constants[0]!.values.some(
151
- (v) =>
152
- v !== "bigint" &&
153
- v !== "number" &&
154
- v !== "string" &&
155
- v !== "array",
156
- ))
157
- )
158
- return report(key)(
159
- `must be one of 'bigint', 'number', 'string', 'array'`,
160
- );
161
- else if (
162
- // KIND
163
- key === "kind" &&
164
- (value.size() !== 1 ||
165
- value.constants.length !== 1 ||
166
- value.constants[0]!.type !== "string" ||
167
- value.constants[0]!.values.length !== 1)
168
- )
169
- return report(key)("must be a string literal type");
170
- else if (
171
- // VALUE
172
- key === "value" &&
173
- (value.size() > 1 ||
174
- (value.size() !== 0 &&
175
- (value.constants.length !== 1 ||
176
- value.constants[0]!.values.length !== 1)))
177
- )
178
- return report(key)(
179
- "must be a constant literal type or undefined value",
180
- );
181
- else if (key === "exclusive")
182
- return get_exclusive(report)(key)(value) !== null;
183
- else if (key === "validate") {
184
- //----
185
- // VALIDATE
186
- //----
187
- // STRING CASE
188
- const single: boolean =
189
- value.size() === 1 &&
190
- value.constants.length === 1 &&
191
- value.constants[0]!.type === "string" &&
192
- value.constants[0]!.values.length === 1;
193
- if (single === true) return true;
194
-
195
- // RECORD<TARGET, STRING>
196
- const target: string[] | undefined =
197
- value.objects[0]?.properties
198
- .map((p) => p.key.getSoleLiteral()!)
199
- .filter((str) => str !== null) as string[] | undefined;
200
- if (target === undefined)
201
- return report("target")(
202
- `must be one of 'bigint', 'number', 'string', 'array'`,
203
- );
204
- const variadic: boolean =
205
- value.size() === 1 &&
206
- value.objects.length === 1 &&
207
- value.objects[0]!.properties.every(
208
- (vp) =>
209
- vp.value.size() === 1 &&
210
- vp.value.isRequired() &&
211
- vp.value.nullable === false &&
212
- vp.value.constants.length === 1 &&
213
- vp.value.constants[0]!.type === "string" &&
214
- vp.value.constants[0]!.values.length === 1 &&
215
- target.includes(vp.key.getSoleLiteral()!),
216
- );
217
- if (variadic === false)
218
- return report(key)(
219
- `must be a string literal type or Record<Target, string> type.`,
220
- );
221
- }
222
- return true;
223
- };
224
-
225
- const create_metadata_type_tag =
226
- (report: (property: string | null) => (msg: string) => false) =>
227
- (obj: MetadataObject): ITypeTag | null => {
228
- const find = (key: string): MetadataProperty | undefined =>
229
- obj.properties[0]?.value.objects[0]?.properties.find(
230
- (p) => p.key.getSoleLiteral() === key,
231
- );
232
-
233
- const target = find("target")!.value.constants[0]!
234
- .values as ITypeTag["target"];
235
- const kind: string = find("kind")!.value.constants[0]!
236
- .values[0] as string;
237
- const value: boolean | bigint | number | string | undefined =
238
- find("value")?.value.constants[0]?.values[0];
239
- const exclusive: string[] | boolean | null = get_exclusive(report)(
240
- "exclusive",
241
- )(find("exclusive")?.value);
242
- if (exclusive === null) return null;
243
-
244
- const validate: Record<string, string> = (() => {
245
- const validate = find("validate")!.value;
246
- if (validate.constants.length)
247
- return Object.fromEntries(
248
- target.map((t) => [
249
- t,
250
- validate.constants[0]!.values[0] as string,
251
- ]),
252
- );
253
- return Object.fromEntries(
254
- validate.objects[0]!.properties.map((p) => [
255
- p.key.getSoleLiteral()!,
256
- p.value.constants[0]!.values[0]! as string,
257
- ]),
258
- );
259
- })();
260
-
261
- return {
262
- name: obj.name,
263
- target,
264
- kind,
265
- value,
266
- validate,
267
- exclusive: exclusive ?? false,
268
- };
269
- };
270
-
271
- const get_exclusive =
272
- (report: (property: string | null) => (msg: string) => false) =>
273
- (key: string) =>
274
- (value: Metadata | undefined): boolean | string[] | null => {
275
- if (value === undefined) return false;
276
- else if (
277
- value.size() === 1 &&
278
- value.constants.length === 1 &&
279
- value.constants[0]!.type === "boolean" &&
280
- value.constants[0]!.values.length === 1
281
- )
282
- return value.constants[0]!.values[0]! as boolean;
283
- else if (
284
- value.size() === 1 &&
285
- value.tuples.length === 1 &&
286
- value.tuples[0]!.type.elements.every(
287
- (elem) =>
288
- elem.size() === 1 &&
289
- elem.constants.length === 1 &&
290
- elem.constants[0]!.type === "string" &&
291
- elem.constants[0]!.values.length === 1,
292
- )
293
- )
294
- return value.tuples[0]!.type.elements.map(
295
- (elem) => elem.constants[0]!.values[0]! as string,
296
- );
297
- report(key)(
298
- "must a boolean literal type or a tuple of string literal types.",
299
- );
300
- return null;
301
- };
302
- }
303
-
304
- interface ITypeTag {
305
- name: string;
306
- target: Array<"bigint" | "number" | "string" | "array">;
307
- kind: string;
308
- value?: boolean | bigint | number | string;
309
- validate: Record<string, string>;
310
- exclusive: boolean | string[];
311
- }
312
-
313
- const FIELDS = ["target", "kind", "value", "validate"];
1
+ import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
2
+ import { Metadata } from "../schemas/metadata/Metadata";
3
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
4
+ import { MetadataProperty } from "../schemas/metadata/MetadataProperty";
5
+
6
+ import { MetadataFactory } from "./MetadataFactory";
7
+
8
+ export namespace MetadataTypeTagFactory {
9
+ export const analyze =
10
+ (errors: MetadataFactory.IError[]) =>
11
+ (type: "bigint" | "number" | "string" | "array") =>
12
+ (
13
+ objects: MetadataObject[],
14
+ explore: MetadataFactory.IExplore,
15
+ ): IMetadataTypeTag[] => {
16
+ const messages: string[] = [];
17
+ const report =
18
+ (property: string | null) =>
19
+ (msg: string): false => {
20
+ messages.push(
21
+ `the property ${
22
+ property === null
23
+ ? `["typia.tag"]`
24
+ : `["typia.tag.${property}"]`
25
+ } ${msg}.`,
26
+ );
27
+ return false;
28
+ };
29
+
30
+ //----
31
+ // VALIDATION PROCESS
32
+ //----
33
+ const filtered: MetadataObject[] = objects.filter((obj) => {
34
+ // ONLY ONE PROPERTY
35
+ if (obj.properties.length !== 1) return false;
36
+
37
+ // THE TAG.TYPE PROPERTY MUST BE
38
+ const top: MetadataProperty = obj.properties[0]!;
39
+ if (
40
+ top.key.getSoleLiteral() !== "typia.tag" ||
41
+ top.value.size() !== 1 ||
42
+ top.value.objects.length !== 1
43
+ )
44
+ return false;
45
+ else if (top.value.optional === false)
46
+ return report(null)("must be optional object");
47
+
48
+ // CHECK LIST OF PROPERTIES
49
+ const tag: MetadataObject = top.value.objects[0]!;
50
+ const statics: string[] = tag.properties
51
+ .map((p) => p.key.getSoleLiteral()!)
52
+ .filter((str) => str !== null);
53
+ if (FIELDS.some((f) => !statics.includes(f)))
54
+ return report(null)(
55
+ `must have four properties - ${FIELDS.map(
56
+ (str) => `'${str}'`,
57
+ ).join(", ")}`,
58
+ );
59
+
60
+ const each: boolean[] = tag.properties.map((p) => {
61
+ const key: string | null = p.key.getSoleLiteral();
62
+ if (key === null) return true;
63
+ else if (FIELDS.includes(key) === false) return true;
64
+ return validate_property(report)(key, p.value);
65
+ });
66
+ return each.every((v) => v === true);
67
+ });
68
+ if (filtered.length === 0) return [];
69
+
70
+ //----
71
+ // CONSTRUCT TYPE TAGS
72
+ //----
73
+ // CREATE 1ST
74
+ const tagList: Array<ITypeTag | null> = filtered.map(
75
+ create_metadata_type_tag(report),
76
+ );
77
+
78
+ const output: IMetadataTypeTag[] = [];
79
+ for (const tag of tagList)
80
+ if (tag !== null)
81
+ output.push({
82
+ target: tag.target.some((str) => str === type)
83
+ ? type
84
+ : null!,
85
+ name: tag.name,
86
+ kind: tag.kind,
87
+ value: tag.value,
88
+ validate: tag.validate[type]!,
89
+ exclusive: tag.exclusive,
90
+ });
91
+ validate(report)(type)(output);
92
+
93
+ if (messages.length > 0) {
94
+ errors.push({
95
+ name: [type, ...objects.map((o) => o.name)].join(" & "),
96
+ explore,
97
+ messages,
98
+ });
99
+ return [];
100
+ }
101
+ return output;
102
+ };
103
+
104
+ export const validate =
105
+ (report: (property: string | null) => (msg: string) => false) =>
106
+ (type: "bigint" | "number" | "string" | "array") =>
107
+ (tagList: IMetadataTypeTag[]): boolean => {
108
+ let success: boolean = true;
109
+ for (const tag of tagList)
110
+ if (tag.target !== type) {
111
+ success &&= report(null)(
112
+ `target must constains ${type} type`,
113
+ );
114
+ }
115
+
116
+ tagList.forEach((tag, i) => {
117
+ if (tag.exclusive === false) return;
118
+ else if (tag.exclusive === true) {
119
+ const some: boolean = tagList.some(
120
+ (opposite, j) => i !== j && opposite.kind === tag.kind,
121
+ );
122
+ if (some === true)
123
+ success &&= report(null)(
124
+ `kind '${tag.kind}' can't be duplicated`,
125
+ );
126
+ } else if (Array.isArray(tag.exclusive)) {
127
+ const some: IMetadataTypeTag | undefined = tagList.find(
128
+ (opposite, j) =>
129
+ i !== j &&
130
+ opposite.kind === tag.kind &&
131
+ (tag.exclusive as string[]).includes(opposite.name),
132
+ );
133
+ if (some !== undefined)
134
+ success ??= report(null)(
135
+ `kind '${tag.kind}' can't be used with '${some.name}'`,
136
+ );
137
+ }
138
+ });
139
+ return success;
140
+ };
141
+
142
+ const validate_property =
143
+ (report: (property: string | null) => (msg: string) => false) =>
144
+ (key: string, value: Metadata): boolean => {
145
+ if (
146
+ // TARGET
147
+ key === "target" &&
148
+ (value.constants.length !== 1 ||
149
+ value.constants[0]!.values.length !== value.size() ||
150
+ value.constants[0]!.values.some(
151
+ (v) =>
152
+ v !== "bigint" &&
153
+ v !== "number" &&
154
+ v !== "string" &&
155
+ v !== "array",
156
+ ))
157
+ )
158
+ return report(key)(
159
+ `must be one of 'bigint', 'number', 'string', 'array'`,
160
+ );
161
+ else if (
162
+ // KIND
163
+ key === "kind" &&
164
+ (value.size() !== 1 ||
165
+ value.constants.length !== 1 ||
166
+ value.constants[0]!.type !== "string" ||
167
+ value.constants[0]!.values.length !== 1)
168
+ )
169
+ return report(key)("must be a string literal type");
170
+ else if (
171
+ // VALUE
172
+ key === "value" &&
173
+ (value.size() > 1 ||
174
+ (value.size() !== 0 &&
175
+ (value.constants.length !== 1 ||
176
+ value.constants[0]!.values.length !== 1)))
177
+ )
178
+ return report(key)(
179
+ "must be a constant literal type or undefined value",
180
+ );
181
+ else if (key === "exclusive")
182
+ return get_exclusive(report)(key)(value) !== null;
183
+ else if (key === "validate") {
184
+ //----
185
+ // VALIDATE
186
+ //----
187
+ // STRING CASE
188
+ const single: boolean =
189
+ value.size() === 1 &&
190
+ value.constants.length === 1 &&
191
+ value.constants[0]!.type === "string" &&
192
+ value.constants[0]!.values.length === 1;
193
+ if (single === true) return true;
194
+
195
+ // RECORD<TARGET, STRING>
196
+ const target: string[] | undefined =
197
+ value.objects[0]?.properties
198
+ .map((p) => p.key.getSoleLiteral()!)
199
+ .filter((str) => str !== null) as string[] | undefined;
200
+ if (target === undefined)
201
+ return report("target")(
202
+ `must be one of 'bigint', 'number', 'string', 'array'`,
203
+ );
204
+ const variadic: boolean =
205
+ value.size() === 1 &&
206
+ value.objects.length === 1 &&
207
+ value.objects[0]!.properties.every(
208
+ (vp) =>
209
+ vp.value.size() === 1 &&
210
+ vp.value.isRequired() &&
211
+ vp.value.nullable === false &&
212
+ vp.value.constants.length === 1 &&
213
+ vp.value.constants[0]!.type === "string" &&
214
+ vp.value.constants[0]!.values.length === 1 &&
215
+ target.includes(vp.key.getSoleLiteral()!),
216
+ );
217
+ if (variadic === false)
218
+ return report(key)(
219
+ `must be a string literal type or Record<Target, string> type.`,
220
+ );
221
+ }
222
+ return true;
223
+ };
224
+
225
+ const create_metadata_type_tag =
226
+ (report: (property: string | null) => (msg: string) => false) =>
227
+ (obj: MetadataObject): ITypeTag | null => {
228
+ const find = (key: string): MetadataProperty | undefined =>
229
+ obj.properties[0]?.value.objects[0]?.properties.find(
230
+ (p) => p.key.getSoleLiteral() === key,
231
+ );
232
+
233
+ const target = find("target")!.value.constants[0]!
234
+ .values as ITypeTag["target"];
235
+ const kind: string = find("kind")!.value.constants[0]!
236
+ .values[0] as string;
237
+ const value: boolean | bigint | number | string | undefined =
238
+ find("value")?.value.constants[0]?.values[0];
239
+ const exclusive: string[] | boolean | null = get_exclusive(report)(
240
+ "exclusive",
241
+ )(find("exclusive")?.value);
242
+ if (exclusive === null) return null;
243
+
244
+ const validate: Record<string, string> = (() => {
245
+ const validate = find("validate")!.value;
246
+ if (validate.constants.length)
247
+ return Object.fromEntries(
248
+ target.map((t) => [
249
+ t,
250
+ validate.constants[0]!.values[0] as string,
251
+ ]),
252
+ );
253
+ return Object.fromEntries(
254
+ validate.objects[0]!.properties.map((p) => [
255
+ p.key.getSoleLiteral()!,
256
+ p.value.constants[0]!.values[0]! as string,
257
+ ]),
258
+ );
259
+ })();
260
+
261
+ return {
262
+ name: obj.name,
263
+ target,
264
+ kind,
265
+ value,
266
+ validate,
267
+ exclusive: exclusive ?? false,
268
+ };
269
+ };
270
+
271
+ const get_exclusive =
272
+ (report: (property: string | null) => (msg: string) => false) =>
273
+ (key: string) =>
274
+ (value: Metadata | undefined): boolean | string[] | null => {
275
+ if (value === undefined) return false;
276
+ else if (
277
+ value.size() === 1 &&
278
+ value.constants.length === 1 &&
279
+ value.constants[0]!.type === "boolean" &&
280
+ value.constants[0]!.values.length === 1
281
+ )
282
+ return value.constants[0]!.values[0]! as boolean;
283
+ else if (
284
+ value.size() === 1 &&
285
+ value.tuples.length === 1 &&
286
+ value.tuples[0]!.type.elements.every(
287
+ (elem) =>
288
+ elem.size() === 1 &&
289
+ elem.constants.length === 1 &&
290
+ elem.constants[0]!.type === "string" &&
291
+ elem.constants[0]!.values.length === 1,
292
+ )
293
+ )
294
+ return value.tuples[0]!.type.elements.map(
295
+ (elem) => elem.constants[0]!.values[0]! as string,
296
+ );
297
+ report(key)(
298
+ "must a boolean literal type or a tuple of string literal types.",
299
+ );
300
+ return null;
301
+ };
302
+ }
303
+
304
+ interface ITypeTag {
305
+ name: string;
306
+ target: Array<"bigint" | "number" | "string" | "array">;
307
+ kind: string;
308
+ value?: boolean | bigint | number | string;
309
+ validate: Record<string, string>;
310
+ exclusive: boolean | string[];
311
+ }
312
+
313
+ const FIELDS = ["target", "kind", "value", "validate"];