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

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