typia 3.8.6 → 4.0.0-dev.20230517

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 (509) hide show
  1. package/README.md +1 -0
  2. package/lib/executable/TypiaGenerateWizard.js +1 -1
  3. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  4. package/lib/executable/TypiaSetupWizard.js +1 -1
  5. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  6. package/lib/executable/setup/ArgumentParser.js +1 -1
  7. package/lib/executable/setup/ArgumentParser.js.map +1 -1
  8. package/lib/executable/setup/CommandExecutor.js +1 -1
  9. package/lib/executable/setup/CommandExecutor.js.map +1 -1
  10. package/lib/executable/setup/FileRetriever.js +1 -1
  11. package/lib/executable/setup/FileRetriever.js.map +1 -1
  12. package/lib/executable/setup/PluginConfigurator.js +1 -1
  13. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  14. package/lib/factories/CommentFactory.d.ts +3 -3
  15. package/lib/factories/CommentFactory.js +1 -1
  16. package/lib/factories/CommentFactory.js.map +1 -1
  17. package/lib/factories/ExpressionFactory.d.ts +1 -1
  18. package/lib/factories/ExpressionFactory.js +10 -10
  19. package/lib/factories/ExpressionFactory.js.map +1 -1
  20. package/lib/factories/IdentifierFactory.d.ts +1 -1
  21. package/lib/factories/IdentifierFactory.js +14 -14
  22. package/lib/factories/IdentifierFactory.js.map +1 -1
  23. package/lib/factories/LiteralFactory.d.ts +1 -1
  24. package/lib/factories/LiteralFactory.js +9 -9
  25. package/lib/factories/LiteralFactory.js.map +1 -1
  26. package/lib/factories/MetadataCollection.d.ts +1 -1
  27. package/lib/factories/MetadataCollection.js +8 -7
  28. package/lib/factories/MetadataCollection.js.map +1 -1
  29. package/lib/factories/MetadataFactory.d.ts +1 -1
  30. package/lib/factories/MetadataFactory.js +1 -1
  31. package/lib/factories/MetadataFactory.js.map +1 -1
  32. package/lib/factories/MetadataTagFactory.d.ts +2 -2
  33. package/lib/factories/MetadataTagFactory.js +1 -1
  34. package/lib/factories/MetadataTagFactory.js.map +1 -1
  35. package/lib/factories/StatementFactory.d.ts +1 -1
  36. package/lib/factories/StatementFactory.js +7 -6
  37. package/lib/factories/StatementFactory.js.map +1 -1
  38. package/lib/factories/TemplateFactory.d.ts +1 -1
  39. package/lib/factories/TemplateFactory.js +10 -10
  40. package/lib/factories/TemplateFactory.js.map +1 -1
  41. package/lib/factories/TypeFactory.d.ts +1 -1
  42. package/lib/factories/TypeFactory.js +28 -22
  43. package/lib/factories/TypeFactory.js.map +1 -1
  44. package/lib/factories/ValueFactory.d.ts +1 -1
  45. package/lib/factories/ValueFactory.js +7 -7
  46. package/lib/factories/ValueFactory.js.map +1 -1
  47. package/lib/factories/internal/metadata/MetadataHelper.js +1 -1
  48. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  49. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +1 -1
  50. package/lib/factories/internal/metadata/emplace_metadata_object.js +41 -34
  51. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  52. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  53. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  54. package/lib/factories/internal/metadata/iterate_metadata.js +2 -1
  55. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  56. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +1 -1
  57. package/lib/factories/internal/metadata/iterate_metadata_array.js +6 -1
  58. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  59. package/lib/factories/internal/metadata/iterate_metadata_atomic.d.ts +1 -1
  60. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +10 -10
  61. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  62. package/lib/factories/internal/metadata/iterate_metadata_coalesce.d.ts +1 -1
  63. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js +8 -8
  64. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -1
  65. package/lib/factories/internal/metadata/iterate_metadata_constant.d.ts +1 -1
  66. package/lib/factories/internal/metadata/iterate_metadata_constant.js +5 -4
  67. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  68. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +1 -1
  69. package/lib/factories/internal/metadata/iterate_metadata_map.js +1 -1
  70. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  71. package/lib/factories/internal/metadata/iterate_metadata_native.d.ts +1 -1
  72. package/lib/factories/internal/metadata/iterate_metadata_native.js +1 -1
  73. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  74. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +1 -1
  75. package/lib/factories/internal/metadata/iterate_metadata_object.js +6 -5
  76. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  77. package/lib/factories/internal/metadata/iterate_metadata_resolve.d.ts +1 -1
  78. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +1 -1
  79. package/lib/factories/internal/metadata/iterate_metadata_set.js +1 -1
  80. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  81. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +1 -1
  82. package/lib/factories/internal/metadata/iterate_metadata_template.js +3 -3
  83. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  84. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +1 -1
  85. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +3 -3
  86. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  87. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +1 -1
  88. package/lib/factories/internal/metadata/iterate_metadata_union.js +5 -4
  89. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  90. package/lib/functional/Namespace.js +1 -1
  91. package/lib/functional/Namespace.js.map +1 -1
  92. package/lib/metadata/Metadata.js +1 -2
  93. package/lib/metadata/Metadata.js.map +1 -1
  94. package/lib/metadata/MetadataObject.js +1 -2
  95. package/lib/metadata/MetadataObject.js.map +1 -1
  96. package/lib/programmers/ApplicationProgrammer.js +1 -1
  97. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  98. package/lib/programmers/AssertCloneProgrammer.d.ts +1 -1
  99. package/lib/programmers/AssertCloneProgrammer.js +7 -7
  100. package/lib/programmers/AssertCloneProgrammer.js.map +1 -1
  101. package/lib/programmers/AssertParseProgrammer.d.ts +1 -1
  102. package/lib/programmers/AssertParseProgrammer.js +6 -6
  103. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  104. package/lib/programmers/AssertProgrammer.d.ts +1 -1
  105. package/lib/programmers/AssertProgrammer.js +37 -37
  106. package/lib/programmers/AssertProgrammer.js.map +1 -1
  107. package/lib/programmers/AssertPruneProgrammer.d.ts +1 -1
  108. package/lib/programmers/AssertPruneProgrammer.js +7 -7
  109. package/lib/programmers/AssertPruneProgrammer.js.map +1 -1
  110. package/lib/programmers/AssertStringifyProgrammer.d.ts +1 -1
  111. package/lib/programmers/AssertStringifyProgrammer.js +6 -6
  112. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  113. package/lib/programmers/CheckerProgrammer.d.ts +3 -2
  114. package/lib/programmers/CheckerProgrammer.js +26 -26
  115. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  116. package/lib/programmers/CloneProgrammer.d.ts +1 -1
  117. package/lib/programmers/CloneProgrammer.js +21 -21
  118. package/lib/programmers/CloneProgrammer.js.map +1 -1
  119. package/lib/programmers/FeatureProgrammer.d.ts +4 -3
  120. package/lib/programmers/FeatureProgrammer.js +18 -18
  121. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  122. package/lib/programmers/IsCloneProgrammer.d.ts +1 -1
  123. package/lib/programmers/IsCloneProgrammer.js +10 -10
  124. package/lib/programmers/IsCloneProgrammer.js.map +1 -1
  125. package/lib/programmers/IsParseProgrammer.d.ts +1 -1
  126. package/lib/programmers/IsParseProgrammer.js +6 -6
  127. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  128. package/lib/programmers/IsProgrammer.d.ts +2 -2
  129. package/lib/programmers/IsProgrammer.js +20 -20
  130. package/lib/programmers/IsProgrammer.js.map +1 -1
  131. package/lib/programmers/IsPruneProgrammer.d.ts +1 -1
  132. package/lib/programmers/IsPruneProgrammer.js +7 -7
  133. package/lib/programmers/IsPruneProgrammer.js.map +1 -1
  134. package/lib/programmers/IsStringifyProgrammer.d.ts +1 -1
  135. package/lib/programmers/IsStringifyProgrammer.js +8 -8
  136. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  137. package/lib/programmers/LiteralsProgrammer.d.ts +1 -1
  138. package/lib/programmers/LiteralsProgrammer.js +9 -9
  139. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  140. package/lib/programmers/PruneProgrammer.d.ts +1 -1
  141. package/lib/programmers/PruneProgrammer.js +20 -20
  142. package/lib/programmers/PruneProgrammer.js.map +1 -1
  143. package/lib/programmers/RandomProgrammer.d.ts +1 -1
  144. package/lib/programmers/RandomProgrammer.js +38 -38
  145. package/lib/programmers/RandomProgrammer.js.map +1 -1
  146. package/lib/programmers/StringifyProgrammer.d.ts +1 -1
  147. package/lib/programmers/StringifyProgrammer.js +44 -44
  148. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  149. package/lib/programmers/TypiaProgrammer.js +16 -7
  150. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  151. package/lib/programmers/ValidateCloneProgrammer.d.ts +1 -1
  152. package/lib/programmers/ValidateCloneProgrammer.js +7 -7
  153. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -1
  154. package/lib/programmers/ValidateParseProgrammer.d.ts +1 -1
  155. package/lib/programmers/ValidateParseProgrammer.js +7 -7
  156. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  157. package/lib/programmers/ValidateProgrammer.d.ts +1 -1
  158. package/lib/programmers/ValidateProgrammer.js +43 -43
  159. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  160. package/lib/programmers/ValidatePruneProgrammer.d.ts +1 -1
  161. package/lib/programmers/ValidatePruneProgrammer.js +7 -7
  162. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -1
  163. package/lib/programmers/ValidateStringifyProgrammer.d.ts +1 -1
  164. package/lib/programmers/ValidateStringifyProgrammer.js +8 -8
  165. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  166. package/lib/programmers/helpers/AtomicPredicator.js +1 -1
  167. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  168. package/lib/programmers/helpers/CloneJoiner.d.ts +1 -1
  169. package/lib/programmers/helpers/CloneJoiner.js +23 -23
  170. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  171. package/lib/programmers/helpers/FunctionImporeter.d.ts +1 -1
  172. package/lib/programmers/helpers/FunctionImporeter.js +3 -3
  173. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  174. package/lib/programmers/helpers/ICheckEntry.d.ts +1 -1
  175. package/lib/programmers/helpers/IExpressionEntry.d.ts +1 -1
  176. package/lib/programmers/helpers/OptionPredicator.js +1 -1
  177. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  178. package/lib/programmers/helpers/PruneJoiner.d.ts +1 -1
  179. package/lib/programmers/helpers/PruneJoiner.js +20 -20
  180. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  181. package/lib/programmers/helpers/RandomJoiner.d.ts +1 -1
  182. package/lib/programmers/helpers/RandomJoiner.js +19 -19
  183. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  184. package/lib/programmers/helpers/RandomRanger.d.ts +1 -1
  185. package/lib/programmers/helpers/RandomRanger.js +8 -8
  186. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  187. package/lib/programmers/helpers/StringifyJoinder.d.ts +1 -1
  188. package/lib/programmers/helpers/StringifyJoinder.js +15 -15
  189. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  190. package/lib/programmers/helpers/StringifyPredicator.js +1 -1
  191. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  192. package/lib/programmers/helpers/UnionExplorer.d.ts +9 -8
  193. package/lib/programmers/helpers/UnionExplorer.js +11 -11
  194. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  195. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  196. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  197. package/lib/programmers/internal/check_array_length.js +4 -4
  198. package/lib/programmers/internal/check_array_length.js.map +1 -1
  199. package/lib/programmers/internal/check_bigint.js +11 -11
  200. package/lib/programmers/internal/check_bigint.js.map +1 -1
  201. package/lib/programmers/internal/check_custom.js +5 -5
  202. package/lib/programmers/internal/check_custom.js.map +1 -1
  203. package/lib/programmers/internal/check_dynamic_properties.js +23 -23
  204. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  205. package/lib/programmers/internal/check_everything.js +4 -4
  206. package/lib/programmers/internal/check_everything.js.map +1 -1
  207. package/lib/programmers/internal/check_native.js +2 -2
  208. package/lib/programmers/internal/check_native.js.map +1 -1
  209. package/lib/programmers/internal/check_number.js +15 -15
  210. package/lib/programmers/internal/check_number.js.map +1 -1
  211. package/lib/programmers/internal/check_object.js +2 -2
  212. package/lib/programmers/internal/check_object.js.map +1 -1
  213. package/lib/programmers/internal/check_string.js +2 -2
  214. package/lib/programmers/internal/check_string.js.map +1 -1
  215. package/lib/programmers/internal/check_string_tags.js +6 -6
  216. package/lib/programmers/internal/check_string_tags.js.map +1 -1
  217. package/lib/programmers/internal/check_template.js +5 -5
  218. package/lib/programmers/internal/check_template.js.map +1 -1
  219. package/lib/programmers/internal/check_union_array_like.js +18 -18
  220. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  221. package/lib/programmers/internal/check_union_tuple.js.map +1 -1
  222. package/lib/programmers/internal/decode_union_object.js +4 -4
  223. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  224. package/lib/programmers/internal/feature_object_entries.js +4 -4
  225. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  226. package/lib/programmers/internal/prune_object_properties.js +9 -9
  227. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  228. package/lib/programmers/internal/random_custom.js +2 -2
  229. package/lib/programmers/internal/random_custom.js.map +1 -1
  230. package/lib/programmers/internal/stringify_dynamic_properties.js +20 -20
  231. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  232. package/lib/programmers/internal/stringify_native.js +2 -2
  233. package/lib/programmers/internal/stringify_native.js.map +1 -1
  234. package/lib/programmers/internal/stringify_regular_properties.js +8 -8
  235. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  236. package/lib/transform.d.ts +3 -4
  237. package/lib/transform.js +18 -15
  238. package/lib/transform.js.map +1 -1
  239. package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
  240. package/lib/transformers/CallExpressionTransformer.js +5 -4
  241. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  242. package/lib/transformers/FileTransformer.d.ts +1 -1
  243. package/lib/transformers/FileTransformer.js +7 -6
  244. package/lib/transformers/FileTransformer.js.map +1 -1
  245. package/lib/transformers/IProject.d.ts +1 -1
  246. package/lib/transformers/ImportTransformer.d.ts +1 -1
  247. package/lib/transformers/ImportTransformer.js +8 -7
  248. package/lib/transformers/ImportTransformer.js.map +1 -1
  249. package/lib/transformers/NodeTransformer.d.ts +1 -1
  250. package/lib/transformers/NodeTransformer.js +3 -3
  251. package/lib/transformers/NodeTransformer.js.map +1 -1
  252. package/lib/transformers/features/miscellaneous/ApplicationTransformer.d.ts +1 -1
  253. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +7 -6
  254. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  255. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.d.ts +1 -1
  256. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js +1 -1
  257. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js.map +1 -1
  258. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.d.ts +1 -1
  259. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js +1 -1
  260. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js.map +1 -1
  261. package/lib/transformers/features/miscellaneous/CloneTransformer.d.ts +1 -1
  262. package/lib/transformers/features/miscellaneous/CloneTransformer.js +1 -1
  263. package/lib/transformers/features/miscellaneous/CloneTransformer.js.map +1 -1
  264. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.d.ts +1 -1
  265. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js +1 -1
  266. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js.map +1 -1
  267. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.d.ts +1 -1
  268. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js +1 -1
  269. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js.map +1 -1
  270. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.d.ts +1 -1
  271. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js +1 -1
  272. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js.map +1 -1
  273. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.d.ts +1 -1
  274. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js +1 -1
  275. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js.map +1 -1
  276. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.d.ts +1 -1
  277. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js +1 -1
  278. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js.map +1 -1
  279. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.d.ts +1 -1
  280. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js +1 -1
  281. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js.map +1 -1
  282. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.d.ts +1 -1
  283. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js +5 -3
  284. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js.map +1 -1
  285. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.d.ts +1 -1
  286. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js +1 -1
  287. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js.map +1 -1
  288. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.d.ts +1 -1
  289. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js +1 -1
  290. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js.map +1 -1
  291. package/lib/transformers/features/miscellaneous/IsCloneTransformer.d.ts +1 -1
  292. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js +1 -1
  293. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js.map +1 -1
  294. package/lib/transformers/features/miscellaneous/IsPruneTransformer.d.ts +1 -1
  295. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js +1 -1
  296. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js.map +1 -1
  297. package/lib/transformers/features/miscellaneous/LiteralsTransformer.d.ts +1 -1
  298. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js +3 -2
  299. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js.map +1 -1
  300. package/lib/transformers/features/miscellaneous/MetadataTransformer.d.ts +1 -1
  301. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +6 -5
  302. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  303. package/lib/transformers/features/miscellaneous/PruneTransformer.d.ts +1 -1
  304. package/lib/transformers/features/miscellaneous/PruneTransformer.js +1 -1
  305. package/lib/transformers/features/miscellaneous/PruneTransformer.js.map +1 -1
  306. package/lib/transformers/features/miscellaneous/RandomTransformer.d.ts +1 -1
  307. package/lib/transformers/features/miscellaneous/RandomTransformer.js +6 -4
  308. package/lib/transformers/features/miscellaneous/RandomTransformer.js.map +1 -1
  309. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.d.ts +1 -1
  310. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js +1 -1
  311. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js.map +1 -1
  312. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.d.ts +1 -1
  313. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js +1 -1
  314. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js.map +1 -1
  315. package/lib/transformers/features/parsers/AssertParseTransformer.d.ts +1 -1
  316. package/lib/transformers/features/parsers/AssertParseTransformer.js +1 -1
  317. package/lib/transformers/features/parsers/AssertParseTransformer.js.map +1 -1
  318. package/lib/transformers/features/parsers/CreateAssertParseTransformer.d.ts +1 -1
  319. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js +1 -1
  320. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js.map +1 -1
  321. package/lib/transformers/features/parsers/CreateIsParseTransformer.d.ts +1 -1
  322. package/lib/transformers/features/parsers/CreateIsParseTransformer.js +1 -1
  323. package/lib/transformers/features/parsers/CreateIsParseTransformer.js.map +1 -1
  324. package/lib/transformers/features/parsers/CreateValidateParseTransformer.d.ts +1 -1
  325. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js +1 -1
  326. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js.map +1 -1
  327. package/lib/transformers/features/parsers/IsParseTransformer.d.ts +1 -1
  328. package/lib/transformers/features/parsers/IsParseTransformer.js +1 -1
  329. package/lib/transformers/features/parsers/IsParseTransformer.js.map +1 -1
  330. package/lib/transformers/features/parsers/ValidateParseTransformer.d.ts +1 -1
  331. package/lib/transformers/features/parsers/ValidateParseTransformer.js +1 -1
  332. package/lib/transformers/features/parsers/ValidateParseTransformer.js.map +1 -1
  333. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.d.ts +1 -1
  334. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js +1 -1
  335. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js.map +1 -1
  336. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.d.ts +1 -1
  337. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js +1 -1
  338. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js.map +1 -1
  339. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.d.ts +1 -1
  340. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js +1 -1
  341. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js.map +1 -1
  342. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.d.ts +1 -1
  343. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js +1 -1
  344. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js.map +1 -1
  345. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.d.ts +1 -1
  346. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js +1 -1
  347. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js.map +1 -1
  348. package/lib/transformers/features/stringifiers/IsStringifyTransformer.d.ts +1 -1
  349. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js +1 -1
  350. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js.map +1 -1
  351. package/lib/transformers/features/stringifiers/StringifyTransformer.d.ts +1 -1
  352. package/lib/transformers/features/stringifiers/StringifyTransformer.js +1 -1
  353. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -1
  354. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.d.ts +1 -1
  355. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js +1 -1
  356. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js.map +1 -1
  357. package/lib/transformers/features/validators/AssertTransformer.d.ts +1 -1
  358. package/lib/transformers/features/validators/AssertTransformer.js +1 -1
  359. package/lib/transformers/features/validators/AssertTransformer.js.map +1 -1
  360. package/lib/transformers/features/validators/CreateAssertTransformer.d.ts +1 -1
  361. package/lib/transformers/features/validators/CreateAssertTransformer.js +1 -1
  362. package/lib/transformers/features/validators/CreateAssertTransformer.js.map +1 -1
  363. package/lib/transformers/features/validators/CreateIsTransformer.d.ts +1 -1
  364. package/lib/transformers/features/validators/CreateIsTransformer.js +1 -1
  365. package/lib/transformers/features/validators/CreateIsTransformer.js.map +1 -1
  366. package/lib/transformers/features/validators/CreateValidateTransformer.d.ts +1 -1
  367. package/lib/transformers/features/validators/CreateValidateTransformer.js +1 -1
  368. package/lib/transformers/features/validators/CreateValidateTransformer.js.map +1 -1
  369. package/lib/transformers/features/validators/IsTransformer.d.ts +1 -1
  370. package/lib/transformers/features/validators/IsTransformer.js +1 -1
  371. package/lib/transformers/features/validators/IsTransformer.js.map +1 -1
  372. package/lib/transformers/features/validators/ValidateTransformer.d.ts +1 -1
  373. package/lib/transformers/features/validators/ValidateTransformer.js +1 -1
  374. package/lib/transformers/features/validators/ValidateTransformer.js.map +1 -1
  375. package/lib/transformers/internal/GenericTransformer.d.ts +1 -1
  376. package/lib/transformers/internal/GenericTransformer.js +10 -8
  377. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  378. package/lib/utils/ArrayUtil.js +1 -1
  379. package/lib/utils/ArrayUtil.js.map +1 -1
  380. package/lib/utils/Escaper.js +1 -1
  381. package/lib/utils/Escaper.js.map +1 -1
  382. package/lib/utils/MapUtil.js +1 -1
  383. package/lib/utils/MapUtil.js.map +1 -1
  384. package/lib/utils/PatternUtil.js +1 -1
  385. package/lib/utils/PatternUtil.js.map +1 -1
  386. package/lib/utils/RandomGenerator.js +1 -1
  387. package/lib/utils/RandomGenerator.js.map +1 -1
  388. package/lib/utils/TsNodeUtil.d.ts +5 -0
  389. package/lib/utils/TsNodeUtil.js +19 -0
  390. package/lib/utils/TsNodeUtil.js.map +1 -0
  391. package/lib/utils/TsSymbolUtil.d.ts +6 -0
  392. package/lib/utils/TsSymbolUtil.js +43 -0
  393. package/lib/utils/TsSymbolUtil.js.map +1 -0
  394. package/lib/utils/TsTypeUtil.d.ts +9 -0
  395. package/lib/utils/TsTypeUtil.js +32 -0
  396. package/lib/utils/TsTypeUtil.js.map +1 -0
  397. package/package.json +129 -131
  398. package/src/factories/CommentFactory.ts +14 -14
  399. package/src/factories/ExpressionFactory.ts +70 -70
  400. package/src/factories/IdentifierFactory.ts +63 -63
  401. package/src/factories/LiteralFactory.ts +39 -39
  402. package/src/factories/MetadataCollection.ts +121 -121
  403. package/src/factories/MetadataFactory.ts +62 -62
  404. package/src/factories/MetadataTagFactory.ts +295 -295
  405. package/src/factories/StatementFactory.ts +25 -24
  406. package/src/factories/TemplateFactory.ts +58 -58
  407. package/src/factories/TypeFactory.ts +136 -124
  408. package/src/factories/ValueFactory.ts +12 -12
  409. package/src/factories/internal/metadata/emplace_metadata_object.ts +148 -143
  410. package/src/factories/internal/metadata/explore_metadata.ts +92 -92
  411. package/src/factories/internal/metadata/iterate_metadata.ts +69 -67
  412. package/src/factories/internal/metadata/iterate_metadata_array.ts +30 -29
  413. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  414. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  415. package/src/factories/internal/metadata/iterate_metadata_constant.ts +59 -58
  416. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  417. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  418. package/src/factories/internal/metadata/iterate_metadata_object.ts +49 -48
  419. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +27 -27
  420. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  421. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  422. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +48 -48
  423. package/src/factories/internal/metadata/iterate_metadata_union.ts +59 -57
  424. package/src/module.ts +2038 -2038
  425. package/src/programmers/ApplicationProgrammer.ts +56 -56
  426. package/src/programmers/AssertCloneProgrammer.ts +79 -79
  427. package/src/programmers/AssertParseProgrammer.ts +74 -74
  428. package/src/programmers/AssertProgrammer.ts +285 -285
  429. package/src/programmers/AssertPruneProgrammer.ts +76 -76
  430. package/src/programmers/AssertStringifyProgrammer.ts +74 -74
  431. package/src/programmers/CheckerProgrammer.ts +902 -901
  432. package/src/programmers/CloneProgrammer.ts +389 -389
  433. package/src/programmers/FeatureProgrammer.ts +501 -500
  434. package/src/programmers/IsCloneProgrammer.ts +86 -86
  435. package/src/programmers/IsParseProgrammer.ts +80 -80
  436. package/src/programmers/IsProgrammer.ts +216 -216
  437. package/src/programmers/IsPruneProgrammer.ts +81 -81
  438. package/src/programmers/IsStringifyProgrammer.ts +84 -84
  439. package/src/programmers/LiteralsProgrammer.ts +65 -65
  440. package/src/programmers/PruneProgrammer.ts +347 -347
  441. package/src/programmers/RandomProgrammer.ts +423 -423
  442. package/src/programmers/StringifyProgrammer.ts +798 -798
  443. package/src/programmers/TypiaProgrammer.ts +136 -129
  444. package/src/programmers/ValidateCloneProgrammer.ts +93 -93
  445. package/src/programmers/ValidateParseProgrammer.ts +78 -78
  446. package/src/programmers/ValidateProgrammer.ts +316 -316
  447. package/src/programmers/ValidatePruneProgrammer.ts +86 -86
  448. package/src/programmers/ValidateStringifyProgrammer.ts +92 -92
  449. package/src/programmers/helpers/CloneJoiner.ts +131 -131
  450. package/src/programmers/helpers/FunctionImporeter.ts +54 -54
  451. package/src/programmers/helpers/ICheckEntry.ts +12 -12
  452. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  453. package/src/programmers/helpers/PruneJoiner.ts +144 -144
  454. package/src/programmers/helpers/RandomJoiner.ts +161 -161
  455. package/src/programmers/helpers/RandomRanger.ts +216 -216
  456. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  457. package/src/programmers/helpers/UnionExplorer.ts +276 -275
  458. package/src/programmers/helpers/disable_function_importer_declare.ts +21 -21
  459. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  460. package/src/programmers/internal/application_array.ts +32 -32
  461. package/src/programmers/internal/application_boolean.ts +15 -15
  462. package/src/programmers/internal/application_constant.ts +26 -26
  463. package/src/programmers/internal/application_default.ts +17 -17
  464. package/src/programmers/internal/application_native.ts +36 -36
  465. package/src/programmers/internal/application_number.ts +71 -71
  466. package/src/programmers/internal/application_object.ts +162 -162
  467. package/src/programmers/internal/application_schema.ts +198 -198
  468. package/src/programmers/internal/application_string.ts +44 -44
  469. package/src/programmers/internal/application_templates.ts +25 -25
  470. package/src/programmers/internal/application_tuple.ts +27 -27
  471. package/src/programmers/internal/check_array.ts +30 -30
  472. package/src/programmers/internal/check_array_length.ts +35 -35
  473. package/src/programmers/internal/check_bigint.ts +82 -82
  474. package/src/programmers/internal/check_custom.ts +31 -31
  475. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  476. package/src/programmers/internal/check_everything.ts +28 -28
  477. package/src/programmers/internal/check_native.ts +21 -21
  478. package/src/programmers/internal/check_number.ts +177 -177
  479. package/src/programmers/internal/check_object.ts +55 -55
  480. package/src/programmers/internal/check_string.ts +26 -25
  481. package/src/programmers/internal/check_string_tags.ts +67 -67
  482. package/src/programmers/internal/check_template.ts +56 -56
  483. package/src/programmers/internal/check_union_array_like.ts +272 -271
  484. package/src/programmers/internal/check_union_tuple.ts +34 -33
  485. package/src/programmers/internal/decode_union_object.ts +73 -73
  486. package/src/programmers/internal/feature_object_entries.ts +63 -63
  487. package/src/programmers/internal/prune_object_properties.ts +60 -60
  488. package/src/programmers/internal/random_custom.ts +29 -29
  489. package/src/programmers/internal/stringify_dynamic_properties.ts +167 -167
  490. package/src/programmers/internal/stringify_native.ts +7 -7
  491. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  492. package/src/schemas/IJsonApplication.ts +13 -13
  493. package/src/schemas/IJsonComponents.ts +33 -33
  494. package/src/schemas/IJsonSchema.ts +134 -134
  495. package/src/transform.ts +17 -13
  496. package/src/transformers/CallExpressionTransformer.ts +180 -177
  497. package/src/transformers/FileTransformer.ts +50 -47
  498. package/src/transformers/IProject.ts +11 -11
  499. package/src/transformers/ImportTransformer.ts +68 -66
  500. package/src/transformers/NodeTransformer.ts +13 -13
  501. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +105 -103
  502. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +43 -39
  503. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +31 -28
  504. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +54 -52
  505. package/src/transformers/features/miscellaneous/RandomTransformer.ts +46 -42
  506. package/src/transformers/internal/GenericTransformer.ts +103 -97
  507. package/src/utils/TsNodeUtil.ts +12 -0
  508. package/src/utils/TsSymbolUtil.ts +41 -0
  509. package/src/utils/TsTypeUtil.ts +30 -0
@@ -1,798 +1,798 @@
1
- import ts from "typescript";
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 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.";