typia 4.0.0-dev.20230517 → 4.0.0-dev.20230519

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 (472) hide show
  1. package/lib/TypeGuardError.js +6 -2
  2. package/lib/TypeGuardError.js.map +1 -1
  3. package/lib/executable/TypiaGenerateWizard.js +24 -23
  4. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  5. package/lib/executable/TypiaSetupWizard.js +27 -20
  6. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  7. package/lib/executable/setup/ArgumentParser.js +5 -5
  8. package/lib/executable/setup/ArgumentParser.js.map +1 -1
  9. package/lib/executable/setup/PackageManager.js +8 -8
  10. package/lib/executable/setup/PackageManager.js.map +1 -1
  11. package/lib/executable/setup/PluginConfigurator.js +5 -4
  12. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  13. package/lib/executable/typia.js +17 -17
  14. package/lib/executable/typia.js.map +1 -1
  15. package/lib/factories/CommentFactory.js +3 -0
  16. package/lib/factories/CommentFactory.js.map +1 -1
  17. package/lib/factories/ExpressionFactory.d.ts +6 -6
  18. package/lib/factories/ExpressionFactory.js +34 -28
  19. package/lib/factories/ExpressionFactory.js.map +1 -1
  20. package/lib/factories/IdentifierFactory.d.ts +4 -8
  21. package/lib/factories/IdentifierFactory.js +23 -26
  22. package/lib/factories/IdentifierFactory.js.map +1 -1
  23. package/lib/factories/LiteralFactory.d.ts +2 -2
  24. package/lib/factories/LiteralFactory.js +42 -36
  25. package/lib/factories/LiteralFactory.js.map +1 -1
  26. package/lib/factories/MetadataCollection.d.ts +3 -2
  27. package/lib/factories/MetadataCollection.js +10 -7
  28. package/lib/factories/MetadataCollection.js.map +1 -1
  29. package/lib/factories/MetadataFactory.d.ts +3 -6
  30. package/lib/factories/MetadataFactory.js +5 -3
  31. package/lib/factories/MetadataFactory.js.map +1 -1
  32. package/lib/factories/MetadataTagFactory.js +19 -2
  33. package/lib/factories/MetadataTagFactory.js.map +1 -1
  34. package/lib/factories/StatementFactory.d.ts +2 -3
  35. package/lib/factories/StatementFactory.js +5 -13
  36. package/lib/factories/StatementFactory.js.map +1 -1
  37. package/lib/factories/TemplateFactory.d.ts +2 -2
  38. package/lib/factories/TemplateFactory.js +37 -35
  39. package/lib/factories/TemplateFactory.js.map +1 -1
  40. package/lib/factories/TypeFactory.d.ts +7 -6
  41. package/lib/factories/TypeFactory.js +65 -51
  42. package/lib/factories/TypeFactory.js.map +1 -1
  43. package/lib/factories/ValueFactory.d.ts +6 -6
  44. package/lib/factories/ValueFactory.js +14 -14
  45. package/lib/factories/ValueFactory.js.map +1 -1
  46. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +3 -2
  47. package/lib/factories/internal/metadata/emplace_metadata_object.js +40 -27
  48. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  49. package/lib/factories/internal/metadata/explore_metadata.d.ts +3 -2
  50. package/lib/factories/internal/metadata/explore_metadata.js +69 -60
  51. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  52. package/lib/factories/internal/metadata/iterate_metadata.d.ts +3 -2
  53. package/lib/factories/internal/metadata/iterate_metadata.js +23 -17
  54. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  55. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +3 -2
  56. package/lib/factories/internal/metadata/iterate_metadata_array.js +11 -13
  57. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  58. package/lib/factories/internal/metadata/iterate_metadata_atomic.d.ts +2 -2
  59. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +25 -23
  60. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  61. package/lib/factories/internal/metadata/iterate_metadata_coalesce.d.ts +2 -2
  62. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js +26 -26
  63. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -1
  64. package/lib/factories/internal/metadata/iterate_metadata_constant.d.ts +3 -2
  65. package/lib/factories/internal/metadata/iterate_metadata_constant.js +28 -29
  66. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  67. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +3 -2
  68. package/lib/factories/internal/metadata/iterate_metadata_map.js +18 -16
  69. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  70. package/lib/factories/internal/metadata/iterate_metadata_native.d.ts +3 -2
  71. package/lib/factories/internal/metadata/iterate_metadata_native.js +39 -37
  72. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  73. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +3 -2
  74. package/lib/factories/internal/metadata/iterate_metadata_object.js +24 -23
  75. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  76. package/lib/factories/internal/metadata/iterate_metadata_resolve.d.ts +3 -2
  77. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +15 -10
  78. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  79. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +3 -2
  80. package/lib/factories/internal/metadata/iterate_metadata_set.js +14 -12
  81. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  82. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +3 -2
  83. package/lib/factories/internal/metadata/iterate_metadata_template.js +21 -20
  84. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  85. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +3 -2
  86. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +26 -25
  87. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  88. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +3 -2
  89. package/lib/factories/internal/metadata/iterate_metadata_union.js +54 -54
  90. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  91. package/lib/functional/$dictionary.js +3 -0
  92. package/lib/functional/$dictionary.js.map +1 -1
  93. package/lib/functional/$guard.js +20 -0
  94. package/lib/functional/$guard.js.map +1 -1
  95. package/lib/functional/$string.js +5 -0
  96. package/lib/functional/$string.js.map +1 -1
  97. package/lib/functional/$tail.js +3 -0
  98. package/lib/functional/$tail.js.map +1 -1
  99. package/lib/functional/Namespace.js +5 -0
  100. package/lib/functional/Namespace.js.map +1 -1
  101. package/lib/metadata/Metadata.js +71 -1
  102. package/lib/metadata/Metadata.js.map +1 -1
  103. package/lib/metadata/MetadataObject.js +22 -1
  104. package/lib/metadata/MetadataObject.js.map +1 -1
  105. package/lib/metadata/MetadataProperty.js +13 -1
  106. package/lib/metadata/MetadataProperty.js.map +1 -1
  107. package/lib/module.js +186 -0
  108. package/lib/module.js.map +1 -1
  109. package/lib/programmers/ApplicationProgrammer.d.ts +0 -4
  110. package/lib/programmers/ApplicationProgrammer.js +3 -1
  111. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  112. package/lib/programmers/AssertCloneProgrammer.d.ts +2 -6
  113. package/lib/programmers/AssertCloneProgrammer.js +9 -18
  114. package/lib/programmers/AssertCloneProgrammer.js.map +1 -1
  115. package/lib/programmers/AssertParseProgrammer.d.ts +2 -6
  116. package/lib/programmers/AssertParseProgrammer.js +7 -16
  117. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  118. package/lib/programmers/AssertProgrammer.d.ts +2 -6
  119. package/lib/programmers/AssertProgrammer.js +102 -106
  120. package/lib/programmers/AssertProgrammer.js.map +1 -1
  121. package/lib/programmers/AssertPruneProgrammer.d.ts +2 -2
  122. package/lib/programmers/AssertPruneProgrammer.js +12 -13
  123. package/lib/programmers/AssertPruneProgrammer.js.map +1 -1
  124. package/lib/programmers/AssertStringifyProgrammer.d.ts +2 -6
  125. package/lib/programmers/AssertStringifyProgrammer.js +8 -17
  126. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  127. package/lib/programmers/CheckerProgrammer.d.ts +5 -5
  128. package/lib/programmers/CheckerProgrammer.js +202 -186
  129. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  130. package/lib/programmers/CloneProgrammer.d.ts +2 -6
  131. package/lib/programmers/CloneProgrammer.js +233 -209
  132. package/lib/programmers/CloneProgrammer.js.map +1 -1
  133. package/lib/programmers/FeatureProgrammer.d.ts +7 -7
  134. package/lib/programmers/FeatureProgrammer.js +114 -96
  135. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  136. package/lib/programmers/IsCloneProgrammer.d.ts +2 -6
  137. package/lib/programmers/IsCloneProgrammer.js +12 -21
  138. package/lib/programmers/IsCloneProgrammer.js.map +1 -1
  139. package/lib/programmers/IsParseProgrammer.d.ts +2 -6
  140. package/lib/programmers/IsParseProgrammer.js +7 -16
  141. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  142. package/lib/programmers/IsProgrammer.d.ts +9 -9
  143. package/lib/programmers/IsProgrammer.js +98 -87
  144. package/lib/programmers/IsProgrammer.js.map +1 -1
  145. package/lib/programmers/IsPruneProgrammer.d.ts +2 -2
  146. package/lib/programmers/IsPruneProgrammer.js +12 -13
  147. package/lib/programmers/IsPruneProgrammer.js.map +1 -1
  148. package/lib/programmers/IsStringifyProgrammer.d.ts +2 -6
  149. package/lib/programmers/IsStringifyProgrammer.js +10 -19
  150. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  151. package/lib/programmers/LiteralsProgrammer.d.ts +2 -2
  152. package/lib/programmers/LiteralsProgrammer.js +12 -13
  153. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  154. package/lib/programmers/PruneProgrammer.d.ts +2 -2
  155. package/lib/programmers/PruneProgrammer.js +99 -80
  156. package/lib/programmers/PruneProgrammer.js.map +1 -1
  157. package/lib/programmers/RandomProgrammer.d.ts +2 -6
  158. package/lib/programmers/RandomProgrammer.js +271 -253
  159. package/lib/programmers/RandomProgrammer.js.map +1 -1
  160. package/lib/programmers/StringifyProgrammer.d.ts +2 -6
  161. package/lib/programmers/StringifyProgrammer.js +397 -355
  162. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  163. package/lib/programmers/TypiaProgrammer.js +45 -41
  164. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  165. package/lib/programmers/ValidateCloneProgrammer.d.ts +2 -2
  166. package/lib/programmers/ValidateCloneProgrammer.js +12 -13
  167. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -1
  168. package/lib/programmers/ValidateParseProgrammer.d.ts +2 -2
  169. package/lib/programmers/ValidateParseProgrammer.js +11 -12
  170. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  171. package/lib/programmers/ValidateProgrammer.d.ts +2 -2
  172. package/lib/programmers/ValidateProgrammer.js +97 -92
  173. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  174. package/lib/programmers/ValidatePruneProgrammer.d.ts +2 -2
  175. package/lib/programmers/ValidatePruneProgrammer.js +12 -13
  176. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -1
  177. package/lib/programmers/ValidateStringifyProgrammer.d.ts +2 -2
  178. package/lib/programmers/ValidateStringifyProgrammer.js +12 -13
  179. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  180. package/lib/programmers/helpers/CloneJoiner.d.ts +4 -4
  181. package/lib/programmers/helpers/CloneJoiner.js +43 -43
  182. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  183. package/lib/programmers/helpers/FunctionImporeter.d.ts +3 -1
  184. package/lib/programmers/helpers/FunctionImporeter.js +6 -8
  185. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  186. package/lib/programmers/helpers/ICheckEntry.d.ts +1 -1
  187. package/lib/programmers/helpers/IExpressionEntry.d.ts +1 -1
  188. package/lib/programmers/helpers/PruneJoiner.d.ts +4 -4
  189. package/lib/programmers/helpers/PruneJoiner.js +54 -47
  190. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  191. package/lib/programmers/helpers/RandomJoiner.d.ts +4 -4
  192. package/lib/programmers/helpers/RandomJoiner.js +65 -59
  193. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  194. package/lib/programmers/helpers/RandomRanger.d.ts +3 -3
  195. package/lib/programmers/helpers/RandomRanger.js +91 -81
  196. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  197. package/lib/programmers/helpers/StringifyJoinder.d.ts +4 -4
  198. package/lib/programmers/helpers/StringifyJoinder.js +62 -54
  199. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  200. package/lib/programmers/helpers/UnionExplorer.d.ts +7 -7
  201. package/lib/programmers/helpers/UnionExplorer.js +103 -64
  202. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  203. package/lib/programmers/helpers/UnionPredicator.js +5 -0
  204. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  205. package/lib/programmers/internal/application_array.js +5 -0
  206. package/lib/programmers/internal/application_array.js.map +1 -1
  207. package/lib/programmers/internal/application_boolean.js +3 -0
  208. package/lib/programmers/internal/application_boolean.js.map +1 -1
  209. package/lib/programmers/internal/application_constant.js +3 -0
  210. package/lib/programmers/internal/application_constant.js.map +1 -1
  211. package/lib/programmers/internal/application_default.js +3 -0
  212. package/lib/programmers/internal/application_default.js.map +1 -1
  213. package/lib/programmers/internal/application_default_string.js +5 -0
  214. package/lib/programmers/internal/application_default_string.js.map +1 -1
  215. package/lib/programmers/internal/application_native.js +3 -0
  216. package/lib/programmers/internal/application_native.js.map +1 -1
  217. package/lib/programmers/internal/application_number.js +9 -0
  218. package/lib/programmers/internal/application_number.js.map +1 -1
  219. package/lib/programmers/internal/application_object.js +9 -0
  220. package/lib/programmers/internal/application_object.js.map +1 -1
  221. package/lib/programmers/internal/application_schema.js +23 -0
  222. package/lib/programmers/internal/application_schema.js.map +1 -1
  223. package/lib/programmers/internal/application_string.js +9 -0
  224. package/lib/programmers/internal/application_string.js.map +1 -1
  225. package/lib/programmers/internal/application_templates.js +6 -0
  226. package/lib/programmers/internal/application_templates.js.map +1 -1
  227. package/lib/programmers/internal/application_tuple.js +3 -0
  228. package/lib/programmers/internal/application_tuple.js.map +1 -1
  229. package/lib/programmers/internal/check_array.js +12 -7
  230. package/lib/programmers/internal/check_array.js.map +1 -1
  231. package/lib/programmers/internal/check_array_length.js +8 -9
  232. package/lib/programmers/internal/check_array_length.js.map +1 -1
  233. package/lib/programmers/internal/check_bigint.js +71 -70
  234. package/lib/programmers/internal/check_bigint.js.map +1 -1
  235. package/lib/programmers/internal/check_custom.js +20 -19
  236. package/lib/programmers/internal/check_custom.js.map +1 -1
  237. package/lib/programmers/internal/check_dynamic_properties.js +82 -69
  238. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  239. package/lib/programmers/internal/check_everything.js +9 -10
  240. package/lib/programmers/internal/check_everything.js.map +1 -1
  241. package/lib/programmers/internal/check_native.js +7 -8
  242. package/lib/programmers/internal/check_native.js.map +1 -1
  243. package/lib/programmers/internal/check_number.js +27 -22
  244. package/lib/programmers/internal/check_number.js.map +1 -1
  245. package/lib/programmers/internal/check_object.js +32 -19
  246. package/lib/programmers/internal/check_object.js.map +1 -1
  247. package/lib/programmers/internal/check_string.js +12 -11
  248. package/lib/programmers/internal/check_string.js.map +1 -1
  249. package/lib/programmers/internal/check_string_tags.js +51 -50
  250. package/lib/programmers/internal/check_string_tags.js.map +1 -1
  251. package/lib/programmers/internal/check_template.js +27 -23
  252. package/lib/programmers/internal/check_template.js.map +1 -1
  253. package/lib/programmers/internal/check_union_array_like.js +61 -45
  254. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  255. package/lib/programmers/internal/check_union_tuple.js +4 -0
  256. package/lib/programmers/internal/check_union_tuple.js.map +1 -1
  257. package/lib/programmers/internal/decode_union_object.js +24 -21
  258. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  259. package/lib/programmers/internal/feature_object_entries.js +33 -32
  260. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  261. package/lib/programmers/internal/get_comment_tags.js +3 -0
  262. package/lib/programmers/internal/get_comment_tags.js.map +1 -1
  263. package/lib/programmers/internal/metadata_to_pattern.js +3 -0
  264. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  265. package/lib/programmers/internal/prune_object_properties.js +15 -14
  266. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  267. package/lib/programmers/internal/random_custom.js +10 -9
  268. package/lib/programmers/internal/random_custom.js.map +1 -1
  269. package/lib/programmers/internal/stringify_dynamic_properties.js +65 -54
  270. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  271. package/lib/programmers/internal/stringify_native.js +5 -6
  272. package/lib/programmers/internal/stringify_native.js.map +1 -1
  273. package/lib/programmers/internal/stringify_regular_properties.js +46 -41
  274. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  275. package/lib/programmers/internal/template_to_pattern.js +3 -0
  276. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  277. package/lib/schemas/IJsonSchema.d.ts +1 -1
  278. package/lib/transform.d.ts +1 -1
  279. package/lib/transform.js +1 -0
  280. package/lib/transform.js.map +1 -1
  281. package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
  282. package/lib/transformers/CallExpressionTransformer.js +29 -2
  283. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  284. package/lib/transformers/FileTransformer.d.ts +1 -1
  285. package/lib/transformers/FileTransformer.js +4 -8
  286. package/lib/transformers/FileTransformer.js.map +1 -1
  287. package/lib/transformers/IProject.d.ts +8 -1
  288. package/lib/transformers/ImportTransformer.d.ts +2 -2
  289. package/lib/transformers/ImportTransformer.js +45 -34
  290. package/lib/transformers/ImportTransformer.js.map +1 -1
  291. package/lib/transformers/NodeTransformer.d.ts +1 -1
  292. package/lib/transformers/NodeTransformer.js +1 -5
  293. package/lib/transformers/NodeTransformer.js.map +1 -1
  294. package/lib/transformers/features/miscellaneous/ApplicationTransformer.d.ts +2 -2
  295. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +27 -18
  296. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  297. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.d.ts +1 -1
  298. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.d.ts +1 -1
  299. package/lib/transformers/features/miscellaneous/CloneTransformer.d.ts +1 -1
  300. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.d.ts +1 -1
  301. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.d.ts +1 -1
  302. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.d.ts +1 -1
  303. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.d.ts +1 -1
  304. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.d.ts +1 -1
  305. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.d.ts +1 -1
  306. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.d.ts +2 -2
  307. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js +7 -4
  308. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js.map +1 -1
  309. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.d.ts +1 -1
  310. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.d.ts +1 -1
  311. package/lib/transformers/features/miscellaneous/IsCloneTransformer.d.ts +1 -1
  312. package/lib/transformers/features/miscellaneous/IsPruneTransformer.d.ts +1 -1
  313. package/lib/transformers/features/miscellaneous/LiteralsTransformer.d.ts +2 -2
  314. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js +7 -4
  315. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js.map +1 -1
  316. package/lib/transformers/features/miscellaneous/MetadataTransformer.d.ts +2 -2
  317. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +13 -14
  318. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  319. package/lib/transformers/features/miscellaneous/PruneTransformer.d.ts +1 -1
  320. package/lib/transformers/features/miscellaneous/RandomTransformer.d.ts +2 -2
  321. package/lib/transformers/features/miscellaneous/RandomTransformer.js +7 -8
  322. package/lib/transformers/features/miscellaneous/RandomTransformer.js.map +1 -1
  323. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.d.ts +1 -1
  324. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.d.ts +1 -1
  325. package/lib/transformers/features/parsers/AssertParseTransformer.d.ts +1 -1
  326. package/lib/transformers/features/parsers/CreateAssertParseTransformer.d.ts +1 -1
  327. package/lib/transformers/features/parsers/CreateIsParseTransformer.d.ts +1 -1
  328. package/lib/transformers/features/parsers/CreateValidateParseTransformer.d.ts +1 -1
  329. package/lib/transformers/features/parsers/IsParseTransformer.d.ts +1 -1
  330. package/lib/transformers/features/parsers/ValidateParseTransformer.d.ts +1 -1
  331. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.d.ts +1 -1
  332. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.d.ts +1 -1
  333. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.d.ts +1 -1
  334. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.d.ts +1 -1
  335. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.d.ts +1 -1
  336. package/lib/transformers/features/stringifiers/IsStringifyTransformer.d.ts +1 -1
  337. package/lib/transformers/features/stringifiers/StringifyTransformer.d.ts +1 -1
  338. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.d.ts +1 -1
  339. package/lib/transformers/features/validators/AssertTransformer.d.ts +1 -1
  340. package/lib/transformers/features/validators/CreateAssertTransformer.d.ts +1 -1
  341. package/lib/transformers/features/validators/CreateIsTransformer.d.ts +1 -1
  342. package/lib/transformers/features/validators/CreateValidateTransformer.d.ts +1 -1
  343. package/lib/transformers/features/validators/IsTransformer.d.ts +1 -1
  344. package/lib/transformers/features/validators/ValidateTransformer.d.ts +1 -1
  345. package/lib/transformers/internal/GenericTransformer.d.ts +3 -3
  346. package/lib/transformers/internal/GenericTransformer.js +19 -17
  347. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  348. package/lib/utils/RandomGenerator.js +9 -0
  349. package/lib/utils/RandomGenerator.js.map +1 -1
  350. package/lib/utils/Singleton.js +1 -1
  351. package/lib/utils/TsNodeUtil.d.ts +3 -3
  352. package/lib/utils/TsNodeUtil.js +7 -9
  353. package/lib/utils/TsNodeUtil.js.map +1 -1
  354. package/lib/utils/TsSymbolUtil.d.ts +3 -3
  355. package/lib/utils/TsSymbolUtil.js +137 -33
  356. package/lib/utils/TsSymbolUtil.js.map +1 -1
  357. package/lib/utils/TsTypeUtil.d.ts +7 -7
  358. package/lib/utils/TsTypeUtil.js +27 -19
  359. package/lib/utils/TsTypeUtil.js.map +1 -1
  360. package/package.json +128 -129
  361. package/src/factories/CommentFactory.ts +14 -14
  362. package/src/factories/ExpressionFactory.ts +77 -70
  363. package/src/factories/IdentifierFactory.ts +62 -63
  364. package/src/factories/LiteralFactory.ts +57 -39
  365. package/src/factories/MetadataCollection.ts +123 -121
  366. package/src/factories/MetadataFactory.ts +53 -62
  367. package/src/factories/MetadataTagFactory.ts +295 -295
  368. package/src/factories/StatementFactory.ts +20 -25
  369. package/src/factories/TemplateFactory.ts +64 -58
  370. package/src/factories/TypeFactory.ts +145 -136
  371. package/src/factories/ValueFactory.ts +15 -12
  372. package/src/factories/internal/metadata/emplace_metadata_object.ts +152 -148
  373. package/src/factories/internal/metadata/explore_metadata.ts +93 -92
  374. package/src/factories/internal/metadata/iterate_metadata.ts +63 -69
  375. package/src/factories/internal/metadata/iterate_metadata_array.ts +32 -30
  376. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  377. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  378. package/src/factories/internal/metadata/iterate_metadata_constant.ts +62 -59
  379. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  380. package/src/factories/internal/metadata/iterate_metadata_native.ts +217 -219
  381. package/src/factories/internal/metadata/iterate_metadata_object.ts +51 -49
  382. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +30 -27
  383. package/src/factories/internal/metadata/iterate_metadata_set.ts +36 -33
  384. package/src/factories/internal/metadata/iterate_metadata_template.ts +40 -38
  385. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +51 -48
  386. package/src/factories/internal/metadata/iterate_metadata_union.ts +59 -59
  387. package/src/module.ts +2038 -2038
  388. package/src/programmers/ApplicationProgrammer.ts +48 -56
  389. package/src/programmers/AssertCloneProgrammer.ts +68 -79
  390. package/src/programmers/AssertParseProgrammer.ts +66 -74
  391. package/src/programmers/AssertProgrammer.ts +274 -285
  392. package/src/programmers/AssertPruneProgrammer.ts +73 -76
  393. package/src/programmers/AssertStringifyProgrammer.ts +66 -74
  394. package/src/programmers/CheckerProgrammer.ts +897 -902
  395. package/src/programmers/CloneProgrammer.ts +387 -389
  396. package/src/programmers/FeatureProgrammer.ts +510 -501
  397. package/src/programmers/IsCloneProgrammer.ts +79 -86
  398. package/src/programmers/IsParseProgrammer.ts +72 -80
  399. package/src/programmers/IsProgrammer.ts +223 -216
  400. package/src/programmers/IsPruneProgrammer.ts +83 -81
  401. package/src/programmers/IsStringifyProgrammer.ts +77 -84
  402. package/src/programmers/LiteralsProgrammer.ts +65 -65
  403. package/src/programmers/PruneProgrammer.ts +348 -347
  404. package/src/programmers/RandomProgrammer.ts +444 -423
  405. package/src/programmers/StringifyProgrammer.ts +758 -798
  406. package/src/programmers/TypiaProgrammer.ts +141 -136
  407. package/src/programmers/ValidateCloneProgrammer.ts +93 -93
  408. package/src/programmers/ValidateParseProgrammer.ts +78 -78
  409. package/src/programmers/ValidateProgrammer.ts +317 -316
  410. package/src/programmers/ValidatePruneProgrammer.ts +86 -86
  411. package/src/programmers/ValidateStringifyProgrammer.ts +93 -92
  412. package/src/programmers/helpers/CloneJoiner.ts +138 -131
  413. package/src/programmers/helpers/FunctionImporeter.ts +56 -54
  414. package/src/programmers/helpers/ICheckEntry.ts +12 -12
  415. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  416. package/src/programmers/helpers/PruneJoiner.ts +156 -144
  417. package/src/programmers/helpers/RandomJoiner.ts +165 -161
  418. package/src/programmers/helpers/RandomRanger.ts +218 -216
  419. package/src/programmers/helpers/StringifyJoinder.ts +118 -113
  420. package/src/programmers/helpers/UnionExplorer.ts +281 -276
  421. package/src/programmers/helpers/disable_function_importer_declare.ts +21 -21
  422. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  423. package/src/programmers/internal/application_array.ts +32 -32
  424. package/src/programmers/internal/application_boolean.ts +15 -15
  425. package/src/programmers/internal/application_constant.ts +26 -26
  426. package/src/programmers/internal/application_default.ts +17 -17
  427. package/src/programmers/internal/application_native.ts +36 -36
  428. package/src/programmers/internal/application_number.ts +71 -71
  429. package/src/programmers/internal/application_object.ts +162 -162
  430. package/src/programmers/internal/application_schema.ts +198 -198
  431. package/src/programmers/internal/application_string.ts +44 -44
  432. package/src/programmers/internal/application_templates.ts +25 -25
  433. package/src/programmers/internal/application_tuple.ts +27 -27
  434. package/src/programmers/internal/check_array.ts +31 -30
  435. package/src/programmers/internal/check_array_length.ts +35 -35
  436. package/src/programmers/internal/check_bigint.ts +95 -82
  437. package/src/programmers/internal/check_custom.ts +32 -31
  438. package/src/programmers/internal/check_dynamic_properties.ts +198 -194
  439. package/src/programmers/internal/check_everything.ts +28 -28
  440. package/src/programmers/internal/check_native.ts +22 -21
  441. package/src/programmers/internal/check_number.ts +177 -177
  442. package/src/programmers/internal/check_object.ts +65 -55
  443. package/src/programmers/internal/check_string.ts +27 -26
  444. package/src/programmers/internal/check_string_tags.ts +68 -67
  445. package/src/programmers/internal/check_template.ts +57 -56
  446. package/src/programmers/internal/check_union_array_like.ts +273 -272
  447. package/src/programmers/internal/check_union_tuple.ts +34 -34
  448. package/src/programmers/internal/decode_union_object.ts +75 -73
  449. package/src/programmers/internal/feature_object_entries.ts +64 -63
  450. package/src/programmers/internal/prune_object_properties.ts +63 -60
  451. package/src/programmers/internal/random_custom.ts +30 -29
  452. package/src/programmers/internal/stringify_dynamic_properties.ts +173 -167
  453. package/src/programmers/internal/stringify_native.ts +7 -7
  454. package/src/programmers/internal/stringify_regular_properties.ts +89 -83
  455. package/src/schemas/IJsonApplication.ts +13 -13
  456. package/src/schemas/IJsonComponents.ts +33 -33
  457. package/src/schemas/IJsonSchema.ts +134 -134
  458. package/src/transform.ts +4 -5
  459. package/src/transformers/CallExpressionTransformer.ts +183 -180
  460. package/src/transformers/FileTransformer.ts +50 -50
  461. package/src/transformers/IProject.ts +18 -11
  462. package/src/transformers/ImportTransformer.ts +74 -68
  463. package/src/transformers/NodeTransformer.ts +13 -13
  464. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +107 -105
  465. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +43 -43
  466. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +31 -31
  467. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +56 -54
  468. package/src/transformers/features/miscellaneous/RandomTransformer.ts +46 -46
  469. package/src/transformers/internal/GenericTransformer.ts +101 -103
  470. package/src/utils/TsNodeUtil.ts +17 -12
  471. package/src/utils/TsSymbolUtil.ts +146 -41
  472. package/src/utils/TsTypeUtil.ts +38 -30
@@ -1,501 +1,510 @@
1
- import { JSDocTagInfo } from "typescript";
2
- import ts from "typescript/lib/tsclibrary";
3
-
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../factories/MetadataCollection";
6
- import { StatementFactory } from "../factories/StatementFactory";
7
- import { TypeFactory } from "../factories/TypeFactory";
8
- import { ValueFactory } from "../factories/ValueFactory";
9
-
10
- import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
11
- import { IMetadataTag } from "../metadata/IMetadataTag";
12
- import { Metadata } from "../metadata/Metadata";
13
- import { MetadataObject } from "../metadata/MetadataObject";
14
-
15
- import { IProject } from "../transformers/IProject";
16
-
17
- import { CheckerProgrammer } from "./CheckerProgrammer";
18
- import { FunctionImporter } from "./helpers/FunctionImporeter";
19
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
20
- import { UnionExplorer } from "./helpers/UnionExplorer";
21
- import { feature_object_entries } from "./internal/feature_object_entries";
22
-
23
- export namespace FeatureProgrammer {
24
- /* -----------------------------------------------------------
25
- PARAMETERS
26
- ----------------------------------------------------------- */
27
- export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
28
- types: IConfig.ITypes;
29
-
30
- /**
31
- * Prefix name of functions for specific object types.
32
- */
33
- functors: string;
34
-
35
- /**
36
- * Prefix name of functions for union object types.
37
- */
38
- unioners: string;
39
-
40
- /**
41
- * Whether to archive access path or not.
42
- */
43
- path: boolean;
44
-
45
- /**
46
- * Whether to trace exception or not.
47
- */
48
- trace: boolean;
49
-
50
- addition?(collection: MetadataCollection): ts.Statement[];
51
-
52
- /**
53
- * Initializer of metadata.
54
- */
55
- initializer: (
56
- project: IProject,
57
- ) => (type: ts.Type) => [MetadataCollection, Metadata];
58
-
59
- /**
60
- * Decoder, station of every types.
61
- */
62
- decoder: Decoder<Metadata, Output>;
63
-
64
- /**
65
- * Object configurator.
66
- */
67
- objector: IConfig.IObjector;
68
-
69
- /**
70
- * Generator of functions for object types.
71
- */
72
- generator?: Partial<IConfig.IGenerator>;
73
- }
74
- export namespace IConfig {
75
- export interface ITypes {
76
- input: (type: ts.Type, name?: string) => ts.TypeNode;
77
- output: (type: ts.Type, name?: string) => ts.TypeNode;
78
- }
79
-
80
- export interface IObjector {
81
- /**
82
- * Type checker when union object type comes.
83
- */
84
- checker: Decoder<Metadata, ts.Expression>;
85
-
86
- /**
87
- * Decoder, function call expression generator of specific typed objects.
88
- */
89
- decoder: Decoder<MetadataObject, ts.Expression>;
90
-
91
- /**
92
- * Joiner of expressions from properties.
93
- */
94
- joiner(
95
- input: ts.Expression,
96
- entries: IExpressionEntry[],
97
- parent: MetadataObject,
98
- ): ts.ConciseBody;
99
-
100
- /**
101
- * Union type specificator.
102
- *
103
- * Expression of an algorithm specifying object type and calling
104
- * the `decoder` function of the specified object type.
105
- */
106
- unionizer: Decoder<MetadataObject[], ts.Expression>;
107
-
108
- /**
109
- * Handler of union type specification failure.
110
- *
111
- * @param value Expression of input parameter
112
- * @param expected Expected type name
113
- * @param explore Exploration info
114
- * @returns Statement of failure
115
- */
116
- failure(
117
- value: ts.Expression,
118
- expected: string,
119
- explore?: IExplore,
120
- ): ts.Statement;
121
-
122
- /**
123
- * Transformer of type checking expression by discrimination.
124
- *
125
- * When an object type has been specified by a discrimination without full
126
- * iteration, the `unionizer` will decode the object instance after
127
- * the last type checking.
128
- *
129
- * In such circumtance, you can transform the last type checking function.
130
- *
131
- * @param exp Current expression about type checking
132
- * @returns Transformed expression
133
- * @deprecated
134
- */
135
- is?(exp: ts.Expression): ts.Expression;
136
-
137
- /**
138
- * Transformer of non-undefined type checking by discrimination.
139
- *
140
- * When specifying an union type of objects, `typia` tries to find
141
- * descrimination way just by checking only one property type.
142
- * If succeeded to find the discrimination way, `typia` will check the target
143
- * property type and in the checking, non-undefined type checking would be
144
- * done.
145
- *
146
- * In such process, you can transform the non-undefined type checking.
147
- *
148
- * @param exp
149
- * @returns Transformed expression
150
- * @deprecated
151
- */
152
- required?(exp: ts.Expression): ts.Expression;
153
-
154
- /**
155
- * Conditon wrapper when unable to specify any object type.
156
- *
157
- * When failed to specify an object type through discrimination, full
158
- * iteration type checking would be happend. In such circumstance, you
159
- * can wrap the condition with additional function.
160
- *
161
- * @param condition Current condition
162
- * @returns A function wrapped current condition
163
- */
164
- full?: (
165
- condition: ts.Expression,
166
- ) => (
167
- input: ts.Expression,
168
- expected: string,
169
- explore: IExplore,
170
- ) => ts.Expression;
171
-
172
- /**
173
- * Return type.
174
- */
175
- type?: ts.TypeNode;
176
- }
177
- export interface IGenerator {
178
- /**
179
- *
180
- * @param col
181
- */
182
- functors(col: MetadataCollection): ts.VariableStatement[];
183
-
184
- /**
185
- *
186
- * @param col
187
- */
188
- unioners(col: MetadataCollection): ts.VariableStatement[];
189
- }
190
- }
191
-
192
- export interface IExplore {
193
- tracable: boolean;
194
- source: "top" | "object";
195
- from: "top" | "array" | "object";
196
- postfix: string;
197
- start?: number;
198
- }
199
-
200
- export interface Decoder<
201
- T,
202
- Output extends ts.ConciseBody = ts.ConciseBody,
203
- > {
204
- (
205
- input: ts.Expression,
206
- target: T,
207
- explore: IExplore,
208
- metaTags: IMetadataTag[],
209
- jsDocTags: JSDocTagInfo[],
210
- ): Output;
211
- }
212
-
213
- /* -----------------------------------------------------------
214
- GENERATORS
215
- ----------------------------------------------------------- */
216
- export const analyze =
217
- (project: IProject) =>
218
- (config: IConfig) =>
219
- (importer: FunctionImporter) =>
220
- (type: ts.Type, name?: string) => {
221
- const [collection, meta] = config.initializer(project)(type);
222
-
223
- // ITERATE OVER ALL METADATA
224
- const output: ts.ConciseBody = config.decoder(
225
- ValueFactory.INPUT(),
226
- meta,
227
- {
228
- tracable: config.path || config.trace,
229
- source: "top",
230
- from: "top",
231
- postfix: '""',
232
- },
233
- [],
234
- [],
235
- );
236
-
237
- // RETURNS THE OPTIMAL ARROW FUNCTION
238
- const functors: ts.VariableStatement[] = (
239
- config.generator?.functors ?? write_functors(config)(importer)
240
- )(collection);
241
- const unioners: ts.VariableStatement[] = (
242
- config.generator?.unioners ?? write_unioners(config)(importer)
243
- )(collection);
244
- const added: ts.Statement[] = (config.addition ?? (() => []))(
245
- collection,
246
- );
247
-
248
- return ts.factory.createArrowFunction(
249
- undefined,
250
- undefined,
251
- PARAMETERS(config)(config.types.input(type, name))(
252
- ValueFactory.INPUT(),
253
- ),
254
- config.types.output(type, name),
255
- undefined,
256
- ts.factory.createBlock(
257
- [
258
- ...added,
259
- ...functors.filter((_, i) =>
260
- importer.hasLocal(`${config.functors}${i}`),
261
- ),
262
- ...unioners.filter((_, i) =>
263
- importer.hasLocal(`${config.unioners}${i}`),
264
- ),
265
- ...(ts.isBlock(output)
266
- ? output.statements
267
- : [ts.factory.createReturnStatement(output)]),
268
- ],
269
- true,
270
- ),
271
- );
272
- };
273
-
274
- export const write_functors =
275
- (config: IConfig) =>
276
- (importer: FunctionImporter) =>
277
- (collection: MetadataCollection) =>
278
- collection
279
- .objects()
280
- .map((obj, i) =>
281
- StatementFactory.constant(
282
- `${config.functors}${i}`,
283
- write_object(config)(importer)(obj),
284
- ),
285
- );
286
-
287
- export const write_unioners =
288
- (config: IConfig) =>
289
- (importer: FunctionImporter) =>
290
- (collection: MetadataCollection) =>
291
- collection
292
- .unions()
293
- .map((union, i) =>
294
- StatementFactory.constant(
295
- importer.useLocal(`${config.unioners}${i}`),
296
- write_union(config)(union),
297
- ),
298
- );
299
-
300
- const write_object =
301
- (config: IConfig) =>
302
- (importer: FunctionImporter) =>
303
- (obj: MetadataObject) =>
304
- ts.factory.createArrowFunction(
305
- undefined,
306
- undefined,
307
- PARAMETERS(config)(TypeFactory.keyword("any"))(
308
- ValueFactory.INPUT(),
309
- ),
310
- config.objector.type ?? TypeFactory.keyword("any"),
311
- undefined,
312
- config.objector.joiner(
313
- ts.factory.createIdentifier("input"),
314
- feature_object_entries(config)(importer)(obj)(
315
- ts.factory.createIdentifier("input"),
316
- ),
317
- obj,
318
- ),
319
- );
320
-
321
- const write_union = (config: IConfig) => {
322
- const explorer = UnionExplorer.object(config);
323
- const input = ValueFactory.INPUT();
324
-
325
- return (meta: MetadataObject[]) =>
326
- ts.factory.createArrowFunction(
327
- undefined,
328
- undefined,
329
- PARAMETERS(config)(TypeFactory.keyword("any"))(
330
- ValueFactory.INPUT(),
331
- ),
332
- TypeFactory.keyword("any"),
333
- undefined,
334
- explorer(
335
- input,
336
- meta,
337
- {
338
- tracable: config.path || config.trace,
339
- source: "object",
340
- from: "object",
341
- postfix: "",
342
- },
343
- [],
344
- [],
345
- ),
346
- );
347
- };
348
-
349
- /* -----------------------------------------------------------
350
- DECODERS
351
- ----------------------------------------------------------- */
352
- export const decode_array =
353
- (config: Pick<IConfig, "trace" | "path" | "decoder">) =>
354
- (importer: FunctionImporter) =>
355
- (
356
- combiner: (
357
- input: ts.Expression,
358
- arrow: ts.ArrowFunction,
359
- metaTags: IMetadataTag[],
360
- jsDocTags: JSDocTagInfo[],
361
- ) => ts.Expression,
362
- ) => {
363
- const rand: string = importer.increment().toString();
364
- const tail =
365
- config.path || config.trace
366
- ? [
367
- IdentifierFactory.parameter(
368
- "_index" + rand,
369
- TypeFactory.keyword("number"),
370
- ),
371
- ]
372
- : [];
373
-
374
- return (
375
- input: ts.Expression,
376
- meta: Metadata,
377
- explore: IExplore,
378
- metaTags: IMetadataTag[],
379
- jsDocTags: IJsDocTagInfo[],
380
- ) => {
381
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
382
- undefined,
383
- undefined,
384
- [
385
- IdentifierFactory.parameter(
386
- "elem",
387
- TypeFactory.keyword("any"),
388
- ),
389
- ...tail,
390
- ],
391
- undefined,
392
- undefined,
393
- config.decoder(
394
- ValueFactory.INPUT("elem"),
395
- meta,
396
- {
397
- tracable: explore.tracable,
398
- source: explore.source,
399
- from: "array",
400
- postfix: INDEX_SYMBOL(explore.start ?? null)(
401
- explore.postfix,
402
- )(rand),
403
- },
404
- metaTags,
405
- jsDocTags,
406
- ),
407
- );
408
- return combiner(input, arrow, metaTags, jsDocTags);
409
- };
410
- };
411
-
412
- export const decode_object =
413
- (config: Pick<IConfig, "trace" | "path" | "functors">) =>
414
- (importer: FunctionImporter) =>
415
- (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
416
- ts.factory.createCallExpression(
417
- ts.factory.createIdentifier(
418
- importer.useLocal(`${config.functors}${obj.index}`),
419
- ),
420
- undefined,
421
- get_object_arguments(config)(explore)(input),
422
- );
423
-
424
- export const get_object_arguments =
425
- (config: Pick<IConfig, "path" | "trace">) =>
426
- (explore: FeatureProgrammer.IExplore) => {
427
- const tail: ts.Expression[] =
428
- config.path === false && config.trace === false
429
- ? []
430
- : config.path === true && config.trace === true
431
- ? [
432
- ts.factory.createIdentifier(
433
- explore.postfix
434
- ? `_path + ${explore.postfix}`
435
- : "_path",
436
- ),
437
- explore.source === "object"
438
- ? ts.factory.createIdentifier(
439
- `${explore.tracable} && _exceptionable`,
440
- )
441
- : explore.tracable
442
- ? ts.factory.createTrue()
443
- : ts.factory.createFalse(),
444
- ]
445
- : config.path === true
446
- ? [
447
- ts.factory.createIdentifier(
448
- explore.postfix
449
- ? `_path + ${explore.postfix}`
450
- : "_path",
451
- ),
452
- ]
453
- : [
454
- explore.source === "object"
455
- ? ts.factory.createIdentifier(
456
- `${explore.tracable} && _exceptionable`,
457
- )
458
- : explore.tracable
459
- ? ts.factory.createTrue()
460
- : ts.factory.createFalse(),
461
- ];
462
- return (input: ts.Expression) => [input, ...tail];
463
- };
464
- }
465
-
466
- const INDEX_SYMBOL =
467
- (start: number | null) => (prev: string) => (rand: string) => {
468
- const tail: string =
469
- start !== null
470
- ? `"[" + (${start} + _index${rand}) + "]"`
471
- : `"[" + _index${rand} + "]"`;
472
- if (prev === "") return tail;
473
- else if (prev[prev.length - 1] === `"`)
474
- return prev.substring(0, prev.length - 1) + tail.substring(1);
475
- return prev + ` + ${tail}`;
476
- };
477
-
478
- const PARAMETERS =
479
- (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
480
- (type: ts.TypeNode) => {
481
- const tail: ts.ParameterDeclaration[] = [];
482
- if (props.path)
483
- tail.push(
484
- IdentifierFactory.parameter(
485
- "_path",
486
- TypeFactory.keyword("string"),
487
- ),
488
- );
489
- if (props.trace)
490
- tail.push(
491
- IdentifierFactory.parameter(
492
- "_exceptionable",
493
- TypeFactory.keyword("boolean"),
494
- ts.factory.createTrue(),
495
- ),
496
- );
497
- return (input: ts.Identifier) => [
498
- IdentifierFactory.parameter(input, type),
499
- ...tail,
500
- ];
501
- };
1
+ import { JSDocTagInfo } from "typescript";
2
+ import type ts from "typescript/lib/tsclibrary";
3
+
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { StatementFactory } from "../factories/StatementFactory";
7
+ import { TypeFactory } from "../factories/TypeFactory";
8
+ import { ValueFactory } from "../factories/ValueFactory";
9
+
10
+ import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
11
+ import { IMetadataTag } from "../metadata/IMetadataTag";
12
+ import { Metadata } from "../metadata/Metadata";
13
+ import { MetadataObject } from "../metadata/MetadataObject";
14
+
15
+ import { IProject } from "../transformers/IProject";
16
+
17
+ import { CheckerProgrammer } from "./CheckerProgrammer";
18
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
19
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
20
+ import { UnionExplorer } from "./helpers/UnionExplorer";
21
+ import { feature_object_entries } from "./internal/feature_object_entries";
22
+
23
+ export namespace FeatureProgrammer {
24
+ /* -----------------------------------------------------------
25
+ PARAMETERS
26
+ ----------------------------------------------------------- */
27
+ export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
28
+ types: IConfig.ITypes;
29
+
30
+ /**
31
+ * Prefix name of functions for specific object types.
32
+ */
33
+ functors: string;
34
+
35
+ /**
36
+ * Prefix name of functions for union object types.
37
+ */
38
+ unioners: string;
39
+
40
+ /**
41
+ * Whether to archive access path or not.
42
+ */
43
+ path: boolean;
44
+
45
+ /**
46
+ * Whether to trace exception or not.
47
+ */
48
+ trace: boolean;
49
+
50
+ addition?(collection: MetadataCollection): ts.Statement[];
51
+
52
+ /**
53
+ * Initializer of metadata.
54
+ */
55
+ initializer: (
56
+ project: IProject,
57
+ ) => (type: ts.Type) => [MetadataCollection, Metadata];
58
+
59
+ /**
60
+ * Decoder, station of every types.
61
+ */
62
+ decoder: Decoder<Metadata, Output>;
63
+
64
+ /**
65
+ * Object configurator.
66
+ */
67
+ objector: IConfig.IObjector;
68
+
69
+ /**
70
+ * Generator of functions for object types.
71
+ */
72
+ generator?: Partial<IConfig.IGenerator>;
73
+ }
74
+ export namespace IConfig {
75
+ export interface ITypes {
76
+ input: (type: ts.Type, name?: string) => ts.TypeNode;
77
+ output: (type: ts.Type, name?: string) => ts.TypeNode;
78
+ }
79
+
80
+ export interface IObjector {
81
+ /**
82
+ * Type checker when union object type comes.
83
+ */
84
+ checker: Decoder<Metadata, ts.Expression>;
85
+
86
+ /**
87
+ * Decoder, function call expression generator of specific typed objects.
88
+ */
89
+ decoder: Decoder<MetadataObject, ts.Expression>;
90
+
91
+ /**
92
+ * Joiner of expressions from properties.
93
+ */
94
+ joiner(
95
+ input: ts.Expression,
96
+ entries: IExpressionEntry[],
97
+ parent: MetadataObject,
98
+ ): ts.ConciseBody;
99
+
100
+ /**
101
+ * Union type specificator.
102
+ *
103
+ * Expression of an algorithm specifying object type and calling
104
+ * the `decoder` function of the specified object type.
105
+ */
106
+ unionizer: Decoder<MetadataObject[], ts.Expression>;
107
+
108
+ /**
109
+ * Handler of union type specification failure.
110
+ *
111
+ * @param value Expression of input parameter
112
+ * @param expected Expected type name
113
+ * @param explore Exploration info
114
+ * @returns Statement of failure
115
+ */
116
+ failure(
117
+ value: ts.Expression,
118
+ expected: string,
119
+ explore?: IExplore,
120
+ ): ts.Statement;
121
+
122
+ /**
123
+ * Transformer of type checking expression by discrimination.
124
+ *
125
+ * When an object type has been specified by a discrimination without full
126
+ * iteration, the `unionizer` will decode the object instance after
127
+ * the last type checking.
128
+ *
129
+ * In such circumtance, you can transform the last type checking function.
130
+ *
131
+ * @param exp Current expression about type checking
132
+ * @returns Transformed expression
133
+ * @deprecated
134
+ */
135
+ is?(exp: ts.Expression): ts.Expression;
136
+
137
+ /**
138
+ * Transformer of non-undefined type checking by discrimination.
139
+ *
140
+ * When specifying an union type of objects, `typia` tries to find
141
+ * descrimination way just by checking only one property type.
142
+ * If succeeded to find the discrimination way, `typia` will check the target
143
+ * property type and in the checking, non-undefined type checking would be
144
+ * done.
145
+ *
146
+ * In such process, you can transform the non-undefined type checking.
147
+ *
148
+ * @param exp
149
+ * @returns Transformed expression
150
+ * @deprecated
151
+ */
152
+ required?(exp: ts.Expression): ts.Expression;
153
+
154
+ /**
155
+ * Conditon wrapper when unable to specify any object type.
156
+ *
157
+ * When failed to specify an object type through discrimination, full
158
+ * iteration type checking would be happend. In such circumstance, you
159
+ * can wrap the condition with additional function.
160
+ *
161
+ * @param condition Current condition
162
+ * @returns A function wrapped current condition
163
+ */
164
+ full?: (
165
+ condition: ts.Expression,
166
+ ) => (
167
+ input: ts.Expression,
168
+ expected: string,
169
+ explore: IExplore,
170
+ ) => ts.Expression;
171
+
172
+ /**
173
+ * Return type.
174
+ */
175
+ type?: ts.TypeNode;
176
+ }
177
+ export interface IGenerator {
178
+ /**
179
+ *
180
+ * @param col
181
+ */
182
+ functors(col: MetadataCollection): ts.VariableStatement[];
183
+
184
+ /**
185
+ *
186
+ * @param col
187
+ */
188
+ unioners(col: MetadataCollection): ts.VariableStatement[];
189
+ }
190
+ }
191
+
192
+ export interface IExplore {
193
+ tracable: boolean;
194
+ source: "top" | "object";
195
+ from: "top" | "array" | "object";
196
+ postfix: string;
197
+ start?: number;
198
+ }
199
+
200
+ export interface Decoder<
201
+ T,
202
+ Output extends ts.ConciseBody = ts.ConciseBody,
203
+ > {
204
+ (
205
+ input: ts.Expression,
206
+ target: T,
207
+ explore: IExplore,
208
+ metaTags: IMetadataTag[],
209
+ jsDocTags: JSDocTagInfo[],
210
+ ): Output;
211
+ }
212
+
213
+ /* -----------------------------------------------------------
214
+ GENERATORS
215
+ ----------------------------------------------------------- */
216
+ export const analyze =
217
+ (p: IProject) =>
218
+ (config: IConfig) =>
219
+ (importer: FunctionImporter) =>
220
+ (type: ts.Type, name?: string) => {
221
+ const [collection, meta] = config.initializer(p)(type);
222
+
223
+ // ITERATE OVER ALL METADATA
224
+ const output: ts.ConciseBody = config.decoder(
225
+ ValueFactory.INPUT(p.tsc)(),
226
+ meta,
227
+ {
228
+ tracable: config.path || config.trace,
229
+ source: "top",
230
+ from: "top",
231
+ postfix: '""',
232
+ },
233
+ [],
234
+ [],
235
+ );
236
+
237
+ // RETURNS THE OPTIMAL ARROW FUNCTION
238
+ const functors: ts.VariableStatement[] = (
239
+ config.generator?.functors ??
240
+ write_functors(p.tsc)(config)(importer)
241
+ )(collection);
242
+ const unioners: ts.VariableStatement[] = (
243
+ config.generator?.unioners ??
244
+ write_unioners(p.tsc)(config)(importer)
245
+ )(collection);
246
+ const added: ts.Statement[] = (config.addition ?? (() => []))(
247
+ collection,
248
+ );
249
+
250
+ return p.tsc.factory.createArrowFunction(
251
+ undefined,
252
+ undefined,
253
+ PARAMETERS(p.tsc)(config)(config.types.input(type, name))(
254
+ ValueFactory.INPUT(p.tsc)(),
255
+ ),
256
+ config.types.output(type, name),
257
+ undefined,
258
+ p.tsc.factory.createBlock(
259
+ [
260
+ ...added,
261
+ ...functors.filter((_, i) =>
262
+ importer.hasLocal(`${config.functors}${i}`),
263
+ ),
264
+ ...unioners.filter((_, i) =>
265
+ importer.hasLocal(`${config.unioners}${i}`),
266
+ ),
267
+ ...(p.tsc.isBlock(output)
268
+ ? output.statements
269
+ : [p.tsc.factory.createReturnStatement(output)]),
270
+ ],
271
+ true,
272
+ ),
273
+ );
274
+ };
275
+
276
+ export const write_functors =
277
+ (tsc: typeof ts) =>
278
+ (config: IConfig) =>
279
+ (importer: FunctionImporter) =>
280
+ (collection: MetadataCollection) =>
281
+ collection
282
+ .objects()
283
+ .map((obj, i) =>
284
+ StatementFactory.constant(tsc)(
285
+ `${config.functors}${i}`,
286
+ write_object(tsc)(config)(importer)(obj),
287
+ ),
288
+ );
289
+
290
+ export const write_unioners =
291
+ (tsc: typeof ts) =>
292
+ (config: IConfig) =>
293
+ (importer: FunctionImporter) =>
294
+ (collection: MetadataCollection) =>
295
+ collection
296
+ .unions()
297
+ .map((union, i) =>
298
+ StatementFactory.constant(tsc)(
299
+ importer.useLocal(`${config.unioners}${i}`),
300
+ write_union(tsc)(config)(union),
301
+ ),
302
+ );
303
+
304
+ const write_object =
305
+ (tsc: typeof ts) =>
306
+ (config: IConfig) =>
307
+ (importer: FunctionImporter) =>
308
+ (obj: MetadataObject) =>
309
+ tsc.factory.createArrowFunction(
310
+ undefined,
311
+ undefined,
312
+ PARAMETERS(tsc)(config)(TypeFactory.keyword(tsc)("any"))(
313
+ ValueFactory.INPUT(tsc)(),
314
+ ),
315
+ config.objector.type ?? TypeFactory.keyword(tsc)("any"),
316
+ undefined,
317
+ config.objector.joiner(
318
+ tsc.factory.createIdentifier("input"),
319
+ feature_object_entries(tsc)(config)(importer)(obj)(
320
+ tsc.factory.createIdentifier("input"),
321
+ ),
322
+ obj,
323
+ ),
324
+ );
325
+
326
+ const write_union = (tsc: typeof ts) => (config: IConfig) => {
327
+ const explorer = UnionExplorer.object(tsc)(config);
328
+ const input = ValueFactory.INPUT(tsc)();
329
+
330
+ return (meta: MetadataObject[]) =>
331
+ tsc.factory.createArrowFunction(
332
+ undefined,
333
+ undefined,
334
+ PARAMETERS(tsc)(config)(TypeFactory.keyword(tsc)("any"))(
335
+ ValueFactory.INPUT(tsc)(),
336
+ ),
337
+ TypeFactory.keyword(tsc)("any"),
338
+ undefined,
339
+ explorer(
340
+ input,
341
+ meta,
342
+ {
343
+ tracable: config.path || config.trace,
344
+ source: "object",
345
+ from: "object",
346
+ postfix: "",
347
+ },
348
+ [],
349
+ [],
350
+ ),
351
+ );
352
+ };
353
+
354
+ /* -----------------------------------------------------------
355
+ DECODERS
356
+ ----------------------------------------------------------- */
357
+ export const decode_array =
358
+ (tsc: typeof ts) =>
359
+ (config: Pick<IConfig, "trace" | "path" | "decoder">) =>
360
+ (importer: FunctionImporter) =>
361
+ (
362
+ combiner: (
363
+ input: ts.Expression,
364
+ arrow: ts.ArrowFunction,
365
+ metaTags: IMetadataTag[],
366
+ jsDocTags: JSDocTagInfo[],
367
+ ) => ts.Expression,
368
+ ) => {
369
+ const rand: string = importer.increment().toString();
370
+ const tail =
371
+ config.path || config.trace
372
+ ? [
373
+ IdentifierFactory.parameter(tsc)(
374
+ "_index" + rand,
375
+ TypeFactory.keyword(tsc)("number"),
376
+ ),
377
+ ]
378
+ : [];
379
+
380
+ return (
381
+ input: ts.Expression,
382
+ meta: Metadata,
383
+ explore: IExplore,
384
+ metaTags: IMetadataTag[],
385
+ jsDocTags: IJsDocTagInfo[],
386
+ ) => {
387
+ const arrow: ts.ArrowFunction = tsc.factory.createArrowFunction(
388
+ undefined,
389
+ undefined,
390
+ [
391
+ IdentifierFactory.parameter(tsc)(
392
+ "elem",
393
+ TypeFactory.keyword(tsc)("any"),
394
+ ),
395
+ ...tail,
396
+ ],
397
+ undefined,
398
+ undefined,
399
+ config.decoder(
400
+ ValueFactory.INPUT(tsc)("elem"),
401
+ meta,
402
+ {
403
+ tracable: explore.tracable,
404
+ source: explore.source,
405
+ from: "array",
406
+ postfix: INDEX_SYMBOL(explore.start ?? null)(
407
+ explore.postfix,
408
+ )(rand),
409
+ },
410
+ metaTags,
411
+ jsDocTags,
412
+ ),
413
+ );
414
+ return combiner(input, arrow, metaTags, jsDocTags);
415
+ };
416
+ };
417
+
418
+ export const decode_object =
419
+ (tsc: typeof ts) =>
420
+ (config: Pick<IConfig, "trace" | "path" | "functors">) =>
421
+ (importer: FunctionImporter) =>
422
+ (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
423
+ tsc.factory.createCallExpression(
424
+ tsc.factory.createIdentifier(
425
+ importer.useLocal(`${config.functors}${obj.index}`),
426
+ ),
427
+ undefined,
428
+ get_object_arguments(tsc)(config)(explore)(input),
429
+ );
430
+
431
+ export const get_object_arguments =
432
+ (tsc: typeof ts) =>
433
+ (config: Pick<IConfig, "path" | "trace">) =>
434
+ (explore: FeatureProgrammer.IExplore) => {
435
+ const tail: ts.Expression[] =
436
+ config.path === false && config.trace === false
437
+ ? []
438
+ : config.path === true && config.trace === true
439
+ ? [
440
+ tsc.factory.createIdentifier(
441
+ explore.postfix
442
+ ? `_path + ${explore.postfix}`
443
+ : "_path",
444
+ ),
445
+ explore.source === "object"
446
+ ? tsc.factory.createIdentifier(
447
+ `${explore.tracable} && _exceptionable`,
448
+ )
449
+ : explore.tracable
450
+ ? tsc.factory.createTrue()
451
+ : tsc.factory.createFalse(),
452
+ ]
453
+ : config.path === true
454
+ ? [
455
+ tsc.factory.createIdentifier(
456
+ explore.postfix
457
+ ? `_path + ${explore.postfix}`
458
+ : "_path",
459
+ ),
460
+ ]
461
+ : [
462
+ explore.source === "object"
463
+ ? tsc.factory.createIdentifier(
464
+ `${explore.tracable} && _exceptionable`,
465
+ )
466
+ : explore.tracable
467
+ ? tsc.factory.createTrue()
468
+ : tsc.factory.createFalse(),
469
+ ];
470
+ return (input: ts.Expression) => [input, ...tail];
471
+ };
472
+ }
473
+
474
+ const INDEX_SYMBOL =
475
+ (start: number | null) => (prev: string) => (rand: string) => {
476
+ const tail: string =
477
+ start !== null
478
+ ? `"[" + (${start} + _index${rand}) + "]"`
479
+ : `"[" + _index${rand} + "]"`;
480
+ if (prev === "") return tail;
481
+ else if (prev[prev.length - 1] === `"`)
482
+ return prev.substring(0, prev.length - 1) + tail.substring(1);
483
+ return prev + ` + ${tail}`;
484
+ };
485
+
486
+ const PARAMETERS =
487
+ (tsc: typeof ts) =>
488
+ (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
489
+ (type: ts.TypeNode) => {
490
+ const tail: ts.ParameterDeclaration[] = [];
491
+ if (props.path)
492
+ tail.push(
493
+ IdentifierFactory.parameter(tsc)(
494
+ "_path",
495
+ TypeFactory.keyword(tsc)("string"),
496
+ ),
497
+ );
498
+ if (props.trace)
499
+ tail.push(
500
+ IdentifierFactory.parameter(tsc)(
501
+ "_exceptionable",
502
+ TypeFactory.keyword(tsc)("boolean"),
503
+ tsc.factory.createTrue(),
504
+ ),
505
+ );
506
+ return (input: ts.Identifier) => [
507
+ IdentifierFactory.parameter(tsc)(input, type),
508
+ ...tail,
509
+ ];
510
+ };