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,798 +1,758 @@
1
- import ts from "typescript/lib/tsclibrary";
2
-
3
- import { ExpressionFactory } from "../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../factories/MetadataCollection";
6
- import { MetadataFactory } from "../factories/MetadataFactory";
7
- import { TypeFactory } from "../factories/TypeFactory";
8
- import { ValueFactory } from "../factories/ValueFactory";
9
-
10
- import { IMetadataTag } from "../metadata/IMetadataTag";
11
- import { Metadata } from "../metadata/Metadata";
12
- import { MetadataObject } from "../metadata/MetadataObject";
13
-
14
- import { IProject } from "../transformers/IProject";
15
-
16
- import { Atomic } from "../typings/Atomic";
17
-
18
- import { ArrayUtil } from "../utils/ArrayUtil";
19
-
20
- import { FeatureProgrammer } from "./FeatureProgrammer";
21
- import { IsProgrammer } from "./IsProgrammer";
22
- import { AtomicPredicator } from "./helpers/AtomicPredicator";
23
- import { FunctionImporter } from "./helpers/FunctionImporeter";
24
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
25
- import { OptionPredicator } from "./helpers/OptionPredicator";
26
- import { StringifyJoiner } from "./helpers/StringifyJoinder";
27
- import { StringifyPredicator } from "./helpers/StringifyPredicator";
28
- import { UnionExplorer } from "./helpers/UnionExplorer";
29
- import { check_native } from "./internal/check_native";
30
- import { decode_union_object } from "./internal/decode_union_object";
31
- import { feature_object_entries } from "./internal/feature_object_entries";
32
-
33
- export namespace StringifyProgrammer {
34
- /* -----------------------------------------------------------
35
- WRITER
36
- ----------------------------------------------------------- */
37
- /**
38
- * @deprecated Use `write()` function instead
39
- */
40
- export const generate =
41
- (project: IProject, modulo: ts.LeftHandSideExpression) =>
42
- (type: ts.Type, name?: string) =>
43
- write(project)(modulo)(type, name);
44
-
45
- export const write =
46
- (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
47
- const importer: FunctionImporter = new FunctionImporter();
48
- return FeatureProgrammer.analyze(project)({
49
- ...configure(project)(importer),
50
- addition: (collection) => {
51
- const isFunctors =
52
- IsProgrammer.write_functors(project)(importer)(
53
- collection,
54
- );
55
- const isUnioners =
56
- IsProgrammer.write_unioners(project)(importer)(
57
- collection,
58
- );
59
-
60
- return [
61
- ...importer.declare(modulo),
62
- ...isFunctors.filter((_, i) =>
63
- importer.hasLocal(`$io${i}`),
64
- ),
65
- ...isUnioners.filter((_, i) =>
66
- importer.hasLocal(`$iu${i}`),
67
- ),
68
- ];
69
- },
70
- })(importer);
71
- };
72
-
73
- /* -----------------------------------------------------------
74
- DECODERS
75
- ----------------------------------------------------------- */
76
- const decode =
77
- (project: IProject, importer: FunctionImporter) =>
78
- (
79
- input: ts.Expression,
80
- meta: Metadata,
81
- explore: FeatureProgrammer.IExplore,
82
- tags: IMetadataTag[],
83
- ): ts.Expression => {
84
- // ANY TYPE
85
- if (meta.any === true)
86
- return wrap_required(
87
- input,
88
- meta,
89
- explore,
90
- )(
91
- wrap_functional(
92
- input,
93
- meta,
94
- explore,
95
- )(
96
- ts.factory.createCallExpression(
97
- ts.factory.createIdentifier("JSON.stringify"),
98
- undefined,
99
- [input],
100
- ),
101
- ),
102
- );
103
-
104
- // ONLY NULL OR UNDEFINED
105
- const size: number = meta.size();
106
- if (
107
- size === 0 &&
108
- (meta.required === false || meta.nullable === true)
109
- ) {
110
- if (meta.required === false && meta.nullable === true)
111
- return explore.from === "array"
112
- ? ts.factory.createStringLiteral("null")
113
- : ts.factory.createConditionalExpression(
114
- ts.factory.createStrictEquality(
115
- ts.factory.createNull(),
116
- input,
117
- ),
118
- undefined,
119
- ts.factory.createStringLiteral("null"),
120
- undefined,
121
- ts.factory.createIdentifier("undefined"),
122
- );
123
- else if (meta.required === false)
124
- return explore.from === "array"
125
- ? ts.factory.createStringLiteral("null")
126
- : ts.factory.createIdentifier("undefined");
127
- else return ts.factory.createStringLiteral("null");
128
- }
129
-
130
- //----
131
- // LIST UP UNION TYPES
132
- //----
133
- const unions: IUnion[] = [];
134
-
135
- // toJSON() METHOD
136
- if (meta.resolved !== null)
137
- if (size === 1)
138
- return decode_to_json(project, importer)(
139
- input,
140
- meta.resolved,
141
- explore,
142
- tags,
143
- );
144
- else
145
- unions.push({
146
- type: "resolved",
147
- is: () => IsProgrammer.decode_to_json(false)(input),
148
- value: () =>
149
- decode_to_json(project, importer)(
150
- input,
151
- meta.resolved!,
152
- explore,
153
- tags,
154
- ),
155
- });
156
- else if (meta.functional === true)
157
- unions.push({
158
- type: "functional",
159
- is: () => IsProgrammer.decode_functional(input),
160
- value: () => decode_functional(explore),
161
- });
162
-
163
- // TEMPLATES
164
- if (
165
- meta.templates.length ||
166
- ArrayUtil.has(meta.constants, (c) => c.type === "string")
167
- )
168
- if (AtomicPredicator.template(meta)) {
169
- const partial = Metadata.initialize();
170
- partial.atomics.push("string"),
171
- unions.push({
172
- type: "template literal",
173
- is: () =>
174
- IsProgrammer.decode(project, importer)(
175
- input,
176
- partial,
177
- explore,
178
- [],
179
- [],
180
- ),
181
- value: () =>
182
- decode_atomic(project)(importer)(
183
- input,
184
- "string",
185
- explore,
186
- tags,
187
- ),
188
- });
189
- }
190
-
191
- // CONSTANTS
192
- for (const constant of meta.constants)
193
- if (AtomicPredicator.constant(meta)(constant.type) === false)
194
- continue;
195
- else if (constant.type !== "string")
196
- unions.push({
197
- type: "atomic",
198
- is: () =>
199
- IsProgrammer.decode(project, importer)(
200
- input,
201
- (() => {
202
- const partial = Metadata.initialize();
203
- partial.atomics.push(constant.type);
204
- return partial;
205
- })(),
206
- explore,
207
- [],
208
- [],
209
- ),
210
- value: () =>
211
- decode_atomic(project)(importer)(
212
- input,
213
- constant.type,
214
- explore,
215
- tags,
216
- ),
217
- });
218
- else if (meta.templates.length === 0)
219
- unions.push({
220
- type: "const string",
221
- is: () =>
222
- IsProgrammer.decode(project, importer)(
223
- input,
224
- (() => {
225
- const partial = Metadata.initialize();
226
- partial.atomics.push("string");
227
- return partial;
228
- })(),
229
- explore,
230
- [],
231
- [],
232
- ),
233
- value: () =>
234
- decode_constant_string(project)(importer)(
235
- input,
236
- [...constant.values] as string[],
237
- explore,
238
- ),
239
- });
240
-
241
- /// ATOMICS
242
- for (const type of meta.atomics)
243
- if (AtomicPredicator.atomic(meta)(type))
244
- unions.push({
245
- type: "atomic",
246
- is: () =>
247
- IsProgrammer.decode(project, importer)(
248
- input,
249
- (() => {
250
- const partial = Metadata.initialize();
251
- partial.atomics.push(type);
252
- return partial;
253
- })(),
254
- explore,
255
- [],
256
- [],
257
- ),
258
- value: () =>
259
- decode_atomic(project)(importer)(
260
- input,
261
- type,
262
- explore,
263
- tags,
264
- ),
265
- });
266
-
267
- // TUPLES
268
- for (const tuple of meta.tuples) {
269
- for (const child of tuple)
270
- if (StringifyPredicator.undefindable(meta))
271
- throw new Error(
272
- `Error on typia.stringify(): tuple cannot contain undefined value - (${child.getName()}).`,
273
- );
274
- unions.push({
275
- type: "tuple",
276
- is: () =>
277
- IsProgrammer.decode(project, importer)(
278
- input,
279
- (() => {
280
- const partial = Metadata.initialize();
281
- partial.tuples.push(tuple);
282
- return partial;
283
- })(),
284
- explore,
285
- [],
286
- [],
287
- ),
288
- value: () =>
289
- decode_tuple(project)(importer)(
290
- input,
291
- tuple,
292
- explore,
293
- tags,
294
- ),
295
- });
296
- }
297
-
298
- // ARRAYS
299
- if (meta.arrays.length) {
300
- for (const child of meta.arrays)
301
- if (StringifyPredicator.undefindable(child))
302
- throw new Error(
303
- `Error on typia.stringify(): array cannot contain undefined value (${child.getName()}).`,
304
- );
305
- const value: () => ts.Expression = meta.arrays.some(
306
- (elem) => elem.any,
307
- )
308
- ? () =>
309
- ts.factory.createCallExpression(
310
- ts.factory.createIdentifier("JSON.stringify"),
311
- undefined,
312
- [input],
313
- )
314
- : () =>
315
- explore_arrays(project)(importer)(
316
- input,
317
- meta.arrays,
318
- {
319
- ...explore,
320
- from: "array",
321
- },
322
- [],
323
- [],
324
- );
325
-
326
- unions.push({
327
- type: "array",
328
- is: () => ExpressionFactory.isArray(input),
329
- value,
330
- });
331
- }
332
-
333
- // BUILT-IN CLASSES
334
- if (meta.natives.length)
335
- for (const native of meta.natives)
336
- unions.push({
337
- type: "object",
338
- is: () => check_native(native)(input),
339
- value: () =>
340
- AtomicPredicator.native(native)
341
- ? decode_atomic(project)(importer)(
342
- input,
343
- native.toLowerCase() as Atomic.Literal,
344
- explore,
345
- tags,
346
- )
347
- : ts.factory.createStringLiteral("{}"),
348
- });
349
-
350
- // SETS
351
- if (meta.sets.length)
352
- unions.push({
353
- type: "object",
354
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
355
- value: () => ts.factory.createStringLiteral("{}"),
356
- });
357
-
358
- // MAPS
359
- if (meta.maps.length)
360
- unions.push({
361
- type: "object",
362
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
363
- value: () => ts.factory.createStringLiteral("{}"),
364
- });
365
-
366
- // OBJECTS
367
- if (meta.objects.length)
368
- unions.push({
369
- type: "object",
370
- is: () =>
371
- ExpressionFactory.isObject({
372
- checkNull: true,
373
- checkArray: meta.objects.some((obj) =>
374
- obj.properties.every(
375
- (prop) =>
376
- !prop.key.isSoleLiteral() ||
377
- !prop.value.required,
378
- ),
379
- ),
380
- })(input),
381
- value: () =>
382
- meta.isParentResolved() === false &&
383
- meta.objects.length === 1 &&
384
- meta.objects[0]!._Is_simple()
385
- ? (() => {
386
- const obj: MetadataObject = meta.objects[0]!;
387
- const entries: IExpressionEntry<ts.Expression>[] =
388
- feature_object_entries<ts.Expression>({
389
- decoder: decode(project, importer),
390
- trace: false,
391
- path: false,
392
- })(importer)(obj)(input);
393
- return StringifyJoiner.object(importer)(
394
- input,
395
- entries,
396
- );
397
- })()
398
- : explore_objects(importer)(input, meta, {
399
- ...explore,
400
- from: "object",
401
- }),
402
- });
403
-
404
- //----
405
- // RETURNS
406
- //----
407
- // CHECK NULL AND UNDEFINED
408
- const wrapper = (output: ts.Expression) =>
409
- wrap_required(
410
- input,
411
- meta,
412
- explore,
413
- )(wrap_nullable(input, meta)(output));
414
-
415
- // DIRECT RETURN
416
- if (unions.length === 0)
417
- return ts.factory.createCallExpression(
418
- ts.factory.createIdentifier("JSON.stringify"),
419
- undefined,
420
- [input],
421
- );
422
- else if (unions.length === 1) return wrapper(unions[0]!.value());
423
-
424
- // RETURN WITH TYPE CHECKING
425
- return wrapper(
426
- ts.factory.createCallExpression(
427
- ts.factory.createArrowFunction(
428
- undefined,
429
- undefined,
430
- [],
431
- undefined,
432
- undefined,
433
- iterate(importer, input, unions, meta.getName()),
434
- ),
435
- undefined,
436
- undefined,
437
- ),
438
- );
439
- };
440
-
441
- const decode_array = (project: IProject) => (importer: FunctionImporter) =>
442
- FeatureProgrammer.decode_array(configure(project)(importer))(importer)(
443
- StringifyJoiner.array,
444
- );
445
-
446
- const decode_object = (importer: FunctionImporter) =>
447
- FeatureProgrammer.decode_object({
448
- trace: false,
449
- path: false,
450
- functors: FUNCTORS,
451
- })(importer);
452
-
453
- const decode_tuple =
454
- (project: IProject) =>
455
- (importer: FunctionImporter) =>
456
- (
457
- input: ts.Expression,
458
- tuple: Metadata[],
459
- explore: FeatureProgrammer.IExplore,
460
- tags: IMetadataTag[],
461
- ): ts.Expression => {
462
- const children: ts.Expression[] = tuple
463
- .filter((elem) => elem.rest === null)
464
- .map((elem, index) =>
465
- decode(project, importer)(
466
- ts.factory.createElementAccessExpression(input, index),
467
- elem,
468
- {
469
- ...explore,
470
- from: "array",
471
- },
472
- tags,
473
- ),
474
- );
475
- const rest = (() => {
476
- if (tuple.length === 0) return null;
477
- const last = tuple[tuple.length - 1]!;
478
- if (last.rest === null) return null;
479
-
480
- const code = decode(project, importer)(
481
- ts.factory.createCallExpression(
482
- IdentifierFactory.access(input)("slice"),
483
- undefined,
484
- [ts.factory.createNumericLiteral(tuple.length - 1)],
485
- ),
486
- (() => {
487
- const wrapper: Metadata = Metadata.initialize();
488
- wrapper.arrays.push(tuple[tuple.length - 1]!.rest!);
489
- return wrapper;
490
- })(),
491
- {
492
- ...explore,
493
- start: tuple.length - 1,
494
- },
495
- tags,
496
- );
497
- return ts.factory.createCallExpression(
498
- importer.use("rest"),
499
- undefined,
500
- [code],
501
- );
502
- })();
503
- return StringifyJoiner.tuple(children, rest);
504
- };
505
-
506
- const decode_atomic =
507
- (project: IProject) =>
508
- (importer: FunctionImporter) =>
509
- (
510
- input: ts.Expression,
511
- type: string,
512
- explore: FeatureProgrammer.IExplore,
513
- tagList: IMetadataTag[],
514
- ) => {
515
- if (type === "string")
516
- if (tagList.find((tag) => tag.kind === "format") !== undefined)
517
- return [
518
- ts.factory.createStringLiteral('"'),
519
- input,
520
- ts.factory.createStringLiteral('"'),
521
- ].reduce((x, y) => ts.factory.createAdd(x, y));
522
- else
523
- return ts.factory.createCallExpression(
524
- importer.use("string"),
525
- undefined,
526
- [input],
527
- );
528
- else if (
529
- type === "number" &&
530
- OptionPredicator.numeric(project.options)
531
- )
532
- input = ts.factory.createCallExpression(
533
- importer.use("number"),
534
- undefined,
535
- [input],
536
- );
537
-
538
- return explore.from !== "top"
539
- ? input
540
- : ts.factory.createCallExpression(
541
- IdentifierFactory.access(input)("toString"),
542
- undefined,
543
- undefined,
544
- );
545
- };
546
-
547
- const decode_constant_string =
548
- (project: IProject) =>
549
- (importer: FunctionImporter) =>
550
- (
551
- input: ts.Expression,
552
- values: string[],
553
- explore: FeatureProgrammer.IExplore,
554
- ): ts.Expression => {
555
- if (values.every((v) => !StringifyPredicator.require_escape(v)))
556
- return [
557
- ts.factory.createStringLiteral('"'),
558
- input,
559
- ts.factory.createStringLiteral('"'),
560
- ].reduce((x, y) => ts.factory.createAdd(x, y));
561
- else
562
- return decode_atomic(project)(importer)(
563
- input,
564
- "string",
565
- explore,
566
- [],
567
- );
568
- };
569
-
570
- const decode_to_json =
571
- (project: IProject, importer: FunctionImporter) =>
572
- (
573
- input: ts.Expression,
574
- resolved: Metadata,
575
- explore: FeatureProgrammer.IExplore,
576
- tags: IMetadataTag[],
577
- ): ts.Expression => {
578
- return decode(project, importer)(
579
- ts.factory.createCallExpression(
580
- IdentifierFactory.access(input)("toJSON"),
581
- undefined,
582
- [],
583
- ),
584
- resolved,
585
- explore,
586
- tags,
587
- );
588
- };
589
-
590
- const decode_functional = (explore: FeatureProgrammer.IExplore) =>
591
- explore.from === "array"
592
- ? ts.factory.createStringLiteral("null")
593
- : ts.factory.createIdentifier("undefined");
594
-
595
- /* -----------------------------------------------------------
596
- EXPLORERS
597
- ----------------------------------------------------------- */
598
- const explore_arrays =
599
- (project: IProject) => (importer: FunctionImporter) =>
600
- UnionExplorer.array({
601
- checker: IsProgrammer.decode(project, importer),
602
- decoder: decode_array(project)(importer),
603
- empty: ts.factory.createStringLiteral("[]"),
604
- success: ts.factory.createTrue(),
605
- failure: (input, expected) =>
606
- create_throw_error(importer, input, expected),
607
- });
608
-
609
- const explore_objects =
610
- (importer: FunctionImporter) =>
611
- (
612
- input: ts.Expression,
613
- meta: Metadata,
614
- explore: FeatureProgrammer.IExplore,
615
- ) => {
616
- if (meta.objects.length === 1)
617
- return decode_object(importer)(
618
- input,
619
- meta.objects[0]!,
620
- explore,
621
- );
622
-
623
- return ts.factory.createCallExpression(
624
- ts.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
625
- undefined,
626
- [input],
627
- );
628
- };
629
-
630
- /* -----------------------------------------------------------
631
- RETURN SCRIPTS
632
- ----------------------------------------------------------- */
633
- const wrap_required = (
634
- input: ts.Expression,
635
- meta: Metadata,
636
- explore: FeatureProgrammer.IExplore,
637
- ): ((expression: ts.Expression) => ts.Expression) => {
638
- if (meta.required === true && meta.any === false)
639
- return (expression) => expression;
640
- return (expression) =>
641
- ts.factory.createConditionalExpression(
642
- ts.factory.createStrictInequality(
643
- ts.factory.createIdentifier("undefined"),
644
- input,
645
- ),
646
- undefined,
647
- expression,
648
- undefined,
649
- explore.from === "array"
650
- ? ts.factory.createStringLiteral("null")
651
- : ts.factory.createIdentifier("undefined"),
652
- );
653
- };
654
-
655
- const wrap_nullable = (
656
- input: ts.Expression,
657
- meta: Metadata,
658
- ): ((expression: ts.Expression) => ts.Expression) => {
659
- if (meta.nullable === false) return (expression) => expression;
660
- return (expression) =>
661
- ts.factory.createConditionalExpression(
662
- ts.factory.createStrictInequality(
663
- ts.factory.createNull(),
664
- input,
665
- ),
666
- undefined,
667
- expression,
668
- undefined,
669
- ts.factory.createStringLiteral("null"),
670
- );
671
- };
672
-
673
- const wrap_functional = (
674
- input: ts.Expression,
675
- meta: Metadata,
676
- explore: FeatureProgrammer.IExplore,
677
- ): ((expression: ts.Expression) => ts.Expression) => {
678
- if (meta.functional === false) return (expression) => expression;
679
- return (expression) =>
680
- ts.factory.createConditionalExpression(
681
- ts.factory.createStrictInequality(
682
- ts.factory.createStringLiteral("function"),
683
- ValueFactory.TYPEOF(input),
684
- ),
685
- undefined,
686
- expression,
687
- undefined,
688
- decode_functional(explore),
689
- );
690
- };
691
-
692
- const iterate = (
693
- importer: FunctionImporter,
694
- input: ts.Expression,
695
- unions: IUnion[],
696
- expected: string,
697
- ) =>
698
- ts.factory.createBlock(
699
- [
700
- ...unions.map((u) =>
701
- ts.factory.createIfStatement(
702
- u.is(),
703
- ts.factory.createReturnStatement(u.value()),
704
- ),
705
- ),
706
- create_throw_error(importer, input, expected),
707
- ],
708
- true,
709
- );
710
-
711
- /* -----------------------------------------------------------
712
- CONFIGURATIONS
713
- ----------------------------------------------------------- */
714
- const FUNCTORS = "$so";
715
- const UNIONERS = "$su";
716
-
717
- const configure =
718
- (project: IProject) =>
719
- (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
720
- types: {
721
- input: (type, name) =>
722
- ts.factory.createTypeReferenceNode(
723
- name ?? TypeFactory.getFullName(project.checker)(type),
724
- ),
725
- output: () => TypeFactory.keyword("string"),
726
- },
727
- functors: FUNCTORS,
728
- unioners: UNIONERS,
729
- trace: false,
730
- path: false,
731
- initializer,
732
- decoder: decode(project, importer),
733
- objector: OBJECTOR(project, importer),
734
- });
735
-
736
- const initializer: FeatureProgrammer.IConfig["initializer"] =
737
- ({ checker }) =>
738
- (type) => {
739
- const collection: MetadataCollection = new MetadataCollection();
740
- const meta: Metadata = MetadataFactory.analyze(checker)({
741
- resolve: true,
742
- constant: true,
743
- validate: (meta) => {
744
- if (meta.atomics.find((str) => str === "bigint"))
745
- throw new Error(NO_BIGINT);
746
- },
747
- })(collection)(type);
748
- return [collection, meta];
749
- };
750
-
751
- const OBJECTOR = (
752
- project: IProject,
753
- importer: FunctionImporter,
754
- ): FeatureProgrammer.IConfig.IObjector => ({
755
- checker: IsProgrammer.decode(project, importer),
756
- decoder: decode_object(importer),
757
- joiner: StringifyJoiner.object(importer),
758
- unionizer: decode_union_object(IsProgrammer.decode_object(importer))(
759
- decode_object(importer),
760
- )((exp) => exp)((value, expected) =>
761
- create_throw_error(importer, value, expected),
762
- ),
763
- failure: (input, expected) =>
764
- create_throw_error(importer, input, expected),
765
- });
766
-
767
- const create_throw_error = (
768
- importer: FunctionImporter,
769
- value: ts.Expression,
770
- expected: string,
771
- ) =>
772
- ts.factory.createExpressionStatement(
773
- ts.factory.createCallExpression(
774
- importer.use("throws"),
775
- [],
776
- [
777
- ts.factory.createObjectLiteralExpression(
778
- [
779
- ts.factory.createPropertyAssignment(
780
- "expected",
781
- ts.factory.createStringLiteral(expected),
782
- ),
783
- ts.factory.createPropertyAssignment("value", value),
784
- ],
785
- true,
786
- ),
787
- ],
788
- ),
789
- );
790
- }
791
-
792
- interface IUnion {
793
- type: string;
794
- is: () => ts.Expression;
795
- value: () => ts.Expression;
796
- }
797
-
798
- const NO_BIGINT = "Error on typia.stringify(): does not allow bigint type.";
1
+ import type ts from "typescript/lib/tsclibrary";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../factories/MetadataFactory";
7
+ import { TypeFactory } from "../factories/TypeFactory";
8
+ import { ValueFactory } from "../factories/ValueFactory";
9
+
10
+ import { IMetadataTag } from "../metadata/IMetadataTag";
11
+ import { Metadata } from "../metadata/Metadata";
12
+ import { MetadataObject } from "../metadata/MetadataObject";
13
+
14
+ import { IProject } from "../transformers/IProject";
15
+
16
+ import { Atomic } from "../typings/Atomic";
17
+
18
+ import { ArrayUtil } from "../utils/ArrayUtil";
19
+
20
+ import { FeatureProgrammer } from "./FeatureProgrammer";
21
+ import { IsProgrammer } from "./IsProgrammer";
22
+ import { AtomicPredicator } from "./helpers/AtomicPredicator";
23
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
24
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
25
+ import { OptionPredicator } from "./helpers/OptionPredicator";
26
+ import { StringifyJoiner } from "./helpers/StringifyJoinder";
27
+ import { StringifyPredicator } from "./helpers/StringifyPredicator";
28
+ import { UnionExplorer } from "./helpers/UnionExplorer";
29
+ import { check_native } from "./internal/check_native";
30
+ import { decode_union_object } from "./internal/decode_union_object";
31
+ import { feature_object_entries } from "./internal/feature_object_entries";
32
+
33
+ export namespace StringifyProgrammer {
34
+ /* -----------------------------------------------------------
35
+ WRITER
36
+ ----------------------------------------------------------- */
37
+ export const write =
38
+ (p: IProject) => (modulo: ts.LeftHandSideExpression) => {
39
+ const importer: FunctionImporter = new FunctionImporter(p.tsc);
40
+ return FeatureProgrammer.analyze(p)({
41
+ ...configure(p)(importer),
42
+ addition: (collection) => {
43
+ const isFunctors =
44
+ IsProgrammer.write_functors(p)(importer)(collection);
45
+ const isUnioners =
46
+ IsProgrammer.write_unioners(p)(importer)(collection);
47
+
48
+ return [
49
+ ...importer.declare(modulo),
50
+ ...isFunctors.filter((_, i) =>
51
+ importer.hasLocal(`$io${i}`),
52
+ ),
53
+ ...isUnioners.filter((_, i) =>
54
+ importer.hasLocal(`$iu${i}`),
55
+ ),
56
+ ];
57
+ },
58
+ })(importer);
59
+ };
60
+
61
+ /* -----------------------------------------------------------
62
+ DECODERS
63
+ ----------------------------------------------------------- */
64
+ const decode =
65
+ (p: IProject) =>
66
+ (importer: FunctionImporter) =>
67
+ (
68
+ input: ts.Expression,
69
+ meta: Metadata,
70
+ explore: FeatureProgrammer.IExplore,
71
+ tags: IMetadataTag[],
72
+ ): ts.Expression => {
73
+ // ANY TYPE
74
+ if (meta.any === true)
75
+ return wrap_required(p.tsc)(input, meta, explore)(
76
+ wrap_functional(p.tsc)(input, meta, explore)(
77
+ p.tsc.factory.createCallExpression(
78
+ p.tsc.factory.createIdentifier("JSON.stringify"),
79
+ undefined,
80
+ [input],
81
+ ),
82
+ ),
83
+ );
84
+
85
+ // ONLY NULL OR UNDEFINED
86
+ const size: number = meta.size();
87
+ if (
88
+ size === 0 &&
89
+ (meta.required === false || meta.nullable === true)
90
+ ) {
91
+ if (meta.required === false && meta.nullable === true)
92
+ return explore.from === "array"
93
+ ? p.tsc.factory.createStringLiteral("null")
94
+ : p.tsc.factory.createConditionalExpression(
95
+ p.tsc.factory.createStrictEquality(
96
+ p.tsc.factory.createNull(),
97
+ input,
98
+ ),
99
+ undefined,
100
+ p.tsc.factory.createStringLiteral("null"),
101
+ undefined,
102
+ p.tsc.factory.createIdentifier("undefined"),
103
+ );
104
+ else if (meta.required === false)
105
+ return explore.from === "array"
106
+ ? p.tsc.factory.createStringLiteral("null")
107
+ : p.tsc.factory.createIdentifier("undefined");
108
+ else return p.tsc.factory.createStringLiteral("null");
109
+ }
110
+
111
+ //----
112
+ // LIST UP UNION TYPES
113
+ //----
114
+ const unions: IUnion[] = [];
115
+
116
+ // toJSON() METHOD
117
+ if (meta.resolved !== null)
118
+ if (size === 1)
119
+ return decode_to_json(p)(importer)(
120
+ input,
121
+ meta.resolved,
122
+ explore,
123
+ tags,
124
+ );
125
+ else
126
+ unions.push({
127
+ type: "resolved",
128
+ is: () =>
129
+ IsProgrammer.decode_to_json(p.tsc)(false)(input),
130
+ value: () =>
131
+ decode_to_json(p)(importer)(
132
+ input,
133
+ meta.resolved!,
134
+ explore,
135
+ tags,
136
+ ),
137
+ });
138
+ else if (meta.functional === true)
139
+ unions.push({
140
+ type: "functional",
141
+ is: () => IsProgrammer.decode_functional(p.tsc)(input),
142
+ value: () => decode_functional(p.tsc)(explore),
143
+ });
144
+
145
+ // TEMPLATES
146
+ if (
147
+ meta.templates.length ||
148
+ ArrayUtil.has(meta.constants, (c) => c.type === "string")
149
+ )
150
+ if (AtomicPredicator.template(meta)) {
151
+ const partial = Metadata.initialize();
152
+ partial.atomics.push("string"),
153
+ unions.push({
154
+ type: "template literal",
155
+ is: () =>
156
+ IsProgrammer.decode(p)(importer)(
157
+ input,
158
+ partial,
159
+ explore,
160
+ [],
161
+ [],
162
+ ),
163
+ value: () =>
164
+ decode_atomic(p)(importer)(
165
+ input,
166
+ "string",
167
+ explore,
168
+ ),
169
+ });
170
+ }
171
+
172
+ // CONSTANTS
173
+ for (const constant of meta.constants)
174
+ if (AtomicPredicator.constant(meta)(constant.type) === false)
175
+ continue;
176
+ else if (constant.type !== "string")
177
+ unions.push({
178
+ type: "atomic",
179
+ is: () =>
180
+ IsProgrammer.decode(p)(importer)(
181
+ input,
182
+ (() => {
183
+ const partial = Metadata.initialize();
184
+ partial.atomics.push(constant.type);
185
+ return partial;
186
+ })(),
187
+ explore,
188
+ [],
189
+ [],
190
+ ),
191
+ value: () =>
192
+ decode_atomic(p)(importer)(
193
+ input,
194
+ constant.type,
195
+ explore,
196
+ ),
197
+ });
198
+ else if (meta.templates.length === 0)
199
+ unions.push({
200
+ type: "const string",
201
+ is: () =>
202
+ IsProgrammer.decode(p)(importer)(
203
+ input,
204
+ (() => {
205
+ const partial = Metadata.initialize();
206
+ partial.atomics.push("string");
207
+ return partial;
208
+ })(),
209
+ explore,
210
+ [],
211
+ [],
212
+ ),
213
+ value: () =>
214
+ decode_constant_string(p)(importer)(
215
+ input,
216
+ [...constant.values] as string[],
217
+ explore,
218
+ ),
219
+ });
220
+
221
+ /// ATOMICS
222
+ for (const type of meta.atomics)
223
+ if (AtomicPredicator.atomic(meta)(type))
224
+ unions.push({
225
+ type: "atomic",
226
+ is: () =>
227
+ IsProgrammer.decode(p)(importer)(
228
+ input,
229
+ (() => {
230
+ const partial = Metadata.initialize();
231
+ partial.atomics.push(type);
232
+ return partial;
233
+ })(),
234
+ explore,
235
+ [],
236
+ [],
237
+ ),
238
+ value: () =>
239
+ decode_atomic(p)(importer)(input, type, explore),
240
+ });
241
+
242
+ // TUPLES
243
+ for (const tuple of meta.tuples) {
244
+ for (const child of tuple)
245
+ if (StringifyPredicator.undefindable(meta))
246
+ throw new Error(
247
+ `Error on typia.stringify(): tuple cannot contain undefined value - (${child.getName()}).`,
248
+ );
249
+ unions.push({
250
+ type: "tuple",
251
+ is: () =>
252
+ IsProgrammer.decode(p)(importer)(
253
+ input,
254
+ (() => {
255
+ const partial = Metadata.initialize();
256
+ partial.tuples.push(tuple);
257
+ return partial;
258
+ })(),
259
+ explore,
260
+ [],
261
+ [],
262
+ ),
263
+ value: () =>
264
+ decode_tuple(p)(importer)(input, tuple, explore, tags),
265
+ });
266
+ }
267
+
268
+ // ARRAYS
269
+ if (meta.arrays.length) {
270
+ for (const child of meta.arrays)
271
+ if (StringifyPredicator.undefindable(child))
272
+ throw new Error(
273
+ `Error on typia.stringify(): array cannot contain undefined value (${child.getName()}).`,
274
+ );
275
+ const value: () => ts.Expression = meta.arrays.some(
276
+ (elem) => elem.any,
277
+ )
278
+ ? () =>
279
+ p.tsc.factory.createCallExpression(
280
+ p.tsc.factory.createIdentifier("JSON.stringify"),
281
+ undefined,
282
+ [input],
283
+ )
284
+ : () =>
285
+ explore_arrays(p)(importer)(
286
+ input,
287
+ meta.arrays,
288
+ {
289
+ ...explore,
290
+ from: "array",
291
+ },
292
+ [],
293
+ [],
294
+ );
295
+
296
+ unions.push({
297
+ type: "array",
298
+ is: () => ExpressionFactory.isArray(p.tsc)(input),
299
+ value,
300
+ });
301
+ }
302
+
303
+ // BUILT-IN CLASSES
304
+ if (meta.natives.length)
305
+ for (const native of meta.natives)
306
+ unions.push({
307
+ type: "object",
308
+ is: () => check_native(p.tsc)(native)(input),
309
+ value: () =>
310
+ AtomicPredicator.native(native)
311
+ ? decode_atomic(p)(importer)(
312
+ input,
313
+ native.toLowerCase() as Atomic.Literal,
314
+ explore,
315
+ )
316
+ : p.tsc.factory.createStringLiteral("{}"),
317
+ });
318
+
319
+ // SETS
320
+ if (meta.sets.length)
321
+ unions.push({
322
+ type: "object",
323
+ is: () =>
324
+ ExpressionFactory.isInstanceOf(p.tsc)("Set")(input),
325
+ value: () => p.tsc.factory.createStringLiteral("{}"),
326
+ });
327
+
328
+ // MAPS
329
+ if (meta.maps.length)
330
+ unions.push({
331
+ type: "object",
332
+ is: () =>
333
+ ExpressionFactory.isInstanceOf(p.tsc)("Map")(input),
334
+ value: () => p.tsc.factory.createStringLiteral("{}"),
335
+ });
336
+
337
+ // OBJECTS
338
+ if (meta.objects.length)
339
+ unions.push({
340
+ type: "object",
341
+ is: () =>
342
+ ExpressionFactory.isObject(p.tsc)({
343
+ checkNull: true,
344
+ checkArray: meta.objects.some((obj) =>
345
+ obj.properties.every(
346
+ (prop) =>
347
+ !prop.key.isSoleLiteral() ||
348
+ !prop.value.required,
349
+ ),
350
+ ),
351
+ })(input),
352
+ value: () =>
353
+ meta.isParentResolved() === false &&
354
+ meta.objects.length === 1 &&
355
+ meta.objects[0]!._Is_simple()
356
+ ? (() => {
357
+ const obj: MetadataObject = meta.objects[0]!;
358
+ const entries: IExpressionEntry<ts.Expression>[] =
359
+ feature_object_entries(
360
+ p.tsc,
361
+ )<ts.Expression>({
362
+ decoder: decode(p)(importer),
363
+ trace: false,
364
+ path: false,
365
+ })(importer)(obj)(input);
366
+ return StringifyJoiner.object(p.tsc)(
367
+ importer,
368
+ )(input, entries);
369
+ })()
370
+ : explore_objects(p.tsc)(importer)(input, meta, {
371
+ ...explore,
372
+ from: "object",
373
+ }),
374
+ });
375
+
376
+ //----
377
+ // RETURNS
378
+ //----
379
+ // CHECK NULL AND UNDEFINED
380
+ const wrapper = (output: ts.Expression) =>
381
+ wrap_required(p.tsc)(input, meta, explore)(
382
+ wrap_nullable(p.tsc)(input, meta)(output),
383
+ );
384
+
385
+ // DIRECT RETURN
386
+ if (unions.length === 0)
387
+ return p.tsc.factory.createCallExpression(
388
+ p.tsc.factory.createIdentifier("JSON.stringify"),
389
+ undefined,
390
+ [input],
391
+ );
392
+ else if (unions.length === 1) return wrapper(unions[0]!.value());
393
+
394
+ // RETURN WITH TYPE CHECKING
395
+ return wrapper(
396
+ p.tsc.factory.createCallExpression(
397
+ p.tsc.factory.createArrowFunction(
398
+ undefined,
399
+ undefined,
400
+ [],
401
+ undefined,
402
+ undefined,
403
+ iterate(p.tsc)(importer)(input, unions, meta.getName()),
404
+ ),
405
+ undefined,
406
+ undefined,
407
+ ),
408
+ );
409
+ };
410
+
411
+ const decode_array = (p: IProject) => (importer: FunctionImporter) =>
412
+ FeatureProgrammer.decode_array(p.tsc)(configure(p)(importer))(importer)(
413
+ StringifyJoiner.array(p.tsc),
414
+ );
415
+
416
+ const decode_object = (tsc: typeof ts) => (importer: FunctionImporter) =>
417
+ FeatureProgrammer.decode_object(tsc)({
418
+ trace: false,
419
+ path: false,
420
+ functors: FUNCTORS,
421
+ })(importer);
422
+
423
+ const decode_tuple =
424
+ (p: IProject) =>
425
+ (importer: FunctionImporter) =>
426
+ (
427
+ input: ts.Expression,
428
+ tuple: Metadata[],
429
+ explore: FeatureProgrammer.IExplore,
430
+ tags: IMetadataTag[],
431
+ ): ts.Expression => {
432
+ const children: ts.Expression[] = tuple
433
+ .filter((elem) => elem.rest === null)
434
+ .map((elem, index) =>
435
+ decode(p)(importer)(
436
+ p.tsc.factory.createElementAccessExpression(
437
+ input,
438
+ index,
439
+ ),
440
+ elem,
441
+ {
442
+ ...explore,
443
+ from: "array",
444
+ },
445
+ tags,
446
+ ),
447
+ );
448
+ const rest = (() => {
449
+ if (tuple.length === 0) return null;
450
+ const last = tuple[tuple.length - 1]!;
451
+ if (last.rest === null) return null;
452
+
453
+ const code = decode(p)(importer)(
454
+ p.tsc.factory.createCallExpression(
455
+ IdentifierFactory.access(p.tsc)(input)("slice"),
456
+ undefined,
457
+ [p.tsc.factory.createNumericLiteral(tuple.length - 1)],
458
+ ),
459
+ (() => {
460
+ const wrapper: Metadata = Metadata.initialize();
461
+ wrapper.arrays.push(tuple[tuple.length - 1]!.rest!);
462
+ return wrapper;
463
+ })(),
464
+ {
465
+ ...explore,
466
+ start: tuple.length - 1,
467
+ },
468
+ tags,
469
+ );
470
+ return p.tsc.factory.createCallExpression(
471
+ importer.use("rest"),
472
+ undefined,
473
+ [code],
474
+ );
475
+ })();
476
+ return StringifyJoiner.tuple(p.tsc)(children, rest);
477
+ };
478
+
479
+ const decode_atomic =
480
+ (p: IProject) =>
481
+ (importer: FunctionImporter) =>
482
+ (
483
+ input: ts.Expression,
484
+ type: string,
485
+ explore: FeatureProgrammer.IExplore,
486
+ ) => {
487
+ if (type === "string")
488
+ return p.tsc.factory.createCallExpression(
489
+ importer.use("string"),
490
+ undefined,
491
+ [input],
492
+ );
493
+ else if (type === "number" && OptionPredicator.numeric(p.options))
494
+ input = p.tsc.factory.createCallExpression(
495
+ importer.use("number"),
496
+ undefined,
497
+ [input],
498
+ );
499
+ return explore.from !== "top"
500
+ ? input
501
+ : p.tsc.factory.createCallExpression(
502
+ IdentifierFactory.access(p.tsc)(input)("toString"),
503
+ undefined,
504
+ undefined,
505
+ );
506
+ };
507
+
508
+ const decode_constant_string =
509
+ (p: IProject) =>
510
+ (importer: FunctionImporter) =>
511
+ (
512
+ input: ts.Expression,
513
+ values: string[],
514
+ explore: FeatureProgrammer.IExplore,
515
+ ): ts.Expression => {
516
+ if (values.every((v) => !StringifyPredicator.require_escape(v)))
517
+ return [
518
+ p.tsc.factory.createStringLiteral('"'),
519
+ input,
520
+ p.tsc.factory.createStringLiteral('"'),
521
+ ].reduce((x, y) => p.tsc.factory.createAdd(x, y));
522
+ else return decode_atomic(p)(importer)(input, "string", explore);
523
+ };
524
+
525
+ const decode_to_json =
526
+ (p: IProject) =>
527
+ (importer: FunctionImporter) =>
528
+ (
529
+ input: ts.Expression,
530
+ resolved: Metadata,
531
+ explore: FeatureProgrammer.IExplore,
532
+ tags: IMetadataTag[],
533
+ ): ts.Expression => {
534
+ return decode(p)(importer)(
535
+ p.tsc.factory.createCallExpression(
536
+ IdentifierFactory.access(p.tsc)(input)("toJSON"),
537
+ undefined,
538
+ [],
539
+ ),
540
+ resolved,
541
+ explore,
542
+ tags,
543
+ );
544
+ };
545
+
546
+ const decode_functional =
547
+ (tsc: typeof ts) => (explore: FeatureProgrammer.IExplore) =>
548
+ explore.from === "array"
549
+ ? tsc.factory.createStringLiteral("null")
550
+ : tsc.factory.createIdentifier("undefined");
551
+
552
+ /* -----------------------------------------------------------
553
+ EXPLORERS
554
+ ----------------------------------------------------------- */
555
+ const explore_arrays = (p: IProject) => (importer: FunctionImporter) =>
556
+ UnionExplorer.array(p.tsc)({
557
+ checker: IsProgrammer.decode(p)(importer),
558
+ decoder: decode_array(p)(importer),
559
+ empty: p.tsc.factory.createStringLiteral("[]"),
560
+ success: p.tsc.factory.createTrue(),
561
+ failure: (input, expected) =>
562
+ create_throw_error(p.tsc)(importer, input, expected),
563
+ });
564
+
565
+ const explore_objects =
566
+ (tsc: typeof ts) =>
567
+ (importer: FunctionImporter) =>
568
+ (
569
+ input: ts.Expression,
570
+ meta: Metadata,
571
+ explore: FeatureProgrammer.IExplore,
572
+ ) => {
573
+ if (meta.objects.length === 1)
574
+ return decode_object(tsc)(importer)(
575
+ input,
576
+ meta.objects[0]!,
577
+ explore,
578
+ );
579
+
580
+ return tsc.factory.createCallExpression(
581
+ tsc.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
582
+ undefined,
583
+ [input],
584
+ );
585
+ };
586
+
587
+ /* -----------------------------------------------------------
588
+ RETURN SCRIPTS
589
+ ----------------------------------------------------------- */
590
+ const wrap_required =
591
+ (tsc: typeof ts) =>
592
+ (
593
+ input: ts.Expression,
594
+ meta: Metadata,
595
+ explore: FeatureProgrammer.IExplore,
596
+ ): ((expression: ts.Expression) => ts.Expression) => {
597
+ if (meta.required === true && meta.any === false)
598
+ return (expression) => expression;
599
+ return (expression) =>
600
+ tsc.factory.createConditionalExpression(
601
+ tsc.factory.createStrictInequality(
602
+ tsc.factory.createIdentifier("undefined"),
603
+ input,
604
+ ),
605
+ undefined,
606
+ expression,
607
+ undefined,
608
+ explore.from === "array"
609
+ ? tsc.factory.createStringLiteral("null")
610
+ : tsc.factory.createIdentifier("undefined"),
611
+ );
612
+ };
613
+
614
+ const wrap_nullable =
615
+ (tsc: typeof ts) =>
616
+ (
617
+ input: ts.Expression,
618
+ meta: Metadata,
619
+ ): ((expression: ts.Expression) => ts.Expression) => {
620
+ if (meta.nullable === false) return (expression) => expression;
621
+ return (expression) =>
622
+ tsc.factory.createConditionalExpression(
623
+ tsc.factory.createStrictInequality(
624
+ tsc.factory.createNull(),
625
+ input,
626
+ ),
627
+ undefined,
628
+ expression,
629
+ undefined,
630
+ tsc.factory.createStringLiteral("null"),
631
+ );
632
+ };
633
+
634
+ const wrap_functional =
635
+ (tsc: typeof ts) =>
636
+ (
637
+ input: ts.Expression,
638
+ meta: Metadata,
639
+ explore: FeatureProgrammer.IExplore,
640
+ ): ((expression: ts.Expression) => ts.Expression) => {
641
+ if (meta.functional === false) return (expression) => expression;
642
+ return (expression) =>
643
+ tsc.factory.createConditionalExpression(
644
+ tsc.factory.createStrictInequality(
645
+ tsc.factory.createStringLiteral("function"),
646
+ ValueFactory.TYPEOF(tsc)(input),
647
+ ),
648
+ undefined,
649
+ expression,
650
+ undefined,
651
+ decode_functional(tsc)(explore),
652
+ );
653
+ };
654
+
655
+ const iterate =
656
+ (tsc: typeof ts) =>
657
+ (importer: FunctionImporter) =>
658
+ (input: ts.Expression, unions: IUnion[], expected: string) =>
659
+ tsc.factory.createBlock(
660
+ [
661
+ ...unions.map((u) =>
662
+ tsc.factory.createIfStatement(
663
+ u.is(),
664
+ tsc.factory.createReturnStatement(u.value()),
665
+ ),
666
+ ),
667
+ create_throw_error(tsc)(importer, input, expected),
668
+ ],
669
+ true,
670
+ );
671
+
672
+ /* -----------------------------------------------------------
673
+ CONFIGURATIONS
674
+ ----------------------------------------------------------- */
675
+ const FUNCTORS = "$so";
676
+ const UNIONERS = "$su";
677
+
678
+ const configure =
679
+ (p: IProject) =>
680
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
681
+ types: {
682
+ input: (type, name) =>
683
+ p.tsc.factory.createTypeReferenceNode(
684
+ name ?? TypeFactory.getFullName(p)(type),
685
+ ),
686
+ output: () => TypeFactory.keyword(p.tsc)("string"),
687
+ },
688
+ functors: FUNCTORS,
689
+ unioners: UNIONERS,
690
+ trace: false,
691
+ path: false,
692
+ initializer,
693
+ decoder: decode(p)(importer),
694
+ objector: OBJECTOR(p)(importer),
695
+ });
696
+
697
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
698
+ (p) => (type) => {
699
+ const collection: MetadataCollection = new MetadataCollection();
700
+ const meta: Metadata = MetadataFactory.analyze(p)({
701
+ resolve: true,
702
+ constant: true,
703
+ validate: (meta) => {
704
+ if (meta.atomics.find((str) => str === "bigint"))
705
+ throw new Error(NO_BIGINT);
706
+ },
707
+ })(collection)(type);
708
+ return [collection, meta];
709
+ };
710
+
711
+ const OBJECTOR =
712
+ (p: IProject) =>
713
+ (importer: FunctionImporter): FeatureProgrammer.IConfig.IObjector => ({
714
+ checker: IsProgrammer.decode(p)(importer),
715
+ decoder: decode_object(p.tsc)(importer),
716
+ joiner: StringifyJoiner.object(p.tsc)(importer),
717
+ unionizer: decode_union_object(p.tsc)(
718
+ IsProgrammer.decode_object(p.tsc)(importer),
719
+ )(decode_object(p.tsc)(importer))((exp) => exp)((value, expected) =>
720
+ create_throw_error(p.tsc)(importer, value, expected),
721
+ ),
722
+ failure: (input, expected) =>
723
+ create_throw_error(p.tsc)(importer, input, expected),
724
+ });
725
+
726
+ const create_throw_error =
727
+ (tsc: typeof ts) =>
728
+ (importer: FunctionImporter, value: ts.Expression, expected: string) =>
729
+ tsc.factory.createExpressionStatement(
730
+ tsc.factory.createCallExpression(
731
+ importer.use("throws"),
732
+ [],
733
+ [
734
+ tsc.factory.createObjectLiteralExpression(
735
+ [
736
+ tsc.factory.createPropertyAssignment(
737
+ "expected",
738
+ tsc.factory.createStringLiteral(expected),
739
+ ),
740
+ tsc.factory.createPropertyAssignment(
741
+ "value",
742
+ value,
743
+ ),
744
+ ],
745
+ true,
746
+ ),
747
+ ],
748
+ ),
749
+ );
750
+ }
751
+
752
+ interface IUnion {
753
+ type: string;
754
+ is: () => ts.Expression;
755
+ value: () => ts.Expression;
756
+ }
757
+
758
+ const NO_BIGINT = "Error on typia.stringify(): does not allow bigint type.";