typia 3.3.12 → 3.4.0-dev.20221212

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 (422) hide show
  1. package/README.md +169 -403
  2. package/lib/IValidation.d.ts +10 -4
  3. package/lib/Primitive.d.ts +45 -0
  4. package/lib/Primitive.js +3 -0
  5. package/lib/Primitive.js.map +1 -0
  6. package/lib/executable/internal/TypiaSetupWizard.d.ts +4 -0
  7. package/lib/executable/internal/TypiaSetupWizard.js +200 -0
  8. package/lib/executable/internal/TypiaSetupWizard.js.map +1 -0
  9. package/lib/executable/typia.d.ts +1 -0
  10. package/lib/executable/typia.js +98 -0
  11. package/lib/executable/typia.js.map +1 -0
  12. package/lib/factories/CommentFactory.js +1 -1
  13. package/lib/factories/CommentFactory.js.map +1 -1
  14. package/lib/factories/ExpressionFactory.d.ts +1 -0
  15. package/lib/factories/ExpressionFactory.js +4 -0
  16. package/lib/factories/ExpressionFactory.js.map +1 -1
  17. package/lib/factories/IdentifierFactory.d.ts +1 -1
  18. package/lib/factories/IdentifierFactory.js +4 -2
  19. package/lib/factories/IdentifierFactory.js.map +1 -1
  20. package/lib/factories/MetadataCollection.d.ts +2 -1
  21. package/lib/factories/MetadataCollection.js +24 -5
  22. package/lib/factories/MetadataCollection.js.map +1 -1
  23. package/lib/factories/MetadataTagFactory.js +1 -1
  24. package/lib/factories/MetadataTagFactory.js.map +1 -1
  25. package/lib/factories/StatementFactory.d.ts +1 -3
  26. package/lib/factories/StatementFactory.js +3 -13
  27. package/lib/factories/StatementFactory.js.map +1 -1
  28. package/lib/factories/TemplateFactory.js +4 -0
  29. package/lib/factories/TemplateFactory.js.map +1 -1
  30. package/lib/factories/TypeFactory.d.ts +2 -1
  31. package/lib/factories/TypeFactory.js +14 -7
  32. package/lib/factories/TypeFactory.js.map +1 -1
  33. package/lib/factories/internal/explore_metadata.js +1 -1
  34. package/lib/factories/internal/explore_metadata.js.map +1 -1
  35. package/lib/factories/internal/iterate_metadata.js +12 -3
  36. package/lib/factories/internal/iterate_metadata.js.map +1 -1
  37. package/lib/factories/internal/iterate_metadata_array.js +2 -3
  38. package/lib/factories/internal/iterate_metadata_array.js.map +1 -1
  39. package/lib/factories/internal/iterate_metadata_atomic.js +30 -55
  40. package/lib/factories/internal/iterate_metadata_atomic.js.map +1 -1
  41. package/lib/factories/internal/iterate_metadata_coalesce.js +2 -3
  42. package/lib/factories/internal/iterate_metadata_coalesce.js.map +1 -1
  43. package/lib/factories/internal/iterate_metadata_map.d.ts +5 -0
  44. package/lib/factories/internal/iterate_metadata_map.js +30 -0
  45. package/lib/factories/internal/iterate_metadata_map.js.map +1 -0
  46. package/lib/factories/internal/iterate_metadata_native.d.ts +3 -0
  47. package/lib/factories/internal/iterate_metadata_native.js +230 -0
  48. package/lib/factories/internal/iterate_metadata_native.js.map +1 -0
  49. package/lib/factories/internal/iterate_metadata_set.d.ts +5 -0
  50. package/lib/factories/internal/iterate_metadata_set.js +26 -0
  51. package/lib/factories/internal/iterate_metadata_set.js.map +1 -0
  52. package/lib/factories/internal/iterate_metadata_tuple.d.ts +1 -1
  53. package/lib/factories/internal/iterate_metadata_tuple.js +25 -3
  54. package/lib/factories/internal/iterate_metadata_tuple.js.map +1 -1
  55. package/lib/functional/$every.d.ts +2 -0
  56. package/lib/functional/$every.js +12 -0
  57. package/lib/functional/$every.js.map +1 -0
  58. package/lib/functional/$guard.d.ts +1 -0
  59. package/lib/functional/$guard.js +18 -0
  60. package/lib/functional/$guard.js.map +1 -0
  61. package/lib/functional/$number.js +4 -4
  62. package/lib/functional/$number.js.map +1 -1
  63. package/lib/functional/$report.d.ts +2 -0
  64. package/lib/functional/$report.js +18 -0
  65. package/lib/functional/$report.js.map +1 -0
  66. package/lib/functional/$rest.d.ts +1 -0
  67. package/lib/functional/$rest.js +8 -0
  68. package/lib/functional/$rest.js.map +1 -0
  69. package/lib/index.d.ts +2 -2
  70. package/lib/index.js +2 -2
  71. package/lib/index.js.map +1 -1
  72. package/lib/metadata/IMetadata.d.ts +5 -0
  73. package/lib/metadata/IMetadataApplication.d.ts +6 -0
  74. package/lib/metadata/IMetadataApplication.js +3 -0
  75. package/lib/metadata/IMetadataApplication.js.map +1 -0
  76. package/lib/metadata/IMetadataConstant.d.ts +1 -1
  77. package/lib/metadata/IMetadataEntry.d.ts +5 -0
  78. package/lib/metadata/IMetadataEntry.js +3 -0
  79. package/lib/metadata/IMetadataEntry.js.map +1 -0
  80. package/lib/metadata/IMetadataTag.d.ts +1 -1
  81. package/lib/metadata/Metadata.d.ts +10 -0
  82. package/lib/metadata/Metadata.js +156 -59
  83. package/lib/metadata/Metadata.js.map +1 -1
  84. package/lib/metadata/MetadataObject.d.ts +0 -1
  85. package/lib/metadata/MetadataObject.js +10 -0
  86. package/lib/metadata/MetadataObject.js.map +1 -1
  87. package/lib/module.d.ts +603 -72
  88. package/lib/module.js +185 -23
  89. package/lib/module.js.map +1 -1
  90. package/lib/programmers/ApplicationProgrammer.js +2 -2
  91. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  92. package/lib/programmers/AssertParseProgrammer.d.ts +5 -0
  93. package/lib/programmers/AssertParseProgrammer.js +23 -0
  94. package/lib/programmers/AssertParseProgrammer.js.map +1 -0
  95. package/lib/programmers/AssertProgrammer.d.ts +1 -1
  96. package/lib/programmers/AssertProgrammer.js +133 -58
  97. package/lib/programmers/AssertProgrammer.js.map +1 -1
  98. package/lib/programmers/AssertStringifyProgrammer.d.ts +5 -0
  99. package/lib/programmers/AssertStringifyProgrammer.js +26 -0
  100. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -0
  101. package/lib/programmers/CheckerProgrammer.d.ts +17 -7
  102. package/lib/programmers/CheckerProgrammer.js +284 -79
  103. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  104. package/lib/programmers/FeatureProgrammer.d.ts +14 -9
  105. package/lib/programmers/FeatureProgrammer.js +76 -116
  106. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  107. package/lib/programmers/IsParseProgrammer.d.ts +5 -0
  108. package/lib/programmers/IsParseProgrammer.js +23 -0
  109. package/lib/programmers/IsParseProgrammer.js.map +1 -0
  110. package/lib/programmers/IsProgrammer.d.ts +5 -4
  111. package/lib/programmers/IsProgrammer.js +69 -44
  112. package/lib/programmers/IsProgrammer.js.map +1 -1
  113. package/lib/programmers/IsStringifyProgrammer.d.ts +5 -0
  114. package/lib/programmers/IsStringifyProgrammer.js +24 -0
  115. package/lib/programmers/IsStringifyProgrammer.js.map +1 -0
  116. package/lib/programmers/StringifyProgrammer.js +118 -47
  117. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  118. package/lib/programmers/ValidateParseProgrammer.d.ts +5 -0
  119. package/lib/programmers/ValidateParseProgrammer.js +24 -0
  120. package/lib/programmers/ValidateParseProgrammer.js.map +1 -0
  121. package/lib/programmers/ValidateProgrammer.d.ts +1 -1
  122. package/lib/programmers/ValidateProgrammer.js +124 -68
  123. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  124. package/lib/programmers/ValidateStringifyProgrammer.d.ts +5 -0
  125. package/lib/programmers/ValidateStringifyProgrammer.js +26 -0
  126. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -0
  127. package/lib/programmers/helpers/AtomicPredicator.d.ts +6 -0
  128. package/lib/programmers/helpers/AtomicPredicator.js +16 -0
  129. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -0
  130. package/lib/programmers/helpers/FunctionImporeter.js +1 -1
  131. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  132. package/lib/programmers/helpers/OptionPredicator.d.ts +1 -1
  133. package/lib/programmers/helpers/OptionPredicator.js +7 -7
  134. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  135. package/lib/programmers/helpers/StringifyJoinder.d.ts +2 -2
  136. package/lib/programmers/helpers/StringifyJoinder.js +5 -2
  137. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  138. package/lib/programmers/helpers/UnionExplorer.d.ts +33 -4
  139. package/lib/programmers/helpers/UnionExplorer.js +85 -47
  140. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  141. package/lib/programmers/internal/application_array.js +1 -1
  142. package/lib/programmers/internal/application_array.js.map +1 -1
  143. package/lib/programmers/internal/application_default.js +1 -1
  144. package/lib/programmers/internal/application_default.js.map +1 -1
  145. package/lib/programmers/internal/application_native.d.ts +4 -0
  146. package/lib/programmers/internal/application_native.js +35 -0
  147. package/lib/programmers/internal/application_native.js.map +1 -0
  148. package/lib/programmers/internal/application_number.js +6 -2
  149. package/lib/programmers/internal/application_number.js.map +1 -1
  150. package/lib/programmers/internal/application_object.js +44 -31
  151. package/lib/programmers/internal/application_object.js.map +1 -1
  152. package/lib/programmers/internal/application_schema.js +70 -36
  153. package/lib/programmers/internal/application_schema.js.map +1 -1
  154. package/lib/programmers/internal/application_string.js +2 -2
  155. package/lib/programmers/internal/application_string.js.map +1 -1
  156. package/lib/programmers/internal/check_array.js +4 -10
  157. package/lib/programmers/internal/check_array.js.map +1 -1
  158. package/lib/programmers/internal/check_dynamic_properties.js +40 -50
  159. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  160. package/lib/programmers/internal/check_everything.js +1 -3
  161. package/lib/programmers/internal/check_everything.js.map +1 -1
  162. package/lib/programmers/internal/check_length.js +2 -2
  163. package/lib/programmers/internal/check_length.js.map +1 -1
  164. package/lib/programmers/internal/check_native.d.ts +1 -0
  165. package/lib/programmers/internal/check_native.js +9 -0
  166. package/lib/programmers/internal/check_native.js.map +1 -0
  167. package/lib/programmers/internal/check_number.js +1 -1
  168. package/lib/programmers/internal/check_number.js.map +1 -1
  169. package/lib/programmers/internal/check_object.d.ts +12 -1
  170. package/lib/programmers/internal/check_object.js +12 -22
  171. package/lib/programmers/internal/check_object.js.map +1 -1
  172. package/lib/programmers/internal/decode_union_object.js +9 -7
  173. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  174. package/lib/programmers/internal/feature_object_entries.d.ts +9 -0
  175. package/lib/programmers/internal/feature_object_entries.js +38 -0
  176. package/lib/programmers/internal/feature_object_entries.js.map +1 -0
  177. package/lib/programmers/internal/stringify_dynamic_properties.js +4 -2
  178. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  179. package/lib/programmers/internal/stringify_native.d.ts +1 -0
  180. package/lib/programmers/internal/stringify_native.js +12 -0
  181. package/lib/programmers/internal/stringify_native.js.map +1 -0
  182. package/lib/schemas/IJsonComponents.d.ts +1 -1
  183. package/lib/schemas/IJsonSchema.d.ts +10 -8
  184. package/lib/transformers/CallExpressionTransformer.js +47 -10
  185. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  186. package/lib/transformers/FileTransformer.js +1 -1
  187. package/lib/transformers/features/{ApplicationTransformer.d.ts → miscellaneous/ApplicationTransformer.d.ts} +1 -1
  188. package/lib/transformers/features/{ApplicationTransformer.js → miscellaneous/ApplicationTransformer.js} +8 -8
  189. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -0
  190. package/lib/transformers/features/{CreateTransformer.d.ts → miscellaneous/CreateInstanceTransformer.d.ts} +2 -2
  191. package/lib/transformers/features/{CreateTransformer.js → miscellaneous/CreateInstanceTransformer.js} +8 -8
  192. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js.map +1 -0
  193. package/lib/transformers/features/miscellaneous/MetadataTransformer.d.ts +5 -0
  194. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +43 -0
  195. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -0
  196. package/lib/transformers/features/parsers/AssertParseTransformer.d.ts +5 -0
  197. package/lib/transformers/features/parsers/AssertParseTransformer.js +21 -0
  198. package/lib/transformers/features/parsers/AssertParseTransformer.js.map +1 -0
  199. package/lib/transformers/features/parsers/CreateAssertParseTransformer.d.ts +5 -0
  200. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js +17 -0
  201. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js.map +1 -0
  202. package/lib/transformers/features/parsers/CreateIsParseTransformer.d.ts +5 -0
  203. package/lib/transformers/features/parsers/CreateIsParseTransformer.js +17 -0
  204. package/lib/transformers/features/parsers/CreateIsParseTransformer.js.map +1 -0
  205. package/lib/transformers/features/parsers/CreateValidateParseTransformer.d.ts +5 -0
  206. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js +17 -0
  207. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js.map +1 -0
  208. package/lib/transformers/features/parsers/IsParseTransformer.d.ts +5 -0
  209. package/lib/transformers/features/parsers/IsParseTransformer.js +21 -0
  210. package/lib/transformers/features/parsers/IsParseTransformer.js.map +1 -0
  211. package/lib/transformers/features/parsers/ValidateParseTransformer.d.ts +5 -0
  212. package/lib/transformers/features/parsers/ValidateParseTransformer.js +21 -0
  213. package/lib/transformers/features/parsers/ValidateParseTransformer.js.map +1 -0
  214. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.d.ts +5 -0
  215. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js +23 -0
  216. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js.map +1 -0
  217. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.d.ts +5 -0
  218. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js +17 -0
  219. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js.map +1 -0
  220. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.d.ts +5 -0
  221. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js +17 -0
  222. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js.map +1 -0
  223. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.d.ts +5 -0
  224. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js +17 -0
  225. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js.map +1 -0
  226. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.d.ts +5 -0
  227. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js +17 -0
  228. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js.map +1 -0
  229. package/lib/transformers/features/stringifiers/IsStringifyTransformer.d.ts +5 -0
  230. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js +23 -0
  231. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js.map +1 -0
  232. package/lib/transformers/features/{StringifyTransformer.d.ts → stringifiers/StringifyTransformer.d.ts} +1 -1
  233. package/lib/transformers/features/{StringifyTransformer.js → stringifiers/StringifyTransformer.js} +3 -3
  234. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -0
  235. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.d.ts +5 -0
  236. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js +23 -0
  237. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js.map +1 -0
  238. package/lib/transformers/features/{AssertTransformer.d.ts → validators/AssertTransformer.d.ts} +1 -1
  239. package/lib/transformers/features/{AssertTransformer.js → validators/AssertTransformer.js} +4 -4
  240. package/lib/transformers/features/validators/AssertTransformer.js.map +1 -0
  241. package/lib/transformers/features/validators/CreateAssertTransformer.d.ts +5 -0
  242. package/lib/transformers/features/validators/CreateAssertTransformer.js +24 -0
  243. package/lib/transformers/features/validators/CreateAssertTransformer.js.map +1 -0
  244. package/lib/transformers/features/validators/CreateIsTransformer.d.ts +5 -0
  245. package/lib/transformers/features/validators/CreateIsTransformer.js +24 -0
  246. package/lib/transformers/features/validators/CreateIsTransformer.js.map +1 -0
  247. package/lib/transformers/features/validators/CreateValidateTransformer.d.ts +5 -0
  248. package/lib/transformers/features/validators/CreateValidateTransformer.js +24 -0
  249. package/lib/transformers/features/validators/CreateValidateTransformer.js.map +1 -0
  250. package/lib/transformers/features/{IsTransformer.d.ts → validators/IsTransformer.d.ts} +1 -1
  251. package/lib/transformers/features/{IsTransformer.js → validators/IsTransformer.js} +3 -3
  252. package/lib/transformers/features/validators/IsTransformer.js.map +1 -0
  253. package/lib/transformers/features/{ValidateTransformer.d.ts → validators/ValidateTransformer.d.ts} +1 -1
  254. package/lib/transformers/features/{ValidateTransformer.js → validators/ValidateTransformer.js} +3 -3
  255. package/lib/transformers/features/validators/ValidateTransformer.js.map +1 -0
  256. package/lib/typings/ClassProperties.d.ts +1 -1
  257. package/lib/typings/OmitNever.d.ts +1 -1
  258. package/lib/typings/SpecialFields.d.ts +1 -1
  259. package/lib/typings/Writable.d.ts +1 -1
  260. package/lib/utils/PatternUtil.js +1 -1
  261. package/lib/utils/PatternUtil.js.map +1 -1
  262. package/package.json +114 -78
  263. package/src/IValidation.ts +21 -0
  264. package/src/Primitive.ts +82 -0
  265. package/src/TypeGuardError.ts +36 -0
  266. package/src/executable/internal/TypiaSetupWizard.ts +130 -0
  267. package/src/executable/typia.ts +34 -0
  268. package/src/factories/CommentFactory.ts +10 -0
  269. package/src/factories/ExpressionFactory.ts +52 -0
  270. package/src/factories/IdentifierFactory.ts +72 -0
  271. package/src/factories/LiteralFactory.ts +44 -0
  272. package/src/factories/MetadataCollection.ts +122 -0
  273. package/src/factories/MetadataFactory.ts +46 -0
  274. package/src/factories/MetadataTagFactory.ts +347 -0
  275. package/src/factories/StatementFactory.ts +60 -0
  276. package/src/factories/TemplateFactory.ts +56 -0
  277. package/src/factories/TypeFactory.ts +101 -0
  278. package/src/factories/ValueFactory.ts +12 -0
  279. package/src/factories/internal/MetadataHelper.ts +12 -0
  280. package/src/factories/internal/emplace_metadata_object.ts +140 -0
  281. package/src/factories/internal/explore_metadata.ts +91 -0
  282. package/src/factories/internal/iterate_metadata.ts +81 -0
  283. package/src/factories/internal/iterate_metadata_array.ts +29 -0
  284. package/src/factories/internal/iterate_metadata_atomic.ts +59 -0
  285. package/src/factories/internal/iterate_metadata_coalesce.ts +33 -0
  286. package/src/factories/internal/iterate_metadata_constant.ts +58 -0
  287. package/src/factories/internal/iterate_metadata_map.ts +41 -0
  288. package/src/factories/internal/iterate_metadata_native.ts +227 -0
  289. package/src/factories/internal/iterate_metadata_object.ts +45 -0
  290. package/src/factories/internal/iterate_metadata_resolve.ts +27 -0
  291. package/src/factories/internal/iterate_metadata_set.ts +33 -0
  292. package/src/factories/internal/iterate_metadata_template.ts +38 -0
  293. package/src/factories/internal/iterate_metadata_tuple.ts +51 -0
  294. package/src/factories/internal/iterate_metadata_union.ts +59 -0
  295. package/src/functional/$every.ts +11 -0
  296. package/src/functional/$guard.ts +35 -0
  297. package/src/functional/$is_email.ts +5 -0
  298. package/src/functional/$is_ipv4.ts +5 -0
  299. package/src/functional/$is_ipv6.ts +5 -0
  300. package/src/functional/$is_url.ts +5 -0
  301. package/src/functional/$is_uuid.ts +5 -0
  302. package/src/functional/$join.ts +50 -0
  303. package/src/functional/$number.ts +19 -0
  304. package/src/functional/$report.ts +15 -0
  305. package/src/functional/$rest.ts +3 -0
  306. package/src/functional/$string.ts +37 -0
  307. package/src/functional/$tail.ts +6 -0
  308. package/src/index.ts +4 -0
  309. package/src/metadata/IJsDocTagInfo.ts +10 -0
  310. package/src/metadata/IMetadata.ts +25 -0
  311. package/src/metadata/IMetadataApplication.ts +7 -0
  312. package/src/metadata/IMetadataConstant.ts +16 -0
  313. package/src/metadata/IMetadataEntry.ts +6 -0
  314. package/src/metadata/IMetadataObject.ts +29 -0
  315. package/src/metadata/IMetadataProperty.ts +11 -0
  316. package/src/metadata/IMetadataTag.ts +122 -0
  317. package/src/metadata/Metadata.ts +477 -0
  318. package/src/metadata/MetadataConstant.ts +3 -0
  319. package/src/metadata/MetadataObject.ts +131 -0
  320. package/src/metadata/MetadataProperty.ts +64 -0
  321. package/src/module.ts +1535 -0
  322. package/src/programmers/ApplicationProgrammer.ts +55 -0
  323. package/src/programmers/AssertParseProgrammer.ts +45 -0
  324. package/src/programmers/AssertProgrammer.ts +444 -0
  325. package/src/programmers/AssertStringifyProgrammer.ts +45 -0
  326. package/src/programmers/CheckerProgrammer.ts +798 -0
  327. package/src/programmers/FeatureProgrammer.ts +327 -0
  328. package/src/programmers/IsParseProgrammer.ts +51 -0
  329. package/src/programmers/IsProgrammer.ts +169 -0
  330. package/src/programmers/IsStringifyProgrammer.ts +49 -0
  331. package/src/programmers/StringifyProgrammer.ts +746 -0
  332. package/src/programmers/ValidateParseProgrammer.ts +49 -0
  333. package/src/programmers/ValidateProgrammer.ts +236 -0
  334. package/src/programmers/ValidateStringifyProgrammer.ts +60 -0
  335. package/src/programmers/helpers/AtomicPredicator.ts +15 -0
  336. package/src/programmers/helpers/FunctionImporeter.ts +31 -0
  337. package/src/programmers/helpers/IExpressionEntry.ts +10 -0
  338. package/src/programmers/helpers/OptionPredicator.ts +18 -0
  339. package/src/programmers/helpers/StringifyJoinder.ts +111 -0
  340. package/src/programmers/helpers/StringifyPredicator.ts +18 -0
  341. package/src/programmers/helpers/UnionExplorer.ts +437 -0
  342. package/src/programmers/helpers/UnionPredicator.ts +81 -0
  343. package/src/programmers/internal/application_array.ts +45 -0
  344. package/src/programmers/internal/application_boolean.ts +17 -0
  345. package/src/programmers/internal/application_constant.ts +29 -0
  346. package/src/programmers/internal/application_default.ts +17 -0
  347. package/src/programmers/internal/application_default_string.ts +32 -0
  348. package/src/programmers/internal/application_native.ts +29 -0
  349. package/src/programmers/internal/application_number.ts +76 -0
  350. package/src/programmers/internal/application_object.ts +103 -0
  351. package/src/programmers/internal/application_schema.ts +221 -0
  352. package/src/programmers/internal/application_string.ts +49 -0
  353. package/src/programmers/internal/application_templates.ts +27 -0
  354. package/src/programmers/internal/application_tuple.ts +25 -0
  355. package/src/programmers/internal/check_array.ts +44 -0
  356. package/src/programmers/internal/check_dynamic_properties.ts +146 -0
  357. package/src/programmers/internal/check_everything.ts +25 -0
  358. package/src/programmers/internal/check_length.ts +46 -0
  359. package/src/programmers/internal/check_native.ts +9 -0
  360. package/src/programmers/internal/check_number.ts +181 -0
  361. package/src/programmers/internal/check_object.ts +42 -0
  362. package/src/programmers/internal/check_string.ts +24 -0
  363. package/src/programmers/internal/check_string_tags.ts +63 -0
  364. package/src/programmers/internal/check_template.ts +50 -0
  365. package/src/programmers/internal/decode_union_object.ts +73 -0
  366. package/src/programmers/internal/feature_object_entries.ts +49 -0
  367. package/src/programmers/internal/metadata_to_pattern.ts +31 -0
  368. package/src/programmers/internal/stringify_dynamic_properties.ts +164 -0
  369. package/src/programmers/internal/stringify_native.ts +8 -0
  370. package/src/programmers/internal/stringify_regular_properties.ts +81 -0
  371. package/src/programmers/internal/template_to_pattern.ts +15 -0
  372. package/src/schemas/IJsonApplication.ts +9 -0
  373. package/src/schemas/IJsonComponents.ts +24 -0
  374. package/src/schemas/IJsonSchema.ts +92 -0
  375. package/src/transform.ts +20 -0
  376. package/src/transformers/CallExpressionTransformer.ts +124 -0
  377. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -0
  378. package/src/transformers/FileTransformer.ts +49 -0
  379. package/src/transformers/IProject.ts +11 -0
  380. package/src/transformers/ITransformOptions.ts +4 -0
  381. package/src/transformers/NodeTransformer.ts +19 -0
  382. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +114 -0
  383. package/src/transformers/features/miscellaneous/CreateInstanceTransformer.ts +41 -0
  384. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -0
  385. package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -0
  386. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -0
  387. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -0
  388. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -0
  389. package/src/transformers/features/parsers/IsParseTransformer.ts +36 -0
  390. package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -0
  391. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -0
  392. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -0
  393. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -0
  394. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -0
  395. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -0
  396. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -0
  397. package/src/transformers/features/stringifiers/StringifyTransformer.ts +36 -0
  398. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -0
  399. package/src/transformers/features/validators/AssertTransformer.ts +43 -0
  400. package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -0
  401. package/src/transformers/features/validators/CreateIsTransformer.ts +35 -0
  402. package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -0
  403. package/src/transformers/features/validators/IsTransformer.ts +43 -0
  404. package/src/transformers/features/validators/ValidateTransformer.ts +43 -0
  405. package/src/typings/Atomic.ts +17 -0
  406. package/src/typings/ClassProperties.ts +5 -0
  407. package/src/typings/OmitNever.ts +3 -0
  408. package/src/typings/SpecialFields.ts +3 -0
  409. package/src/typings/Writable.ts +11 -0
  410. package/src/utils/ArrayUtil.ts +49 -0
  411. package/src/utils/Escaper.ts +50 -0
  412. package/src/utils/MapUtil.ts +14 -0
  413. package/src/utils/PatternUtil.ts +30 -0
  414. package/src/utils/Singleton.ts +17 -0
  415. package/CODE_OF_CONDUCT.md +0 -133
  416. package/CONTRIBUTING.md +0 -104
  417. package/lib/transformers/features/ApplicationTransformer.js.map +0 -1
  418. package/lib/transformers/features/AssertTransformer.js.map +0 -1
  419. package/lib/transformers/features/CreateTransformer.js.map +0 -1
  420. package/lib/transformers/features/IsTransformer.js.map +0 -1
  421. package/lib/transformers/features/StringifyTransformer.js.map +0 -1
  422. package/lib/transformers/features/ValidateTransformer.js.map +0 -1
@@ -0,0 +1,72 @@
1
+ import ts from "typescript";
2
+
3
+ import { Escaper } from "../utils/Escaper";
4
+
5
+ export namespace IdentifierFactory {
6
+ export function generate(name: string) {
7
+ return Escaper.variable(name)
8
+ ? ts.factory.createIdentifier(name)
9
+ : ts.factory.createStringLiteral(name);
10
+ }
11
+
12
+ export function join(prefix: ts.Expression, name: string) {
13
+ const postfix = generate(name);
14
+ return ts.isStringLiteral(postfix)
15
+ ? ts.factory.createElementAccessExpression(prefix, postfix)
16
+ : ts.factory.createPropertyAccessExpression(prefix, postfix);
17
+ }
18
+
19
+ export function postfix(str: string): string {
20
+ return Escaper.variable(str)
21
+ ? `".${str}"`
22
+ : `"[${JSON.stringify(str).split('"').join('\\"')}]"`;
23
+ }
24
+
25
+ export function parameter(
26
+ name: string | ts.BindingName,
27
+ init?: ts.Expression,
28
+ ) {
29
+ if (ts.version >= "4.8")
30
+ return ts.factory.createParameterDeclaration(
31
+ undefined,
32
+ undefined,
33
+ name,
34
+ undefined,
35
+ undefined,
36
+ init,
37
+ );
38
+ // eslint-disable-next-line
39
+ return ts.factory.createParameterDeclaration(
40
+ undefined,
41
+ undefined,
42
+ undefined,
43
+ name,
44
+ undefined,
45
+ undefined,
46
+ init,
47
+ );
48
+ }
49
+
50
+ // export function property(
51
+ // name: string | ts.PropertyName,
52
+ // value: ts.Expression,
53
+ // ): ts.PropertyDeclaration {
54
+ // if (ts.version >= "4.8")
55
+ // return ts.factory.createPropertyDeclaration(
56
+ // undefined,
57
+ // name,
58
+ // undefined,
59
+ // undefined,
60
+ // value,
61
+ // );
62
+ // // eslint-disable-next-line
63
+ // return ts.factory.createPropertyDeclaration(
64
+ // undefined,
65
+ // undefined,
66
+ // name,
67
+ // undefined,
68
+ // undefined,
69
+ // value,
70
+ // );
71
+ // }
72
+ }
@@ -0,0 +1,44 @@
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "./IdentifierFactory";
4
+
5
+ export namespace LiteralFactory {
6
+ export function generate(input: any): ts.Expression {
7
+ if (input === null) return ts.factory.createNull();
8
+ else if (ts.isIdentifier(input)) return input;
9
+ else if (input instanceof Array) return generate_array(input);
10
+ else if (typeof input === "object") return generate_object(input);
11
+ else if (typeof input === "string") return generate_string(input);
12
+ else if (typeof input === "boolean") return generate_value(input);
13
+ else if (typeof input === "number") return generate_value(input);
14
+ else if (typeof input === "bigint") return generate_value(input);
15
+ else throw new Error("Unknown type.");
16
+ }
17
+
18
+ function generate_object(obj: object): ts.ObjectLiteralExpression {
19
+ const properties = Object.entries(obj)
20
+ .filter((tuple) => tuple[1] !== undefined)
21
+ .map(([key, value]) =>
22
+ ts.factory.createPropertyAssignment(
23
+ IdentifierFactory.generate(key),
24
+ generate(value),
25
+ ),
26
+ );
27
+ return ts.factory.createObjectLiteralExpression(properties, true);
28
+ }
29
+
30
+ function generate_array(array: any[]): ts.ArrayLiteralExpression {
31
+ return ts.factory.createArrayLiteralExpression(
32
+ array.map(generate),
33
+ true,
34
+ );
35
+ }
36
+
37
+ function generate_value(value: number | boolean | bigint): ts.Identifier {
38
+ return ts.factory.createIdentifier(value.toString());
39
+ }
40
+
41
+ function generate_string(value: string): ts.StringLiteral {
42
+ return ts.factory.createStringLiteral(value);
43
+ }
44
+ }
@@ -0,0 +1,122 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../metadata/Metadata";
4
+ import { MetadataObject } from "../metadata/MetadataObject";
5
+
6
+ import { MapUtil } from "../utils/MapUtil";
7
+
8
+ import { CommentFactory } from "./CommentFactory";
9
+ import { TypeFactory } from "./TypeFactory";
10
+
11
+ export class MetadataCollection {
12
+ private readonly dict_: Map<ts.Type, MetadataObject>;
13
+ private readonly names_: Map<string, Map<ts.Type, string>>;
14
+ private readonly unions_: Map<string, MetadataObject[]>;
15
+ private index_: number;
16
+
17
+ public constructor(
18
+ private readonly options?: Partial<MetadataCollection.IOptions>,
19
+ ) {
20
+ this.dict_ = new Map();
21
+ this.names_ = new Map();
22
+ this.unions_ = new Map();
23
+ this.index_ = 0;
24
+ }
25
+
26
+ public objects(): MetadataObject[] {
27
+ return [...this.dict_.values()];
28
+ }
29
+ public unions(): MetadataObject[][] {
30
+ return [...this.unions_.values()];
31
+ }
32
+
33
+ public emplace(
34
+ checker: ts.TypeChecker,
35
+ type: ts.Type,
36
+ ): [MetadataObject, boolean] {
37
+ const oldbie = this.dict_.get(type);
38
+ if (oldbie !== undefined) return [oldbie, false];
39
+
40
+ const $id: string = this.get_name(checker, type);
41
+ const obj: MetadataObject = MetadataObject.create({
42
+ name: $id,
43
+ properties: [],
44
+ description:
45
+ (type.symbol &&
46
+ CommentFactory.generate(
47
+ type.symbol.getDocumentationComment(checker),
48
+ )) ||
49
+ undefined,
50
+ jsDocTags: type.symbol?.getJsDocTags() || [],
51
+ validated: false,
52
+ index: this.index_++,
53
+ recursive: false,
54
+ nullables: [],
55
+ });
56
+ this.dict_.set(type, obj);
57
+ return [obj, true];
58
+ }
59
+
60
+ /**
61
+ * @internal
62
+ */
63
+ public getUnionIndex(meta: Metadata): number {
64
+ const key: string = meta.objects.map((obj) => obj.name).join(" | ");
65
+ MapUtil.take(this.unions_, key, () => meta.objects);
66
+ return [...this.unions_.keys()].indexOf(key);
67
+ }
68
+
69
+ private get_name(checker: ts.TypeChecker, type: ts.Type): string {
70
+ const name: string = (() => {
71
+ const str: string = TypeFactory.getFullName(checker, type);
72
+ return this.options?.replace ? this.options.replace(str) : str;
73
+ })();
74
+
75
+ const duplicates: Map<ts.Type, string> = MapUtil.take(
76
+ this.names_,
77
+ name,
78
+ () => new Map(),
79
+ );
80
+ const oldbie: string | undefined = duplicates.get(type);
81
+ if (oldbie !== undefined) return oldbie;
82
+
83
+ const addicted: string = duplicates.size
84
+ ? `${name}.o${duplicates.size}`
85
+ : name;
86
+ duplicates.set(type, addicted);
87
+ return addicted;
88
+ }
89
+ }
90
+ export namespace MetadataCollection {
91
+ export interface IOptions {
92
+ replace?(str: string): string;
93
+ }
94
+
95
+ export function replace(str: string): string {
96
+ for (const [before, after] of REPLACERS)
97
+ str = str.split(before).join(after);
98
+ return str;
99
+ }
100
+
101
+ export function escape(str: string): string {
102
+ for (const [before, after] of REPLACERS)
103
+ if (after !== "") str = str.split(after).join(before);
104
+ return str;
105
+ }
106
+ }
107
+ const REPLACERS: [string, string][] = [
108
+ ["$", "_dollar_"],
109
+ ["&", "_and_"],
110
+ ["|", "_or_"],
111
+ ["{", "_blt_"],
112
+ ["}", "_bgt_"],
113
+ ["<", "_lt_"],
114
+ [">", "_gt_"],
115
+ ["[", "_alt_"],
116
+ ["]", "_agt_"],
117
+ [",", "_comma_"],
118
+ ["`", "_backquote_"],
119
+ ["'", "_singlequote_"],
120
+ ['"', "_doublequote_"],
121
+ [" ", "_space_"],
122
+ ];
@@ -0,0 +1,46 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../metadata/Metadata";
4
+
5
+ import { ArrayUtil } from "../utils/ArrayUtil";
6
+
7
+ import { MetadataCollection } from "./MetadataCollection";
8
+ import { explore_metadata } from "./internal/explore_metadata";
9
+
10
+ export namespace MetadataFactory {
11
+ export interface IOptions {
12
+ resolve: boolean;
13
+ constant: boolean;
14
+ }
15
+
16
+ export function generate(
17
+ checker: ts.TypeChecker,
18
+ collection: MetadataCollection,
19
+ type: ts.Type | null,
20
+ options: IOptions,
21
+ ): Metadata {
22
+ // CONSTRUCT SCHEMA WITH OBJECTS
23
+ const metadata: Metadata = explore_metadata(checker)(options)(
24
+ collection,
25
+ )(type, false);
26
+
27
+ // FIND RECURSIVE OBJECTS
28
+ for (const object of collection.objects())
29
+ object.recursive = object.properties.some(
30
+ (prop) =>
31
+ ArrayUtil.has(
32
+ prop.value.objects,
33
+ (elem) => elem.name === object.name,
34
+ ) ||
35
+ prop.value.arrays.some((meta) =>
36
+ ArrayUtil.has(
37
+ meta.objects,
38
+ (elem) => elem.name === object.name,
39
+ ),
40
+ ),
41
+ );
42
+
43
+ // RETURNS
44
+ return metadata;
45
+ }
46
+ }
@@ -0,0 +1,347 @@
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 function generate(
8
+ identifier: () => string,
9
+ metadata: Metadata,
10
+ tagList: ts.JSDocTagInfo[],
11
+ ): IMetadataTag[] {
12
+ const output: IMetadataTag[] = [];
13
+ for (const tag of tagList) {
14
+ const elem: IMetadataTag | null = parse(
15
+ identifier,
16
+ metadata,
17
+ tag,
18
+ output,
19
+ );
20
+ if (elem !== null) output.push(elem);
21
+ }
22
+ return output;
23
+ }
24
+
25
+ function parse(
26
+ identifier: () => string,
27
+ metadata: Metadata,
28
+ tag: ts.JSDocTagInfo,
29
+ output: IMetadataTag[],
30
+ ): IMetadataTag | null {
31
+ const closure = PARSER[tag.name];
32
+ if (closure === undefined) return null;
33
+
34
+ const text = (tag.text || [])[0]?.text;
35
+ if (text === undefined)
36
+ throw new Error(`${LABEL}: no tag value on ${identifier()}`);
37
+
38
+ return closure(identifier, metadata, text, output);
39
+ }
40
+ }
41
+
42
+ const PARSER: Record<
43
+ string,
44
+ (
45
+ identifier: () => string,
46
+ metadata: Metadata,
47
+ text: string,
48
+ output: IMetadataTag[],
49
+ ) => IMetadataTag | null
50
+ > = {
51
+ /* -----------------------------------------------------------
52
+ ARRAY
53
+ ----------------------------------------------------------- */
54
+ items: (identifier, metadata, text, output) => {
55
+ validate(identifier, metadata, output, "items", "array", [
56
+ "minItems",
57
+ "maxItems",
58
+ ]);
59
+ return parse_range("items", identifier, text, true);
60
+ },
61
+ minItems: (identifier, metadata, text, output) => {
62
+ validate(identifier, metadata, output, "minItems", "array", ["items"]);
63
+ return {
64
+ kind: "minItems",
65
+ value: parse_number(identifier, text),
66
+ };
67
+ },
68
+ maxItems: (identifier, metadata, text, output) => {
69
+ validate(identifier, metadata, output, "maxItems", "array", ["items"]);
70
+ return {
71
+ kind: "maxItems",
72
+ value: parse_number(identifier, text),
73
+ };
74
+ },
75
+
76
+ /* -----------------------------------------------------------
77
+ NUMBER
78
+ ----------------------------------------------------------- */
79
+ type: (identifier, metadata, text, output) => {
80
+ validate(identifier, metadata, output, "type", "number", []);
81
+ if (text !== "int" && text !== "uint")
82
+ throw new Error(`${LABEL}: invalid type tag on "${identifier()}".`);
83
+ return { kind: "type", value: text };
84
+ },
85
+ range: (identifier, metadata, text, output) => {
86
+ validate(identifier, metadata, output, "range", "number", [
87
+ "exclusiveMinimum",
88
+ "minimum",
89
+ "maximum",
90
+ "exclusiveMaximum",
91
+ ]);
92
+ return parse_range("range", identifier, text, false);
93
+ },
94
+ minimum: (identifier, metadata, text, output) => {
95
+ validate(identifier, metadata, output, "minimum", "number", [
96
+ "range",
97
+ "exclusiveMaximum",
98
+ "exclusiveMinimum",
99
+ ]);
100
+ return {
101
+ kind: "minimum",
102
+ value: parse_number(identifier, text),
103
+ };
104
+ },
105
+ maximum: (identifier, metadata, text, output) => {
106
+ validate(identifier, metadata, output, "maximum", "number", [
107
+ "range",
108
+ "exclusiveMinimum",
109
+ "exclusiveMaximum",
110
+ ]);
111
+ return {
112
+ kind: "maximum",
113
+ value: parse_number(identifier, text),
114
+ };
115
+ },
116
+ exclusiveMinimum: (identifier, metadata, text, output) => {
117
+ validate(identifier, metadata, output, "exclusiveMinimum", "number", [
118
+ "range",
119
+ "minimum",
120
+ "maximum",
121
+ ]);
122
+ return {
123
+ kind: "exclusiveMinimum",
124
+ value: parse_number(identifier, text),
125
+ };
126
+ },
127
+ exclusiveMaximum: (identifier, metadata, text, output) => {
128
+ validate(identifier, metadata, output, "exclusiveMaximum", "number", [
129
+ "range",
130
+ "minimum",
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" ||
155
+ tag.kind === "exclusiveMinimum" ||
156
+ (tag.kind === "range" && tag.minimum !== undefined),
157
+ );
158
+ if (minimum === undefined)
159
+ throw new Error(
160
+ `${LABEL}: step requires minimum 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, value, output) => {
173
+ validate(identifier, metadata, output, "format", "string", ["pattern"]);
174
+
175
+ // Ignore arbitrary @format values in the internal metadata,
176
+ // these are currently only supported on the typia.application() API.
177
+ if (FORMATS.has(value) === false) return null;
178
+
179
+ return {
180
+ kind: "format",
181
+ value: value as "uuid",
182
+ };
183
+ },
184
+ pattern: (identifier, metadata, value, output) => {
185
+ validate(identifier, metadata, output, "pattern", "string", ["format"]);
186
+ return {
187
+ kind: "pattern",
188
+ value,
189
+ };
190
+ },
191
+ length: (identifier, metadata, text, output) => {
192
+ validate(identifier, metadata, output, "length", "string", [
193
+ "minLength",
194
+ "maxLength",
195
+ ]);
196
+ return parse_range("length", identifier, text, true);
197
+ },
198
+ minLength: (identifier, metadata, text, output) => {
199
+ validate(identifier, metadata, output, "minLength", "string", [
200
+ "length",
201
+ ]);
202
+ return {
203
+ kind: "minLength",
204
+ value: parse_number(identifier, text),
205
+ };
206
+ },
207
+ maxLength: (identifier, metadata, text, output) => {
208
+ validate(identifier, metadata, output, "maxLength", "string", [
209
+ "length",
210
+ ]);
211
+ return {
212
+ kind: "maxLength",
213
+ value: parse_number(identifier, text),
214
+ };
215
+ },
216
+ };
217
+
218
+ function parse_range<Kind extends string>(
219
+ kind: Kind,
220
+ identifier: () => string,
221
+ text: string,
222
+ allowScalar: boolean,
223
+ ): Omit<IMetadataTag.IRange, "kind"> & { kind: Kind } {
224
+ if (allowScalar === true && Number.isNaN(Number(text)) === false) {
225
+ const value: number = Number(text);
226
+ if (Math.floor(value) !== value)
227
+ throw new Error(`${LABEL}: invalid length on "${identifier()}".`);
228
+ return {
229
+ kind,
230
+ minimum: {
231
+ include: true,
232
+ value,
233
+ },
234
+ maximum: {
235
+ include: true,
236
+ value,
237
+ },
238
+ };
239
+ } else if (text.indexOf(",") === -1)
240
+ if (LEFT_PARENTHESIS.some((str) => text.indexOf(str) !== -1))
241
+ return {
242
+ kind,
243
+ minimum: parse_side("left")(kind)(identifier)(text),
244
+ };
245
+ else if (RIGHT_PARENTHESIS.some((str) => text.indexOf(str) !== -1))
246
+ return {
247
+ kind,
248
+ maximum: parse_side("right")(kind)(identifier)(text),
249
+ };
250
+ else
251
+ throw new Error(
252
+ `${LABEL}: invalid ${kind} tag on "${identifier()}".`,
253
+ );
254
+
255
+ const [left, right] = text.split(",") as [string, string];
256
+ return {
257
+ kind,
258
+ minimum: parse_side("left")(kind)(identifier)(left),
259
+ maximum: parse_side("right")(kind)(identifier)(right),
260
+ };
261
+ }
262
+
263
+ const parse_side = (side: "left" | "right") => {
264
+ const symbol = side === "left" ? LEFT_PARENTHESIS : RIGHT_PARENTHESIS;
265
+ const substring: (str: string, index: number) => string =
266
+ side === "left"
267
+ ? (str, index) => str.substring(index + 1)
268
+ : (str, index) => str.substring(0, index);
269
+ return (tag: string) => (identifier: () => string) => (text: string) => {
270
+ const [index, include] =
271
+ text.indexOf(symbol[0]) !== -1
272
+ ? [text.indexOf(symbol[0]), true]
273
+ : [text.indexOf(symbol[1]), false];
274
+ if (index === -1)
275
+ throw new Error(
276
+ `${LABEL}: invalid ${tag} tag on "${identifier()}".`,
277
+ );
278
+ return {
279
+ include,
280
+ value: parse_number(identifier, substring(text, index)),
281
+ };
282
+ };
283
+ };
284
+
285
+ function parse_number(identifier: () => string, str: string): number {
286
+ const value: number = Number(str);
287
+ if (isNaN(value) === true)
288
+ throw new Error(`${LABEL}: invalid number on "${identifier()}".`);
289
+ return value;
290
+ }
291
+
292
+ const LABEL = "Error on typia.MetadataTagFactory.generate()";
293
+ const LEFT_PARENTHESIS = ["[", "("] as const;
294
+ const RIGHT_PARENTHESIS = ["]", ")"] as const;
295
+ const FORMATS = new Set(["uuid", "email", "url", "mobile", "ipv4", "ipv6"]);
296
+
297
+ const WRONG_TYPE = (
298
+ tag: string,
299
+ type: "string" | "number" | "array",
300
+ identifier: () => string,
301
+ ) => `${LABEL}: ${tag} requires ${type} type, but no "${identifier()}".`;
302
+
303
+ function validate(
304
+ identifier: () => string,
305
+ metadata: Metadata,
306
+ output: IMetadataTag[],
307
+ kind: IMetadataTag["kind"],
308
+ type: "array" | "string" | "number",
309
+ neighbors: IMetadataTag["kind"][],
310
+ ): void {
311
+ // TYPE CHECKING
312
+ if (type === "array") {
313
+ if (has_array(metadata) === false)
314
+ throw new Error(WRONG_TYPE(kind, "array", identifier));
315
+ } else if (has_atomic(metadata, type) === false)
316
+ throw new Error(WRONG_TYPE(kind, type, identifier));
317
+
318
+ // DUPLICATED TAG
319
+ if (output.some((tag) => tag.kind === kind))
320
+ throw new Error(
321
+ `${LABEL}: duplicated ${kind} tags on "${identifier()}".`,
322
+ );
323
+
324
+ // NEIGHBOR TAG
325
+ for (const name of neighbors)
326
+ if (output.some((tag) => tag.kind === name))
327
+ throw new Error(
328
+ `${LABEL}: ${kind} and ${name} tags on "${identifier()}".`,
329
+ );
330
+ }
331
+
332
+ function has_atomic(metadata: Metadata, type: "string" | "number"): boolean {
333
+ return (
334
+ metadata.atomics.find((atom) => atom === type) !== undefined ||
335
+ metadata.arrays.some((child) => has_atomic(child, type)) ||
336
+ metadata.tuples.some((tuple) =>
337
+ tuple.some((child) => has_atomic(child, type)),
338
+ )
339
+ );
340
+ }
341
+
342
+ function has_array(metadata: Metadata): boolean {
343
+ return (
344
+ metadata.arrays.length !== 0 ||
345
+ metadata.tuples.some((tuple) => tuple.some((child) => has_array(child)))
346
+ );
347
+ }
@@ -0,0 +1,60 @@
1
+ import ts from "typescript";
2
+
3
+ export namespace StatementFactory {
4
+ export function constant(name: string, initializer?: ts.Expression) {
5
+ return ts.factory.createVariableStatement(
6
+ undefined,
7
+ ts.factory.createVariableDeclarationList(
8
+ [
9
+ ts.factory.createVariableDeclaration(
10
+ name,
11
+ undefined,
12
+ undefined,
13
+ initializer,
14
+ ),
15
+ ],
16
+ ts.NodeFlags.Const,
17
+ ),
18
+ );
19
+ }
20
+
21
+ export function transpile(script: string) {
22
+ return ts.factory.createExpressionStatement(
23
+ ts.factory.createIdentifier(ts.transpile(script)),
24
+ );
25
+ }
26
+
27
+ // export function require(variable: string, location: string) {
28
+ // return ts.factory.createImportDeclaration(
29
+ // undefined,
30
+ // undefined,
31
+ // ts.factory.createImportClause(
32
+ // false,
33
+ // undefined,
34
+ // ts.factory.createNamespaceImport(
35
+ // ts.factory.createIdentifier(variable),
36
+ // ),
37
+ // ),
38
+ // ts.factory.createStringLiteral(location),
39
+ // );
40
+ // }
41
+
42
+ // export function importModulo(variable: string, location: string) {
43
+ // return ts.factory.createImportDeclaration(
44
+ // undefined,
45
+ // undefined,
46
+ // ts.factory.createImportClause(
47
+ // false,
48
+ // undefined,
49
+ // ts.factory.createNamedImports([
50
+ // ts.factory.createImportSpecifier(
51
+ // false,
52
+ // undefined,
53
+ // ts.factory.createIdentifier(variable),
54
+ // ),
55
+ // ]),
56
+ // ),
57
+ // ts.factory.createStringLiteral(location),
58
+ // );
59
+ // }
60
+ }