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,56 @@
1
+ import ts from "typescript";
2
+
3
+ export namespace TemplateFactory {
4
+ export function generate(expressions: ts.Expression[]): ts.Expression {
5
+ if (expressions.every((exp) => ts.isStringLiteral(exp)))
6
+ return ts.factory.createStringLiteral(
7
+ (expressions as ts.StringLiteral[])
8
+ .map((str) => str.text)
9
+ .join(""),
10
+ );
11
+
12
+ const it: IIerator = {
13
+ value: "",
14
+ index: 0,
15
+ };
16
+ gather(expressions, it);
17
+
18
+ const head: ts.TemplateHead = ts.factory.createTemplateHead(it.value);
19
+ const spans: ts.TemplateSpan[] = [];
20
+
21
+ while (true) {
22
+ const elem: ts.Expression = expressions[it.index++]!;
23
+ gather(expressions, it);
24
+
25
+ const broken: boolean = it.index === expressions.length;
26
+ spans.push(
27
+ ts.factory.createTemplateSpan(
28
+ elem,
29
+ broken
30
+ ? ts.factory.createTemplateTail(it.value)
31
+ : ts.factory.createTemplateMiddle(it.value),
32
+ ),
33
+ );
34
+ if (broken === true) break;
35
+ }
36
+ return ts.factory.createTemplateExpression(head, spans);
37
+ }
38
+
39
+ function gather(expressions: ts.Expression[], it: IIerator): void {
40
+ const found: number = expressions.findIndex(
41
+ (elem, index) => index >= it.index && !ts.isStringLiteral(elem),
42
+ );
43
+
44
+ const last: number = found !== -1 ? found : expressions.length;
45
+ it.value = expressions
46
+ .slice(it.index, last)
47
+ .map((elem) => (elem as ts.StringLiteral).text)
48
+ .reduce((x, y) => x + y, "");
49
+ it.index = last;
50
+ }
51
+
52
+ interface IIerator {
53
+ value: string;
54
+ index: number;
55
+ }
56
+ }
@@ -0,0 +1,101 @@
1
+ import ts from "typescript";
2
+
3
+ export namespace TypeFactory {
4
+ export function resolve(
5
+ checker: ts.TypeChecker,
6
+ type: ts.Type,
7
+ ): ts.Type | null {
8
+ return getReturnType(checker, type, "toJSON");
9
+ }
10
+
11
+ export function isFunction(type: ts.Type): boolean {
12
+ return getFunction(type) !== null;
13
+ }
14
+ function getFunction(type: ts.Type) {
15
+ const node = type.symbol?.declarations?.[0];
16
+ if (node === undefined) return null;
17
+
18
+ return ts.isFunctionLike(node)
19
+ ? node
20
+ : ts.isPropertyAssignment(node) || ts.isPropertyDeclaration(node)
21
+ ? ts.isFunctionLike(node.initializer)
22
+ ? node.initializer
23
+ : null
24
+ : null;
25
+ }
26
+
27
+ export function getReturnType(
28
+ checker: ts.TypeChecker,
29
+ type: ts.Type,
30
+ name: string,
31
+ ): ts.Type | null {
32
+ // FIND TO-JSON METHOD
33
+ const symbol: ts.Symbol | undefined = type.getProperty(name);
34
+ if (!symbol) return null;
35
+ else if (!symbol.valueDeclaration) return null;
36
+
37
+ // GET FUNCTION DECLARATION
38
+ const functor: ts.Type = checker.getTypeOfSymbolAtLocation(
39
+ symbol,
40
+ symbol.valueDeclaration,
41
+ );
42
+
43
+ // RETURNS THE RETURN-TYPE
44
+ const signature: ts.Signature | undefined = checker.getSignaturesOfType(
45
+ functor,
46
+ ts.SignatureKind.Call,
47
+ )[0];
48
+ return signature ? signature.getReturnType() : null;
49
+ }
50
+
51
+ export function getFullName(
52
+ checker: ts.TypeChecker,
53
+ type: ts.Type,
54
+ symbol?: ts.Symbol,
55
+ ): string {
56
+ // PRIMITIVE
57
+ symbol ||= type.aliasSymbol || type.getSymbol();
58
+ if (symbol === undefined) return checker.typeToString(type);
59
+
60
+ // UNION OR INTERSECT
61
+ if (type.aliasSymbol === undefined && type.isUnionOrIntersection()) {
62
+ const joiner: string = type.isIntersection() ? " & " : " | ";
63
+ return type.types
64
+ .map((child) => getFullName(checker, child))
65
+ .join(joiner);
66
+ }
67
+
68
+ //----
69
+ // SPECIALIZATION
70
+ //----
71
+ const name: string = get_name(symbol);
72
+
73
+ // CHECK GENERIC
74
+ const generic: readonly ts.Type[] = type.aliasSymbol
75
+ ? type.aliasTypeArguments || []
76
+ : checker.getTypeArguments(type as ts.TypeReference);
77
+ return generic.length
78
+ ? name === "Promise"
79
+ ? getFullName(checker, generic[0]!)
80
+ : `${name}<${generic
81
+ .map((child) => getFullName(checker, child))
82
+ .join(", ")}>`
83
+ : name;
84
+ }
85
+
86
+ function explore_name(name: string, decl: ts.Node): string {
87
+ return ts.isModuleBlock(decl)
88
+ ? explore_name(
89
+ `${decl.parent.name.getText()}.${name}`,
90
+ decl.parent.parent,
91
+ )
92
+ : name;
93
+ }
94
+
95
+ function get_name(symbol: ts.Symbol): string {
96
+ const parent = symbol.getDeclarations()?.[0]?.parent;
97
+ return parent
98
+ ? explore_name(symbol.escapedName.toString(), parent)
99
+ : "__type";
100
+ }
101
+ }
@@ -0,0 +1,12 @@
1
+ import ts from "typescript";
2
+
3
+ export namespace ValueFactory {
4
+ export const NULL = () => ts.factory.createNull();
5
+ export const UNDEFINED = () => ts.factory.createIdentifier("undefined");
6
+ export const BOOLEAN = (value: boolean) =>
7
+ value ? ts.factory.createTrue() : ts.factory.createFalse();
8
+ export const INPUT = (str: string = "input") =>
9
+ ts.factory.createIdentifier(str);
10
+ export const TYPEOF = (input: ts.Expression) =>
11
+ ts.factory.createTypeOfExpression(input);
12
+ }
@@ -0,0 +1,12 @@
1
+ import { Metadata } from "../../metadata/Metadata";
2
+
3
+ export namespace MetadataHelper {
4
+ export function literal_to_metadata(key: string): Metadata {
5
+ const metadata: Metadata = Metadata.initialize();
6
+ metadata.constants.push({
7
+ type: "string",
8
+ values: [key],
9
+ });
10
+ return metadata;
11
+ }
12
+ }
@@ -0,0 +1,140 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../metadata/Metadata";
4
+ import { MetadataObject } from "../../metadata/MetadataObject";
5
+ import { MetadataProperty } from "../../metadata/MetadataProperty";
6
+
7
+ import { Writable } from "../../typings/Writable";
8
+
9
+ import { ArrayUtil } from "../../utils/ArrayUtil";
10
+
11
+ import { CommentFactory } from "../CommentFactory";
12
+ import { MetadataCollection } from "../MetadataCollection";
13
+ import { MetadataFactory } from "../MetadataFactory";
14
+ import { MetadataTagFactory } from "../MetadataTagFactory";
15
+ import { MetadataHelper } from "./MetadataHelper";
16
+ import { explore_metadata } from "./explore_metadata";
17
+
18
+ export const emplace_metadata_object =
19
+ (checker: ts.TypeChecker) =>
20
+ (options: MetadataFactory.IOptions) =>
21
+ (collection: MetadataCollection) =>
22
+ (parent: ts.Type, nullable: boolean): MetadataObject => {
23
+ // EMPLACE OBJECT
24
+ const [obj, newbie] = collection.emplace(checker, parent);
25
+ ArrayUtil.add(obj.nullables, nullable, (elem) => elem === nullable);
26
+ if (newbie === false) return obj;
27
+
28
+ // PREPARE ASSETS
29
+ const isClass: boolean = parent.isClass();
30
+ const pred: (node: ts.Declaration) => boolean = isClass
31
+ ? (node) => {
32
+ const kind: ts.SyntaxKind | undefined = node
33
+ .getChildren()[0]
34
+ ?.getChildren()[0]?.kind;
35
+ return (
36
+ kind !== ts.SyntaxKind.PrivateKeyword &&
37
+ kind !== ts.SyntaxKind.ProtectedKeyword &&
38
+ (ts.isParameter(node) || ts.isPropertyDeclaration(node))
39
+ );
40
+ }
41
+ : (node) =>
42
+ ts.isPropertyDeclaration(node) ||
43
+ ts.isPropertyAssignment(node) ||
44
+ ts.isPropertySignature(node) ||
45
+ ts.isTypeLiteralNode(node);
46
+
47
+ const insert =
48
+ (key: Metadata) =>
49
+ (value: Metadata) =>
50
+ (identifier: () => string) =>
51
+ (
52
+ symbol: ts.Symbol | undefined,
53
+ filter?: (doc: ts.JSDocTagInfo) => boolean,
54
+ ): MetadataProperty => {
55
+ // COMMENTS AND TAGS
56
+ const description: string | undefined =
57
+ CommentFactory.generate(
58
+ symbol?.getDocumentationComment(checker) || [],
59
+ ) || undefined;
60
+ const jsDocTags: ts.JSDocTagInfo[] = (
61
+ symbol?.getJsDocTags() || []
62
+ ).filter(filter || (() => true));
63
+
64
+ // THE PROPERTY
65
+ const property = MetadataProperty.create({
66
+ key,
67
+ value,
68
+ description,
69
+ jsDocTags,
70
+ tags: MetadataTagFactory.generate(
71
+ () => identifier(),
72
+ value,
73
+ jsDocTags,
74
+ ),
75
+ });
76
+ obj.properties.push(property);
77
+ return property;
78
+ };
79
+
80
+ //----
81
+ // REGULAR PROPERTIES
82
+ //----
83
+ for (const prop of parent.getApparentProperties()) {
84
+ // CHECK INTERNAL TAG
85
+ if (
86
+ (prop.getJsDocTags(checker) || []).find(
87
+ (tag) => tag.name === "internal",
88
+ ) !== undefined
89
+ )
90
+ continue;
91
+
92
+ // CHECK NODE IS A FORMAL PROPERTY
93
+ const [node, type] = (() => {
94
+ const node = (prop.getDeclarations() || [])[0] as
95
+ | ts.PropertyDeclaration
96
+ | undefined;
97
+ const type: ts.Type | undefined = node
98
+ ? checker.getTypeOfSymbolAtLocation(prop, node)
99
+ : "getTypeOfPropertyOfType" in checker
100
+ ? (checker as any).getTypeOfPropertyOfType(
101
+ parent,
102
+ prop.name,
103
+ )
104
+ : undefined;
105
+ return [node, type];
106
+ })();
107
+ if ((node && pred(node) === false) || type === undefined) continue;
108
+
109
+ // GET EXACT TYPE
110
+ const key: Metadata = MetadataHelper.literal_to_metadata(prop.name);
111
+ const value: Metadata = explore_metadata(checker)(options)(
112
+ collection,
113
+ )(type, false);
114
+
115
+ // INSERT WITH REQUIRED CONFIGURATION
116
+ if (node?.questionToken) Writable(value).required = false;
117
+ insert(key)(value)(() => `${obj.name}.${prop.name}`)(prop);
118
+ }
119
+
120
+ //----
121
+ // DYNAMIC PROPERTIES
122
+ //----
123
+ for (const index of checker.getIndexInfosOfType(parent)) {
124
+ // GET EXACT TYPE
125
+ const analyzer = (type: ts.Type) =>
126
+ explore_metadata(checker)(options)(collection)(type, false);
127
+ const key: Metadata = analyzer(index.keyType);
128
+ const value: Metadata = analyzer(index.type);
129
+
130
+ // INSERT WITH REQUIRED CONFIGURATION
131
+ insert(key)(value)(() => `${obj.name}[${key.getName()}]`)(
132
+ index.declaration?.parent
133
+ ? checker.getSymbolAtLocation(index.declaration.parent)
134
+ : undefined,
135
+ (doc) => doc.name !== "default",
136
+ );
137
+ }
138
+
139
+ return obj;
140
+ };
@@ -0,0 +1,91 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../metadata/Metadata";
4
+ import { MetadataObject } from "../../metadata/MetadataObject";
5
+
6
+ import { ArrayUtil } from "../../utils/ArrayUtil";
7
+
8
+ import { MetadataCollection } from "../MetadataCollection";
9
+ import { MetadataFactory } from "../MetadataFactory";
10
+ import { iterate_metadata } from "./iterate_metadata";
11
+
12
+ export const explore_metadata =
13
+ (checker: ts.TypeChecker) =>
14
+ (options: MetadataFactory.IOptions) =>
15
+ (collection: MetadataCollection) =>
16
+ (type: ts.Type | null, parentResolved: boolean): Metadata => {
17
+ // CONSTRUCT METADATA
18
+ const meta: Metadata = Metadata.initialize(parentResolved);
19
+ if (type !== null)
20
+ iterate_metadata(checker)(options)(collection)(
21
+ meta,
22
+ type,
23
+ parentResolved,
24
+ );
25
+
26
+ // SORT OBJECTS
27
+ if (meta.objects.length > 1) {
28
+ meta.objects.sort((x, y) =>
29
+ MetadataObject.covers(x, y)
30
+ ? -1
31
+ : MetadataObject.covers(y, x)
32
+ ? 1
33
+ : 0,
34
+ );
35
+ if (parentResolved === false)
36
+ meta.union_index = collection.getUnionIndex(meta);
37
+ }
38
+
39
+ // SORT ARRAYS AND TUPLES
40
+ if (meta.arrays.length > 1)
41
+ meta.arrays.sort((x, y) =>
42
+ Metadata.covers(x, y) ? -1 : Metadata.covers(y, x) ? 1 : 0,
43
+ );
44
+ if (meta.tuples.length > 1)
45
+ meta.tuples.sort((x, y) => {
46
+ const xt = Metadata.initialize();
47
+ const yt = Metadata.initialize();
48
+
49
+ xt.tuples.push(x);
50
+ yt.tuples.push(y);
51
+
52
+ return Metadata.covers(xt, yt)
53
+ ? -1
54
+ : Metadata.covers(yt, xt)
55
+ ? 1
56
+ : 0;
57
+ });
58
+
59
+ // EMEND ATOMICS
60
+ for (const type of meta.atomics) {
61
+ const index: number = meta.constants.findIndex(
62
+ (c) => c.type === type,
63
+ );
64
+ if (index !== -1) meta.constants.splice(index, 1);
65
+ }
66
+
67
+ // EMEND BOOLEAN
68
+ {
69
+ const index: number = meta.constants.findIndex(
70
+ (c) => c.type === "boolean",
71
+ );
72
+ if (index !== -1 && meta.constants[index]!.values.length === 2) {
73
+ meta.constants.splice(index, 1);
74
+ ArrayUtil.take(
75
+ meta.atomics,
76
+ (type) => type === "boolean",
77
+ () => "boolean",
78
+ );
79
+ }
80
+ }
81
+
82
+ // EMEND TEMPLATE
83
+ if (
84
+ meta.templates.length &&
85
+ meta.atomics.find((type) => type === "string") !== undefined
86
+ )
87
+ meta.templates.splice(0, meta.templates.length);
88
+
89
+ // RETURNS
90
+ return meta;
91
+ };
@@ -0,0 +1,81 @@
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 { MetadataFactory } from "../MetadataFactory";
9
+ import { iterate_metadata_array } from "./iterate_metadata_array";
10
+ import { iterate_metadata_atomic } from "./iterate_metadata_atomic";
11
+ import { iterate_metadata_coalesce } from "./iterate_metadata_coalesce";
12
+ import { iterate_metadata_constant } from "./iterate_metadata_constant";
13
+ import { iterate_metadata_map } from "./iterate_metadata_map";
14
+ import { iterate_metadata_native } from "./iterate_metadata_native";
15
+ import { iterate_metadata_object } from "./iterate_metadata_object";
16
+ import { iterate_metadata_resolve } from "./iterate_metadata_resolve";
17
+ import { iterate_metadata_set } from "./iterate_metadata_set";
18
+ import { iterate_metadata_template } from "./iterate_metadata_template";
19
+ import { iterate_metadata_tuple } from "./iterate_metadata_tuple";
20
+ import { iterate_metadata_union } from "./iterate_metadata_union";
21
+
22
+ export const iterate_metadata =
23
+ (checker: ts.TypeChecker) =>
24
+ (options: MetadataFactory.IOptions) =>
25
+ (collection: MetadataCollection) =>
26
+ (meta: Metadata, type: ts.Type, parentResolved: boolean): void => {
27
+ if (type.isTypeParameter() === true)
28
+ throw new Error(
29
+ `Error on typia.MetadataFactory.generate(): non-specified generic argument on ${meta.getName()}.`,
30
+ );
31
+
32
+ // CHECK UNION & toJSON()
33
+ if (
34
+ iterate_metadata_union(checker)(options)(collection)(
35
+ meta,
36
+ type,
37
+ parentResolved,
38
+ ) ||
39
+ iterate_metadata_resolve(checker)(options)(collection)(
40
+ meta,
41
+ type,
42
+ parentResolved,
43
+ )
44
+ )
45
+ return;
46
+
47
+ // VALIDATE NODE
48
+ const node: ts.TypeNode | undefined = checker.typeToTypeNode(
49
+ type,
50
+ undefined,
51
+ undefined,
52
+ );
53
+ if (node === undefined) {
54
+ // EMPTY TUPLE CASE CAN BE
55
+ ArrayUtil.set(meta.tuples, [], () => "[]");
56
+ return;
57
+ }
58
+
59
+ // ITERATE CASES
60
+ iterate_metadata_coalesce(meta, type) ||
61
+ iterate_metadata_constant(checker)(options)(meta, type) ||
62
+ iterate_metadata_template(checker)(options)(collection)(
63
+ meta,
64
+ type,
65
+ ) ||
66
+ iterate_metadata_atomic(meta, type) ||
67
+ iterate_metadata_tuple(checker)(options)(collection)(
68
+ meta,
69
+ type,
70
+ node,
71
+ ) ||
72
+ iterate_metadata_array(checker)(options)(collection)(meta, type) ||
73
+ iterate_metadata_native(checker)(meta, type) ||
74
+ iterate_metadata_map(checker)(options)(collection)(meta, type) ||
75
+ iterate_metadata_set(checker)(options)(collection)(meta, type) ||
76
+ iterate_metadata_object(checker)(options)(collection)(
77
+ meta,
78
+ type,
79
+ parentResolved,
80
+ );
81
+ };
@@ -0,0 +1,29 @@
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 { MetadataFactory } from "../MetadataFactory";
9
+ import { explore_metadata } from "./explore_metadata";
10
+
11
+ export const iterate_metadata_array =
12
+ (checker: ts.TypeChecker) =>
13
+ (options: MetadataFactory.IOptions) =>
14
+ (collection: MetadataCollection) =>
15
+ (meta: Metadata, type: ts.Type): boolean => {
16
+ if (
17
+ !(checker as any).isArrayType(type) &&
18
+ !(checker as any).isArrayLikeType(type)
19
+ )
20
+ return false;
21
+
22
+ const value: ts.Type | null = type.getNumberIndexType() || null;
23
+ ArrayUtil.set(
24
+ meta.arrays,
25
+ explore_metadata(checker)(options)(collection)(value, false),
26
+ (elem) => elem.getName(),
27
+ );
28
+ return true;
29
+ };
@@ -0,0 +1,59 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../metadata/Metadata";
4
+
5
+ import { Atomic } from "../../typings/Atomic";
6
+
7
+ import { ArrayUtil } from "../../utils/ArrayUtil";
8
+
9
+ const same = (type: ts.Type | null) => {
10
+ if (type === null) return () => false;
11
+ return (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
12
+ };
13
+
14
+ export const iterate_metadata_atomic = (
15
+ meta: Metadata,
16
+ type: ts.Type,
17
+ ): boolean => {
18
+ // PREPARE INTERNAL FUNCTIONS
19
+ const filter = same(type);
20
+ const check = (info: IAtomicInfo) => {
21
+ if (filter(info.atomic) || filter(info.literal)) {
22
+ ArrayUtil.add(meta.atomics, info.name);
23
+ return true;
24
+ }
25
+ return false;
26
+ };
27
+
28
+ // CHECK EACH TYPES
29
+ return ATOMICS.some((info) => check(info));
30
+ };
31
+
32
+ const ATOMICS: IAtomicInfo[] = [
33
+ {
34
+ name: "boolean",
35
+ atomic: ts.TypeFlags.BooleanLike,
36
+ literal: ts.TypeFlags.BooleanLiteral,
37
+ },
38
+ {
39
+ name: "number",
40
+ atomic: ts.TypeFlags.NumberLike,
41
+ literal: ts.TypeFlags.NumberLiteral,
42
+ },
43
+ {
44
+ name: "bigint",
45
+ atomic: ts.TypeFlags.BigInt,
46
+ literal: ts.TypeFlags.BigIntLiteral,
47
+ },
48
+ {
49
+ name: "string",
50
+ atomic: ts.TypeFlags.StringLike,
51
+ literal: ts.TypeFlags.StringLiteral,
52
+ },
53
+ ];
54
+
55
+ interface IAtomicInfo {
56
+ name: Atomic.Literal;
57
+ atomic: ts.TypeFlags;
58
+ literal: ts.TypeFlags;
59
+ }
@@ -0,0 +1,33 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../metadata/Metadata";
4
+
5
+ import { Writable } from "../../typings/Writable";
6
+
7
+ import { TypeFactory } from "../TypeFactory";
8
+
9
+ export const iterate_metadata_coalesce = (
10
+ meta: Metadata,
11
+ type: ts.Type,
12
+ ): boolean => {
13
+ const filter = (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
14
+ if (filter(ts.TypeFlags.Unknown) || filter(ts.TypeFlags.Any)) {
15
+ Writable(meta).any = true;
16
+ return true;
17
+ } else if (filter(ts.TypeFlags.Null)) {
18
+ Writable(meta).nullable = true;
19
+ return true;
20
+ } else if (
21
+ filter(ts.TypeFlags.Undefined) ||
22
+ filter(ts.TypeFlags.Never) ||
23
+ filter(ts.TypeFlags.Void) ||
24
+ filter(ts.TypeFlags.VoidLike)
25
+ ) {
26
+ Writable(meta).required = false;
27
+ return true;
28
+ } else if (TypeFactory.isFunction(type) === true) {
29
+ Writable(meta).functional = true;
30
+ return true;
31
+ }
32
+ return false;
33
+ };
@@ -0,0 +1,58 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../metadata/Metadata";
4
+ import { MetadataConstant } from "../../metadata/MetadataConstant";
5
+
6
+ import { ArrayUtil } from "../../utils/ArrayUtil";
7
+
8
+ import { MetadataFactory } from "../MetadataFactory";
9
+
10
+ export const iterate_metadata_constant =
11
+ (checker: ts.TypeChecker) =>
12
+ (options: MetadataFactory.IOptions) =>
13
+ (meta: Metadata, type: ts.Type): boolean => {
14
+ if (!options.constant) return false;
15
+
16
+ const filter = (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
17
+ if (type.isLiteral()) {
18
+ const value: string | number | bigint =
19
+ typeof type.value === "object"
20
+ ? BigInt(
21
+ `${type.value.negative ? "-" : ""}${
22
+ type.value.base10Value
23
+ }`,
24
+ )
25
+ : type.value;
26
+ const constant: MetadataConstant = ArrayUtil.take(
27
+ meta.constants,
28
+ (elem) => elem.type === typeof value,
29
+ () => ({
30
+ type: typeof value as "number",
31
+ values: [],
32
+ }),
33
+ );
34
+ ArrayUtil.add(
35
+ constant.values as Array<any>,
36
+ value,
37
+ (a, b) => a === b,
38
+ );
39
+ return true;
40
+ } else if (filter(ts.TypeFlags.BooleanLiteral)) {
41
+ const value: boolean = checker.typeToString(type) === "true";
42
+ const constant: MetadataConstant = ArrayUtil.take(
43
+ meta.constants,
44
+ (elem) => elem.type === "boolean",
45
+ () => ({
46
+ type: "boolean",
47
+ values: [],
48
+ }),
49
+ );
50
+ ArrayUtil.add(
51
+ constant.values as boolean[],
52
+ value,
53
+ (a, b) => a === b,
54
+ );
55
+ return true;
56
+ }
57
+ return false;
58
+ };