typia 4.0.0-dev.20230604 → 4.0.0-dev.20230605

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 (290) hide show
  1. package/lib/executable/TypiaGenerateWizard.js +1 -1
  2. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  3. package/lib/executable/TypiaSetupWizard.js +1 -1
  4. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  5. package/lib/executable/setup/ArgumentParser.js +1 -1
  6. package/lib/executable/setup/ArgumentParser.js.map +1 -1
  7. package/lib/executable/setup/CommandExecutor.js +1 -1
  8. package/lib/executable/setup/CommandExecutor.js.map +1 -1
  9. package/lib/executable/setup/FileRetriever.js +1 -1
  10. package/lib/executable/setup/FileRetriever.js.map +1 -1
  11. package/lib/executable/setup/PluginConfigurator.js +1 -1
  12. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  13. package/lib/factories/CommentFactory.js +1 -1
  14. package/lib/factories/CommentFactory.js.map +1 -1
  15. package/lib/factories/ExpressionFactory.js +1 -1
  16. package/lib/factories/ExpressionFactory.js.map +1 -1
  17. package/lib/factories/IdentifierFactory.js +1 -1
  18. package/lib/factories/IdentifierFactory.js.map +1 -1
  19. package/lib/factories/LiteralFactory.js +1 -1
  20. package/lib/factories/LiteralFactory.js.map +1 -1
  21. package/lib/factories/MetadataCollection.js +1 -2
  22. package/lib/factories/MetadataCollection.js.map +1 -1
  23. package/lib/factories/MetadataFactory.js +1 -1
  24. package/lib/factories/MetadataFactory.js.map +1 -1
  25. package/lib/factories/MetadataTagFactory.js +4 -2
  26. package/lib/factories/MetadataTagFactory.js.map +1 -1
  27. package/lib/factories/StatementFactory.js +1 -1
  28. package/lib/factories/StatementFactory.js.map +1 -1
  29. package/lib/factories/TemplateFactory.js +1 -1
  30. package/lib/factories/TemplateFactory.js.map +1 -1
  31. package/lib/factories/TypeFactory.js +1 -1
  32. package/lib/factories/TypeFactory.js.map +1 -1
  33. package/lib/factories/ValueFactory.js +1 -1
  34. package/lib/factories/ValueFactory.js.map +1 -1
  35. package/lib/factories/internal/metadata/MetadataHelper.js +1 -1
  36. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  37. package/lib/factories/internal/metadata/iterate_metadata_array.js +1 -2
  38. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  39. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  40. package/lib/functional/Namespace.js +1 -1
  41. package/lib/functional/Namespace.js.map +1 -1
  42. package/lib/metadata/Metadata.js +1 -2
  43. package/lib/metadata/Metadata.js.map +1 -1
  44. package/lib/metadata/MetadataObject.js +1 -2
  45. package/lib/metadata/MetadataObject.js.map +1 -1
  46. package/lib/programmers/ApplicationProgrammer.js +1 -1
  47. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  48. package/lib/programmers/AssertCloneProgrammer.js +1 -1
  49. package/lib/programmers/AssertCloneProgrammer.js.map +1 -1
  50. package/lib/programmers/AssertParseProgrammer.js +1 -1
  51. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  52. package/lib/programmers/AssertProgrammer.js +1 -1
  53. package/lib/programmers/AssertProgrammer.js.map +1 -1
  54. package/lib/programmers/AssertPruneProgrammer.js +1 -1
  55. package/lib/programmers/AssertPruneProgrammer.js.map +1 -1
  56. package/lib/programmers/AssertStringifyProgrammer.js +1 -1
  57. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  58. package/lib/programmers/CheckerProgrammer.js +1 -1
  59. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  60. package/lib/programmers/CloneProgrammer.js +1 -1
  61. package/lib/programmers/CloneProgrammer.js.map +1 -1
  62. package/lib/programmers/FeatureProgrammer.js +1 -1
  63. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  64. package/lib/programmers/IsCloneProgrammer.js +1 -1
  65. package/lib/programmers/IsCloneProgrammer.js.map +1 -1
  66. package/lib/programmers/IsParseProgrammer.js +1 -1
  67. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  68. package/lib/programmers/IsProgrammer.js +1 -1
  69. package/lib/programmers/IsProgrammer.js.map +1 -1
  70. package/lib/programmers/IsPruneProgrammer.js +1 -1
  71. package/lib/programmers/IsPruneProgrammer.js.map +1 -1
  72. package/lib/programmers/IsStringifyProgrammer.js +1 -1
  73. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  74. package/lib/programmers/LiteralsProgrammer.js +1 -1
  75. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  76. package/lib/programmers/PruneProgrammer.js +1 -1
  77. package/lib/programmers/PruneProgrammer.js.map +1 -1
  78. package/lib/programmers/RandomProgrammer.js +1 -1
  79. package/lib/programmers/RandomProgrammer.js.map +1 -1
  80. package/lib/programmers/StringifyProgrammer.js +1 -1
  81. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  82. package/lib/programmers/TypiaProgrammer.js +1 -1
  83. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  84. package/lib/programmers/ValidateCloneProgrammer.js +1 -1
  85. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -1
  86. package/lib/programmers/ValidateParseProgrammer.js +1 -1
  87. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  88. package/lib/programmers/ValidateProgrammer.js +1 -1
  89. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  90. package/lib/programmers/ValidatePruneProgrammer.js +1 -1
  91. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -1
  92. package/lib/programmers/ValidateStringifyProgrammer.js +1 -1
  93. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  94. package/lib/programmers/helpers/AtomicPredicator.js +1 -1
  95. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  96. package/lib/programmers/helpers/CloneJoiner.js +1 -1
  97. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  98. package/lib/programmers/helpers/OptionPredicator.js +1 -1
  99. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  100. package/lib/programmers/helpers/PruneJoiner.js +1 -1
  101. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  102. package/lib/programmers/helpers/RandomJoiner.js +1 -1
  103. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  104. package/lib/programmers/helpers/RandomRanger.js +1 -1
  105. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  106. package/lib/programmers/helpers/StringifyJoinder.js +1 -1
  107. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  108. package/lib/programmers/helpers/StringifyPredicator.js +1 -1
  109. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  110. package/lib/programmers/helpers/UnionExplorer.js +1 -1
  111. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  112. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  113. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  114. package/lib/programmers/internal/application_number.js +4 -1
  115. package/lib/programmers/internal/application_number.js.map +1 -1
  116. package/lib/transformers/CallExpressionTransformer.js +1 -1
  117. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  118. package/lib/transformers/FileTransformer.js +1 -1
  119. package/lib/transformers/FileTransformer.js.map +1 -1
  120. package/lib/transformers/ImportTransformer.js +1 -1
  121. package/lib/transformers/ImportTransformer.js.map +1 -1
  122. package/lib/transformers/NodeTransformer.js +1 -1
  123. package/lib/transformers/NodeTransformer.js.map +1 -1
  124. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -1
  125. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  126. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js +1 -1
  127. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js.map +1 -1
  128. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js +1 -1
  129. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js.map +1 -1
  130. package/lib/transformers/features/miscellaneous/CloneTransformer.js +1 -1
  131. package/lib/transformers/features/miscellaneous/CloneTransformer.js.map +1 -1
  132. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js +1 -1
  133. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js.map +1 -1
  134. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js +1 -1
  135. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js.map +1 -1
  136. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js +1 -1
  137. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js.map +1 -1
  138. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js +1 -1
  139. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js.map +1 -1
  140. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js +1 -1
  141. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js.map +1 -1
  142. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js +1 -1
  143. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js.map +1 -1
  144. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js +1 -1
  145. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js.map +1 -1
  146. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js +1 -1
  147. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js.map +1 -1
  148. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js +1 -1
  149. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js.map +1 -1
  150. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js +1 -1
  151. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js.map +1 -1
  152. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js +1 -1
  153. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js.map +1 -1
  154. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js +1 -1
  155. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js.map +1 -1
  156. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +1 -1
  157. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  158. package/lib/transformers/features/miscellaneous/PruneTransformer.js +1 -1
  159. package/lib/transformers/features/miscellaneous/PruneTransformer.js.map +1 -1
  160. package/lib/transformers/features/miscellaneous/RandomTransformer.js +1 -1
  161. package/lib/transformers/features/miscellaneous/RandomTransformer.js.map +1 -1
  162. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js +1 -1
  163. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js.map +1 -1
  164. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js +1 -1
  165. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js.map +1 -1
  166. package/lib/transformers/features/parsers/AssertParseTransformer.js +1 -1
  167. package/lib/transformers/features/parsers/AssertParseTransformer.js.map +1 -1
  168. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js +1 -1
  169. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js.map +1 -1
  170. package/lib/transformers/features/parsers/CreateIsParseTransformer.js +1 -1
  171. package/lib/transformers/features/parsers/CreateIsParseTransformer.js.map +1 -1
  172. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js +1 -1
  173. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js.map +1 -1
  174. package/lib/transformers/features/parsers/IsParseTransformer.js +1 -1
  175. package/lib/transformers/features/parsers/IsParseTransformer.js.map +1 -1
  176. package/lib/transformers/features/parsers/ValidateParseTransformer.js +1 -1
  177. package/lib/transformers/features/parsers/ValidateParseTransformer.js.map +1 -1
  178. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js +1 -1
  179. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js.map +1 -1
  180. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js +1 -1
  181. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js.map +1 -1
  182. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js +1 -1
  183. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js.map +1 -1
  184. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js +1 -1
  185. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js.map +1 -1
  186. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js +1 -1
  187. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js.map +1 -1
  188. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js +1 -1
  189. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js.map +1 -1
  190. package/lib/transformers/features/stringifiers/StringifyTransformer.js +1 -1
  191. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -1
  192. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js +1 -1
  193. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js.map +1 -1
  194. package/lib/transformers/features/validators/AssertTransformer.js +1 -1
  195. package/lib/transformers/features/validators/AssertTransformer.js.map +1 -1
  196. package/lib/transformers/features/validators/CreateAssertTransformer.js +1 -1
  197. package/lib/transformers/features/validators/CreateAssertTransformer.js.map +1 -1
  198. package/lib/transformers/features/validators/CreateIsTransformer.js +1 -1
  199. package/lib/transformers/features/validators/CreateIsTransformer.js.map +1 -1
  200. package/lib/transformers/features/validators/CreateValidateTransformer.js +1 -1
  201. package/lib/transformers/features/validators/CreateValidateTransformer.js.map +1 -1
  202. package/lib/transformers/features/validators/IsTransformer.js +1 -1
  203. package/lib/transformers/features/validators/IsTransformer.js.map +1 -1
  204. package/lib/transformers/features/validators/ValidateTransformer.js +1 -1
  205. package/lib/transformers/features/validators/ValidateTransformer.js.map +1 -1
  206. package/lib/transformers/internal/GenericTransformer.js +1 -1
  207. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  208. package/lib/utils/ArrayUtil.js +1 -1
  209. package/lib/utils/ArrayUtil.js.map +1 -1
  210. package/lib/utils/Escaper.js +1 -1
  211. package/lib/utils/Escaper.js.map +1 -1
  212. package/lib/utils/MapUtil.js +1 -1
  213. package/lib/utils/MapUtil.js.map +1 -1
  214. package/lib/utils/PatternUtil.js +1 -1
  215. package/lib/utils/PatternUtil.js.map +1 -1
  216. package/lib/utils/RandomGenerator.js +1 -1
  217. package/lib/utils/RandomGenerator.js.map +1 -1
  218. package/package.json +3 -3
  219. package/src/IRandomGenerator.ts +34 -34
  220. package/src/factories/IdentifierFactory.ts +65 -65
  221. package/src/factories/MetadataCollection.ts +254 -254
  222. package/src/factories/MetadataFactory.ts +40 -40
  223. package/src/factories/MetadataTagFactory.ts +300 -298
  224. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  225. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -35
  226. package/src/factories/internal/metadata/emplace_metadata_object.ts +142 -142
  227. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  228. package/src/factories/internal/metadata/explore_metadata.ts +66 -66
  229. package/src/factories/internal/metadata/iterate_metadata.ts +77 -77
  230. package/src/factories/internal/metadata/iterate_metadata_array.ts +25 -29
  231. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -130
  232. package/src/factories/internal/metadata/iterate_metadata_definition.ts +30 -30
  233. package/src/factories/internal/metadata/iterate_metadata_object.ts +49 -49
  234. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -68
  235. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -25
  236. package/src/factories/internal/metadata/iterate_metadata_union.ts +68 -68
  237. package/src/metadata/IMetadata.ts +27 -27
  238. package/src/metadata/IMetadataAlias.ts +12 -12
  239. package/src/metadata/IMetadataApplication.ts +7 -7
  240. package/src/metadata/IMetadataArray.ts +10 -10
  241. package/src/metadata/IMetadataCollection.ts +11 -11
  242. package/src/metadata/IMetadataDictionary.ts +14 -14
  243. package/src/metadata/IMetadataObject.ts +18 -18
  244. package/src/metadata/IMetadataProperty.ts +11 -11
  245. package/src/metadata/IMetadataTuple.ts +10 -10
  246. package/src/metadata/Metadata.ts +585 -585
  247. package/src/metadata/MetadataAlias.ts +61 -61
  248. package/src/metadata/MetadataArray.ts +52 -52
  249. package/src/metadata/MetadataObject.ts +114 -114
  250. package/src/metadata/MetadataProperty.ts +64 -64
  251. package/src/metadata/MetadataTuple.ts +53 -53
  252. package/src/programmers/ApplicationProgrammer.ts +55 -55
  253. package/src/programmers/AssertProgrammer.ts +291 -291
  254. package/src/programmers/CheckerProgrammer.ts +1182 -1182
  255. package/src/programmers/CloneProgrammer.ts +595 -595
  256. package/src/programmers/FeatureProgrammer.ts +495 -495
  257. package/src/programmers/IsProgrammer.ts +250 -250
  258. package/src/programmers/LiteralsProgrammer.ts +66 -66
  259. package/src/programmers/PruneProgrammer.ts +550 -550
  260. package/src/programmers/RandomProgrammer.ts +589 -589
  261. package/src/programmers/StringifyProgrammer.ts +990 -990
  262. package/src/programmers/ValidateProgrammer.ts +313 -313
  263. package/src/programmers/helpers/FunctionImporeter.ts +78 -78
  264. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  265. package/src/programmers/helpers/UnionExplorer.ts +301 -301
  266. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  267. package/src/programmers/helpers/disable_function_importer_declare.ts +26 -26
  268. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  269. package/src/programmers/internal/application_array.ts +64 -64
  270. package/src/programmers/internal/application_boolean.ts +15 -15
  271. package/src/programmers/internal/application_constant.ts +26 -26
  272. package/src/programmers/internal/application_default.ts +17 -17
  273. package/src/programmers/internal/application_definition.ts +45 -45
  274. package/src/programmers/internal/application_native.ts +39 -39
  275. package/src/programmers/internal/application_number.ts +74 -71
  276. package/src/programmers/internal/application_object.ts +167 -167
  277. package/src/programmers/internal/application_schema.ts +164 -164
  278. package/src/programmers/internal/application_tuple.ts +77 -77
  279. package/src/programmers/internal/check_union_array_like.ts +329 -329
  280. package/src/programmers/internal/feature_object_entries.ts +63 -63
  281. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  282. package/src/schemas/IJsonApplication.ts +8 -8
  283. package/src/schemas/IJsonComponents.ts +45 -45
  284. package/src/schemas/IJsonSchema.ts +134 -134
  285. package/src/transformers/CallExpressionTransformer.ts +179 -179
  286. package/src/transformers/FileTransformer.ts +47 -47
  287. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +104 -104
  288. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +53 -53
  289. package/src/utils/ArrayUtil.ts +45 -45
  290. package/src/utils/RandomGenerator.ts +81 -81
@@ -1,298 +1,300 @@
1
- import ts from "typescript";
2
-
3
- import { IMetadataTag } from "../metadata/IMetadataTag";
4
- import { Metadata } from "../metadata/Metadata";
5
-
6
- export namespace MetadataTagFactory {
7
- export const generate =
8
- (metadata: Metadata) =>
9
- (tagList: ts.JSDocTagInfo[]) =>
10
- (identifier: () => string): IMetadataTag[] => {
11
- const output: IMetadataTag[] = [];
12
- for (const tag of tagList) {
13
- const elem: IMetadataTag | null = parse(
14
- identifier,
15
- metadata,
16
- tag,
17
- output,
18
- );
19
- if (elem !== null) output.push(elem);
20
- }
21
- return output;
22
- };
23
-
24
- const parse = (
25
- identifier: () => string,
26
- metadata: Metadata,
27
- tag: ts.JSDocTagInfo,
28
- output: IMetadataTag[],
29
- ): IMetadataTag | null => {
30
- const closure = _PARSER[tag.name];
31
- if (closure === undefined) return null;
32
-
33
- const text = (tag.text || [])[0]?.text;
34
- if (text === undefined)
35
- throw new Error(`${LABEL}: no tag value on ${identifier()}`);
36
-
37
- return closure(identifier, metadata, text, output);
38
- };
39
-
40
- /**
41
- * @internal
42
- */
43
- export const _PARSER: Record<
44
- string,
45
- (
46
- identifier: () => string,
47
- metadata: Metadata,
48
- text: string,
49
- output: IMetadataTag[],
50
- ) => IMetadataTag | null
51
- > = {
52
- /* -----------------------------------------------------------
53
- ARRAY
54
- ----------------------------------------------------------- */
55
- items: (identifier, metadata, text, output) => {
56
- validate(identifier, metadata, output, "items", "array", [
57
- "minItems",
58
- ]);
59
- return {
60
- kind: "items",
61
- value: parse_number(identifier, text),
62
- };
63
- },
64
- minItems: (identifier, metadata, text, output) => {
65
- validate(identifier, metadata, output, "minItems", "array", [
66
- "items",
67
- ]);
68
- return {
69
- kind: "minItems",
70
- value: parse_number(identifier, text),
71
- };
72
- },
73
- maxItems: (identifier, metadata, text, output) => {
74
- validate(identifier, metadata, output, "maxItems", "array", [
75
- "items",
76
- ]);
77
- return {
78
- kind: "maxItems",
79
- value: parse_number(identifier, text),
80
- };
81
- },
82
-
83
- /* -----------------------------------------------------------
84
- NUMBER
85
- ----------------------------------------------------------- */
86
- type: (_identifier, metadata, text, _output) => {
87
- return has_atomic(metadata)("number") &&
88
- (text === "int" || text === "uint")
89
- ? { kind: "type", value: text }
90
- : null;
91
- },
92
- minimum: (identifier, metadata, text, output) => {
93
- validate(identifier, metadata, output, "minimum", "number", [
94
- "exclusiveMinimum",
95
- ]);
96
- return {
97
- kind: "minimum",
98
- value: parse_number(identifier, text),
99
- };
100
- },
101
- maximum: (identifier, metadata, text, output) => {
102
- validate(identifier, metadata, output, "maximum", "number", [
103
- "exclusiveMaximum",
104
- ]);
105
- return {
106
- kind: "maximum",
107
- value: parse_number(identifier, text),
108
- };
109
- },
110
- exclusiveMinimum: (identifier, metadata, text, output) => {
111
- validate(
112
- identifier,
113
- metadata,
114
- output,
115
- "exclusiveMinimum",
116
- "number",
117
- ["minimum"],
118
- );
119
- return {
120
- kind: "exclusiveMinimum",
121
- value: parse_number(identifier, text),
122
- };
123
- },
124
- exclusiveMaximum: (identifier, metadata, text, output) => {
125
- validate(
126
- identifier,
127
- metadata,
128
- output,
129
- "exclusiveMaximum",
130
- "number",
131
- ["maximum"],
132
- );
133
- return {
134
- kind: "exclusiveMaximum",
135
- value: parse_number(identifier, text),
136
- };
137
- },
138
- multipleOf: (identifier, metadata, text, output) => {
139
- validate(identifier, metadata, output, "multipleOf", "number", [
140
- "step",
141
- ]);
142
- return {
143
- kind: "multipleOf",
144
- value: parse_number(identifier, text),
145
- };
146
- },
147
- step: (identifier, metadata, text, output) => {
148
- validate(identifier, metadata, output, "step", "number", [
149
- "multipleOf",
150
- ]);
151
-
152
- const minimum: boolean = output.some(
153
- (tag) =>
154
- tag.kind === "minimum" || tag.kind === "exclusiveMinimum",
155
- );
156
- if (minimum === undefined)
157
- throw new Error(
158
- `${LABEL}: step requires minimum or exclusiveMinimum tag on "${identifier()}".`,
159
- );
160
-
161
- return {
162
- kind: "step",
163
- value: parse_number(identifier, text),
164
- };
165
- },
166
-
167
- /* -----------------------------------------------------------
168
- STRING
169
- ----------------------------------------------------------- */
170
- format: (identifier, metadata, str, output) => {
171
- validate(identifier, metadata, output, "format", "string", [
172
- "pattern",
173
- ]);
174
-
175
- // Ignore arbitrary @format values in the internal metadata,
176
- // these are currently only supported on the typia.application() API.
177
- const value: IMetadataTag.IFormat["value"] | undefined =
178
- FORMATS.get(str);
179
- if (value === undefined) return null;
180
- return {
181
- kind: "format",
182
- value,
183
- };
184
- },
185
- pattern: (identifier, metadata, value, output) => {
186
- validate(identifier, metadata, output, "pattern", "string", [
187
- "format",
188
- ]);
189
- return {
190
- kind: "pattern",
191
- value,
192
- };
193
- },
194
- length: (identifier, metadata, text, output) => {
195
- validate(identifier, metadata, output, "length", "string", [
196
- "minLength",
197
- "maxLength",
198
- ]);
199
- return {
200
- kind: "length",
201
- value: parse_number(identifier, text),
202
- };
203
- },
204
- minLength: (identifier, metadata, text, output) => {
205
- validate(identifier, metadata, output, "minLength", "string", [
206
- "length",
207
- ]);
208
- return {
209
- kind: "minLength",
210
- value: parse_number(identifier, text),
211
- };
212
- },
213
- maxLength: (identifier, metadata, text, output) => {
214
- validate(identifier, metadata, output, "maxLength", "string", [
215
- "length",
216
- ]);
217
- return {
218
- kind: "maxLength",
219
- value: parse_number(identifier, text),
220
- };
221
- },
222
- };
223
- }
224
-
225
- const parse_number = (identifier: () => string, str: string): number => {
226
- const value: number = Number(str);
227
- if (isNaN(value) === true)
228
- throw new Error(`${LABEL}: invalid number on "${identifier()}".`);
229
- return value;
230
- };
231
-
232
- const LABEL = "Error on typia.MetadataTagFactory.generate()";
233
- const FORMATS: Map<string, IMetadataTag.IFormat["value"]> = new Map([
234
- ["uuid", "uuid"],
235
- ["email", "email"],
236
- ["url", "url"],
237
- ["ipv4", "ipv4"],
238
- ["ipv6", "ipv6"],
239
- ["date", "date"],
240
- ["datetime", "datetime"],
241
- ["date-time", "datetime"],
242
- ["dateTime", "datetime"],
243
- ]);
244
-
245
- const WRONG_TYPE = (
246
- tag: string,
247
- type: "string" | "number" | "array",
248
- identifier: () => string,
249
- ) => `${LABEL}: ${tag} requires ${type} type, but no "${identifier()}".`;
250
-
251
- const validate = (
252
- identifier: () => string,
253
- metadata: Metadata,
254
- output: IMetadataTag[],
255
- kind: IMetadataTag["kind"],
256
- type: "array" | "string" | "number",
257
- neighbors: IMetadataTag["kind"][],
258
- ): void => {
259
- // TYPE CHECKING
260
- if (type === "array") {
261
- if (has_array(metadata) === false)
262
- throw new Error(WRONG_TYPE(kind, "array", identifier));
263
- } else if (has_atomic(metadata)(type) === false)
264
- throw new Error(WRONG_TYPE(kind, type, identifier));
265
-
266
- // DUPLICATED TAG
267
- if (output.some((tag) => tag.kind === kind))
268
- throw new Error(
269
- `${LABEL}: duplicated ${kind} tags on "${identifier()}".`,
270
- );
271
-
272
- // NEIGHBOR TAG
273
- for (const name of neighbors)
274
- if (output.some((tag) => tag.kind === name))
275
- throw new Error(
276
- `${LABEL}: ${kind} and ${name} tags on "${identifier()}".`,
277
- );
278
- };
279
-
280
- // @todo: must block repeated array and tuple type
281
- const has_atomic =
282
- (metadata: Metadata) =>
283
- (type: "string" | "number"): boolean =>
284
- metadata.atomics.find(
285
- type === "number"
286
- ? (atom: string) => atom === type || atom === "bigint"
287
- : (atom: string) => atom === type,
288
- ) !== undefined ||
289
- metadata.arrays.some((child) => has_atomic(child.value)(type)) ||
290
- metadata.tuples.some((tuple) =>
291
- tuple.elements.some((child) => has_atomic(child)(type)),
292
- );
293
-
294
- const has_array = (metadata: Metadata): boolean =>
295
- metadata.arrays.length !== 0 ||
296
- metadata.tuples.some((tuple) =>
297
- tuple.elements.some((child) => has_array(child)),
298
- );
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTag } from "../metadata/IMetadataTag";
4
+ import { Metadata } from "../metadata/Metadata";
5
+
6
+ export namespace MetadataTagFactory {
7
+ export const generate =
8
+ (metadata: Metadata) =>
9
+ (tagList: ts.JSDocTagInfo[]) =>
10
+ (identifier: () => string): IMetadataTag[] => {
11
+ const output: IMetadataTag[] = [];
12
+ for (const tag of tagList) {
13
+ const elem: IMetadataTag | null = parse(
14
+ identifier,
15
+ metadata,
16
+ tag,
17
+ output,
18
+ );
19
+ if (elem !== null) output.push(elem);
20
+ }
21
+ return output;
22
+ };
23
+
24
+ const parse = (
25
+ identifier: () => string,
26
+ metadata: Metadata,
27
+ tag: ts.JSDocTagInfo,
28
+ output: IMetadataTag[],
29
+ ): IMetadataTag | null => {
30
+ const closure = _PARSER[tag.name];
31
+ if (closure === undefined) return null;
32
+
33
+ const text = (tag.text || [])[0]?.text;
34
+ if (text === undefined)
35
+ throw new Error(`${LABEL}: no tag value on ${identifier()}`);
36
+
37
+ return closure(identifier, metadata, text, output);
38
+ };
39
+
40
+ /**
41
+ * @internal
42
+ */
43
+ export const _PARSER: Record<
44
+ string,
45
+ (
46
+ identifier: () => string,
47
+ metadata: Metadata,
48
+ text: string,
49
+ output: IMetadataTag[],
50
+ ) => IMetadataTag | null
51
+ > = {
52
+ /* -----------------------------------------------------------
53
+ ARRAY
54
+ ----------------------------------------------------------- */
55
+ items: (identifier, metadata, text, output) => {
56
+ validate(identifier, metadata, output, "items", "array", [
57
+ "minItems",
58
+ ]);
59
+ return {
60
+ kind: "items",
61
+ value: parse_number(identifier, text),
62
+ };
63
+ },
64
+ minItems: (identifier, metadata, text, output) => {
65
+ validate(identifier, metadata, output, "minItems", "array", [
66
+ "items",
67
+ ]);
68
+ return {
69
+ kind: "minItems",
70
+ value: parse_number(identifier, text),
71
+ };
72
+ },
73
+ maxItems: (identifier, metadata, text, output) => {
74
+ validate(identifier, metadata, output, "maxItems", "array", [
75
+ "items",
76
+ ]);
77
+ return {
78
+ kind: "maxItems",
79
+ value: parse_number(identifier, text),
80
+ };
81
+ },
82
+
83
+ /* -----------------------------------------------------------
84
+ NUMBER
85
+ ----------------------------------------------------------- */
86
+ type: (_identifier, metadata, text, _output) => {
87
+ return has_atomic(metadata)("number") &&
88
+ (text === "int" || text === "uint")
89
+ ? { kind: "type", value: text }
90
+ : text === "{int}" || text === "{uint}"
91
+ ? { kind: "type", value: text.slice(1, -1) as "int" | "uint" }
92
+ : null;
93
+ },
94
+ minimum: (identifier, metadata, text, output) => {
95
+ validate(identifier, metadata, output, "minimum", "number", [
96
+ "exclusiveMinimum",
97
+ ]);
98
+ return {
99
+ kind: "minimum",
100
+ value: parse_number(identifier, text),
101
+ };
102
+ },
103
+ maximum: (identifier, metadata, text, output) => {
104
+ validate(identifier, metadata, output, "maximum", "number", [
105
+ "exclusiveMaximum",
106
+ ]);
107
+ return {
108
+ kind: "maximum",
109
+ value: parse_number(identifier, text),
110
+ };
111
+ },
112
+ exclusiveMinimum: (identifier, metadata, text, output) => {
113
+ validate(
114
+ identifier,
115
+ metadata,
116
+ output,
117
+ "exclusiveMinimum",
118
+ "number",
119
+ ["minimum"],
120
+ );
121
+ return {
122
+ kind: "exclusiveMinimum",
123
+ value: parse_number(identifier, text),
124
+ };
125
+ },
126
+ exclusiveMaximum: (identifier, metadata, text, output) => {
127
+ validate(
128
+ identifier,
129
+ metadata,
130
+ output,
131
+ "exclusiveMaximum",
132
+ "number",
133
+ ["maximum"],
134
+ );
135
+ return {
136
+ kind: "exclusiveMaximum",
137
+ value: parse_number(identifier, text),
138
+ };
139
+ },
140
+ multipleOf: (identifier, metadata, text, output) => {
141
+ validate(identifier, metadata, output, "multipleOf", "number", [
142
+ "step",
143
+ ]);
144
+ return {
145
+ kind: "multipleOf",
146
+ value: parse_number(identifier, text),
147
+ };
148
+ },
149
+ step: (identifier, metadata, text, output) => {
150
+ validate(identifier, metadata, output, "step", "number", [
151
+ "multipleOf",
152
+ ]);
153
+
154
+ const minimum: boolean = output.some(
155
+ (tag) =>
156
+ tag.kind === "minimum" || tag.kind === "exclusiveMinimum",
157
+ );
158
+ if (minimum === undefined)
159
+ throw new Error(
160
+ `${LABEL}: step requires minimum or exclusiveMinimum tag on "${identifier()}".`,
161
+ );
162
+
163
+ return {
164
+ kind: "step",
165
+ value: parse_number(identifier, text),
166
+ };
167
+ },
168
+
169
+ /* -----------------------------------------------------------
170
+ STRING
171
+ ----------------------------------------------------------- */
172
+ format: (identifier, metadata, str, output) => {
173
+ validate(identifier, metadata, output, "format", "string", [
174
+ "pattern",
175
+ ]);
176
+
177
+ // Ignore arbitrary @format values in the internal metadata,
178
+ // these are currently only supported on the typia.application() API.
179
+ const value: IMetadataTag.IFormat["value"] | undefined =
180
+ FORMATS.get(str);
181
+ if (value === undefined) return null;
182
+ return {
183
+ kind: "format",
184
+ value,
185
+ };
186
+ },
187
+ pattern: (identifier, metadata, value, output) => {
188
+ validate(identifier, metadata, output, "pattern", "string", [
189
+ "format",
190
+ ]);
191
+ return {
192
+ kind: "pattern",
193
+ value,
194
+ };
195
+ },
196
+ length: (identifier, metadata, text, output) => {
197
+ validate(identifier, metadata, output, "length", "string", [
198
+ "minLength",
199
+ "maxLength",
200
+ ]);
201
+ return {
202
+ kind: "length",
203
+ value: parse_number(identifier, text),
204
+ };
205
+ },
206
+ minLength: (identifier, metadata, text, output) => {
207
+ validate(identifier, metadata, output, "minLength", "string", [
208
+ "length",
209
+ ]);
210
+ return {
211
+ kind: "minLength",
212
+ value: parse_number(identifier, text),
213
+ };
214
+ },
215
+ maxLength: (identifier, metadata, text, output) => {
216
+ validate(identifier, metadata, output, "maxLength", "string", [
217
+ "length",
218
+ ]);
219
+ return {
220
+ kind: "maxLength",
221
+ value: parse_number(identifier, text),
222
+ };
223
+ },
224
+ };
225
+ }
226
+
227
+ const parse_number = (identifier: () => string, str: string): number => {
228
+ const value: number = Number(str);
229
+ if (isNaN(value) === true)
230
+ throw new Error(`${LABEL}: invalid number on "${identifier()}".`);
231
+ return value;
232
+ };
233
+
234
+ const LABEL = "Error on typia.MetadataTagFactory.generate()";
235
+ const FORMATS: Map<string, IMetadataTag.IFormat["value"]> = new Map([
236
+ ["uuid", "uuid"],
237
+ ["email", "email"],
238
+ ["url", "url"],
239
+ ["ipv4", "ipv4"],
240
+ ["ipv6", "ipv6"],
241
+ ["date", "date"],
242
+ ["datetime", "datetime"],
243
+ ["date-time", "datetime"],
244
+ ["dateTime", "datetime"],
245
+ ]);
246
+
247
+ const WRONG_TYPE = (
248
+ tag: string,
249
+ type: "string" | "number" | "array",
250
+ identifier: () => string,
251
+ ) => `${LABEL}: ${tag} requires ${type} type, but no "${identifier()}".`;
252
+
253
+ const validate = (
254
+ identifier: () => string,
255
+ metadata: Metadata,
256
+ output: IMetadataTag[],
257
+ kind: IMetadataTag["kind"],
258
+ type: "array" | "string" | "number",
259
+ neighbors: IMetadataTag["kind"][],
260
+ ): void => {
261
+ // TYPE CHECKING
262
+ if (type === "array") {
263
+ if (has_array(metadata) === false)
264
+ throw new Error(WRONG_TYPE(kind, "array", identifier));
265
+ } else if (has_atomic(metadata)(type) === false)
266
+ throw new Error(WRONG_TYPE(kind, type, identifier));
267
+
268
+ // DUPLICATED TAG
269
+ if (output.some((tag) => tag.kind === kind))
270
+ throw new Error(
271
+ `${LABEL}: duplicated ${kind} tags on "${identifier()}".`,
272
+ );
273
+
274
+ // NEIGHBOR TAG
275
+ for (const name of neighbors)
276
+ if (output.some((tag) => tag.kind === name))
277
+ throw new Error(
278
+ `${LABEL}: ${kind} and ${name} tags on "${identifier()}".`,
279
+ );
280
+ };
281
+
282
+ // @todo: must block repeated array and tuple type
283
+ const has_atomic =
284
+ (metadata: Metadata) =>
285
+ (type: "string" | "number"): boolean =>
286
+ metadata.atomics.find(
287
+ type === "number"
288
+ ? (atom: string) => atom === type || atom === "bigint"
289
+ : (atom: string) => atom === type,
290
+ ) !== undefined ||
291
+ metadata.arrays.some((child) => has_atomic(child.value)(type)) ||
292
+ metadata.tuples.some((tuple) =>
293
+ tuple.elements.some((child) => has_atomic(child)(type)),
294
+ );
295
+
296
+ const has_array = (metadata: Metadata): boolean =>
297
+ metadata.arrays.length !== 0 ||
298
+ metadata.tuples.some((tuple) =>
299
+ tuple.elements.some((child) => has_array(child)),
300
+ );