typia 5.0.4 → 5.0.5-dev.20230921

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 (291) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/IRandomGenerator.ts +35 -35
  4. package/src/IValidation.ts +21 -21
  5. package/src/Primitive.ts +135 -135
  6. package/src/Resolved.ts +116 -116
  7. package/src/TypeGuardError.ts +36 -36
  8. package/src/executable/TypiaGenerateWizard.ts +85 -85
  9. package/src/executable/TypiaSetupWizard.ts +153 -153
  10. package/src/executable/setup/ArgumentParser.ts +45 -45
  11. package/src/executable/setup/CommandExecutor.ts +8 -8
  12. package/src/executable/setup/FileRetriever.ts +22 -22
  13. package/src/executable/setup/PackageManager.ts +71 -71
  14. package/src/executable/setup/PluginConfigurator.ts +70 -70
  15. package/src/executable/typia.ts +52 -52
  16. package/src/factories/CommentFactory.ts +84 -84
  17. package/src/factories/ExpressionFactory.ts +159 -159
  18. package/src/factories/IdentifierFactory.ts +74 -74
  19. package/src/factories/JsonMetadataFactory.ts +43 -43
  20. package/src/factories/LiteralFactory.ts +47 -47
  21. package/src/factories/MetadataCollection.ts +269 -269
  22. package/src/factories/MetadataCommentTagFactory.ts +629 -629
  23. package/src/factories/MetadataFactory.ts +214 -214
  24. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  25. package/src/factories/NumericRangeFactory.ts +33 -33
  26. package/src/factories/ProtobufFactory.ts +272 -272
  27. package/src/factories/StatementFactory.ts +72 -72
  28. package/src/factories/TemplateFactory.ts +58 -58
  29. package/src/factories/TypeFactory.ts +119 -119
  30. package/src/factories/ValueFactory.ts +12 -12
  31. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  32. package/src/factories/internal/metadata/emend_metadata_atomics.ts +40 -40
  33. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  34. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +41 -41
  35. package/src/factories/internal/metadata/emplace_metadata_object.ts +150 -150
  36. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +60 -60
  37. package/src/factories/internal/metadata/explore_metadata.ts +32 -32
  38. package/src/factories/internal/metadata/iterate_metadata.ts +101 -101
  39. package/src/factories/internal/metadata/iterate_metadata_alias.ts +35 -35
  40. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  41. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  42. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  43. package/src/factories/internal/metadata/iterate_metadata_collection.ts +141 -141
  44. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  45. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  46. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +197 -197
  47. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  48. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -210
  49. package/src/factories/internal/metadata/iterate_metadata_object.ts +44 -44
  50. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  51. package/src/factories/internal/metadata/iterate_metadata_set.ts +42 -42
  52. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  53. package/src/factories/internal/metadata/iterate_metadata_template.ts +47 -47
  54. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  55. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  56. package/src/functional/$ProtobufReader.ts +201 -201
  57. package/src/functional/$ProtobufSizer.ts +147 -147
  58. package/src/functional/$ProtobufWriter.ts +151 -151
  59. package/src/functional/$any.ts +4 -4
  60. package/src/functional/$clone.ts +4 -4
  61. package/src/functional/$dictionary.ts +25 -25
  62. package/src/functional/$every.ts +11 -11
  63. package/src/functional/$guard.ts +35 -35
  64. package/src/functional/$is_between.ts +2 -2
  65. package/src/functional/$join.ts +46 -46
  66. package/src/functional/$number.ts +13 -13
  67. package/src/functional/$report.ts +15 -15
  68. package/src/functional/$rest.ts +3 -3
  69. package/src/functional/$string.ts +50 -50
  70. package/src/functional/$strlen.ts +7 -7
  71. package/src/functional/$tail.ts +5 -5
  72. package/src/functional/$varint.ts +130 -130
  73. package/src/functional/$zigzag.ts +39 -39
  74. package/src/functional/IProtobufWriter.ts +18 -18
  75. package/src/functional/Namespace.ts +133 -133
  76. package/src/index.ts +4 -4
  77. package/src/json.ts +648 -648
  78. package/src/misc.ts +651 -651
  79. package/src/module.ts +656 -656
  80. package/src/programmers/AssertProgrammer.ts +317 -317
  81. package/src/programmers/CheckerProgrammer.ts +1137 -1137
  82. package/src/programmers/FeatureProgrammer.ts +478 -478
  83. package/src/programmers/IsProgrammer.ts +252 -252
  84. package/src/programmers/RandomProgrammer.ts +878 -878
  85. package/src/programmers/TypiaProgrammer.ts +163 -163
  86. package/src/programmers/ValidateProgrammer.ts +346 -346
  87. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  88. package/src/programmers/helpers/CloneJoiner.ts +144 -144
  89. package/src/programmers/helpers/FunctionImporeter.ts +91 -91
  90. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  91. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  92. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  93. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  94. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  95. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  96. package/src/programmers/helpers/RandomJoiner.ts +151 -151
  97. package/src/programmers/helpers/RandomRanger.ts +173 -173
  98. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  99. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  100. package/src/programmers/helpers/UnionExplorer.ts +305 -305
  101. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  102. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  103. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  104. package/src/programmers/internal/application_alias.ts +65 -65
  105. package/src/programmers/internal/application_array.ts +53 -53
  106. package/src/programmers/internal/application_boolean.ts +15 -15
  107. package/src/programmers/internal/application_constant.ts +26 -26
  108. package/src/programmers/internal/application_default.ts +17 -17
  109. package/src/programmers/internal/application_default_string.ts +37 -37
  110. package/src/programmers/internal/application_escaped.ts +55 -55
  111. package/src/programmers/internal/application_native.ts +39 -39
  112. package/src/programmers/internal/application_number.ts +88 -88
  113. package/src/programmers/internal/application_object.ts +162 -162
  114. package/src/programmers/internal/application_schema.ts +175 -175
  115. package/src/programmers/internal/application_string.ts +51 -51
  116. package/src/programmers/internal/application_templates.ts +25 -25
  117. package/src/programmers/internal/application_tuple.ts +58 -58
  118. package/src/programmers/internal/check_array_length.ts +41 -41
  119. package/src/programmers/internal/check_bigint.ts +45 -45
  120. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  121. package/src/programmers/internal/check_everything.ts +28 -28
  122. package/src/programmers/internal/check_native.ts +21 -21
  123. package/src/programmers/internal/check_number.ts +105 -105
  124. package/src/programmers/internal/check_object.ts +55 -55
  125. package/src/programmers/internal/check_string.ts +45 -45
  126. package/src/programmers/internal/check_template.ts +61 -61
  127. package/src/programmers/internal/check_union_array_like.ts +323 -323
  128. package/src/programmers/internal/decode_union_object.ts +84 -84
  129. package/src/programmers/internal/feature_object_entries.ts +58 -58
  130. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  131. package/src/programmers/internal/prune_object_properties.ts +60 -60
  132. package/src/programmers/internal/random_custom.ts +37 -37
  133. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  134. package/src/programmers/internal/stringify_native.ts +7 -7
  135. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  136. package/src/programmers/internal/template_to_pattern.ts +15 -15
  137. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  138. package/src/programmers/json/JsonApplicationProgrammer.ts +50 -50
  139. package/src/programmers/json/JsonAssertParseProgrammer.ts +71 -71
  140. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  141. package/src/programmers/json/JsonIsParseProgrammer.ts +77 -77
  142. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  143. package/src/programmers/json/JsonStringifyProgrammer.ts +964 -964
  144. package/src/programmers/json/JsonValidateParseProgrammer.ts +68 -68
  145. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  146. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  147. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  148. package/src/programmers/misc/MiscCloneProgrammer.ts +774 -774
  149. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  150. package/src/programmers/misc/MiscIsPruneProgrammer.ts +73 -73
  151. package/src/programmers/misc/MiscLiteralsProgrammer.ts +69 -69
  152. package/src/programmers/misc/MiscPruneProgrammer.ts +550 -550
  153. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  154. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  155. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  156. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  157. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +655 -655
  158. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +883 -883
  159. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -85
  160. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  161. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +165 -165
  162. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  163. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  164. package/src/protobuf.ts +881 -881
  165. package/src/schemas/json/IJsonApplication.ts +8 -8
  166. package/src/schemas/json/IJsonComponents.ts +33 -33
  167. package/src/schemas/json/IJsonSchema.ts +110 -110
  168. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  169. package/src/schemas/metadata/IMetadata.ts +34 -34
  170. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  171. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  172. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  173. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  174. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  175. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  176. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  177. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  178. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  179. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  180. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  181. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  182. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  183. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  184. package/src/schemas/metadata/IMetadataTypeTag.ts +8 -8
  185. package/src/schemas/metadata/Metadata.ts +685 -685
  186. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  187. package/src/schemas/metadata/MetadataArray.ts +49 -49
  188. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  189. package/src/schemas/metadata/MetadataAtomic.ts +42 -42
  190. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  191. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  192. package/src/schemas/metadata/MetadataObject.ts +139 -139
  193. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  194. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  195. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  196. package/src/tags/ExclusiveMaximum.ts +13 -13
  197. package/src/tags/ExclusiveMinimum.ts +13 -13
  198. package/src/tags/Format.ts +30 -30
  199. package/src/tags/MaxItems.ts +9 -9
  200. package/src/tags/MaxLength.ts +9 -9
  201. package/src/tags/Maximum.ts +13 -13
  202. package/src/tags/MinItems.ts +9 -9
  203. package/src/tags/MinLength.ts +9 -9
  204. package/src/tags/Minimum.ts +13 -13
  205. package/src/tags/MultipleOf.ts +15 -15
  206. package/src/tags/Pattern.ts +8 -8
  207. package/src/tags/TagBase.ts +68 -68
  208. package/src/tags/Type.ts +27 -27
  209. package/src/tags/index.ts +13 -13
  210. package/src/transform.ts +35 -35
  211. package/src/transformers/CallExpressionTransformer.ts +243 -243
  212. package/src/transformers/FileTransformer.ts +57 -57
  213. package/src/transformers/IProject.ts +15 -15
  214. package/src/transformers/ITransformOptions.ts +62 -62
  215. package/src/transformers/ImportTransformer.ts +66 -66
  216. package/src/transformers/NodeTransformer.ts +13 -13
  217. package/src/transformers/TransformerError.ts +55 -55
  218. package/src/transformers/features/AssertTransformer.ts +11 -11
  219. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  220. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  221. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  222. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  223. package/src/transformers/features/IsTransformer.ts +11 -11
  224. package/src/transformers/features/RandomTransformer.ts +46 -46
  225. package/src/transformers/features/ValidateTransformer.ts +11 -11
  226. package/src/transformers/features/json/JsonApplicationTransformer.ts +118 -118
  227. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  228. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  229. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  230. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  231. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  232. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  233. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  234. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  235. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  236. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  237. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  238. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  239. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  240. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  241. package/src/transformers/features/misc/MetadataTransformer.ts +61 -61
  242. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  243. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  244. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  245. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  246. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  247. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  248. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  249. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  250. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  251. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  252. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  253. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  254. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  255. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  256. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  257. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  258. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  259. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  260. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  261. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  262. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  263. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  264. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  265. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  266. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  267. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  268. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  269. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  270. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  271. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  272. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  273. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  274. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  275. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  276. package/src/transformers/internal/GenericTransformer.ts +104 -104
  277. package/src/typings/Atomic.ts +18 -18
  278. package/src/typings/ClassProperties.ts +5 -5
  279. package/src/typings/Customizable.ts +5 -5
  280. package/src/typings/OmitNever.ts +3 -3
  281. package/src/typings/ProtobufAtomic.ts +19 -19
  282. package/src/typings/SpecialFields.ts +3 -3
  283. package/src/typings/ValidationPipe.ts +9 -9
  284. package/src/typings/Writable.ts +11 -11
  285. package/src/utils/ArrayUtil.ts +45 -45
  286. package/src/utils/Escaper.ts +46 -46
  287. package/src/utils/MapUtil.ts +12 -12
  288. package/src/utils/NameEncoder.ts +32 -32
  289. package/src/utils/PatternUtil.ts +33 -33
  290. package/src/utils/RandomGenerator.ts +83 -83
  291. 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"];