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,901 +1,902 @@
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 { FeatureProgrammer } from "./FeatureProgrammer";
17
- import { AtomicPredicator } from "./helpers/AtomicPredicator";
18
- import { FunctionImporter } from "./helpers/FunctionImporeter";
19
- import { ICheckEntry } from "./helpers/ICheckEntry";
20
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
21
- import { OptionPredicator } from "./helpers/OptionPredicator";
22
- import { UnionExplorer } from "./helpers/UnionExplorer";
23
- import { check_array } from "./internal/check_array";
24
- import { check_array_length } from "./internal/check_array_length";
25
- import { check_bigint } from "./internal/check_bigint";
26
- import { check_native } from "./internal/check_native";
27
- import { check_number } from "./internal/check_number";
28
- import { check_string } from "./internal/check_string";
29
- import { check_template } from "./internal/check_template";
30
- import { check_union_tuple } from "./internal/check_union_tuple";
31
- import { decode_union_object } from "./internal/decode_union_object";
32
-
33
- export namespace CheckerProgrammer {
34
- export interface IConfig {
35
- functors: string;
36
- unioners: string;
37
- path: boolean;
38
- trace: boolean;
39
- equals: boolean;
40
- numeric: boolean;
41
- addition?: () => ts.Statement[];
42
- decoder?: FeatureProgrammer.Decoder<Metadata, ts.Expression>;
43
- combiner: IConfig.Combiner;
44
- atomist: (
45
- explore: IExplore,
46
- ) => (check: ICheckEntry) => (input: ts.Expression) => ts.Expression;
47
- joiner: IConfig.IJoiner;
48
- success: ts.Expression;
49
- }
50
- export namespace IConfig {
51
- export interface Combiner {
52
- (explorer: IExplore): {
53
- (logic: "and" | "or"): {
54
- (
55
- input: ts.Expression,
56
- binaries: IBinary[],
57
- expected: string,
58
- ): ts.Expression;
59
- };
60
- };
61
- }
62
- export interface IJoiner {
63
- object(
64
- input: ts.Expression,
65
- entries: IExpressionEntry[],
66
- ): ts.Expression;
67
- array(input: ts.Expression, arrow: ts.ArrowFunction): ts.Expression;
68
- tuple?(exprs: ts.Expression[]): ts.Expression;
69
-
70
- failure(
71
- value: ts.Expression,
72
- expected: string,
73
- explore?: FeatureProgrammer.IExplore,
74
- ): ts.Expression;
75
- is?(expression: ts.Expression): ts.Expression;
76
- required?(exp: ts.Expression): ts.Expression;
77
- full?: (
78
- condition: ts.Expression,
79
- ) => (
80
- input: ts.Expression,
81
- expected: string,
82
- explore: IExplore,
83
- ) => ts.Expression;
84
- }
85
- }
86
- export type IExplore = FeatureProgrammer.IExplore;
87
-
88
- export interface IBinary {
89
- expression: ts.Expression;
90
- combined: boolean;
91
- }
92
-
93
- /* -----------------------------------------------------------
94
- WRITERS
95
- ----------------------------------------------------------- */
96
- export const write =
97
- (project: IProject) =>
98
- (config: IConfig) =>
99
- (importer: FunctionImporter) =>
100
- FeatureProgrammer.analyze(project)(
101
- configure(project)(config)(importer),
102
- )(importer);
103
-
104
- export const write_functors =
105
- (project: IProject) =>
106
- (config: IConfig) =>
107
- (importer: FunctionImporter) =>
108
- FeatureProgrammer.write_functors(
109
- configure(project)(config)(importer),
110
- )(importer);
111
-
112
- export const write_unioners = (
113
- project: IProject,
114
- config: IConfig,
115
- importer: FunctionImporter,
116
- ) =>
117
- FeatureProgrammer.write_unioners(
118
- configure(project)({ ...config, numeric: false })(importer),
119
- )(importer);
120
-
121
- const configure =
122
- (project: IProject) =>
123
- (config: IConfig) =>
124
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
125
- const output: FeatureProgrammer.IConfig = {
126
- types: {
127
- input: () => TypeFactory.keyword("any"),
128
- output: (type, name) =>
129
- ts.factory.createTypePredicateNode(
130
- undefined,
131
- "input",
132
- ts.factory.createTypeReferenceNode(
133
- name ??
134
- TypeFactory.getFullName(project.checker)(
135
- type,
136
- ),
137
- ),
138
- ),
139
- },
140
- trace: config.trace,
141
- path: config.path,
142
- functors: config.functors,
143
- unioners: config.unioners,
144
- initializer:
145
- ({ checker }) =>
146
- (type) => {
147
- const collection: MetadataCollection =
148
- new MetadataCollection();
149
- const meta: Metadata = MetadataFactory.analyze(checker)(
150
- {
151
- resolve: false,
152
- constant: true,
153
- },
154
- )(collection)(type);
155
- return [collection, meta];
156
- },
157
- addition: config.addition,
158
- decoder: config.decoder ?? decode(project)(config)(importer),
159
- objector: {
160
- checker:
161
- config.decoder ?? decode(project)(config)(importer),
162
- decoder: decode_object(config)(importer),
163
- joiner: config.joiner.object,
164
- unionizer: config.equals
165
- ? decode_union_object(decode_object(config)(importer))(
166
- (input, obj, explore) =>
167
- decode_object(config)(importer)(input, obj, {
168
- ...explore,
169
- tracable: true,
170
- }),
171
- )(config.joiner.is ?? ((expr) => expr))(
172
- (value, expected) =>
173
- ts.factory.createReturnStatement(
174
- config.joiner.failure(value, expected),
175
- ),
176
- )
177
- : (input, targets, explore) =>
178
- config.combiner(explore)("or")(
179
- input,
180
- targets.map((obj) => ({
181
- expression: decode_object(config)(
182
- importer,
183
- )(input, obj, explore),
184
- combined: true,
185
- })),
186
- `(${targets.map((t) => t.name).join(" | ")})`,
187
- ),
188
- failure: (value, expected) =>
189
- ts.factory.createReturnStatement(
190
- config.joiner.failure(value, expected),
191
- ),
192
- is: config.joiner.is,
193
- required: config.joiner.required,
194
- full: config.joiner.full,
195
- type: TypeFactory.keyword("boolean"),
196
- },
197
- };
198
- if (config.numeric === true)
199
- output.generator = {
200
- unioners: FeatureProgrammer.write_unioners(
201
- configure(project)({ ...config, numeric: false })(
202
- importer,
203
- ),
204
- )(importer),
205
- };
206
- return output;
207
- };
208
-
209
- /* -----------------------------------------------------------
210
- DECODERS
211
- ----------------------------------------------------------- */
212
- /**
213
- * @internal
214
- */
215
- export const decode =
216
- (project: IProject) =>
217
- (config: IConfig) =>
218
- (importer: FunctionImporter) =>
219
- (
220
- input: ts.Expression,
221
- meta: Metadata,
222
- explore: IExplore,
223
- metaTags: IMetadataTag[],
224
- jsDocTags: ts.JSDocTagInfo[],
225
- ): ts.Expression => {
226
- if (meta.any) return config.success;
227
-
228
- const top: IBinary[] = [];
229
- const binaries: IBinary[] = [];
230
- const add = create_add(binaries)(input);
231
- const getConstantValue = (
232
- value: number | string | bigint | boolean,
233
- ) =>
234
- typeof value === "string"
235
- ? ts.factory.createStringLiteral(value)
236
- : ts.factory.createIdentifier(value.toString());
237
-
238
- //----
239
- // CHECK OPTIONAL
240
- //----
241
- // @todo -> should be elaborated
242
- const checkOptional: boolean = meta.empty() || meta.isUnionBucket();
243
-
244
- // NULLABLE
245
- if (
246
- checkOptional ||
247
- meta.nullable
248
- // || (meta.objects.length && meta.size() !== meta.objects.length)
249
- )
250
- (meta.nullable ? add : create_add(top)(input))(
251
- meta.nullable,
252
- ValueFactory.NULL(),
253
- );
254
-
255
- // UNDEFINDABLE
256
- if (checkOptional || !meta.required)
257
- (meta.required ? create_add(top)(input) : add)(
258
- !meta.required,
259
- ValueFactory.UNDEFINED(),
260
- );
261
-
262
- // FUNCTIONAL
263
- if (meta.functional === true)
264
- if (
265
- OptionPredicator.functional(project.options) ||
266
- meta.size() !== 1
267
- )
268
- add(
269
- true,
270
- ts.factory.createStringLiteral("function"),
271
- ValueFactory.TYPEOF(input),
272
- );
273
- else
274
- binaries.push({
275
- combined: false,
276
- expression: config.success,
277
- });
278
-
279
- //----
280
- // VALUES
281
- //----
282
- // CONSTANT VALUES
283
- for (const constant of meta.constants)
284
- if (AtomicPredicator.constant(meta)(constant.type))
285
- for (const val of constant.values)
286
- add(true, getConstantValue(val));
287
-
288
- // ATOMIC VALUES
289
- for (const type of meta.atomics)
290
- if (AtomicPredicator.atomic(meta)(type) === false) continue;
291
- else if (type === "number")
292
- binaries.push({
293
- expression: config.atomist(explore)(
294
- check_number(project, config.numeric)(importer)(
295
- metaTags,
296
- )(jsDocTags)(input),
297
- )(input),
298
- combined: false,
299
- });
300
- else if (type === "bigint")
301
- binaries.push({
302
- expression: config.atomist(explore)(
303
- check_bigint(importer)(metaTags)(jsDocTags)(input),
304
- )(input),
305
- combined: false,
306
- });
307
- else if (type === "string")
308
- binaries.push({
309
- expression: config.atomist(explore)(
310
- check_string(importer)(metaTags)(jsDocTags)(input),
311
- )(input),
312
- combined: false,
313
- });
314
- else
315
- add(
316
- true,
317
- ts.factory.createStringLiteral(type),
318
- ValueFactory.TYPEOF(input),
319
- );
320
-
321
- // TEMPLATE LITERAL VALUES
322
- if (meta.templates.length)
323
- if (AtomicPredicator.template(meta))
324
- binaries.push({
325
- expression: config.atomist(explore)(
326
- check_template(importer)(metaTags)(jsDocTags)(
327
- meta.templates,
328
- )(input),
329
- )(input),
330
- combined: false,
331
- });
332
-
333
- // NATIVE CLASSES
334
- for (const native of meta.natives)
335
- binaries.push({
336
- expression: check_native(native)(input),
337
- combined: false,
338
- });
339
-
340
- //----
341
- // INSTANCES
342
- //----
343
- interface IInstance {
344
- pre: ts.Expression;
345
- body: ts.Expression | null;
346
- expected: string;
347
- }
348
- const instances: IInstance[] = [];
349
- const prepare =
350
- (pre: ts.Expression, expected: string) =>
351
- (body: ts.Expression | null) =>
352
- instances.push({
353
- pre,
354
- expected,
355
- body,
356
- });
357
-
358
- // SETS
359
- if (meta.sets.length) {
360
- const install = prepare(
361
- check_native("Set")(input),
362
- meta.sets
363
- .map((elem) => `Set<${elem.getName()}>`)
364
- .join(" | "),
365
- );
366
- if (meta.sets.some((elem) => elem.any)) install(null);
367
- else
368
- install(
369
- explore_sets(project)(config)(importer)(
370
- input,
371
- meta.sets,
372
- {
373
- ...explore,
374
- from: "array",
375
- },
376
- [],
377
- [],
378
- ),
379
- );
380
- }
381
-
382
- // MAPS
383
- if (meta.maps.length) {
384
- const install = prepare(
385
- check_native("Map")(input),
386
- meta.maps
387
- .map(({ key, value }) => `Map<${key}, ${value}>`)
388
- .join(" | "),
389
- );
390
- if (meta.maps.some((elem) => elem.key.any && elem.value.any))
391
- install(null);
392
- else
393
- install(
394
- explore_maps(project)(config)(importer)(
395
- input,
396
- meta.maps.map((m) => [m.key, m.value]),
397
- {
398
- ...explore,
399
- from: "array",
400
- },
401
- [],
402
- [],
403
- ),
404
- );
405
- }
406
-
407
- // ARRAYS AND TUPLES
408
- if (meta.tuples.length + meta.arrays.length > 0) {
409
- const install = prepare(
410
- config.atomist(explore)(
411
- check_array(importer)(
412
- meta.tuples.length === 0 ? metaTags : [],
413
- )(jsDocTags)(input),
414
- )(input),
415
- [...meta.tuples, ...meta.arrays]
416
- .map((elem) =>
417
- Array.isArray(elem)
418
- ? `[${elem
419
- .map((elem) => elem.getName())
420
- .join(", ")}]`
421
- : `Array<${elem.getName()}>`,
422
- )
423
- .join(" | "),
424
- );
425
- if (meta.arrays.length === 0)
426
- install(
427
- explore_tuples(project)(config)(importer)(
428
- input,
429
- meta.tuples,
430
- {
431
- ...explore,
432
- from: "array",
433
- },
434
- metaTags,
435
- jsDocTags,
436
- ),
437
- );
438
- else if (meta.arrays.some((elem) => elem.any)) install(null);
439
- else if (meta.tuples.length === 0)
440
- // ARRAY ONLY
441
- install(
442
- explore_arrays(project, config, importer)(
443
- input,
444
- meta.arrays,
445
- {
446
- ...explore,
447
- from: "array",
448
- },
449
- metaTags,
450
- jsDocTags,
451
- ),
452
- );
453
- else
454
- install(
455
- explore_arrays_and_tuples(project, config, importer)(
456
- input,
457
- [...meta.tuples, ...meta.arrays],
458
- explore,
459
- metaTags,
460
- jsDocTags,
461
- ),
462
- );
463
- }
464
-
465
- // OBJECT
466
- if (meta.objects.length > 0)
467
- prepare(
468
- ExpressionFactory.isObject({
469
- checkNull: true,
470
- checkArray: meta.objects.some((obj) =>
471
- obj.properties.every(
472
- (prop) =>
473
- !prop.key.isSoleLiteral() ||
474
- !prop.value.required,
475
- ),
476
- ),
477
- })(input),
478
- meta.objects.map((obj) => obj.name).join(" | "),
479
- )(
480
- explore_objects(config)(importer)(input, meta, {
481
- ...explore,
482
- from: "object",
483
- }),
484
- );
485
-
486
- if (instances.length) {
487
- const transformer =
488
- (
489
- merger: (
490
- x: ts.Expression,
491
- y: ts.Expression,
492
- ) => ts.Expression,
493
- ) =>
494
- (ins: IInstance) =>
495
- ins.body
496
- ? {
497
- expression: merger(ins.pre, ins.body),
498
- combined: true,
499
- }
500
- : {
501
- expression: ins.pre,
502
- combined: false,
503
- };
504
- if (instances.length === 1)
505
- binaries.push(
506
- transformer((pre, body) =>
507
- config.combiner(explore)("and")(
508
- input,
509
- [pre, body].map((expression) => ({
510
- expression,
511
- combined: expression !== pre,
512
- })),
513
- meta.getName(),
514
- ),
515
- )(instances[0]!),
516
- );
517
- else
518
- binaries.push({
519
- expression: config.combiner(explore)("or")(
520
- input,
521
- instances.map(
522
- transformer(ts.factory.createLogicalAnd),
523
- ),
524
- meta.getName(),
525
- ),
526
- combined: true,
527
- });
528
- }
529
-
530
- //----
531
- // COMBINE CONDITIONS
532
- //----
533
- return top.length && binaries.length
534
- ? config.combiner(explore)("and")(
535
- input,
536
- [
537
- ...top,
538
- {
539
- expression: config.combiner(explore)("or")(
540
- input,
541
- binaries,
542
- meta.getName(),
543
- ),
544
- combined: true,
545
- },
546
- ],
547
- meta.getName(),
548
- )
549
- : binaries.length
550
- ? config.combiner(explore)("or")(
551
- input,
552
- binaries,
553
- meta.getName(),
554
- )
555
- : config.success;
556
- };
557
-
558
- export const decode_tuple =
559
- (project: IProject) =>
560
- (config: IConfig) =>
561
- (importer: FunctionImporter) =>
562
- (checkLength: boolean) =>
563
- (
564
- input: ts.Expression,
565
- tuple: Array<Metadata>,
566
- explore: IExplore,
567
- tagList: IMetadataTag[],
568
- jsDocTags: ts.JSDocTagInfo[],
569
- ): ts.Expression => {
570
- const binaries: ts.Expression[] = tuple
571
- .filter((meta) => meta.rest === null)
572
- .map((meta, index) =>
573
- decode(project)(config)(importer)(
574
- ts.factory.createElementAccessExpression(input, index),
575
- meta,
576
- {
577
- ...explore,
578
- from: "array",
579
- postfix: explore.postfix.length
580
- ? `${explore.postfix.slice(0, -1)}[${index}]"`
581
- : `[${index}]`,
582
- },
583
- tagList,
584
- jsDocTags,
585
- ),
586
- );
587
- const rest: ts.Expression | null =
588
- tuple.length && tuple[tuple.length - 1]!.rest !== null
589
- ? decode(project)(config)(importer)(
590
- ts.factory.createCallExpression(
591
- IdentifierFactory.access(input)("slice"),
592
- undefined,
593
- [
594
- ts.factory.createNumericLiteral(
595
- tuple.length - 1,
596
- ),
597
- ],
598
- ),
599
- (() => {
600
- const wrapper: Metadata = Metadata.initialize();
601
- wrapper.arrays.push(
602
- tuple[tuple.length - 1]!.rest!,
603
- );
604
- return wrapper;
605
- })(),
606
- {
607
- ...explore,
608
- start: tuple.length - 1,
609
- },
610
- tagList,
611
- jsDocTags,
612
- )
613
- : null;
614
-
615
- const arrayLength = ts.factory.createPropertyAccessExpression(
616
- input,
617
- "length",
618
- );
619
- return config.combiner(explore)("and")(
620
- input,
621
- [
622
- ...(checkLength && rest === null
623
- ? tuple.every((t) => t.optional === false)
624
- ? [
625
- {
626
- combined: false,
627
- expression:
628
- ts.factory.createStrictEquality(
629
- arrayLength,
630
- ts.factory.createNumericLiteral(
631
- tuple.length,
632
- ),
633
- ),
634
- },
635
- ]
636
- : [
637
- {
638
- combined: false,
639
- expression: ts.factory.createLogicalAnd(
640
- ts.factory.createLessThanEquals(
641
- ts.factory.createNumericLiteral(
642
- tuple.filter(
643
- (t) =>
644
- t.optional === false,
645
- ).length,
646
- ),
647
- arrayLength,
648
- ),
649
- ts.factory.createGreaterThanEquals(
650
- ts.factory.createNumericLiteral(
651
- tuple.length,
652
- ),
653
- arrayLength,
654
- ),
655
- ),
656
- },
657
- ]
658
- : []),
659
- ...(config.joiner.tuple
660
- ? [
661
- {
662
- expression: config.joiner.tuple(binaries),
663
- combined: true,
664
- },
665
- ]
666
- : binaries.map((expression) => ({
667
- expression,
668
- combined: true,
669
- }))),
670
- ...(rest !== null
671
- ? [
672
- {
673
- expression: rest,
674
- combined: true,
675
- },
676
- ]
677
- : []),
678
- ],
679
- `[${tuple.map((t) => t.getName()).join(", ")}]`,
680
- );
681
- };
682
-
683
- const decode_array =
684
- (project: IProject) =>
685
- (config: IConfig) =>
686
- (importer: FunctionImporter) =>
687
- FeatureProgrammer.decode_array({
688
- trace: config.trace,
689
- path: config.path,
690
- decoder: decode(project)(config)(importer),
691
- })(importer)(config.joiner.array);
692
-
693
- export const decode_object =
694
- (config: IConfig) => (importer: FunctionImporter) => {
695
- const func = FeatureProgrammer.decode_object(config)(importer);
696
- return (
697
- input: ts.Expression,
698
- obj: MetadataObject,
699
- explore: IExplore,
700
- ) => {
701
- obj.validated = true;
702
- return func(input, obj, explore);
703
- };
704
- };
705
-
706
- const explore_sets =
707
- (project: IProject) =>
708
- (config: IConfig) =>
709
- (importer: FunctionImporter) =>
710
- UnionExplorer.set({
711
- checker: decode(project)(config)(importer),
712
- decoder: decode_array(project)(config)(importer),
713
- empty: config.success,
714
- success: config.success,
715
- failure: (input, expected, explore) =>
716
- ts.factory.createReturnStatement(
717
- config.joiner.failure(input, expected, explore),
718
- ),
719
- });
720
-
721
- const explore_maps =
722
- (project: IProject) =>
723
- (config: IConfig) =>
724
- (importer: FunctionImporter) =>
725
- UnionExplorer.map({
726
- checker: (input, entry, explore) => {
727
- const func = decode(project)(config)(importer);
728
- return ts.factory.createLogicalAnd(
729
- func(
730
- ts.factory.createElementAccessExpression(input, 0),
731
- entry[0],
732
- { ...explore, postfix: `${explore.postfix}[0]` },
733
- [],
734
- [],
735
- ),
736
- func(
737
- ts.factory.createElementAccessExpression(input, 1),
738
- entry[1],
739
- { ...explore, postfix: `${explore.postfix}[1]` },
740
- [],
741
- [],
742
- ),
743
- );
744
- },
745
- decoder: (input, target, explore) =>
746
- decode_array(project)(config)(importer)(
747
- input,
748
- Metadata.create({
749
- any: false,
750
- nullable: false,
751
- required: true,
752
- optional: false,
753
- functional: false,
754
- resolved: null,
755
- constants: [],
756
- atomics: [],
757
- templates: [],
758
- rest: null,
759
- arrays: [],
760
- tuples: [target],
761
- objects: [],
762
- natives: [],
763
- sets: [],
764
- maps: [],
765
- }),
766
- explore,
767
- [],
768
- [],
769
- ),
770
- empty: config.success,
771
- success: config.success,
772
- failure: (input, expected, explore) =>
773
- ts.factory.createReturnStatement(
774
- config.joiner.failure(input, expected, explore),
775
- ),
776
- });
777
-
778
- const explore_tuples =
779
- (project: IProject) =>
780
- (config: IConfig) =>
781
- (importer: FunctionImporter) =>
782
- UnionExplorer.tuple({
783
- checker: check_union_tuple(project)(config)(importer),
784
- decoder: decode_tuple(project)(config)(importer)(true),
785
- empty: config.success,
786
- success: config.success,
787
- failure: (input, expected, explore) =>
788
- ts.factory.createReturnStatement(
789
- config.joiner.failure(input, expected, explore),
790
- ),
791
- });
792
-
793
- const explore_arrays = (
794
- project: IProject,
795
- config: IConfig,
796
- importer: FunctionImporter,
797
- ) =>
798
- UnionExplorer.array({
799
- checker: decode(project)(config)(importer),
800
- decoder: decode_array(project)(config)(importer),
801
- empty: config.success,
802
- success: config.success,
803
- failure: (input, expected, explore) =>
804
- ts.factory.createReturnStatement(
805
- config.joiner.failure(input, expected, explore),
806
- ),
807
- });
808
-
809
- const explore_arrays_and_tuples = (
810
- project: IProject,
811
- config: IConfig,
812
- importer: FunctionImporter,
813
- ) =>
814
- UnionExplorer.array_or_tuple({
815
- checker: (front, target, explore, tags, jsDocTags, array) =>
816
- Array.isArray(target)
817
- ? check_union_tuple(project)(config)(importer)(
818
- front,
819
- target,
820
- explore,
821
- tags,
822
- jsDocTags,
823
- array,
824
- )
825
- : config.atomist(explore)({
826
- expression: decode(project)(config)(importer)(
827
- front,
828
- target,
829
- explore,
830
- tags,
831
- jsDocTags,
832
- ),
833
- tags: check_array_length(tags)(array),
834
- })(array),
835
- decoder: (input, target, explore, tags, jsDocTags) =>
836
- Array.isArray(target)
837
- ? decode_tuple(project)(config)(importer)(true)(
838
- input,
839
- target,
840
- explore,
841
- tags,
842
- jsDocTags,
843
- )
844
- : decode_array(project)(config)(importer)(
845
- input,
846
- target,
847
- explore,
848
- tags,
849
- jsDocTags,
850
- ),
851
- empty: config.success,
852
- success: config.success,
853
- failure: (input, expected, explore) =>
854
- ts.factory.createReturnStatement(
855
- config.joiner.failure(input, expected, explore),
856
- ),
857
- });
858
-
859
- const explore_objects =
860
- (config: IConfig) => (importer: FunctionImporter) => {
861
- const objector = decode_object(config)(importer);
862
-
863
- return (
864
- input: ts.Expression,
865
- meta: Metadata,
866
- explore: IExplore,
867
- ) => {
868
- if (meta.objects.length === 1)
869
- return objector(input, meta.objects[0]!, explore);
870
-
871
- return ts.factory.createCallExpression(
872
- ts.factory.createIdentifier(
873
- importer.useLocal(
874
- `${config.unioners}${meta.union_index!}`,
875
- ),
876
- ),
877
- undefined,
878
- FeatureProgrammer.get_object_arguments(config)(explore)(
879
- input,
880
- ),
881
- );
882
- };
883
- };
884
- }
885
-
886
- const create_add =
887
- (binaries: CheckerProgrammer.IBinary[]) =>
888
- (defaultInput: ts.Expression) =>
889
- (
890
- exact: boolean,
891
- left: ts.Expression,
892
- right: ts.Expression = defaultInput,
893
- ) => {
894
- const factory = exact
895
- ? ts.factory.createStrictEquality
896
- : ts.factory.createStrictInequality;
897
- binaries.push({
898
- expression: factory(left, right),
899
- combined: false,
900
- });
901
- };
1
+ import { JSDocTagInfo } from "typescript";
2
+ import ts from "typescript/lib/tsclibrary";
3
+
4
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
5
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
6
+ import { MetadataCollection } from "../factories/MetadataCollection";
7
+ import { MetadataFactory } from "../factories/MetadataFactory";
8
+ import { TypeFactory } from "../factories/TypeFactory";
9
+ import { ValueFactory } from "../factories/ValueFactory";
10
+
11
+ import { IMetadataTag } from "../metadata/IMetadataTag";
12
+ import { Metadata } from "../metadata/Metadata";
13
+ import { MetadataObject } from "../metadata/MetadataObject";
14
+
15
+ import { IProject } from "../transformers/IProject";
16
+
17
+ import { FeatureProgrammer } from "./FeatureProgrammer";
18
+ import { AtomicPredicator } from "./helpers/AtomicPredicator";
19
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
20
+ import { ICheckEntry } from "./helpers/ICheckEntry";
21
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
22
+ import { OptionPredicator } from "./helpers/OptionPredicator";
23
+ import { UnionExplorer } from "./helpers/UnionExplorer";
24
+ import { check_array } from "./internal/check_array";
25
+ import { check_array_length } from "./internal/check_array_length";
26
+ import { check_bigint } from "./internal/check_bigint";
27
+ import { check_native } from "./internal/check_native";
28
+ import { check_number } from "./internal/check_number";
29
+ import { check_string } from "./internal/check_string";
30
+ import { check_template } from "./internal/check_template";
31
+ import { check_union_tuple } from "./internal/check_union_tuple";
32
+ import { decode_union_object } from "./internal/decode_union_object";
33
+
34
+ export namespace CheckerProgrammer {
35
+ export interface IConfig {
36
+ functors: string;
37
+ unioners: string;
38
+ path: boolean;
39
+ trace: boolean;
40
+ equals: boolean;
41
+ numeric: boolean;
42
+ addition?: () => ts.Statement[];
43
+ decoder?: FeatureProgrammer.Decoder<Metadata, ts.Expression>;
44
+ combiner: IConfig.Combiner;
45
+ atomist: (
46
+ explore: IExplore,
47
+ ) => (check: ICheckEntry) => (input: ts.Expression) => ts.Expression;
48
+ joiner: IConfig.IJoiner;
49
+ success: ts.Expression;
50
+ }
51
+ export namespace IConfig {
52
+ export interface Combiner {
53
+ (explorer: IExplore): {
54
+ (logic: "and" | "or"): {
55
+ (
56
+ input: ts.Expression,
57
+ binaries: IBinary[],
58
+ expected: string,
59
+ ): ts.Expression;
60
+ };
61
+ };
62
+ }
63
+ export interface IJoiner {
64
+ object(
65
+ input: ts.Expression,
66
+ entries: IExpressionEntry[],
67
+ ): ts.Expression;
68
+ array(input: ts.Expression, arrow: ts.ArrowFunction): ts.Expression;
69
+ tuple?(exprs: ts.Expression[]): ts.Expression;
70
+
71
+ failure(
72
+ value: ts.Expression,
73
+ expected: string,
74
+ explore?: FeatureProgrammer.IExplore,
75
+ ): ts.Expression;
76
+ is?(expression: ts.Expression): ts.Expression;
77
+ required?(exp: ts.Expression): ts.Expression;
78
+ full?: (
79
+ condition: ts.Expression,
80
+ ) => (
81
+ input: ts.Expression,
82
+ expected: string,
83
+ explore: IExplore,
84
+ ) => ts.Expression;
85
+ }
86
+ }
87
+ export type IExplore = FeatureProgrammer.IExplore;
88
+
89
+ export interface IBinary {
90
+ expression: ts.Expression;
91
+ combined: boolean;
92
+ }
93
+
94
+ /* -----------------------------------------------------------
95
+ WRITERS
96
+ ----------------------------------------------------------- */
97
+ export const write =
98
+ (project: IProject) =>
99
+ (config: IConfig) =>
100
+ (importer: FunctionImporter) =>
101
+ FeatureProgrammer.analyze(project)(
102
+ configure(project)(config)(importer),
103
+ )(importer);
104
+
105
+ export const write_functors =
106
+ (project: IProject) =>
107
+ (config: IConfig) =>
108
+ (importer: FunctionImporter) =>
109
+ FeatureProgrammer.write_functors(
110
+ configure(project)(config)(importer),
111
+ )(importer);
112
+
113
+ export const write_unioners = (
114
+ project: IProject,
115
+ config: IConfig,
116
+ importer: FunctionImporter,
117
+ ) =>
118
+ FeatureProgrammer.write_unioners(
119
+ configure(project)({ ...config, numeric: false })(importer),
120
+ )(importer);
121
+
122
+ const configure =
123
+ (project: IProject) =>
124
+ (config: IConfig) =>
125
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
126
+ const output: FeatureProgrammer.IConfig = {
127
+ types: {
128
+ input: () => TypeFactory.keyword("any"),
129
+ output: (type, name) =>
130
+ ts.factory.createTypePredicateNode(
131
+ undefined,
132
+ "input",
133
+ ts.factory.createTypeReferenceNode(
134
+ name ??
135
+ TypeFactory.getFullName(project.checker)(
136
+ type,
137
+ ),
138
+ ),
139
+ ),
140
+ },
141
+ trace: config.trace,
142
+ path: config.path,
143
+ functors: config.functors,
144
+ unioners: config.unioners,
145
+ initializer:
146
+ ({ checker }) =>
147
+ (type) => {
148
+ const collection: MetadataCollection =
149
+ new MetadataCollection();
150
+ const meta: Metadata = MetadataFactory.analyze(checker)(
151
+ {
152
+ resolve: false,
153
+ constant: true,
154
+ },
155
+ )(collection)(type);
156
+ return [collection, meta];
157
+ },
158
+ addition: config.addition,
159
+ decoder: config.decoder ?? decode(project)(config)(importer),
160
+ objector: {
161
+ checker:
162
+ config.decoder ?? decode(project)(config)(importer),
163
+ decoder: decode_object(config)(importer),
164
+ joiner: config.joiner.object,
165
+ unionizer: config.equals
166
+ ? decode_union_object(decode_object(config)(importer))(
167
+ (input, obj, explore) =>
168
+ decode_object(config)(importer)(input, obj, {
169
+ ...explore,
170
+ tracable: true,
171
+ }),
172
+ )(config.joiner.is ?? ((expr) => expr))(
173
+ (value, expected) =>
174
+ ts.factory.createReturnStatement(
175
+ config.joiner.failure(value, expected),
176
+ ),
177
+ )
178
+ : (input, targets, explore) =>
179
+ config.combiner(explore)("or")(
180
+ input,
181
+ targets.map((obj) => ({
182
+ expression: decode_object(config)(
183
+ importer,
184
+ )(input, obj, explore),
185
+ combined: true,
186
+ })),
187
+ `(${targets.map((t) => t.name).join(" | ")})`,
188
+ ),
189
+ failure: (value, expected) =>
190
+ ts.factory.createReturnStatement(
191
+ config.joiner.failure(value, expected),
192
+ ),
193
+ is: config.joiner.is,
194
+ required: config.joiner.required,
195
+ full: config.joiner.full,
196
+ type: TypeFactory.keyword("boolean"),
197
+ },
198
+ };
199
+ if (config.numeric === true)
200
+ output.generator = {
201
+ unioners: FeatureProgrammer.write_unioners(
202
+ configure(project)({ ...config, numeric: false })(
203
+ importer,
204
+ ),
205
+ )(importer),
206
+ };
207
+ return output;
208
+ };
209
+
210
+ /* -----------------------------------------------------------
211
+ DECODERS
212
+ ----------------------------------------------------------- */
213
+ /**
214
+ * @internal
215
+ */
216
+ export const decode =
217
+ (project: IProject) =>
218
+ (config: IConfig) =>
219
+ (importer: FunctionImporter) =>
220
+ (
221
+ input: ts.Expression,
222
+ meta: Metadata,
223
+ explore: IExplore,
224
+ metaTags: IMetadataTag[],
225
+ jsDocTags: JSDocTagInfo[],
226
+ ): ts.Expression => {
227
+ if (meta.any) return config.success;
228
+
229
+ const top: IBinary[] = [];
230
+ const binaries: IBinary[] = [];
231
+ const add = create_add(binaries)(input);
232
+ const getConstantValue = (
233
+ value: number | string | bigint | boolean,
234
+ ) =>
235
+ typeof value === "string"
236
+ ? ts.factory.createStringLiteral(value)
237
+ : ts.factory.createIdentifier(value.toString());
238
+
239
+ //----
240
+ // CHECK OPTIONAL
241
+ //----
242
+ // @todo -> should be elaborated
243
+ const checkOptional: boolean = meta.empty() || meta.isUnionBucket();
244
+
245
+ // NULLABLE
246
+ if (
247
+ checkOptional ||
248
+ meta.nullable
249
+ // || (meta.objects.length && meta.size() !== meta.objects.length)
250
+ )
251
+ (meta.nullable ? add : create_add(top)(input))(
252
+ meta.nullable,
253
+ ValueFactory.NULL(),
254
+ );
255
+
256
+ // UNDEFINDABLE
257
+ if (checkOptional || !meta.required)
258
+ (meta.required ? create_add(top)(input) : add)(
259
+ !meta.required,
260
+ ValueFactory.UNDEFINED(),
261
+ );
262
+
263
+ // FUNCTIONAL
264
+ if (meta.functional === true)
265
+ if (
266
+ OptionPredicator.functional(project.options) ||
267
+ meta.size() !== 1
268
+ )
269
+ add(
270
+ true,
271
+ ts.factory.createStringLiteral("function"),
272
+ ValueFactory.TYPEOF(input),
273
+ );
274
+ else
275
+ binaries.push({
276
+ combined: false,
277
+ expression: config.success,
278
+ });
279
+
280
+ //----
281
+ // VALUES
282
+ //----
283
+ // CONSTANT VALUES
284
+ for (const constant of meta.constants)
285
+ if (AtomicPredicator.constant(meta)(constant.type))
286
+ for (const val of constant.values)
287
+ add(true, getConstantValue(val));
288
+
289
+ // ATOMIC VALUES
290
+ for (const type of meta.atomics)
291
+ if (AtomicPredicator.atomic(meta)(type) === false) continue;
292
+ else if (type === "number")
293
+ binaries.push({
294
+ expression: config.atomist(explore)(
295
+ check_number(project, config.numeric)(importer)(
296
+ metaTags,
297
+ )(jsDocTags)(input),
298
+ )(input),
299
+ combined: false,
300
+ });
301
+ else if (type === "bigint")
302
+ binaries.push({
303
+ expression: config.atomist(explore)(
304
+ check_bigint(importer)(metaTags)(jsDocTags)(input),
305
+ )(input),
306
+ combined: false,
307
+ });
308
+ else if (type === "string")
309
+ binaries.push({
310
+ expression: config.atomist(explore)(
311
+ check_string(importer)(metaTags)(jsDocTags)(input),
312
+ )(input),
313
+ combined: false,
314
+ });
315
+ else
316
+ add(
317
+ true,
318
+ ts.factory.createStringLiteral(type),
319
+ ValueFactory.TYPEOF(input),
320
+ );
321
+
322
+ // TEMPLATE LITERAL VALUES
323
+ if (meta.templates.length)
324
+ if (AtomicPredicator.template(meta))
325
+ binaries.push({
326
+ expression: config.atomist(explore)(
327
+ check_template(importer)(metaTags)(jsDocTags)(
328
+ meta.templates,
329
+ )(input),
330
+ )(input),
331
+ combined: false,
332
+ });
333
+
334
+ // NATIVE CLASSES
335
+ for (const native of meta.natives)
336
+ binaries.push({
337
+ expression: check_native(native)(input),
338
+ combined: false,
339
+ });
340
+
341
+ //----
342
+ // INSTANCES
343
+ //----
344
+ interface IInstance {
345
+ pre: ts.Expression;
346
+ body: ts.Expression | null;
347
+ expected: string;
348
+ }
349
+ const instances: IInstance[] = [];
350
+ const prepare =
351
+ (pre: ts.Expression, expected: string) =>
352
+ (body: ts.Expression | null) =>
353
+ instances.push({
354
+ pre,
355
+ expected,
356
+ body,
357
+ });
358
+
359
+ // SETS
360
+ if (meta.sets.length) {
361
+ const install = prepare(
362
+ check_native("Set")(input),
363
+ meta.sets
364
+ .map((elem) => `Set<${elem.getName()}>`)
365
+ .join(" | "),
366
+ );
367
+ if (meta.sets.some((elem) => elem.any)) install(null);
368
+ else
369
+ install(
370
+ explore_sets(project)(config)(importer)(
371
+ input,
372
+ meta.sets,
373
+ {
374
+ ...explore,
375
+ from: "array",
376
+ },
377
+ [],
378
+ [],
379
+ ),
380
+ );
381
+ }
382
+
383
+ // MAPS
384
+ if (meta.maps.length) {
385
+ const install = prepare(
386
+ check_native("Map")(input),
387
+ meta.maps
388
+ .map(({ key, value }) => `Map<${key}, ${value}>`)
389
+ .join(" | "),
390
+ );
391
+ if (meta.maps.some((elem) => elem.key.any && elem.value.any))
392
+ install(null);
393
+ else
394
+ install(
395
+ explore_maps(project)(config)(importer)(
396
+ input,
397
+ meta.maps.map((m) => [m.key, m.value]),
398
+ {
399
+ ...explore,
400
+ from: "array",
401
+ },
402
+ [],
403
+ [],
404
+ ),
405
+ );
406
+ }
407
+
408
+ // ARRAYS AND TUPLES
409
+ if (meta.tuples.length + meta.arrays.length > 0) {
410
+ const install = prepare(
411
+ config.atomist(explore)(
412
+ check_array(importer)(
413
+ meta.tuples.length === 0 ? metaTags : [],
414
+ )(jsDocTags)(input),
415
+ )(input),
416
+ [...meta.tuples, ...meta.arrays]
417
+ .map((elem) =>
418
+ Array.isArray(elem)
419
+ ? `[${elem
420
+ .map((elem) => elem.getName())
421
+ .join(", ")}]`
422
+ : `Array<${elem.getName()}>`,
423
+ )
424
+ .join(" | "),
425
+ );
426
+ if (meta.arrays.length === 0)
427
+ install(
428
+ explore_tuples(project)(config)(importer)(
429
+ input,
430
+ meta.tuples,
431
+ {
432
+ ...explore,
433
+ from: "array",
434
+ },
435
+ metaTags,
436
+ jsDocTags,
437
+ ),
438
+ );
439
+ else if (meta.arrays.some((elem) => elem.any)) install(null);
440
+ else if (meta.tuples.length === 0)
441
+ // ARRAY ONLY
442
+ install(
443
+ explore_arrays(project, config, importer)(
444
+ input,
445
+ meta.arrays,
446
+ {
447
+ ...explore,
448
+ from: "array",
449
+ },
450
+ metaTags,
451
+ jsDocTags,
452
+ ),
453
+ );
454
+ else
455
+ install(
456
+ explore_arrays_and_tuples(project, config, importer)(
457
+ input,
458
+ [...meta.tuples, ...meta.arrays],
459
+ explore,
460
+ metaTags,
461
+ jsDocTags,
462
+ ),
463
+ );
464
+ }
465
+
466
+ // OBJECT
467
+ if (meta.objects.length > 0)
468
+ prepare(
469
+ ExpressionFactory.isObject({
470
+ checkNull: true,
471
+ checkArray: meta.objects.some((obj) =>
472
+ obj.properties.every(
473
+ (prop) =>
474
+ !prop.key.isSoleLiteral() ||
475
+ !prop.value.required,
476
+ ),
477
+ ),
478
+ })(input),
479
+ meta.objects.map((obj) => obj.name).join(" | "),
480
+ )(
481
+ explore_objects(config)(importer)(input, meta, {
482
+ ...explore,
483
+ from: "object",
484
+ }),
485
+ );
486
+
487
+ if (instances.length) {
488
+ const transformer =
489
+ (
490
+ merger: (
491
+ x: ts.Expression,
492
+ y: ts.Expression,
493
+ ) => ts.Expression,
494
+ ) =>
495
+ (ins: IInstance) =>
496
+ ins.body
497
+ ? {
498
+ expression: merger(ins.pre, ins.body),
499
+ combined: true,
500
+ }
501
+ : {
502
+ expression: ins.pre,
503
+ combined: false,
504
+ };
505
+ if (instances.length === 1)
506
+ binaries.push(
507
+ transformer((pre, body) =>
508
+ config.combiner(explore)("and")(
509
+ input,
510
+ [pre, body].map((expression) => ({
511
+ expression,
512
+ combined: expression !== pre,
513
+ })),
514
+ meta.getName(),
515
+ ),
516
+ )(instances[0]!),
517
+ );
518
+ else
519
+ binaries.push({
520
+ expression: config.combiner(explore)("or")(
521
+ input,
522
+ instances.map(
523
+ transformer(ts.factory.createLogicalAnd),
524
+ ),
525
+ meta.getName(),
526
+ ),
527
+ combined: true,
528
+ });
529
+ }
530
+
531
+ //----
532
+ // COMBINE CONDITIONS
533
+ //----
534
+ return top.length && binaries.length
535
+ ? config.combiner(explore)("and")(
536
+ input,
537
+ [
538
+ ...top,
539
+ {
540
+ expression: config.combiner(explore)("or")(
541
+ input,
542
+ binaries,
543
+ meta.getName(),
544
+ ),
545
+ combined: true,
546
+ },
547
+ ],
548
+ meta.getName(),
549
+ )
550
+ : binaries.length
551
+ ? config.combiner(explore)("or")(
552
+ input,
553
+ binaries,
554
+ meta.getName(),
555
+ )
556
+ : config.success;
557
+ };
558
+
559
+ export const decode_tuple =
560
+ (project: IProject) =>
561
+ (config: IConfig) =>
562
+ (importer: FunctionImporter) =>
563
+ (checkLength: boolean) =>
564
+ (
565
+ input: ts.Expression,
566
+ tuple: Array<Metadata>,
567
+ explore: IExplore,
568
+ tagList: IMetadataTag[],
569
+ jsDocTags: JSDocTagInfo[],
570
+ ): ts.Expression => {
571
+ const binaries: ts.Expression[] = tuple
572
+ .filter((meta) => meta.rest === null)
573
+ .map((meta, index) =>
574
+ decode(project)(config)(importer)(
575
+ ts.factory.createElementAccessExpression(input, index),
576
+ meta,
577
+ {
578
+ ...explore,
579
+ from: "array",
580
+ postfix: explore.postfix.length
581
+ ? `${explore.postfix.slice(0, -1)}[${index}]"`
582
+ : `[${index}]`,
583
+ },
584
+ tagList,
585
+ jsDocTags,
586
+ ),
587
+ );
588
+ const rest: ts.Expression | null =
589
+ tuple.length && tuple[tuple.length - 1]!.rest !== null
590
+ ? decode(project)(config)(importer)(
591
+ ts.factory.createCallExpression(
592
+ IdentifierFactory.access(input)("slice"),
593
+ undefined,
594
+ [
595
+ ts.factory.createNumericLiteral(
596
+ tuple.length - 1,
597
+ ),
598
+ ],
599
+ ),
600
+ (() => {
601
+ const wrapper: Metadata = Metadata.initialize();
602
+ wrapper.arrays.push(
603
+ tuple[tuple.length - 1]!.rest!,
604
+ );
605
+ return wrapper;
606
+ })(),
607
+ {
608
+ ...explore,
609
+ start: tuple.length - 1,
610
+ },
611
+ tagList,
612
+ jsDocTags,
613
+ )
614
+ : null;
615
+
616
+ const arrayLength = ts.factory.createPropertyAccessExpression(
617
+ input,
618
+ "length",
619
+ );
620
+ return config.combiner(explore)("and")(
621
+ input,
622
+ [
623
+ ...(checkLength && rest === null
624
+ ? tuple.every((t) => t.optional === false)
625
+ ? [
626
+ {
627
+ combined: false,
628
+ expression:
629
+ ts.factory.createStrictEquality(
630
+ arrayLength,
631
+ ts.factory.createNumericLiteral(
632
+ tuple.length,
633
+ ),
634
+ ),
635
+ },
636
+ ]
637
+ : [
638
+ {
639
+ combined: false,
640
+ expression: ts.factory.createLogicalAnd(
641
+ ts.factory.createLessThanEquals(
642
+ ts.factory.createNumericLiteral(
643
+ tuple.filter(
644
+ (t) =>
645
+ t.optional === false,
646
+ ).length,
647
+ ),
648
+ arrayLength,
649
+ ),
650
+ ts.factory.createGreaterThanEquals(
651
+ ts.factory.createNumericLiteral(
652
+ tuple.length,
653
+ ),
654
+ arrayLength,
655
+ ),
656
+ ),
657
+ },
658
+ ]
659
+ : []),
660
+ ...(config.joiner.tuple
661
+ ? [
662
+ {
663
+ expression: config.joiner.tuple(binaries),
664
+ combined: true,
665
+ },
666
+ ]
667
+ : binaries.map((expression) => ({
668
+ expression,
669
+ combined: true,
670
+ }))),
671
+ ...(rest !== null
672
+ ? [
673
+ {
674
+ expression: rest,
675
+ combined: true,
676
+ },
677
+ ]
678
+ : []),
679
+ ],
680
+ `[${tuple.map((t) => t.getName()).join(", ")}]`,
681
+ );
682
+ };
683
+
684
+ const decode_array =
685
+ (project: IProject) =>
686
+ (config: IConfig) =>
687
+ (importer: FunctionImporter) =>
688
+ FeatureProgrammer.decode_array({
689
+ trace: config.trace,
690
+ path: config.path,
691
+ decoder: decode(project)(config)(importer),
692
+ })(importer)(config.joiner.array);
693
+
694
+ export const decode_object =
695
+ (config: IConfig) => (importer: FunctionImporter) => {
696
+ const func = FeatureProgrammer.decode_object(config)(importer);
697
+ return (
698
+ input: ts.Expression,
699
+ obj: MetadataObject,
700
+ explore: IExplore,
701
+ ) => {
702
+ obj.validated = true;
703
+ return func(input, obj, explore);
704
+ };
705
+ };
706
+
707
+ const explore_sets =
708
+ (project: IProject) =>
709
+ (config: IConfig) =>
710
+ (importer: FunctionImporter) =>
711
+ UnionExplorer.set({
712
+ checker: decode(project)(config)(importer),
713
+ decoder: decode_array(project)(config)(importer),
714
+ empty: config.success,
715
+ success: config.success,
716
+ failure: (input, expected, explore) =>
717
+ ts.factory.createReturnStatement(
718
+ config.joiner.failure(input, expected, explore),
719
+ ),
720
+ });
721
+
722
+ const explore_maps =
723
+ (project: IProject) =>
724
+ (config: IConfig) =>
725
+ (importer: FunctionImporter) =>
726
+ UnionExplorer.map({
727
+ checker: (input, entry, explore) => {
728
+ const func = decode(project)(config)(importer);
729
+ return ts.factory.createLogicalAnd(
730
+ func(
731
+ ts.factory.createElementAccessExpression(input, 0),
732
+ entry[0],
733
+ { ...explore, postfix: `${explore.postfix}[0]` },
734
+ [],
735
+ [],
736
+ ),
737
+ func(
738
+ ts.factory.createElementAccessExpression(input, 1),
739
+ entry[1],
740
+ { ...explore, postfix: `${explore.postfix}[1]` },
741
+ [],
742
+ [],
743
+ ),
744
+ );
745
+ },
746
+ decoder: (input, target, explore) =>
747
+ decode_array(project)(config)(importer)(
748
+ input,
749
+ Metadata.create({
750
+ any: false,
751
+ nullable: false,
752
+ required: true,
753
+ optional: false,
754
+ functional: false,
755
+ resolved: null,
756
+ constants: [],
757
+ atomics: [],
758
+ templates: [],
759
+ rest: null,
760
+ arrays: [],
761
+ tuples: [target],
762
+ objects: [],
763
+ natives: [],
764
+ sets: [],
765
+ maps: [],
766
+ }),
767
+ explore,
768
+ [],
769
+ [],
770
+ ),
771
+ empty: config.success,
772
+ success: config.success,
773
+ failure: (input, expected, explore) =>
774
+ ts.factory.createReturnStatement(
775
+ config.joiner.failure(input, expected, explore),
776
+ ),
777
+ });
778
+
779
+ const explore_tuples =
780
+ (project: IProject) =>
781
+ (config: IConfig) =>
782
+ (importer: FunctionImporter) =>
783
+ UnionExplorer.tuple({
784
+ checker: check_union_tuple(project)(config)(importer),
785
+ decoder: decode_tuple(project)(config)(importer)(true),
786
+ empty: config.success,
787
+ success: config.success,
788
+ failure: (input, expected, explore) =>
789
+ ts.factory.createReturnStatement(
790
+ config.joiner.failure(input, expected, explore),
791
+ ),
792
+ });
793
+
794
+ const explore_arrays = (
795
+ project: IProject,
796
+ config: IConfig,
797
+ importer: FunctionImporter,
798
+ ) =>
799
+ UnionExplorer.array({
800
+ checker: decode(project)(config)(importer),
801
+ decoder: decode_array(project)(config)(importer),
802
+ empty: config.success,
803
+ success: config.success,
804
+ failure: (input, expected, explore) =>
805
+ ts.factory.createReturnStatement(
806
+ config.joiner.failure(input, expected, explore),
807
+ ),
808
+ });
809
+
810
+ const explore_arrays_and_tuples = (
811
+ project: IProject,
812
+ config: IConfig,
813
+ importer: FunctionImporter,
814
+ ) =>
815
+ UnionExplorer.array_or_tuple({
816
+ checker: (front, target, explore, tags, jsDocTags, array) =>
817
+ Array.isArray(target)
818
+ ? check_union_tuple(project)(config)(importer)(
819
+ front,
820
+ target,
821
+ explore,
822
+ tags,
823
+ jsDocTags,
824
+ array,
825
+ )
826
+ : config.atomist(explore)({
827
+ expression: decode(project)(config)(importer)(
828
+ front,
829
+ target,
830
+ explore,
831
+ tags,
832
+ jsDocTags,
833
+ ),
834
+ tags: check_array_length(tags)(array),
835
+ })(array),
836
+ decoder: (input, target, explore, tags, jsDocTags) =>
837
+ Array.isArray(target)
838
+ ? decode_tuple(project)(config)(importer)(true)(
839
+ input,
840
+ target,
841
+ explore,
842
+ tags,
843
+ jsDocTags,
844
+ )
845
+ : decode_array(project)(config)(importer)(
846
+ input,
847
+ target,
848
+ explore,
849
+ tags,
850
+ jsDocTags,
851
+ ),
852
+ empty: config.success,
853
+ success: config.success,
854
+ failure: (input, expected, explore) =>
855
+ ts.factory.createReturnStatement(
856
+ config.joiner.failure(input, expected, explore),
857
+ ),
858
+ });
859
+
860
+ const explore_objects =
861
+ (config: IConfig) => (importer: FunctionImporter) => {
862
+ const objector = decode_object(config)(importer);
863
+
864
+ return (
865
+ input: ts.Expression,
866
+ meta: Metadata,
867
+ explore: IExplore,
868
+ ) => {
869
+ if (meta.objects.length === 1)
870
+ return objector(input, meta.objects[0]!, explore);
871
+
872
+ return ts.factory.createCallExpression(
873
+ ts.factory.createIdentifier(
874
+ importer.useLocal(
875
+ `${config.unioners}${meta.union_index!}`,
876
+ ),
877
+ ),
878
+ undefined,
879
+ FeatureProgrammer.get_object_arguments(config)(explore)(
880
+ input,
881
+ ),
882
+ );
883
+ };
884
+ };
885
+ }
886
+
887
+ const create_add =
888
+ (binaries: CheckerProgrammer.IBinary[]) =>
889
+ (defaultInput: ts.Expression) =>
890
+ (
891
+ exact: boolean,
892
+ left: ts.Expression,
893
+ right: ts.Expression = defaultInput,
894
+ ) => {
895
+ const factory = exact
896
+ ? ts.factory.createStrictEquality
897
+ : ts.factory.createStrictInequality;
898
+ binaries.push({
899
+ expression: factory(left, right),
900
+ combined: false,
901
+ });
902
+ };