typia 5.0.4 → 5.0.5-dev.20230921-2

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