typia 5.3.0-dev.20231117 → 5.3.0-dev.20231119

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 (744) hide show
  1. package/lib/TypeGuardError.js.map +1 -1
  2. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  3. package/lib/executable/TypiaSetupWizard.js +1 -2
  4. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  5. package/lib/executable/setup/ArgumentParser.js.map +1 -1
  6. package/lib/executable/setup/CommandExecutor.js.map +1 -1
  7. package/lib/executable/setup/FileRetriever.js.map +1 -1
  8. package/lib/executable/setup/PackageManager.js.map +1 -1
  9. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  10. package/lib/executable/typia.js.map +1 -1
  11. package/lib/factories/CommentFactory.js +1 -3
  12. package/lib/factories/CommentFactory.js.map +1 -1
  13. package/lib/factories/ExpressionFactory.js +2 -6
  14. package/lib/factories/ExpressionFactory.js.map +1 -1
  15. package/lib/factories/IdentifierFactory.js +2 -6
  16. package/lib/factories/IdentifierFactory.js.map +1 -1
  17. package/lib/factories/JsonMetadataFactory.js.map +1 -1
  18. package/lib/factories/LiteralFactory.js.map +1 -1
  19. package/lib/factories/MetadataCollection.js +2 -7
  20. package/lib/factories/MetadataCollection.js.map +1 -1
  21. package/lib/factories/MetadataCommentTagFactory.js +2 -6
  22. package/lib/factories/MetadataCommentTagFactory.js.map +1 -1
  23. package/lib/factories/MetadataFactory.js +1 -4
  24. package/lib/factories/MetadataFactory.js.map +1 -1
  25. package/lib/factories/MetadataTypeTagFactory.js +3 -10
  26. package/lib/factories/MetadataTypeTagFactory.js.map +1 -1
  27. package/lib/factories/NumericRangeFactory.js.map +1 -1
  28. package/lib/factories/ProtobufFactory.js +5 -11
  29. package/lib/factories/ProtobufFactory.js.map +1 -1
  30. package/lib/factories/StatementFactory.js.map +1 -1
  31. package/lib/factories/TemplateFactory.js +1 -3
  32. package/lib/factories/TemplateFactory.js.map +1 -1
  33. package/lib/factories/TypeFactory.js +1 -2
  34. package/lib/factories/TypeFactory.js.map +1 -1
  35. package/lib/factories/ValueFactory.js.map +1 -1
  36. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  37. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  38. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  39. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -1
  40. package/lib/factories/internal/metadata/emplace_metadata_object.js +2 -5
  41. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  42. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
  43. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  44. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  45. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  46. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  47. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  48. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -1
  49. package/lib/factories/internal/metadata/iterate_metadata_collection.js +6 -16
  50. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  51. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -1
  52. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  53. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +9 -23
  54. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  55. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  56. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  57. package/lib/factories/internal/metadata/iterate_metadata_object.js +1 -3
  58. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  59. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  60. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  61. package/lib/factories/internal/metadata/iterate_metadata_sort.js +2 -10
  62. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  63. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  64. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  65. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  66. package/lib/functional/$HeadersReader.js.map +1 -1
  67. package/lib/functional/$ParameterReader.js.map +1 -1
  68. package/lib/functional/$ProtobufReader.js.map +1 -1
  69. package/lib/functional/$ProtobufSizer.js.map +1 -1
  70. package/lib/functional/$ProtobufWriter.js.map +1 -1
  71. package/lib/functional/$QueryReader.js.map +1 -1
  72. package/lib/functional/$any.js.map +1 -1
  73. package/lib/functional/$clone.js.map +1 -1
  74. package/lib/functional/$convention.js +1 -4
  75. package/lib/functional/$convention.js.map +1 -1
  76. package/lib/functional/$dictionary.js.map +1 -1
  77. package/lib/functional/$every.js.map +1 -1
  78. package/lib/functional/$from.js.map +1 -1
  79. package/lib/functional/$guard.js.map +1 -1
  80. package/lib/functional/$is_between.js.map +1 -1
  81. package/lib/functional/$join.js.map +1 -1
  82. package/lib/functional/$number.js.map +1 -1
  83. package/lib/functional/$report.js +1 -1
  84. package/lib/functional/$report.js.map +1 -1
  85. package/lib/functional/$rest.js.map +1 -1
  86. package/lib/functional/$stoll.js.map +1 -1
  87. package/lib/functional/$string.js.map +1 -1
  88. package/lib/functional/$strlen.js.map +1 -1
  89. package/lib/functional/$tail.js.map +1 -1
  90. package/lib/functional/$varint.js.map +1 -1
  91. package/lib/functional/$zigzag.js.map +1 -1
  92. package/lib/functional/Namespace.js +1 -2
  93. package/lib/functional/Namespace.js.map +1 -1
  94. package/lib/http.js.map +1 -1
  95. package/lib/json.js.map +1 -1
  96. package/lib/misc.js.map +1 -1
  97. package/lib/module.d.ts +4 -4
  98. package/lib/module.js.map +1 -1
  99. package/lib/notations.js.map +1 -1
  100. package/lib/programmers/AssertProgrammer.js +21 -31
  101. package/lib/programmers/AssertProgrammer.js.map +1 -1
  102. package/lib/programmers/CheckerProgrammer.js +15 -36
  103. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  104. package/lib/programmers/FeatureProgrammer.js +2 -6
  105. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  106. package/lib/programmers/IsProgrammer.js +5 -20
  107. package/lib/programmers/IsProgrammer.js.map +1 -1
  108. package/lib/programmers/RandomProgrammer.js +22 -40
  109. package/lib/programmers/RandomProgrammer.js.map +1 -1
  110. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  111. package/lib/programmers/ValidateProgrammer.js +6 -10
  112. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  113. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  114. package/lib/programmers/helpers/CloneJoiner.js +1 -3
  115. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  116. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  117. package/lib/programmers/helpers/HttpMetadataUtil.js.map +1 -1
  118. package/lib/programmers/helpers/NotationJoiner.js +1 -3
  119. package/lib/programmers/helpers/NotationJoiner.js.map +1 -1
  120. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  121. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  122. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  123. package/lib/programmers/helpers/RandomJoiner.js +5 -4
  124. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  125. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  126. package/lib/programmers/helpers/StringifyJoinder.js +5 -6
  127. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  128. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  129. package/lib/programmers/helpers/UnionExplorer.js +3 -9
  130. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  131. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  132. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  133. package/lib/programmers/http/HttpAssertHeadersProgrammer.js.map +1 -1
  134. package/lib/programmers/http/HttpAssertQueryProgrammer.js.map +1 -1
  135. package/lib/programmers/http/HttpHeadersProgrammer.js +8 -15
  136. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  137. package/lib/programmers/http/HttpIsHeadersProgrammer.js.map +1 -1
  138. package/lib/programmers/http/HttpIsQueryProgrammer.js.map +1 -1
  139. package/lib/programmers/http/HttpParameterProgrammer.js +4 -4
  140. package/lib/programmers/http/HttpParameterProgrammer.js.map +1 -1
  141. package/lib/programmers/http/HttpQueryProgrammer.js +4 -10
  142. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  143. package/lib/programmers/http/HttpValidateHeadersProgrammer.js.map +1 -1
  144. package/lib/programmers/http/HttpValidateQueryProgrammer.js.map +1 -1
  145. package/lib/programmers/internal/application_alias.js +1 -2
  146. package/lib/programmers/internal/application_alias.js.map +1 -1
  147. package/lib/programmers/internal/application_array.js +1 -3
  148. package/lib/programmers/internal/application_array.js.map +1 -1
  149. package/lib/programmers/internal/application_boolean.js.map +1 -1
  150. package/lib/programmers/internal/application_constant.js.map +1 -1
  151. package/lib/programmers/internal/application_default.js.map +1 -1
  152. package/lib/programmers/internal/application_default_string.js.map +1 -1
  153. package/lib/programmers/internal/application_escaped.js +1 -3
  154. package/lib/programmers/internal/application_escaped.js.map +1 -1
  155. package/lib/programmers/internal/application_native.js.map +1 -1
  156. package/lib/programmers/internal/application_number.js +1 -2
  157. package/lib/programmers/internal/application_number.js.map +1 -1
  158. package/lib/programmers/internal/application_object.js +3 -5
  159. package/lib/programmers/internal/application_object.js.map +1 -1
  160. package/lib/programmers/internal/application_schema.js +3 -1
  161. package/lib/programmers/internal/application_schema.js.map +1 -1
  162. package/lib/programmers/internal/application_string.js +1 -3
  163. package/lib/programmers/internal/application_string.js.map +1 -1
  164. package/lib/programmers/internal/application_templates.js.map +1 -1
  165. package/lib/programmers/internal/application_tuple.js +1 -2
  166. package/lib/programmers/internal/application_tuple.js.map +1 -1
  167. package/lib/programmers/internal/check_array_length.js.map +1 -1
  168. package/lib/programmers/internal/check_bigint.js.map +1 -1
  169. package/lib/programmers/internal/check_dynamic_key.js +3 -6
  170. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  171. package/lib/programmers/internal/check_dynamic_properties.js +3 -7
  172. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  173. package/lib/programmers/internal/check_everything.js +1 -3
  174. package/lib/programmers/internal/check_everything.js.map +1 -1
  175. package/lib/programmers/internal/check_native.js.map +1 -1
  176. package/lib/programmers/internal/check_number.js +3 -6
  177. package/lib/programmers/internal/check_number.js.map +1 -1
  178. package/lib/programmers/internal/check_object.js.map +1 -1
  179. package/lib/programmers/internal/check_string.js.map +1 -1
  180. package/lib/programmers/internal/check_template.js.map +1 -1
  181. package/lib/programmers/internal/check_union_array_like.js +2 -6
  182. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  183. package/lib/programmers/internal/decode_union_object.js +1 -3
  184. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  185. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  186. package/lib/programmers/internal/metadata_to_pattern.js +1 -3
  187. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  188. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  189. package/lib/programmers/internal/random_custom.js.map +1 -1
  190. package/lib/programmers/internal/stringify_dynamic_properties.js +1 -3
  191. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  192. package/lib/programmers/internal/stringify_native.js.map +1 -1
  193. package/lib/programmers/internal/stringify_regular_properties.js +1 -3
  194. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  195. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  196. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  197. package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
  198. package/lib/programmers/json/JsonAssertParseProgrammer.js +1 -3
  199. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  200. package/lib/programmers/json/JsonAssertStringifyProgrammer.js +1 -3
  201. package/lib/programmers/json/JsonAssertStringifyProgrammer.js.map +1 -1
  202. package/lib/programmers/json/JsonIsParseProgrammer.js +1 -3
  203. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  204. package/lib/programmers/json/JsonIsStringifyProgrammer.js.map +1 -1
  205. package/lib/programmers/json/JsonStringifyProgrammer.js +4 -10
  206. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  207. package/lib/programmers/json/JsonValidateParseProgrammer.js +1 -3
  208. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  209. package/lib/programmers/json/JsonValidateStringifyProgrammer.js.map +1 -1
  210. package/lib/programmers/misc/MiscAssertCloneProgrammer.js +1 -3
  211. package/lib/programmers/misc/MiscAssertCloneProgrammer.js.map +1 -1
  212. package/lib/programmers/misc/MiscAssertPruneProgrammer.js +1 -3
  213. package/lib/programmers/misc/MiscAssertPruneProgrammer.js.map +1 -1
  214. package/lib/programmers/misc/MiscCloneProgrammer.js +9 -22
  215. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  216. package/lib/programmers/misc/MiscIsCloneProgrammer.js +1 -3
  217. package/lib/programmers/misc/MiscIsCloneProgrammer.js.map +1 -1
  218. package/lib/programmers/misc/MiscIsPruneProgrammer.js +1 -3
  219. package/lib/programmers/misc/MiscIsPruneProgrammer.js.map +1 -1
  220. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  221. package/lib/programmers/misc/MiscPruneProgrammer.js +1 -3
  222. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  223. package/lib/programmers/misc/MiscValidateCloneProgrammer.js +1 -3
  224. package/lib/programmers/misc/MiscValidateCloneProgrammer.js.map +1 -1
  225. package/lib/programmers/misc/MiscValidatePruneProgrammer.js +1 -3
  226. package/lib/programmers/misc/MiscValidatePruneProgrammer.js.map +1 -1
  227. package/lib/programmers/notations/NotationAssertGeneralProgrammer.js +1 -3
  228. package/lib/programmers/notations/NotationAssertGeneralProgrammer.js.map +1 -1
  229. package/lib/programmers/notations/NotationGeneralProgrammer.js +9 -22
  230. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  231. package/lib/programmers/notations/NotationIsGeneralProgrammer.js +1 -3
  232. package/lib/programmers/notations/NotationIsGeneralProgrammer.js.map +1 -1
  233. package/lib/programmers/notations/NotationValidateGeneralProgrammer.js +1 -3
  234. package/lib/programmers/notations/NotationValidateGeneralProgrammer.js.map +1 -1
  235. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  236. package/lib/programmers/protobuf/ProtobufAssertEncodeProgrammer.js +1 -3
  237. package/lib/programmers/protobuf/ProtobufAssertEncodeProgrammer.js.map +1 -1
  238. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +8 -17
  239. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  240. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +6 -10
  241. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  242. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  243. package/lib/programmers/protobuf/ProtobufIsEncodeProgrammer.js.map +1 -1
  244. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +1 -3
  245. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  246. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  247. package/lib/programmers/protobuf/ProtobufValidateEncodeProgrammer.js.map +1 -1
  248. package/lib/protobuf.js.map +1 -1
  249. package/lib/reflect.js.map +1 -1
  250. package/lib/schemas/metadata/Metadata.js +7 -19
  251. package/lib/schemas/metadata/Metadata.js.map +1 -1
  252. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  253. package/lib/schemas/metadata/MetadataApplication.js.map +1 -1
  254. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  255. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -1
  256. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  257. package/lib/schemas/metadata/MetadataComponents.js.map +1 -1
  258. package/lib/schemas/metadata/MetadataConstant.js.map +1 -1
  259. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -1
  260. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  261. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  262. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  263. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -1
  264. package/lib/transform.js.map +1 -1
  265. package/lib/transformers/CallExpressionTransformer.js +10 -30
  266. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  267. package/lib/transformers/FileTransformer.js.map +1 -1
  268. package/lib/transformers/ImportTransformer.js.map +1 -1
  269. package/lib/transformers/NodeTransformer.js.map +1 -1
  270. package/lib/transformers/TransformerError.js.map +1 -1
  271. package/lib/transformers/features/AssertTransformer.js +1 -3
  272. package/lib/transformers/features/AssertTransformer.js.map +1 -1
  273. package/lib/transformers/features/CreateAssertTransformer.js +1 -3
  274. package/lib/transformers/features/CreateAssertTransformer.js.map +1 -1
  275. package/lib/transformers/features/CreateIsTransformer.js +1 -3
  276. package/lib/transformers/features/CreateIsTransformer.js.map +1 -1
  277. package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
  278. package/lib/transformers/features/CreateValidateTransformer.js.map +1 -1
  279. package/lib/transformers/features/IsTransformer.js +1 -3
  280. package/lib/transformers/features/IsTransformer.js.map +1 -1
  281. package/lib/transformers/features/RandomTransformer.js +1 -3
  282. package/lib/transformers/features/RandomTransformer.js.map +1 -1
  283. package/lib/transformers/features/ValidateTransformer.js.map +1 -1
  284. package/lib/transformers/features/http/CreateHttpAssertHeadersTransformer.js +1 -3
  285. package/lib/transformers/features/http/CreateHttpAssertHeadersTransformer.js.map +1 -1
  286. package/lib/transformers/features/http/CreateHttpAssertQueryTransformer.js +1 -3
  287. package/lib/transformers/features/http/CreateHttpAssertQueryTransformer.js.map +1 -1
  288. package/lib/transformers/features/http/CreateHttpHeadersTransformer.js.map +1 -1
  289. package/lib/transformers/features/http/CreateHttpIsHeadersTransformer.js.map +1 -1
  290. package/lib/transformers/features/http/CreateHttpIsQueryTransformer.js.map +1 -1
  291. package/lib/transformers/features/http/CreateHttpParameterTransformer.js.map +1 -1
  292. package/lib/transformers/features/http/CreateHttpQueryTransformer.js.map +1 -1
  293. package/lib/transformers/features/http/CreateHttpValidateHeadersTransformer.js.map +1 -1
  294. package/lib/transformers/features/http/CreateHttpValidateQueryTransformer.js +1 -3
  295. package/lib/transformers/features/http/CreateHttpValidateQueryTransformer.js.map +1 -1
  296. package/lib/transformers/features/http/HttpAssertHeadersTransformer.js +1 -3
  297. package/lib/transformers/features/http/HttpAssertHeadersTransformer.js.map +1 -1
  298. package/lib/transformers/features/http/HttpAssertQueryTransformer.js +1 -3
  299. package/lib/transformers/features/http/HttpAssertQueryTransformer.js.map +1 -1
  300. package/lib/transformers/features/http/HttpHeadersTransformer.js.map +1 -1
  301. package/lib/transformers/features/http/HttpIsHeadersTransformer.js.map +1 -1
  302. package/lib/transformers/features/http/HttpIsQueryTransformer.js.map +1 -1
  303. package/lib/transformers/features/http/HttpParameterTransformer.js.map +1 -1
  304. package/lib/transformers/features/http/HttpQueryTransformer.js.map +1 -1
  305. package/lib/transformers/features/http/HttpValidateHeadersTransformer.js.map +1 -1
  306. package/lib/transformers/features/http/HttpValidateQueryTransformer.js +1 -3
  307. package/lib/transformers/features/http/HttpValidateQueryTransformer.js.map +1 -1
  308. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  309. package/lib/transformers/features/json/JsonAssertParseTransformer.js +1 -3
  310. package/lib/transformers/features/json/JsonAssertParseTransformer.js.map +1 -1
  311. package/lib/transformers/features/json/JsonAssertStringifyTransformer.js.map +1 -1
  312. package/lib/transformers/features/json/JsonCreateAssertParseTransformer.js +1 -3
  313. package/lib/transformers/features/json/JsonCreateAssertParseTransformer.js.map +1 -1
  314. package/lib/transformers/features/json/JsonCreateAssertStringifyTransformer.js.map +1 -1
  315. package/lib/transformers/features/json/JsonCreateIsParseTransformer.js.map +1 -1
  316. package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.js +1 -3
  317. package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.js.map +1 -1
  318. package/lib/transformers/features/json/JsonCreateStringifyTransformer.js.map +1 -1
  319. package/lib/transformers/features/json/JsonCreateValidateParseTransformer.js +1 -3
  320. package/lib/transformers/features/json/JsonCreateValidateParseTransformer.js.map +1 -1
  321. package/lib/transformers/features/json/JsonCreateValidateStringifyProgrammer.js.map +1 -1
  322. package/lib/transformers/features/json/JsonIsParseTransformer.js.map +1 -1
  323. package/lib/transformers/features/json/JsonIsStringifyTransformer.js +1 -3
  324. package/lib/transformers/features/json/JsonIsStringifyTransformer.js.map +1 -1
  325. package/lib/transformers/features/json/JsonStringifyTransformer.js.map +1 -1
  326. package/lib/transformers/features/json/JsonValidateParseTransformer.js +1 -3
  327. package/lib/transformers/features/json/JsonValidateParseTransformer.js.map +1 -1
  328. package/lib/transformers/features/json/JsonValidateStringifyTransformer.js.map +1 -1
  329. package/lib/transformers/features/misc/MiscAssertCloneTransformer.js +1 -3
  330. package/lib/transformers/features/misc/MiscAssertCloneTransformer.js.map +1 -1
  331. package/lib/transformers/features/misc/MiscAssertPruneTransformer.js +1 -3
  332. package/lib/transformers/features/misc/MiscAssertPruneTransformer.js.map +1 -1
  333. package/lib/transformers/features/misc/MiscCloneTransformer.js.map +1 -1
  334. package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.js +1 -3
  335. package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.js.map +1 -1
  336. package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.js +1 -3
  337. package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.js.map +1 -1
  338. package/lib/transformers/features/misc/MiscCreateCloneTransformer.js.map +1 -1
  339. package/lib/transformers/features/misc/MiscCreateIsCloneTransformer.js.map +1 -1
  340. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js.map +1 -1
  341. package/lib/transformers/features/misc/MiscCreatePruneTransformer.js.map +1 -1
  342. package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.js +1 -3
  343. package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.js.map +1 -1
  344. package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.js +1 -3
  345. package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.js.map +1 -1
  346. package/lib/transformers/features/misc/MiscIsCloneTransformer.js.map +1 -1
  347. package/lib/transformers/features/misc/MiscIsPruneTransformer.js.map +1 -1
  348. package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
  349. package/lib/transformers/features/misc/MiscPruneTransformer.js.map +1 -1
  350. package/lib/transformers/features/misc/MiscValidateCloneTransformer.js +1 -3
  351. package/lib/transformers/features/misc/MiscValidateCloneTransformer.js.map +1 -1
  352. package/lib/transformers/features/misc/MiscValidatePruneTransformer.js +1 -3
  353. package/lib/transformers/features/misc/MiscValidatePruneTransformer.js.map +1 -1
  354. package/lib/transformers/features/notations/NotationAssertGeneralTransformer.js.map +1 -1
  355. package/lib/transformers/features/notations/NotationCreateAssertGeneralTransformer.js.map +1 -1
  356. package/lib/transformers/features/notations/NotationCreateGeneralTransformer.js.map +1 -1
  357. package/lib/transformers/features/notations/NotationCreateIsGeneralTransformer.js.map +1 -1
  358. package/lib/transformers/features/notations/NotationCreateValidateGeneralTransformer.js.map +1 -1
  359. package/lib/transformers/features/notations/NotationGeneralTransformer.js.map +1 -1
  360. package/lib/transformers/features/notations/NotationIsGeneralTransformer.js.map +1 -1
  361. package/lib/transformers/features/notations/NotationValidateGeneralTransformer.js.map +1 -1
  362. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.js.map +1 -1
  363. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.js.map +1 -1
  364. package/lib/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.js.map +1 -1
  365. package/lib/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.js.map +1 -1
  366. package/lib/transformers/features/protobuf/ProtobufCreateDecodeTransformer.js.map +1 -1
  367. package/lib/transformers/features/protobuf/ProtobufCreateEncodeTransformer.js.map +1 -1
  368. package/lib/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.js +1 -3
  369. package/lib/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.js.map +1 -1
  370. package/lib/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.js +1 -3
  371. package/lib/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.js.map +1 -1
  372. package/lib/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.js.map +1 -1
  373. package/lib/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.js.map +1 -1
  374. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.js +1 -3
  375. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.js.map +1 -1
  376. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.js +1 -3
  377. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.js.map +1 -1
  378. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.js +1 -3
  379. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.js.map +1 -1
  380. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.js +1 -3
  381. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.js.map +1 -1
  382. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  383. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.js.map +1 -1
  384. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.js.map +1 -1
  385. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js.map +1 -1
  386. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  387. package/lib/typings/Writable.js.map +1 -1
  388. package/lib/utils/ArrayUtil.js +1 -3
  389. package/lib/utils/ArrayUtil.js.map +1 -1
  390. package/lib/utils/Escaper.js.map +1 -1
  391. package/lib/utils/MapUtil.js.map +1 -1
  392. package/lib/utils/NameEncoder.js.map +1 -1
  393. package/lib/utils/NamingConvention.js.map +1 -1
  394. package/lib/utils/PatternUtil.js +2 -6
  395. package/lib/utils/PatternUtil.js.map +1 -1
  396. package/lib/utils/RandomGenerator.js.map +1 -1
  397. package/lib/utils/Singleton.js.map +1 -1
  398. package/lib/utils/StringUtil.js.map +1 -1
  399. package/package.json +1 -1
  400. package/src/AssertionGuard.ts +1 -1
  401. package/src/CamelCase.ts +114 -116
  402. package/src/IRandomGenerator.ts +35 -35
  403. package/src/IValidation.ts +21 -21
  404. package/src/PascalCase.ts +114 -116
  405. package/src/Primitive.ts +135 -135
  406. package/src/Resolved.ts +116 -116
  407. package/src/SnakeCase.ts +156 -156
  408. package/src/TypeGuardError.ts +36 -36
  409. package/src/executable/TypiaGenerateWizard.ts +83 -85
  410. package/src/executable/TypiaSetupWizard.ts +140 -142
  411. package/src/executable/setup/ArgumentParser.ts +43 -45
  412. package/src/executable/setup/CommandExecutor.ts +8 -8
  413. package/src/executable/setup/FileRetriever.ts +22 -22
  414. package/src/executable/setup/PackageManager.ts +71 -71
  415. package/src/executable/setup/PluginConfigurator.ts +69 -70
  416. package/src/executable/typia.ts +52 -52
  417. package/src/factories/CommentFactory.ts +79 -84
  418. package/src/factories/ExpressionFactory.ts +150 -166
  419. package/src/factories/IdentifierFactory.ts +70 -74
  420. package/src/factories/JsonMetadataFactory.ts +53 -53
  421. package/src/factories/LiteralFactory.ts +47 -49
  422. package/src/factories/MetadataCollection.ts +269 -282
  423. package/src/factories/MetadataCommentTagFactory.ts +601 -629
  424. package/src/factories/MetadataFactory.ts +267 -271
  425. package/src/factories/MetadataTypeTagFactory.ts +313 -325
  426. package/src/factories/NumericRangeFactory.ts +72 -72
  427. package/src/factories/ProtobufFactory.ts +259 -275
  428. package/src/factories/StatementFactory.ts +72 -72
  429. package/src/factories/TemplateFactory.ts +56 -58
  430. package/src/factories/TypeFactory.ts +118 -119
  431. package/src/factories/ValueFactory.ts +12 -12
  432. package/src/factories/internal/metadata/MetadataHelper.ts +15 -15
  433. package/src/factories/internal/metadata/emend_metadata_atomics.ts +37 -41
  434. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  435. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +38 -41
  436. package/src/factories/internal/metadata/emplace_metadata_object.ts +175 -178
  437. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -60
  438. package/src/factories/internal/metadata/explore_metadata.ts +28 -32
  439. package/src/factories/internal/metadata/iterate_metadata.ts +94 -101
  440. package/src/factories/internal/metadata/iterate_metadata_alias.ts +34 -35
  441. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  442. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  443. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  444. package/src/factories/internal/metadata/iterate_metadata_collection.ts +131 -141
  445. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  446. package/src/factories/internal/metadata/iterate_metadata_constant.ts +48 -60
  447. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +233 -260
  448. package/src/factories/internal/metadata/iterate_metadata_map.ts +50 -57
  449. package/src/factories/internal/metadata/iterate_metadata_native.ts +208 -210
  450. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -44
  451. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  452. package/src/factories/internal/metadata/iterate_metadata_set.ts +41 -42
  453. package/src/factories/internal/metadata/iterate_metadata_sort.ts +61 -69
  454. package/src/factories/internal/metadata/iterate_metadata_template.ts +44 -47
  455. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  456. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  457. package/src/functional/$HeadersReader.ts +28 -28
  458. package/src/functional/$ParameterReader.ts +31 -31
  459. package/src/functional/$ProtobufReader.ts +195 -201
  460. package/src/functional/$ProtobufSizer.ts +147 -147
  461. package/src/functional/$ProtobufWriter.ts +150 -151
  462. package/src/functional/$QueryReader.ts +56 -56
  463. package/src/functional/$any.ts +4 -4
  464. package/src/functional/$clone.ts +4 -4
  465. package/src/functional/$convention.ts +37 -40
  466. package/src/functional/$dictionary.ts +22 -25
  467. package/src/functional/$every.ts +11 -11
  468. package/src/functional/$from.ts +5 -5
  469. package/src/functional/$guard.ts +35 -35
  470. package/src/functional/$is_between.ts +2 -2
  471. package/src/functional/$join.ts +46 -46
  472. package/src/functional/$number.ts +12 -13
  473. package/src/functional/$report.ts +13 -15
  474. package/src/functional/$rest.ts +3 -3
  475. package/src/functional/$stoll.ts +8 -8
  476. package/src/functional/$string.ts +50 -50
  477. package/src/functional/$strlen.ts +7 -7
  478. package/src/functional/$tail.ts +5 -5
  479. package/src/functional/$varint.ts +130 -130
  480. package/src/functional/$zigzag.ts +39 -39
  481. package/src/functional/IProtobufWriter.ts +18 -18
  482. package/src/functional/Namespace.ts +174 -175
  483. package/src/http.ts +1149 -1149
  484. package/src/json.ts +648 -648
  485. package/src/misc.ts +651 -651
  486. package/src/module.ts +896 -896
  487. package/src/notations.ts +855 -855
  488. package/src/programmers/AssertProgrammer.ts +293 -342
  489. package/src/programmers/CheckerProgrammer.ts +1025 -1138
  490. package/src/programmers/FeatureProgrammer.ts +460 -486
  491. package/src/programmers/IsProgrammer.ts +232 -258
  492. package/src/programmers/RandomProgrammer.ts +825 -880
  493. package/src/programmers/TypiaProgrammer.ts +167 -169
  494. package/src/programmers/ValidateProgrammer.ts +307 -350
  495. package/src/programmers/helpers/AtomicPredicator.ts +25 -31
  496. package/src/programmers/helpers/CloneJoiner.ts +130 -144
  497. package/src/programmers/helpers/FunctionImporeter.ts +87 -91
  498. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  499. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  500. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  501. package/src/programmers/helpers/NotationJoiner.ts +132 -146
  502. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  503. package/src/programmers/helpers/ProtobufUtil.ts +125 -126
  504. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  505. package/src/programmers/helpers/PruneJoiner.ts +141 -143
  506. package/src/programmers/helpers/RandomJoiner.ts +140 -149
  507. package/src/programmers/helpers/RandomRanger.ts +164 -175
  508. package/src/programmers/helpers/StringifyJoinder.ts +105 -113
  509. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  510. package/src/programmers/helpers/UnionExplorer.ts +269 -305
  511. package/src/programmers/helpers/UnionPredicator.ts +77 -81
  512. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  513. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +77 -77
  514. package/src/programmers/http/HttpAssertQueryProgrammer.ts +75 -77
  515. package/src/programmers/http/HttpHeadersProgrammer.ts +314 -342
  516. package/src/programmers/http/HttpIsHeadersProgrammer.ts +84 -87
  517. package/src/programmers/http/HttpIsQueryProgrammer.ts +82 -87
  518. package/src/programmers/http/HttpParameterProgrammer.ts +97 -107
  519. package/src/programmers/http/HttpQueryProgrammer.ts +252 -276
  520. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +77 -77
  521. package/src/programmers/http/HttpValidateQueryProgrammer.ts +75 -77
  522. package/src/programmers/internal/application_alias.ts +65 -65
  523. package/src/programmers/internal/application_array.ts +59 -61
  524. package/src/programmers/internal/application_boolean.ts +30 -30
  525. package/src/programmers/internal/application_constant.ts +26 -26
  526. package/src/programmers/internal/application_default.ts +17 -17
  527. package/src/programmers/internal/application_default_string.ts +33 -37
  528. package/src/programmers/internal/application_escaped.ts +53 -55
  529. package/src/programmers/internal/application_native.ts +38 -39
  530. package/src/programmers/internal/application_number.ts +94 -97
  531. package/src/programmers/internal/application_object.ts +153 -162
  532. package/src/programmers/internal/application_schema.ts +180 -180
  533. package/src/programmers/internal/application_string.ts +58 -61
  534. package/src/programmers/internal/application_templates.ts +25 -25
  535. package/src/programmers/internal/application_tuple.ts +55 -58
  536. package/src/programmers/internal/check_array_length.ts +45 -47
  537. package/src/programmers/internal/check_bigint.ts +49 -51
  538. package/src/programmers/internal/check_dynamic_key.ts +175 -178
  539. package/src/programmers/internal/check_dynamic_properties.ts +198 -202
  540. package/src/programmers/internal/check_everything.ts +23 -28
  541. package/src/programmers/internal/check_native.ts +21 -21
  542. package/src/programmers/internal/check_number.ts +106 -111
  543. package/src/programmers/internal/check_object.ts +60 -62
  544. package/src/programmers/internal/check_string.ts +48 -50
  545. package/src/programmers/internal/check_template.ts +61 -61
  546. package/src/programmers/internal/check_union_array_like.ts +307 -324
  547. package/src/programmers/internal/decode_union_object.ts +78 -84
  548. package/src/programmers/internal/feature_object_entries.ts +58 -58
  549. package/src/programmers/internal/metadata_to_pattern.ts +33 -36
  550. package/src/programmers/internal/prune_object_properties.ts +60 -60
  551. package/src/programmers/internal/random_custom.ts +37 -37
  552. package/src/programmers/internal/stringify_dynamic_properties.ts +157 -171
  553. package/src/programmers/internal/stringify_native.ts +7 -7
  554. package/src/programmers/internal/stringify_regular_properties.ts +81 -83
  555. package/src/programmers/internal/template_to_pattern.ts +15 -15
  556. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  557. package/src/programmers/json/JsonApplicationProgrammer.ts +50 -50
  558. package/src/programmers/json/JsonAssertParseProgrammer.ts +67 -72
  559. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +61 -66
  560. package/src/programmers/json/JsonIsParseProgrammer.ts +73 -78
  561. package/src/programmers/json/JsonIsStringifyProgrammer.ts +75 -76
  562. package/src/programmers/json/JsonStringifyProgrammer.ts +893 -959
  563. package/src/programmers/json/JsonValidateParseProgrammer.ts +64 -69
  564. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +83 -84
  565. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +63 -71
  566. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +60 -68
  567. package/src/programmers/misc/MiscCloneProgrammer.ts +713 -787
  568. package/src/programmers/misc/MiscIsCloneProgrammer.ts +70 -78
  569. package/src/programmers/misc/MiscIsPruneProgrammer.ts +66 -73
  570. package/src/programmers/misc/MiscLiteralsProgrammer.ts +72 -72
  571. package/src/programmers/misc/MiscPruneProgrammer.ts +523 -549
  572. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +80 -85
  573. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +73 -78
  574. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +64 -72
  575. package/src/programmers/notations/NotationGeneralProgrammer.ts +647 -717
  576. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +71 -79
  577. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +81 -88
  578. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  579. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +61 -66
  580. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +596 -654
  581. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +819 -872
  582. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +82 -85
  583. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +75 -76
  584. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +160 -165
  585. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  586. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +83 -86
  587. package/src/protobuf.ts +887 -887
  588. package/src/reflect.ts +24 -24
  589. package/src/schemas/json/IJsonApplication.ts +8 -8
  590. package/src/schemas/json/IJsonComponents.ts +36 -36
  591. package/src/schemas/json/IJsonSchema.ts +113 -113
  592. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  593. package/src/schemas/metadata/IMetadata.ts +34 -34
  594. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  595. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  596. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  597. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  598. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  599. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  600. package/src/schemas/metadata/IMetadataConstant.ts +23 -25
  601. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  602. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  603. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  604. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  605. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  606. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  607. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  608. package/src/schemas/metadata/IMetadataTypeTag.ts +15 -15
  609. package/src/schemas/metadata/Metadata.ts +596 -613
  610. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  611. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  612. package/src/schemas/metadata/MetadataArray.ts +49 -49
  613. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  614. package/src/schemas/metadata/MetadataAtomic.ts +84 -86
  615. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  616. package/src/schemas/metadata/MetadataConstant.ts +46 -46
  617. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  618. package/src/schemas/metadata/MetadataObject.ts +135 -139
  619. package/src/schemas/metadata/MetadataProperty.ts +56 -56
  620. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  621. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  622. package/src/tags/Default.ts +15 -15
  623. package/src/tags/ExclusiveMaximum.ts +13 -13
  624. package/src/tags/ExclusiveMinimum.ts +13 -13
  625. package/src/tags/Format.ts +30 -30
  626. package/src/tags/MaxItems.ts +9 -9
  627. package/src/tags/MaxLength.ts +9 -9
  628. package/src/tags/Maximum.ts +13 -13
  629. package/src/tags/MinItems.ts +9 -9
  630. package/src/tags/MinLength.ts +9 -9
  631. package/src/tags/Minimum.ts +13 -13
  632. package/src/tags/MultipleOf.ts +15 -15
  633. package/src/tags/Pattern.ts +9 -9
  634. package/src/tags/TagBase.ts +68 -68
  635. package/src/tags/Type.ts +27 -27
  636. package/src/transform.ts +35 -35
  637. package/src/transformers/CallExpressionTransformer.ts +359 -397
  638. package/src/transformers/FileTransformer.ts +57 -57
  639. package/src/transformers/IProject.ts +15 -15
  640. package/src/transformers/ITransformOptions.ts +62 -62
  641. package/src/transformers/ImportTransformer.ts +66 -66
  642. package/src/transformers/NodeTransformer.ts +13 -13
  643. package/src/transformers/TransformerError.ts +55 -55
  644. package/src/transformers/features/AssertTransformer.ts +16 -19
  645. package/src/transformers/features/CreateAssertTransformer.ts +16 -19
  646. package/src/transformers/features/CreateIsTransformer.ts +10 -11
  647. package/src/transformers/features/CreateRandomTransformer.ts +40 -43
  648. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  649. package/src/transformers/features/IsTransformer.ts +10 -11
  650. package/src/transformers/features/RandomTransformer.ts +44 -46
  651. package/src/transformers/features/ValidateTransformer.ts +11 -11
  652. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +11 -12
  653. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +9 -12
  654. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +9 -9
  655. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +9 -9
  656. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +9 -9
  657. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +9 -9
  658. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +9 -9
  659. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +12 -12
  660. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +11 -12
  661. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +9 -10
  662. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +9 -10
  663. package/src/transformers/features/http/HttpHeadersTransformer.ts +9 -9
  664. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +9 -9
  665. package/src/transformers/features/http/HttpIsQueryTransformer.ts +9 -9
  666. package/src/transformers/features/http/HttpParameterTransformer.ts +9 -9
  667. package/src/transformers/features/http/HttpQueryTransformer.ts +9 -9
  668. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +10 -10
  669. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +9 -10
  670. package/src/transformers/features/json/JsonApplicationTransformer.ts +121 -121
  671. package/src/transformers/features/json/JsonAssertParseTransformer.ts +9 -10
  672. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  673. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +9 -12
  674. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  675. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  676. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +9 -12
  677. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  678. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +11 -12
  679. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  680. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  681. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +9 -10
  682. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  683. package/src/transformers/features/json/JsonValidateParseTransformer.ts +9 -10
  684. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  685. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +9 -10
  686. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +9 -10
  687. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  688. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +9 -12
  689. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +9 -12
  690. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  691. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  692. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  693. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  694. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +11 -12
  695. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +11 -12
  696. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  697. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  698. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  699. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  700. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +9 -10
  701. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +9 -10
  702. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +15 -15
  703. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +15 -15
  704. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +15 -15
  705. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +15 -15
  706. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +15 -17
  707. package/src/transformers/features/notations/NotationGeneralTransformer.ts +11 -11
  708. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +15 -15
  709. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +15 -17
  710. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  711. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  712. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +12 -12
  713. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +12 -12
  714. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +9 -9
  715. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +9 -9
  716. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +9 -12
  717. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +9 -12
  718. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +12 -12
  719. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +12 -12
  720. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +9 -10
  721. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +9 -10
  722. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +9 -10
  723. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +9 -10
  724. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  725. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +10 -12
  726. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +10 -12
  727. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +73 -78
  728. package/src/transformers/internal/GenericTransformer.ts +96 -104
  729. package/src/typings/Atomic.ts +13 -18
  730. package/src/typings/ClassProperties.ts +5 -5
  731. package/src/typings/Customizable.ts +5 -5
  732. package/src/typings/ProtobufAtomic.ts +19 -19
  733. package/src/typings/SpecialFields.ts +3 -3
  734. package/src/typings/ValidationPipe.ts +9 -9
  735. package/src/typings/Writable.ts +11 -11
  736. package/src/utils/ArrayUtil.ts +43 -45
  737. package/src/utils/Escaper.ts +46 -46
  738. package/src/utils/MapUtil.ts +12 -12
  739. package/src/utils/NameEncoder.ts +32 -32
  740. package/src/utils/NamingConvention.ts +87 -91
  741. package/src/utils/PatternUtil.ts +29 -33
  742. package/src/utils/RandomGenerator.ts +83 -83
  743. package/src/utils/Singleton.ts +16 -17
  744. package/src/utils/StringUtil.ts +4 -4
@@ -1,1138 +1,1025 @@
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 { StatementFactory } from "../factories/StatementFactory";
8
- import { TypeFactory } from "../factories/TypeFactory";
9
- import { ValueFactory } from "../factories/ValueFactory";
10
-
11
- import { Metadata } from "../schemas/metadata/Metadata";
12
- import { MetadataArray } from "../schemas/metadata/MetadataArray";
13
- import { MetadataObject } from "../schemas/metadata/MetadataObject";
14
- import { MetadataTuple } from "../schemas/metadata/MetadataTuple";
15
- import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
16
-
17
- import { IProject } from "../transformers/IProject";
18
- import { TransformerError } from "../transformers/TransformerError";
19
-
20
- import { FeatureProgrammer } from "./FeatureProgrammer";
21
- import { AtomicPredicator } from "./helpers/AtomicPredicator";
22
- import { FunctionImporter } from "./helpers/FunctionImporeter";
23
- import { ICheckEntry } from "./helpers/ICheckEntry";
24
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
25
- import { OptionPredicator } from "./helpers/OptionPredicator";
26
- import { UnionExplorer } from "./helpers/UnionExplorer";
27
- import { check_array_length } from "./internal/check_array_length";
28
- import { check_bigint } from "./internal/check_bigint";
29
- import { check_native } from "./internal/check_native";
30
- import { check_number } from "./internal/check_number";
31
- import { check_string } from "./internal/check_string";
32
- import { check_template } from "./internal/check_template";
33
- import { decode_union_object } from "./internal/decode_union_object";
34
- import { wrap_metadata_rest_tuple } from "./internal/wrap_metadata_rest_tuple";
35
-
36
- export namespace CheckerProgrammer {
37
- export interface IConfig {
38
- prefix: string;
39
- path: boolean;
40
- trace: boolean;
41
- equals: boolean;
42
- numeric: boolean;
43
- addition?: () => ts.Statement[];
44
- decoder?: () => FeatureProgrammer.Decoder<Metadata, ts.Expression>;
45
- combiner: IConfig.Combiner;
46
- atomist: (
47
- explore: IExplore,
48
- ) => (check: ICheckEntry) => (input: ts.Expression) => ts.Expression;
49
- joiner: IConfig.IJoiner;
50
- success: ts.Expression;
51
- }
52
- export namespace IConfig {
53
- export interface Combiner {
54
- (explorer: IExplore): {
55
- (logic: "and" | "or"): {
56
- (
57
- input: ts.Expression,
58
- binaries: IBinary[],
59
- expected: string,
60
- ): ts.Expression;
61
- };
62
- };
63
- }
64
- export interface IJoiner {
65
- object(
66
- input: ts.Expression,
67
- entries: IExpressionEntry[],
68
- ): ts.Expression;
69
- array(input: ts.Expression, arrow: ts.ArrowFunction): ts.Expression;
70
- tuple?: undefined | ((exprs: ts.Expression[]) => ts.Expression);
71
-
72
- failure(
73
- value: ts.Expression,
74
- expected: string,
75
- explore?: undefined | FeatureProgrammer.IExplore,
76
- ): ts.Expression;
77
- is?(expression: ts.Expression): ts.Expression;
78
- required?(exp: ts.Expression): ts.Expression;
79
- full?:
80
- | undefined
81
- | ((
82
- condition: ts.Expression,
83
- ) => (
84
- input: ts.Expression,
85
- expected: string,
86
- explore: IExplore,
87
- ) => ts.Expression);
88
- }
89
- }
90
- export type IExplore = FeatureProgrammer.IExplore;
91
-
92
- export interface IBinary {
93
- expression: ts.Expression;
94
- combined: boolean;
95
- }
96
-
97
- /* -----------------------------------------------------------
98
- WRITERS
99
- ----------------------------------------------------------- */
100
- export const write =
101
- (project: IProject) =>
102
- (config: IConfig) =>
103
- (importer: FunctionImporter) =>
104
- FeatureProgrammer.write(project)(
105
- configure(project)(config)(importer),
106
- )(importer);
107
-
108
- export const write_object_functions =
109
- (project: IProject) =>
110
- (config: IConfig) =>
111
- (importer: FunctionImporter) =>
112
- FeatureProgrammer.write_object_functions(
113
- configure(project)(config)(importer),
114
- )(importer);
115
-
116
- export const write_union_functions =
117
- (project: IProject) =>
118
- (config: IConfig) =>
119
- (importer: FunctionImporter) =>
120
- FeatureProgrammer.write_union_functions(
121
- configure(project)({ ...config, numeric: false })(importer),
122
- );
123
-
124
- export const write_array_functions =
125
- (project: IProject) =>
126
- (config: IConfig) =>
127
- (importer: FunctionImporter) =>
128
- (collection: MetadataCollection): ts.VariableStatement[] =>
129
- collection
130
- .arrays()
131
- .filter((a) => a.recursive)
132
- .map((type, i) =>
133
- StatementFactory.constant(
134
- `${config.prefix}a${i}`,
135
- ts.factory.createArrowFunction(
136
- undefined,
137
- undefined,
138
- FeatureProgrammer.parameterDeclarations(config)(
139
- TypeFactory.keyword("any"),
140
- )(ts.factory.createIdentifier("input")),
141
- TypeFactory.keyword("any"),
142
- undefined,
143
- decode_array_inline(project)(config)(importer)(
144
- ts.factory.createIdentifier("input"),
145
- MetadataArray.create({
146
- type,
147
- tags: [],
148
- }),
149
- {
150
- tracable: config.trace,
151
- source: "function",
152
- from: "array",
153
- postfix: "",
154
- },
155
- ),
156
- ),
157
- ),
158
- );
159
-
160
- export const write_tuple_functions =
161
- (project: IProject) =>
162
- (config: IConfig) =>
163
- (importer: FunctionImporter) =>
164
- (collection: MetadataCollection): ts.VariableStatement[] =>
165
- collection
166
- .tuples()
167
- .filter((t) => t.recursive)
168
- .map((tuple, i) =>
169
- StatementFactory.constant(
170
- `${config.prefix}t${i}`,
171
- ts.factory.createArrowFunction(
172
- undefined,
173
- undefined,
174
- FeatureProgrammer.parameterDeclarations(config)(
175
- TypeFactory.keyword("any"),
176
- )(ts.factory.createIdentifier("input")),
177
- TypeFactory.keyword("any"),
178
- undefined,
179
- decode_tuple_inline(project)(config)(importer)(
180
- ts.factory.createIdentifier("input"),
181
- tuple,
182
- {
183
- tracable: config.trace,
184
- source: "function",
185
- from: "array",
186
- postfix: "",
187
- },
188
- ),
189
- ),
190
- ),
191
- );
192
-
193
- const configure =
194
- (project: IProject) =>
195
- (config: IConfig) =>
196
- (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
197
- types: {
198
- input: () => TypeFactory.keyword("any"),
199
- output: (type, name) =>
200
- ts.factory.createTypePredicateNode(
201
- undefined,
202
- "input",
203
- ts.factory.createTypeReferenceNode(
204
- name ??
205
- TypeFactory.getFullName(project.checker)(type),
206
- ),
207
- ),
208
- },
209
- trace: config.trace,
210
- path: config.path,
211
- prefix: config.prefix,
212
- initializer: (project) => (importer) => (type) => {
213
- const collection: MetadataCollection = new MetadataCollection();
214
- const result = MetadataFactory.analyze(
215
- project.checker,
216
- project.context,
217
- )({
218
- escape: false,
219
- constant: true,
220
- absorb: true,
221
- })(collection)(type);
222
- if (result.success === false)
223
- throw TransformerError.from(`typia.${importer.method}`)(
224
- result.errors,
225
- );
226
- return [collection, result.data];
227
- },
228
- addition: config.addition,
229
- decoder: () =>
230
- config.decoder?.() ?? decode(project)(config)(importer),
231
- objector: {
232
- checker: () =>
233
- config.decoder?.() ?? decode(project)(config)(importer),
234
- decoder: () => decode_object(config)(importer),
235
- joiner: config.joiner.object,
236
- unionizer: config.equals
237
- ? decode_union_object(decode_object(config)(importer))(
238
- (input, obj, explore) =>
239
- decode_object(config)(importer)(input, obj, {
240
- ...explore,
241
- tracable: true,
242
- }),
243
- )(config.joiner.is ?? ((expr) => expr))(
244
- (value, expected) =>
245
- ts.factory.createReturnStatement(
246
- config.joiner.failure(value, expected),
247
- ),
248
- )
249
- : (input, targets, explore) =>
250
- config.combiner(explore)("or")(
251
- input,
252
- targets.map((obj) => ({
253
- expression: decode_object(config)(importer)(
254
- input,
255
- obj,
256
- explore,
257
- ),
258
- combined: true,
259
- })),
260
- `(${targets.map((t) => t.name).join(" | ")})`,
261
- ),
262
- failure: (value, expected) =>
263
- ts.factory.createReturnStatement(
264
- config.joiner.failure(value, expected),
265
- ),
266
- is: config.joiner.is,
267
- required: config.joiner.required,
268
- full: config.joiner.full,
269
- type: TypeFactory.keyword("boolean"),
270
- },
271
- generator: {
272
- unions: config.numeric
273
- ? () =>
274
- FeatureProgrammer.write_union_functions(
275
- configure(project)({ ...config, numeric: false })(
276
- importer,
277
- ),
278
- )
279
- : undefined,
280
- arrays: () => write_array_functions(project)(config)(importer),
281
- tuples: () => write_tuple_functions(project)(config)(importer),
282
- },
283
- });
284
-
285
- /* -----------------------------------------------------------
286
- DECODERS
287
- ----------------------------------------------------------- */
288
- /**
289
- * @internal
290
- */
291
- export const decode =
292
- (project: IProject) =>
293
- (config: IConfig) =>
294
- (importer: FunctionImporter) =>
295
- (
296
- input: ts.Expression,
297
- meta: Metadata,
298
- explore: IExplore,
299
- ): ts.Expression => {
300
- if (meta.any) return config.success;
301
-
302
- const top: IBinary[] = [];
303
- const binaries: IBinary[] = [];
304
- const add = create_add(binaries)(input);
305
- const getConstantValue = (
306
- value: number | string | bigint | boolean,
307
- ) => {
308
- if (typeof value === "string")
309
- return ts.factory.createStringLiteral(value);
310
- else if (typeof value === "bigint")
311
- return ExpressionFactory.bigint(value);
312
- return ts.factory.createIdentifier(value.toString());
313
- };
314
-
315
- //----
316
- // CHECK OPTIONAL
317
- //----
318
- // @todo -> should be elaborated
319
- const checkOptional: boolean = meta.empty() || meta.isUnionBucket();
320
-
321
- // NULLABLE
322
- if (checkOptional || meta.nullable)
323
- (meta.nullable ? add : create_add(top)(input))(
324
- meta.nullable,
325
- ValueFactory.NULL(),
326
- );
327
-
328
- // UNDEFINDABLE
329
- if (checkOptional || !meta.isRequired())
330
- (meta.isRequired() ? create_add(top)(input) : add)(
331
- !meta.isRequired(),
332
- ValueFactory.UNDEFINED(),
333
- );
334
-
335
- // FUNCTIONAL
336
- if (meta.functional === true)
337
- if (
338
- OptionPredicator.functional(project.options) ||
339
- meta.size() !== 1
340
- )
341
- add(
342
- true,
343
- ts.factory.createStringLiteral("function"),
344
- ValueFactory.TYPEOF(input),
345
- );
346
- else
347
- binaries.push({
348
- combined: false,
349
- expression: config.success,
350
- });
351
-
352
- //----
353
- // VALUES
354
- //----
355
- // CONSTANT VALUES
356
- for (const constant of meta.constants)
357
- if (AtomicPredicator.constant(meta)(constant.type))
358
- for (const val of constant.values)
359
- add(true, getConstantValue(val));
360
-
361
- // ATOMIC VALUES
362
- for (const atom of meta.atomics)
363
- if (AtomicPredicator.atomic(meta)(atom.type) === false)
364
- continue;
365
- else if (atom.type === "number")
366
- binaries.push({
367
- expression: config.atomist(explore)(
368
- check_number(project, config.numeric)(atom)(input),
369
- )(input),
370
- combined: false,
371
- });
372
- else if (atom.type === "bigint")
373
- binaries.push({
374
- expression: config.atomist(explore)(
375
- check_bigint(project)(atom)(input),
376
- )(input),
377
- combined: false,
378
- });
379
- else if (atom.type === "string")
380
- binaries.push({
381
- expression: config.atomist(explore)(
382
- check_string(project)(atom)(input),
383
- )(input),
384
- combined: false,
385
- });
386
- else
387
- add(
388
- true,
389
- ts.factory.createStringLiteral(atom.type),
390
- ValueFactory.TYPEOF(input),
391
- );
392
-
393
- // TEMPLATE LITERAL VALUES
394
- if (meta.templates.length)
395
- if (AtomicPredicator.template(meta))
396
- binaries.push({
397
- expression: config.atomist(explore)(
398
- check_template(meta.templates)(input),
399
- )(input),
400
- combined: false,
401
- });
402
-
403
- // NATIVE CLASSES
404
- for (const native of meta.natives)
405
- binaries.push({
406
- expression: check_native(native)(input),
407
- combined: false,
408
- });
409
-
410
- //----
411
- // INSTANCES
412
- //----
413
- interface IInstance {
414
- pre: ts.Expression;
415
- body: ts.Expression | null;
416
- expected: string;
417
- }
418
- const instances: IInstance[] = [];
419
- const prepare =
420
- (pre: ts.Expression, expected: string) =>
421
- (body: ts.Expression | null) =>
422
- instances.push({
423
- pre,
424
- expected,
425
- body,
426
- });
427
-
428
- // SETS
429
- if (meta.sets.length) {
430
- const install = prepare(
431
- check_native("Set")(input),
432
- meta.sets
433
- .map((elem) => `Set<${elem.getName()}>`)
434
- .join(" | "),
435
- );
436
- if (meta.sets.some((elem) => elem.any)) install(null);
437
- else
438
- install(
439
- explore_sets(project)(config)(importer)(
440
- input,
441
- meta.sets,
442
- {
443
- ...explore,
444
- from: "array",
445
- },
446
- ),
447
- );
448
- }
449
-
450
- // MAPS
451
- if (meta.maps.length) {
452
- const install = prepare(
453
- check_native("Map")(input),
454
- meta.maps
455
- .map(({ key, value }) => `Map<${key}, ${value}>`)
456
- .join(" | "),
457
- );
458
- if (meta.maps.some((elem) => elem.key.any && elem.value.any))
459
- install(null);
460
- else
461
- install(
462
- explore_maps(project)(config)(importer)(
463
- input,
464
- meta.maps,
465
- {
466
- ...explore,
467
- from: "array",
468
- },
469
- ),
470
- );
471
- }
472
-
473
- // ARRAYS AND TUPLES
474
- if (meta.tuples.length + meta.arrays.length > 0) {
475
- const install = prepare(
476
- config.atomist(explore)({
477
- expected: [
478
- ...meta.tuples.map((t) => t.type.name),
479
- ...meta.arrays.map((a) => a.getName()),
480
- ].join(" | "),
481
- expression: ExpressionFactory.isArray(input),
482
- conditions: [],
483
- })(input),
484
- [...meta.tuples, ...meta.arrays]
485
- .map((elem) => elem.type.name)
486
- .join(" | "),
487
- );
488
- if (meta.arrays.length === 0)
489
- if (meta.tuples.length === 1)
490
- install(
491
- decode_tuple(project)(config)(importer)(
492
- input,
493
- meta.tuples[0]!,
494
- {
495
- ...explore,
496
- from: "array",
497
- },
498
- ),
499
- );
500
- // TUPLE ONLY
501
- else
502
- install(
503
- explore_tuples(project)(config)(importer)(
504
- input,
505
- meta.tuples,
506
- {
507
- ...explore,
508
- from: "array",
509
- },
510
- ),
511
- );
512
- else if (meta.arrays.some((elem) => elem.type.value.any))
513
- install(null);
514
- else if (meta.tuples.length === 0)
515
- if (meta.arrays.length === 1)
516
- // ARRAY ONLY
517
- install(
518
- decode_array(project)(config)(importer)(
519
- input,
520
- meta.arrays[0]!,
521
- {
522
- ...explore,
523
- from: "array",
524
- },
525
- ),
526
- );
527
- else
528
- install(
529
- explore_arrays(project)(config)(importer)(
530
- input,
531
- meta.arrays,
532
- {
533
- ...explore,
534
- from: "array",
535
- },
536
- ),
537
- );
538
- else
539
- install(
540
- explore_arrays_and_tuples(project)(config)(importer)(
541
- input,
542
- [...meta.tuples, ...meta.arrays],
543
- explore,
544
- ),
545
- );
546
- }
547
-
548
- // OBJECT
549
- if (meta.objects.length > 0)
550
- prepare(
551
- ExpressionFactory.isObject({
552
- checkNull: true,
553
- checkArray: meta.objects.some((obj) =>
554
- obj.properties.every(
555
- (prop) =>
556
- !prop.key.isSoleLiteral() ||
557
- !prop.value.isRequired(),
558
- ),
559
- ),
560
- })(input),
561
- meta.objects.map((obj) => obj.name).join(" | "),
562
- )(
563
- explore_objects(config)(importer)(input, meta, {
564
- ...explore,
565
- from: "object",
566
- }),
567
- );
568
-
569
- if (instances.length) {
570
- const transformer =
571
- (
572
- merger: (
573
- x: ts.Expression,
574
- y: ts.Expression,
575
- ) => ts.Expression,
576
- ) =>
577
- (ins: IInstance) =>
578
- ins.body
579
- ? {
580
- expression: merger(ins.pre, ins.body),
581
- combined: true,
582
- }
583
- : {
584
- expression: ins.pre,
585
- combined: false,
586
- };
587
- if (instances.length === 1)
588
- binaries.push(
589
- transformer((pre, body) =>
590
- config.combiner(explore)("and")(
591
- input,
592
- [pre, body].map((expression) => ({
593
- expression,
594
- combined: expression !== pre,
595
- })),
596
- meta.getName(),
597
- ),
598
- )(instances[0]!),
599
- );
600
- else
601
- binaries.push({
602
- expression: config.combiner(explore)("or")(
603
- input,
604
- instances.map(
605
- transformer(ts.factory.createLogicalAnd),
606
- ),
607
- meta.getName(),
608
- ),
609
- combined: true,
610
- });
611
- }
612
-
613
- //----
614
- // COMBINE CONDITIONS
615
- //----
616
- return top.length && binaries.length
617
- ? config.combiner(explore)("and")(
618
- input,
619
- [
620
- ...top,
621
- {
622
- expression: config.combiner(explore)("or")(
623
- input,
624
- binaries,
625
- meta.getName(),
626
- ),
627
- combined: true,
628
- },
629
- ],
630
- meta.getName(),
631
- )
632
- : binaries.length
633
- ? config.combiner(explore)("or")(
634
- input,
635
- binaries,
636
- meta.getName(),
637
- )
638
- : config.success;
639
- };
640
-
641
- export const decode_object =
642
- (config: IConfig) => (importer: FunctionImporter) => {
643
- const func = FeatureProgrammer.decode_object(config)(importer);
644
- return (
645
- input: ts.Expression,
646
- obj: MetadataObject,
647
- explore: IExplore,
648
- ) => {
649
- obj.validated = true;
650
- return func(input, obj, explore);
651
- };
652
- };
653
-
654
- const decode_array =
655
- (project: IProject) =>
656
- (config: IConfig) =>
657
- (importer: FunctionImporter) =>
658
- (input: ts.Expression, array: MetadataArray, explore: IExplore) => {
659
- if (array.type.recursive === false)
660
- return decode_array_inline(project)(config)(importer)(
661
- input,
662
- array,
663
- explore,
664
- );
665
-
666
- explore = {
667
- ...explore,
668
- source: "function",
669
- from: "array",
670
- };
671
- return ts.factory.createLogicalOr(
672
- ts.factory.createCallExpression(
673
- ts.factory.createIdentifier(
674
- importer.useLocal(
675
- `${config.prefix}a${array.type.index}`,
676
- ),
677
- ),
678
- undefined,
679
- FeatureProgrammer.argumentsArray(config)({
680
- ...explore,
681
- source: "function",
682
- from: "array",
683
- })(input),
684
- ),
685
- config.joiner.failure(input, array.type.name, explore),
686
- );
687
- };
688
-
689
- const decode_array_inline =
690
- (project: IProject) =>
691
- (config: IConfig) =>
692
- (importer: FunctionImporter) =>
693
- (
694
- input: ts.Expression,
695
- array: MetadataArray,
696
- explore: IExplore,
697
- ): ts.Expression => {
698
- const length = check_array_length(project)(array)(input);
699
- const main = FeatureProgrammer.decode_array({
700
- prefix: config.prefix,
701
- trace: config.trace,
702
- path: config.path,
703
- decoder: () => decode(project)(config)(importer),
704
- })(importer)(config.joiner.array)(input, array, explore);
705
- return length.expression === null && length.conditions.length === 0
706
- ? main
707
- : ts.factory.createLogicalAnd(
708
- config.atomist(explore)(length)(input),
709
- main,
710
- );
711
- };
712
-
713
- const decode_tuple =
714
- (project: IProject) =>
715
- (config: IConfig) =>
716
- (importer: FunctionImporter) =>
717
- (
718
- input: ts.Expression,
719
- tuple: MetadataTuple,
720
- explore: IExplore,
721
- ): ts.Expression => {
722
- if (tuple.type.recursive === false)
723
- return decode_tuple_inline(project)(config)(importer)(
724
- input,
725
- tuple.type,
726
- explore,
727
- );
728
- explore = {
729
- ...explore,
730
- source: "function",
731
- from: "array",
732
- };
733
- return ts.factory.createLogicalOr(
734
- ts.factory.createCallExpression(
735
- ts.factory.createIdentifier(
736
- importer.useLocal(
737
- `${config.prefix}t${tuple.type.index}`,
738
- ),
739
- ),
740
- undefined,
741
- FeatureProgrammer.argumentsArray(config)({
742
- ...explore,
743
- source: "function",
744
- })(input),
745
- ),
746
- config.joiner.failure(input, tuple.type.name, explore),
747
- );
748
- };
749
-
750
- const decode_tuple_inline =
751
- (project: IProject) =>
752
- (config: IConfig) =>
753
- (importer: FunctionImporter) =>
754
- (
755
- input: ts.Expression,
756
- tuple: MetadataTupleType,
757
- explore: IExplore,
758
- ): ts.Expression => {
759
- const binaries: ts.Expression[] = tuple.elements
760
- .filter((meta) => meta.rest === null)
761
- .map((meta, index) =>
762
- decode(project)(config)(importer)(
763
- ts.factory.createElementAccessExpression(input, index),
764
- meta,
765
- {
766
- ...explore,
767
- from: "array",
768
- postfix: explore.postfix.length
769
- ? `${explore.postfix.slice(0, -1)}[${index}]"`
770
- : `"[${index}]"`,
771
- },
772
- ),
773
- );
774
- const rest: ts.Expression | null =
775
- tuple.elements.length && tuple.elements.at(-1)!.rest !== null
776
- ? decode(project)(config)(importer)(
777
- ts.factory.createCallExpression(
778
- IdentifierFactory.access(input)("slice"),
779
- undefined,
780
- [
781
- ExpressionFactory.number(
782
- tuple.elements.length - 1,
783
- ),
784
- ],
785
- ),
786
- wrap_metadata_rest_tuple(
787
- tuple.elements.at(-1)!.rest!,
788
- ),
789
- {
790
- ...explore,
791
- start: tuple.elements.length - 1,
792
- },
793
- )
794
- : null;
795
-
796
- const arrayLength = ts.factory.createPropertyAccessExpression(
797
- input,
798
- "length",
799
- );
800
- return config.combiner(explore)("and")(
801
- input,
802
- [
803
- ...(rest === null
804
- ? tuple.elements.every((t) => t.optional === false)
805
- ? [
806
- {
807
- combined: false,
808
- expression:
809
- ts.factory.createStrictEquality(
810
- arrayLength,
811
- ExpressionFactory.number(
812
- tuple.elements.length,
813
- ),
814
- ),
815
- },
816
- ]
817
- : [
818
- {
819
- combined: false,
820
- expression: ts.factory.createLogicalAnd(
821
- ts.factory.createLessThanEquals(
822
- ExpressionFactory.number(
823
- tuple.elements.filter(
824
- (t) =>
825
- t.optional === false,
826
- ).length,
827
- ),
828
- arrayLength,
829
- ),
830
- ts.factory.createGreaterThanEquals(
831
- ExpressionFactory.number(
832
- tuple.elements.length,
833
- ),
834
- arrayLength,
835
- ),
836
- ),
837
- },
838
- ]
839
- : []),
840
- ...(config.joiner.tuple
841
- ? [
842
- {
843
- expression: config.joiner.tuple(binaries),
844
- combined: true,
845
- },
846
- ]
847
- : binaries.map((expression) => ({
848
- expression,
849
- combined: true,
850
- }))),
851
- ...(rest !== null
852
- ? [
853
- {
854
- expression: rest,
855
- combined: true,
856
- },
857
- ]
858
- : []),
859
- ],
860
- `[${tuple.elements.map((t) => t.getName()).join(", ")}]`,
861
- );
862
- };
863
-
864
- /* -----------------------------------------------------------
865
- UNION TYPE EXPLORERS
866
- ----------------------------------------------------------- */
867
- const explore_sets =
868
- (project: IProject) =>
869
- (config: IConfig) =>
870
- (importer: FunctionImporter) =>
871
- (
872
- input: ts.Expression,
873
- sets: Metadata[],
874
- explore: IExplore,
875
- ): ts.Expression =>
876
- ts.factory.createCallExpression(
877
- UnionExplorer.set({
878
- checker: decode(project)(config)(importer),
879
- decoder: decode_array(project)(config)(importer),
880
- empty: config.success,
881
- success: config.success,
882
- failure: (input, expected, explore) =>
883
- ts.factory.createReturnStatement(
884
- config.joiner.failure(input, expected, explore),
885
- ),
886
- })([])(input, sets, explore),
887
- undefined,
888
- undefined,
889
- );
890
-
891
- const explore_maps =
892
- (project: IProject) =>
893
- (config: IConfig) =>
894
- (importer: FunctionImporter) =>
895
- (
896
- input: ts.Expression,
897
- maps: Metadata.Entry[],
898
- explore: IExplore,
899
- ): ts.Expression =>
900
- ts.factory.createCallExpression(
901
- UnionExplorer.map({
902
- checker: (input, entry, explore) => {
903
- const func = decode(project)(config)(importer);
904
- return ts.factory.createLogicalAnd(
905
- func(
906
- ts.factory.createElementAccessExpression(
907
- input,
908
- 0,
909
- ),
910
- entry[0],
911
- {
912
- ...explore,
913
- postfix: `${explore.postfix}[0]`,
914
- },
915
- ),
916
- func(
917
- ts.factory.createElementAccessExpression(
918
- input,
919
- 1,
920
- ),
921
- entry[1],
922
- {
923
- ...explore,
924
- postfix: `${explore.postfix}[1]`,
925
- },
926
- ),
927
- );
928
- },
929
- decoder: decode_array(project)(config)(importer),
930
- empty: config.success,
931
- success: config.success,
932
- failure: (input, expected, explore) =>
933
- ts.factory.createReturnStatement(
934
- config.joiner.failure(input, expected, explore),
935
- ),
936
- })([])(input, maps, explore),
937
- undefined,
938
- undefined,
939
- );
940
-
941
- const explore_tuples =
942
- (project: IProject) =>
943
- (config: IConfig) =>
944
- (importer: FunctionImporter) =>
945
- (
946
- input: ts.Expression,
947
- tuples: MetadataTuple[],
948
- explore: IExplore,
949
- ): ts.Expression =>
950
- explore_array_like_union_types(config)(importer)(
951
- UnionExplorer.tuple({
952
- checker: decode_tuple(project)(config)(importer),
953
- decoder: decode_tuple(project)(config)(importer),
954
- empty: config.success,
955
- success: config.success,
956
- failure: (input, expected, explore) =>
957
- ts.factory.createReturnStatement(
958
- config.joiner.failure(input, expected, explore),
959
- ),
960
- }),
961
- )(input, tuples, explore);
962
-
963
- const explore_arrays =
964
- (project: IProject) =>
965
- (config: IConfig) =>
966
- (importer: FunctionImporter) =>
967
- (
968
- input: ts.Expression,
969
- arrays: MetadataArray[],
970
- explore: IExplore,
971
- ): ts.Expression =>
972
- explore_array_like_union_types(config)(importer)(
973
- UnionExplorer.array({
974
- checker: decode(project)(config)(importer),
975
- decoder: decode_array(project)(config)(importer),
976
- empty: config.success,
977
- success: config.success,
978
- failure: (input, expected, explore) =>
979
- ts.factory.createReturnStatement(
980
- config.joiner.failure(input, expected, explore),
981
- ),
982
- }),
983
- )(input, arrays, explore);
984
-
985
- const explore_arrays_and_tuples =
986
- (project: IProject) =>
987
- (config: IConfig) =>
988
- (importer: FunctionImporter) =>
989
- (
990
- input: ts.Expression,
991
- elements: Array<MetadataArray | MetadataTuple>,
992
- explore: IExplore,
993
- ): ts.Expression =>
994
- explore_array_like_union_types(config)(importer)(
995
- UnionExplorer.array_or_tuple({
996
- checker: (front, target, explore, array) =>
997
- target instanceof MetadataTuple
998
- ? decode_tuple(project)(config)(importer)(
999
- front,
1000
- target,
1001
- explore,
1002
- )
1003
- : config.atomist(explore)({
1004
- expected: elements
1005
- .map((elem) =>
1006
- elem instanceof MetadataArray
1007
- ? elem.getName()
1008
- : elem.type.name,
1009
- )
1010
- .join(" | "),
1011
- expression: decode(project)(config)(importer)(
1012
- front,
1013
- target,
1014
- explore,
1015
- ),
1016
- conditions: [],
1017
- })(array),
1018
- decoder: (input, target, explore) =>
1019
- target instanceof MetadataTuple
1020
- ? decode_tuple(project)(config)(importer)(
1021
- input,
1022
- target,
1023
- explore,
1024
- )
1025
- : decode_array(project)(config)(importer)(
1026
- input,
1027
- target,
1028
- explore,
1029
- ),
1030
- empty: config.success,
1031
- success: config.success,
1032
- failure: (input, expected, explore) =>
1033
- ts.factory.createReturnStatement(
1034
- config.joiner.failure(input, expected, explore),
1035
- ),
1036
- }),
1037
- )(input, elements, explore);
1038
-
1039
- const explore_array_like_union_types =
1040
- (config: IConfig) =>
1041
- (importer: FunctionImporter) =>
1042
- <T extends MetadataArray | MetadataTuple>(
1043
- factory: (
1044
- parameters: ts.ParameterDeclaration[],
1045
- ) => (
1046
- input: ts.Expression,
1047
- elements: T[],
1048
- explore: IExplore,
1049
- ) => ts.ArrowFunction,
1050
- ) =>
1051
- (
1052
- input: ts.Expression,
1053
- elements: T[],
1054
- explore: IExplore,
1055
- ): ts.Expression => {
1056
- const arrow =
1057
- (parameters: ts.ParameterDeclaration[]) =>
1058
- (explore: IExplore) =>
1059
- (input: ts.Expression): ts.ArrowFunction =>
1060
- factory(parameters)(input, elements, explore);
1061
- if (elements.every((e) => e.type.recursive === false))
1062
- ts.factory.createCallExpression(
1063
- arrow([])(explore)(input),
1064
- undefined,
1065
- [],
1066
- );
1067
- explore = {
1068
- ...explore,
1069
- source: "function",
1070
- from: "array",
1071
- };
1072
- return ts.factory.createLogicalOr(
1073
- ts.factory.createCallExpression(
1074
- ts.factory.createIdentifier(
1075
- importer.emplaceUnion(
1076
- config.prefix,
1077
- elements.map((e) => e.type.name).join(" | "),
1078
- () =>
1079
- arrow(
1080
- FeatureProgrammer.parameterDeclarations(
1081
- config,
1082
- )(TypeFactory.keyword("any"))(
1083
- ts.factory.createIdentifier("input"),
1084
- ),
1085
- )({
1086
- ...explore,
1087
- postfix: "",
1088
- })(ts.factory.createIdentifier("input")),
1089
- ),
1090
- ),
1091
- undefined,
1092
- FeatureProgrammer.argumentsArray(config)(explore)(input),
1093
- ),
1094
- config.joiner.failure(
1095
- input,
1096
- elements.map((e) => e.type.name).join(" | "),
1097
- explore,
1098
- ),
1099
- );
1100
- };
1101
-
1102
- const explore_objects =
1103
- (config: IConfig) =>
1104
- (importer: FunctionImporter) =>
1105
- (input: ts.Expression, meta: Metadata, explore: IExplore) =>
1106
- meta.objects.length === 1
1107
- ? decode_object(config)(importer)(
1108
- input,
1109
- meta.objects[0]!,
1110
- explore,
1111
- )
1112
- : ts.factory.createCallExpression(
1113
- ts.factory.createIdentifier(
1114
- importer.useLocal(
1115
- `${config.prefix}u${meta.union_index!}`,
1116
- ),
1117
- ),
1118
- undefined,
1119
- FeatureProgrammer.argumentsArray(config)(explore)(input),
1120
- );
1121
- }
1122
-
1123
- const create_add =
1124
- (binaries: CheckerProgrammer.IBinary[]) =>
1125
- (defaultInput: ts.Expression) =>
1126
- (
1127
- exact: boolean,
1128
- left: ts.Expression,
1129
- right: ts.Expression = defaultInput,
1130
- ) => {
1131
- const factory = exact
1132
- ? ts.factory.createStrictEquality
1133
- : ts.factory.createStrictInequality;
1134
- binaries.push({
1135
- expression: factory(left, right),
1136
- combined: false,
1137
- });
1138
- };
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 { StatementFactory } from "../factories/StatementFactory";
8
+ import { TypeFactory } from "../factories/TypeFactory";
9
+ import { ValueFactory } from "../factories/ValueFactory";
10
+
11
+ import { Metadata } from "../schemas/metadata/Metadata";
12
+ import { MetadataArray } from "../schemas/metadata/MetadataArray";
13
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
14
+ import { MetadataTuple } from "../schemas/metadata/MetadataTuple";
15
+ import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
16
+
17
+ import { IProject } from "../transformers/IProject";
18
+ import { TransformerError } from "../transformers/TransformerError";
19
+
20
+ import { FeatureProgrammer } from "./FeatureProgrammer";
21
+ import { AtomicPredicator } from "./helpers/AtomicPredicator";
22
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
23
+ import { ICheckEntry } from "./helpers/ICheckEntry";
24
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
25
+ import { OptionPredicator } from "./helpers/OptionPredicator";
26
+ import { UnionExplorer } from "./helpers/UnionExplorer";
27
+ import { check_array_length } from "./internal/check_array_length";
28
+ import { check_bigint } from "./internal/check_bigint";
29
+ import { check_native } from "./internal/check_native";
30
+ import { check_number } from "./internal/check_number";
31
+ import { check_string } from "./internal/check_string";
32
+ import { check_template } from "./internal/check_template";
33
+ import { decode_union_object } from "./internal/decode_union_object";
34
+ import { wrap_metadata_rest_tuple } from "./internal/wrap_metadata_rest_tuple";
35
+
36
+ export namespace CheckerProgrammer {
37
+ export interface IConfig {
38
+ prefix: string;
39
+ path: boolean;
40
+ trace: boolean;
41
+ equals: boolean;
42
+ numeric: boolean;
43
+ addition?: () => ts.Statement[];
44
+ decoder?: () => FeatureProgrammer.Decoder<Metadata, ts.Expression>;
45
+ combiner: IConfig.Combiner;
46
+ atomist: (
47
+ explore: IExplore,
48
+ ) => (check: ICheckEntry) => (input: ts.Expression) => ts.Expression;
49
+ joiner: IConfig.IJoiner;
50
+ success: ts.Expression;
51
+ }
52
+ export namespace IConfig {
53
+ export interface Combiner {
54
+ (explorer: IExplore): {
55
+ (logic: "and" | "or"): {
56
+ (
57
+ input: ts.Expression,
58
+ binaries: IBinary[],
59
+ expected: string,
60
+ ): ts.Expression;
61
+ };
62
+ };
63
+ }
64
+ export interface IJoiner {
65
+ object(input: ts.Expression, entries: IExpressionEntry[]): ts.Expression;
66
+ array(input: ts.Expression, arrow: ts.ArrowFunction): ts.Expression;
67
+ tuple?: undefined | ((exprs: ts.Expression[]) => ts.Expression);
68
+
69
+ failure(
70
+ value: ts.Expression,
71
+ expected: string,
72
+ explore?: undefined | FeatureProgrammer.IExplore,
73
+ ): ts.Expression;
74
+ is?(expression: ts.Expression): ts.Expression;
75
+ required?(exp: ts.Expression): ts.Expression;
76
+ full?:
77
+ | undefined
78
+ | ((
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) => (config: IConfig) => (importer: FunctionImporter) =>
99
+ FeatureProgrammer.write(project)(configure(project)(config)(importer))(
100
+ importer,
101
+ );
102
+
103
+ export const write_object_functions =
104
+ (project: IProject) => (config: IConfig) => (importer: FunctionImporter) =>
105
+ FeatureProgrammer.write_object_functions(
106
+ configure(project)(config)(importer),
107
+ )(importer);
108
+
109
+ export const write_union_functions =
110
+ (project: IProject) => (config: IConfig) => (importer: FunctionImporter) =>
111
+ FeatureProgrammer.write_union_functions(
112
+ configure(project)({ ...config, numeric: false })(importer),
113
+ );
114
+
115
+ export const write_array_functions =
116
+ (project: IProject) =>
117
+ (config: IConfig) =>
118
+ (importer: FunctionImporter) =>
119
+ (collection: MetadataCollection): ts.VariableStatement[] =>
120
+ collection
121
+ .arrays()
122
+ .filter((a) => a.recursive)
123
+ .map((type, i) =>
124
+ StatementFactory.constant(
125
+ `${config.prefix}a${i}`,
126
+ ts.factory.createArrowFunction(
127
+ undefined,
128
+ undefined,
129
+ FeatureProgrammer.parameterDeclarations(config)(
130
+ TypeFactory.keyword("any"),
131
+ )(ts.factory.createIdentifier("input")),
132
+ TypeFactory.keyword("any"),
133
+ undefined,
134
+ decode_array_inline(project)(config)(importer)(
135
+ ts.factory.createIdentifier("input"),
136
+ MetadataArray.create({
137
+ type,
138
+ tags: [],
139
+ }),
140
+ {
141
+ tracable: config.trace,
142
+ source: "function",
143
+ from: "array",
144
+ postfix: "",
145
+ },
146
+ ),
147
+ ),
148
+ ),
149
+ );
150
+
151
+ export const write_tuple_functions =
152
+ (project: IProject) =>
153
+ (config: IConfig) =>
154
+ (importer: FunctionImporter) =>
155
+ (collection: MetadataCollection): ts.VariableStatement[] =>
156
+ collection
157
+ .tuples()
158
+ .filter((t) => t.recursive)
159
+ .map((tuple, i) =>
160
+ StatementFactory.constant(
161
+ `${config.prefix}t${i}`,
162
+ ts.factory.createArrowFunction(
163
+ undefined,
164
+ undefined,
165
+ FeatureProgrammer.parameterDeclarations(config)(
166
+ TypeFactory.keyword("any"),
167
+ )(ts.factory.createIdentifier("input")),
168
+ TypeFactory.keyword("any"),
169
+ undefined,
170
+ decode_tuple_inline(project)(config)(importer)(
171
+ ts.factory.createIdentifier("input"),
172
+ tuple,
173
+ {
174
+ tracable: config.trace,
175
+ source: "function",
176
+ from: "array",
177
+ postfix: "",
178
+ },
179
+ ),
180
+ ),
181
+ ),
182
+ );
183
+
184
+ const configure =
185
+ (project: IProject) =>
186
+ (config: IConfig) =>
187
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => ({
188
+ types: {
189
+ input: () => TypeFactory.keyword("any"),
190
+ output: (type, name) =>
191
+ ts.factory.createTypePredicateNode(
192
+ undefined,
193
+ "input",
194
+ ts.factory.createTypeReferenceNode(
195
+ name ?? TypeFactory.getFullName(project.checker)(type),
196
+ ),
197
+ ),
198
+ },
199
+ trace: config.trace,
200
+ path: config.path,
201
+ prefix: config.prefix,
202
+ initializer: (project) => (importer) => (type) => {
203
+ const collection: MetadataCollection = new MetadataCollection();
204
+ const result = MetadataFactory.analyze(
205
+ project.checker,
206
+ project.context,
207
+ )({
208
+ escape: false,
209
+ constant: true,
210
+ absorb: true,
211
+ })(collection)(type);
212
+ if (result.success === false)
213
+ throw TransformerError.from(`typia.${importer.method}`)(
214
+ result.errors,
215
+ );
216
+ return [collection, result.data];
217
+ },
218
+ addition: config.addition,
219
+ decoder: () => config.decoder?.() ?? decode(project)(config)(importer),
220
+ objector: {
221
+ checker: () => config.decoder?.() ?? decode(project)(config)(importer),
222
+ decoder: () => decode_object(config)(importer),
223
+ joiner: config.joiner.object,
224
+ unionizer: config.equals
225
+ ? decode_union_object(decode_object(config)(importer))(
226
+ (input, obj, explore) =>
227
+ decode_object(config)(importer)(input, obj, {
228
+ ...explore,
229
+ tracable: true,
230
+ }),
231
+ )(config.joiner.is ?? ((expr) => expr))((value, expected) =>
232
+ ts.factory.createReturnStatement(
233
+ config.joiner.failure(value, expected),
234
+ ),
235
+ )
236
+ : (input, targets, explore) =>
237
+ config.combiner(explore)("or")(
238
+ input,
239
+ targets.map((obj) => ({
240
+ expression: decode_object(config)(importer)(
241
+ input,
242
+ obj,
243
+ explore,
244
+ ),
245
+ combined: true,
246
+ })),
247
+ `(${targets.map((t) => t.name).join(" | ")})`,
248
+ ),
249
+ failure: (value, expected) =>
250
+ ts.factory.createReturnStatement(
251
+ config.joiner.failure(value, expected),
252
+ ),
253
+ is: config.joiner.is,
254
+ required: config.joiner.required,
255
+ full: config.joiner.full,
256
+ type: TypeFactory.keyword("boolean"),
257
+ },
258
+ generator: {
259
+ unions: config.numeric
260
+ ? () =>
261
+ FeatureProgrammer.write_union_functions(
262
+ configure(project)({ ...config, numeric: false })(importer),
263
+ )
264
+ : undefined,
265
+ arrays: () => write_array_functions(project)(config)(importer),
266
+ tuples: () => write_tuple_functions(project)(config)(importer),
267
+ },
268
+ });
269
+
270
+ /* -----------------------------------------------------------
271
+ DECODERS
272
+ ----------------------------------------------------------- */
273
+ /**
274
+ * @internal
275
+ */
276
+ export const decode =
277
+ (project: IProject) =>
278
+ (config: IConfig) =>
279
+ (importer: FunctionImporter) =>
280
+ (
281
+ input: ts.Expression,
282
+ meta: Metadata,
283
+ explore: IExplore,
284
+ ): ts.Expression => {
285
+ if (meta.any) return config.success;
286
+
287
+ const top: IBinary[] = [];
288
+ const binaries: IBinary[] = [];
289
+ const add = create_add(binaries)(input);
290
+ const getConstantValue = (value: number | string | bigint | boolean) => {
291
+ if (typeof value === "string")
292
+ return ts.factory.createStringLiteral(value);
293
+ else if (typeof value === "bigint")
294
+ return ExpressionFactory.bigint(value);
295
+ return ts.factory.createIdentifier(value.toString());
296
+ };
297
+
298
+ //----
299
+ // CHECK OPTIONAL
300
+ //----
301
+ // @todo -> should be elaborated
302
+ const checkOptional: boolean = meta.empty() || meta.isUnionBucket();
303
+
304
+ // NULLABLE
305
+ if (checkOptional || meta.nullable)
306
+ (meta.nullable ? add : create_add(top)(input))(
307
+ meta.nullable,
308
+ ValueFactory.NULL(),
309
+ );
310
+
311
+ // UNDEFINDABLE
312
+ if (checkOptional || !meta.isRequired())
313
+ (meta.isRequired() ? create_add(top)(input) : add)(
314
+ !meta.isRequired(),
315
+ ValueFactory.UNDEFINED(),
316
+ );
317
+
318
+ // FUNCTIONAL
319
+ if (meta.functional === true)
320
+ if (OptionPredicator.functional(project.options) || meta.size() !== 1)
321
+ add(
322
+ true,
323
+ ts.factory.createStringLiteral("function"),
324
+ ValueFactory.TYPEOF(input),
325
+ );
326
+ else
327
+ binaries.push({
328
+ combined: false,
329
+ expression: config.success,
330
+ });
331
+
332
+ //----
333
+ // VALUES
334
+ //----
335
+ // CONSTANT VALUES
336
+ for (const constant of meta.constants)
337
+ if (AtomicPredicator.constant(meta)(constant.type))
338
+ for (const val of constant.values) add(true, getConstantValue(val));
339
+
340
+ // ATOMIC VALUES
341
+ for (const atom of meta.atomics)
342
+ if (AtomicPredicator.atomic(meta)(atom.type) === false) continue;
343
+ else if (atom.type === "number")
344
+ binaries.push({
345
+ expression: config.atomist(explore)(
346
+ check_number(project, config.numeric)(atom)(input),
347
+ )(input),
348
+ combined: false,
349
+ });
350
+ else if (atom.type === "bigint")
351
+ binaries.push({
352
+ expression: config.atomist(explore)(
353
+ check_bigint(project)(atom)(input),
354
+ )(input),
355
+ combined: false,
356
+ });
357
+ else if (atom.type === "string")
358
+ binaries.push({
359
+ expression: config.atomist(explore)(
360
+ check_string(project)(atom)(input),
361
+ )(input),
362
+ combined: false,
363
+ });
364
+ else
365
+ add(
366
+ true,
367
+ ts.factory.createStringLiteral(atom.type),
368
+ ValueFactory.TYPEOF(input),
369
+ );
370
+
371
+ // TEMPLATE LITERAL VALUES
372
+ if (meta.templates.length)
373
+ if (AtomicPredicator.template(meta))
374
+ binaries.push({
375
+ expression: config.atomist(explore)(
376
+ check_template(meta.templates)(input),
377
+ )(input),
378
+ combined: false,
379
+ });
380
+
381
+ // NATIVE CLASSES
382
+ for (const native of meta.natives)
383
+ binaries.push({
384
+ expression: check_native(native)(input),
385
+ combined: false,
386
+ });
387
+
388
+ //----
389
+ // INSTANCES
390
+ //----
391
+ interface IInstance {
392
+ pre: ts.Expression;
393
+ body: ts.Expression | null;
394
+ expected: string;
395
+ }
396
+ const instances: IInstance[] = [];
397
+ const prepare =
398
+ (pre: ts.Expression, expected: string) =>
399
+ (body: ts.Expression | null) =>
400
+ instances.push({
401
+ pre,
402
+ expected,
403
+ body,
404
+ });
405
+
406
+ // SETS
407
+ if (meta.sets.length) {
408
+ const install = prepare(
409
+ check_native("Set")(input),
410
+ meta.sets.map((elem) => `Set<${elem.getName()}>`).join(" | "),
411
+ );
412
+ if (meta.sets.some((elem) => elem.any)) install(null);
413
+ else
414
+ install(
415
+ explore_sets(project)(config)(importer)(input, meta.sets, {
416
+ ...explore,
417
+ from: "array",
418
+ }),
419
+ );
420
+ }
421
+
422
+ // MAPS
423
+ if (meta.maps.length) {
424
+ const install = prepare(
425
+ check_native("Map")(input),
426
+ meta.maps
427
+ .map(({ key, value }) => `Map<${key}, ${value}>`)
428
+ .join(" | "),
429
+ );
430
+ if (meta.maps.some((elem) => elem.key.any && elem.value.any))
431
+ install(null);
432
+ else
433
+ install(
434
+ explore_maps(project)(config)(importer)(input, meta.maps, {
435
+ ...explore,
436
+ from: "array",
437
+ }),
438
+ );
439
+ }
440
+
441
+ // ARRAYS AND TUPLES
442
+ if (meta.tuples.length + meta.arrays.length > 0) {
443
+ const install = prepare(
444
+ config.atomist(explore)({
445
+ expected: [
446
+ ...meta.tuples.map((t) => t.type.name),
447
+ ...meta.arrays.map((a) => a.getName()),
448
+ ].join(" | "),
449
+ expression: ExpressionFactory.isArray(input),
450
+ conditions: [],
451
+ })(input),
452
+ [...meta.tuples, ...meta.arrays]
453
+ .map((elem) => elem.type.name)
454
+ .join(" | "),
455
+ );
456
+ if (meta.arrays.length === 0)
457
+ if (meta.tuples.length === 1)
458
+ install(
459
+ decode_tuple(project)(config)(importer)(input, meta.tuples[0]!, {
460
+ ...explore,
461
+ from: "array",
462
+ }),
463
+ );
464
+ // TUPLE ONLY
465
+ else
466
+ install(
467
+ explore_tuples(project)(config)(importer)(input, meta.tuples, {
468
+ ...explore,
469
+ from: "array",
470
+ }),
471
+ );
472
+ else if (meta.arrays.some((elem) => elem.type.value.any)) install(null);
473
+ else if (meta.tuples.length === 0)
474
+ if (meta.arrays.length === 1)
475
+ // ARRAY ONLY
476
+ install(
477
+ decode_array(project)(config)(importer)(input, meta.arrays[0]!, {
478
+ ...explore,
479
+ from: "array",
480
+ }),
481
+ );
482
+ else
483
+ install(
484
+ explore_arrays(project)(config)(importer)(input, meta.arrays, {
485
+ ...explore,
486
+ from: "array",
487
+ }),
488
+ );
489
+ else
490
+ install(
491
+ explore_arrays_and_tuples(project)(config)(importer)(
492
+ input,
493
+ [...meta.tuples, ...meta.arrays],
494
+ explore,
495
+ ),
496
+ );
497
+ }
498
+
499
+ // OBJECT
500
+ if (meta.objects.length > 0)
501
+ prepare(
502
+ ExpressionFactory.isObject({
503
+ checkNull: true,
504
+ checkArray: meta.objects.some((obj) =>
505
+ obj.properties.every(
506
+ (prop) => !prop.key.isSoleLiteral() || !prop.value.isRequired(),
507
+ ),
508
+ ),
509
+ })(input),
510
+ meta.objects.map((obj) => obj.name).join(" | "),
511
+ )(
512
+ explore_objects(config)(importer)(input, meta, {
513
+ ...explore,
514
+ from: "object",
515
+ }),
516
+ );
517
+
518
+ if (instances.length) {
519
+ const transformer =
520
+ (merger: (x: ts.Expression, y: ts.Expression) => ts.Expression) =>
521
+ (ins: IInstance) =>
522
+ ins.body
523
+ ? {
524
+ expression: merger(ins.pre, ins.body),
525
+ combined: true,
526
+ }
527
+ : {
528
+ expression: ins.pre,
529
+ combined: false,
530
+ };
531
+ if (instances.length === 1)
532
+ binaries.push(
533
+ transformer((pre, body) =>
534
+ config.combiner(explore)("and")(
535
+ input,
536
+ [pre, body].map((expression) => ({
537
+ expression,
538
+ combined: expression !== pre,
539
+ })),
540
+ meta.getName(),
541
+ ),
542
+ )(instances[0]!),
543
+ );
544
+ else
545
+ binaries.push({
546
+ expression: config.combiner(explore)("or")(
547
+ input,
548
+ instances.map(transformer(ts.factory.createLogicalAnd)),
549
+ meta.getName(),
550
+ ),
551
+ combined: true,
552
+ });
553
+ }
554
+
555
+ //----
556
+ // COMBINE CONDITIONS
557
+ //----
558
+ return top.length && binaries.length
559
+ ? config.combiner(explore)("and")(
560
+ input,
561
+ [
562
+ ...top,
563
+ {
564
+ expression: config.combiner(explore)("or")(
565
+ input,
566
+ binaries,
567
+ meta.getName(),
568
+ ),
569
+ combined: true,
570
+ },
571
+ ],
572
+ meta.getName(),
573
+ )
574
+ : binaries.length
575
+ ? config.combiner(explore)("or")(input, binaries, meta.getName())
576
+ : config.success;
577
+ };
578
+
579
+ export const decode_object =
580
+ (config: IConfig) => (importer: FunctionImporter) => {
581
+ const func = FeatureProgrammer.decode_object(config)(importer);
582
+ return (input: ts.Expression, obj: MetadataObject, explore: IExplore) => {
583
+ obj.validated = true;
584
+ return func(input, obj, explore);
585
+ };
586
+ };
587
+
588
+ const decode_array =
589
+ (project: IProject) =>
590
+ (config: IConfig) =>
591
+ (importer: FunctionImporter) =>
592
+ (input: ts.Expression, array: MetadataArray, explore: IExplore) => {
593
+ if (array.type.recursive === false)
594
+ return decode_array_inline(project)(config)(importer)(
595
+ input,
596
+ array,
597
+ explore,
598
+ );
599
+
600
+ explore = {
601
+ ...explore,
602
+ source: "function",
603
+ from: "array",
604
+ };
605
+ return ts.factory.createLogicalOr(
606
+ ts.factory.createCallExpression(
607
+ ts.factory.createIdentifier(
608
+ importer.useLocal(`${config.prefix}a${array.type.index}`),
609
+ ),
610
+ undefined,
611
+ FeatureProgrammer.argumentsArray(config)({
612
+ ...explore,
613
+ source: "function",
614
+ from: "array",
615
+ })(input),
616
+ ),
617
+ config.joiner.failure(input, array.type.name, explore),
618
+ );
619
+ };
620
+
621
+ const decode_array_inline =
622
+ (project: IProject) =>
623
+ (config: IConfig) =>
624
+ (importer: FunctionImporter) =>
625
+ (
626
+ input: ts.Expression,
627
+ array: MetadataArray,
628
+ explore: IExplore,
629
+ ): ts.Expression => {
630
+ const length = check_array_length(project)(array)(input);
631
+ const main = FeatureProgrammer.decode_array({
632
+ prefix: config.prefix,
633
+ trace: config.trace,
634
+ path: config.path,
635
+ decoder: () => decode(project)(config)(importer),
636
+ })(importer)(config.joiner.array)(input, array, explore);
637
+ return length.expression === null && length.conditions.length === 0
638
+ ? main
639
+ : ts.factory.createLogicalAnd(
640
+ config.atomist(explore)(length)(input),
641
+ main,
642
+ );
643
+ };
644
+
645
+ const decode_tuple =
646
+ (project: IProject) =>
647
+ (config: IConfig) =>
648
+ (importer: FunctionImporter) =>
649
+ (
650
+ input: ts.Expression,
651
+ tuple: MetadataTuple,
652
+ explore: IExplore,
653
+ ): ts.Expression => {
654
+ if (tuple.type.recursive === false)
655
+ return decode_tuple_inline(project)(config)(importer)(
656
+ input,
657
+ tuple.type,
658
+ explore,
659
+ );
660
+ explore = {
661
+ ...explore,
662
+ source: "function",
663
+ from: "array",
664
+ };
665
+ return ts.factory.createLogicalOr(
666
+ ts.factory.createCallExpression(
667
+ ts.factory.createIdentifier(
668
+ importer.useLocal(`${config.prefix}t${tuple.type.index}`),
669
+ ),
670
+ undefined,
671
+ FeatureProgrammer.argumentsArray(config)({
672
+ ...explore,
673
+ source: "function",
674
+ })(input),
675
+ ),
676
+ config.joiner.failure(input, tuple.type.name, explore),
677
+ );
678
+ };
679
+
680
+ const decode_tuple_inline =
681
+ (project: IProject) =>
682
+ (config: IConfig) =>
683
+ (importer: FunctionImporter) =>
684
+ (
685
+ input: ts.Expression,
686
+ tuple: MetadataTupleType,
687
+ explore: IExplore,
688
+ ): ts.Expression => {
689
+ const binaries: ts.Expression[] = tuple.elements
690
+ .filter((meta) => meta.rest === null)
691
+ .map((meta, index) =>
692
+ decode(project)(config)(importer)(
693
+ ts.factory.createElementAccessExpression(input, index),
694
+ meta,
695
+ {
696
+ ...explore,
697
+ from: "array",
698
+ postfix: explore.postfix.length
699
+ ? `${explore.postfix.slice(0, -1)}[${index}]"`
700
+ : `"[${index}]"`,
701
+ },
702
+ ),
703
+ );
704
+ const rest: ts.Expression | null =
705
+ tuple.elements.length && tuple.elements.at(-1)!.rest !== null
706
+ ? decode(project)(config)(importer)(
707
+ ts.factory.createCallExpression(
708
+ IdentifierFactory.access(input)("slice"),
709
+ undefined,
710
+ [ExpressionFactory.number(tuple.elements.length - 1)],
711
+ ),
712
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
713
+ {
714
+ ...explore,
715
+ start: tuple.elements.length - 1,
716
+ },
717
+ )
718
+ : null;
719
+
720
+ const arrayLength = ts.factory.createPropertyAccessExpression(
721
+ input,
722
+ "length",
723
+ );
724
+ return config.combiner(explore)("and")(
725
+ input,
726
+ [
727
+ ...(rest === null
728
+ ? tuple.elements.every((t) => t.optional === false)
729
+ ? [
730
+ {
731
+ combined: false,
732
+ expression: ts.factory.createStrictEquality(
733
+ arrayLength,
734
+ ExpressionFactory.number(tuple.elements.length),
735
+ ),
736
+ },
737
+ ]
738
+ : [
739
+ {
740
+ combined: false,
741
+ expression: ts.factory.createLogicalAnd(
742
+ ts.factory.createLessThanEquals(
743
+ ExpressionFactory.number(
744
+ tuple.elements.filter((t) => t.optional === false)
745
+ .length,
746
+ ),
747
+ arrayLength,
748
+ ),
749
+ ts.factory.createGreaterThanEquals(
750
+ ExpressionFactory.number(tuple.elements.length),
751
+ arrayLength,
752
+ ),
753
+ ),
754
+ },
755
+ ]
756
+ : []),
757
+ ...(config.joiner.tuple
758
+ ? [
759
+ {
760
+ expression: config.joiner.tuple(binaries),
761
+ combined: true,
762
+ },
763
+ ]
764
+ : binaries.map((expression) => ({
765
+ expression,
766
+ combined: true,
767
+ }))),
768
+ ...(rest !== null
769
+ ? [
770
+ {
771
+ expression: rest,
772
+ combined: true,
773
+ },
774
+ ]
775
+ : []),
776
+ ],
777
+ `[${tuple.elements.map((t) => t.getName()).join(", ")}]`,
778
+ );
779
+ };
780
+
781
+ /* -----------------------------------------------------------
782
+ UNION TYPE EXPLORERS
783
+ ----------------------------------------------------------- */
784
+ const explore_sets =
785
+ (project: IProject) =>
786
+ (config: IConfig) =>
787
+ (importer: FunctionImporter) =>
788
+ (
789
+ input: ts.Expression,
790
+ sets: Metadata[],
791
+ explore: IExplore,
792
+ ): ts.Expression =>
793
+ ts.factory.createCallExpression(
794
+ UnionExplorer.set({
795
+ checker: decode(project)(config)(importer),
796
+ decoder: decode_array(project)(config)(importer),
797
+ empty: config.success,
798
+ success: config.success,
799
+ failure: (input, expected, explore) =>
800
+ ts.factory.createReturnStatement(
801
+ config.joiner.failure(input, expected, explore),
802
+ ),
803
+ })([])(input, sets, explore),
804
+ undefined,
805
+ undefined,
806
+ );
807
+
808
+ const explore_maps =
809
+ (project: IProject) =>
810
+ (config: IConfig) =>
811
+ (importer: FunctionImporter) =>
812
+ (
813
+ input: ts.Expression,
814
+ maps: Metadata.Entry[],
815
+ explore: IExplore,
816
+ ): ts.Expression =>
817
+ ts.factory.createCallExpression(
818
+ UnionExplorer.map({
819
+ checker: (input, entry, explore) => {
820
+ const func = decode(project)(config)(importer);
821
+ return ts.factory.createLogicalAnd(
822
+ func(
823
+ ts.factory.createElementAccessExpression(input, 0),
824
+ entry[0],
825
+ {
826
+ ...explore,
827
+ postfix: `${explore.postfix}[0]`,
828
+ },
829
+ ),
830
+ func(
831
+ ts.factory.createElementAccessExpression(input, 1),
832
+ entry[1],
833
+ {
834
+ ...explore,
835
+ postfix: `${explore.postfix}[1]`,
836
+ },
837
+ ),
838
+ );
839
+ },
840
+ decoder: decode_array(project)(config)(importer),
841
+ empty: config.success,
842
+ success: config.success,
843
+ failure: (input, expected, explore) =>
844
+ ts.factory.createReturnStatement(
845
+ config.joiner.failure(input, expected, explore),
846
+ ),
847
+ })([])(input, maps, explore),
848
+ undefined,
849
+ undefined,
850
+ );
851
+
852
+ const explore_tuples =
853
+ (project: IProject) =>
854
+ (config: IConfig) =>
855
+ (importer: FunctionImporter) =>
856
+ (
857
+ input: ts.Expression,
858
+ tuples: MetadataTuple[],
859
+ explore: IExplore,
860
+ ): ts.Expression =>
861
+ explore_array_like_union_types(config)(importer)(
862
+ UnionExplorer.tuple({
863
+ checker: decode_tuple(project)(config)(importer),
864
+ decoder: decode_tuple(project)(config)(importer),
865
+ empty: config.success,
866
+ success: config.success,
867
+ failure: (input, expected, explore) =>
868
+ ts.factory.createReturnStatement(
869
+ config.joiner.failure(input, expected, explore),
870
+ ),
871
+ }),
872
+ )(input, tuples, explore);
873
+
874
+ const explore_arrays =
875
+ (project: IProject) =>
876
+ (config: IConfig) =>
877
+ (importer: FunctionImporter) =>
878
+ (
879
+ input: ts.Expression,
880
+ arrays: MetadataArray[],
881
+ explore: IExplore,
882
+ ): ts.Expression =>
883
+ explore_array_like_union_types(config)(importer)(
884
+ UnionExplorer.array({
885
+ checker: decode(project)(config)(importer),
886
+ decoder: decode_array(project)(config)(importer),
887
+ empty: config.success,
888
+ success: config.success,
889
+ failure: (input, expected, explore) =>
890
+ ts.factory.createReturnStatement(
891
+ config.joiner.failure(input, expected, explore),
892
+ ),
893
+ }),
894
+ )(input, arrays, explore);
895
+
896
+ const explore_arrays_and_tuples =
897
+ (project: IProject) =>
898
+ (config: IConfig) =>
899
+ (importer: FunctionImporter) =>
900
+ (
901
+ input: ts.Expression,
902
+ elements: Array<MetadataArray | MetadataTuple>,
903
+ explore: IExplore,
904
+ ): ts.Expression =>
905
+ explore_array_like_union_types(config)(importer)(
906
+ UnionExplorer.array_or_tuple({
907
+ checker: (front, target, explore, array) =>
908
+ target instanceof MetadataTuple
909
+ ? decode_tuple(project)(config)(importer)(front, target, explore)
910
+ : config.atomist(explore)({
911
+ expected: elements
912
+ .map((elem) =>
913
+ elem instanceof MetadataArray
914
+ ? elem.getName()
915
+ : elem.type.name,
916
+ )
917
+ .join(" | "),
918
+ expression: decode(project)(config)(importer)(
919
+ front,
920
+ target,
921
+ explore,
922
+ ),
923
+ conditions: [],
924
+ })(array),
925
+ decoder: (input, target, explore) =>
926
+ target instanceof MetadataTuple
927
+ ? decode_tuple(project)(config)(importer)(input, target, explore)
928
+ : decode_array(project)(config)(importer)(input, target, explore),
929
+ empty: config.success,
930
+ success: config.success,
931
+ failure: (input, expected, explore) =>
932
+ ts.factory.createReturnStatement(
933
+ config.joiner.failure(input, expected, explore),
934
+ ),
935
+ }),
936
+ )(input, elements, explore);
937
+
938
+ const explore_array_like_union_types =
939
+ (config: IConfig) =>
940
+ (importer: FunctionImporter) =>
941
+ <T extends MetadataArray | MetadataTuple>(
942
+ factory: (
943
+ parameters: ts.ParameterDeclaration[],
944
+ ) => (
945
+ input: ts.Expression,
946
+ elements: T[],
947
+ explore: IExplore,
948
+ ) => ts.ArrowFunction,
949
+ ) =>
950
+ (input: ts.Expression, elements: T[], explore: IExplore): ts.Expression => {
951
+ const arrow =
952
+ (parameters: ts.ParameterDeclaration[]) =>
953
+ (explore: IExplore) =>
954
+ (input: ts.Expression): ts.ArrowFunction =>
955
+ factory(parameters)(input, elements, explore);
956
+ if (elements.every((e) => e.type.recursive === false))
957
+ ts.factory.createCallExpression(
958
+ arrow([])(explore)(input),
959
+ undefined,
960
+ [],
961
+ );
962
+ explore = {
963
+ ...explore,
964
+ source: "function",
965
+ from: "array",
966
+ };
967
+ return ts.factory.createLogicalOr(
968
+ ts.factory.createCallExpression(
969
+ ts.factory.createIdentifier(
970
+ importer.emplaceUnion(
971
+ config.prefix,
972
+ elements.map((e) => e.type.name).join(" | "),
973
+ () =>
974
+ arrow(
975
+ FeatureProgrammer.parameterDeclarations(config)(
976
+ TypeFactory.keyword("any"),
977
+ )(ts.factory.createIdentifier("input")),
978
+ )({
979
+ ...explore,
980
+ postfix: "",
981
+ })(ts.factory.createIdentifier("input")),
982
+ ),
983
+ ),
984
+ undefined,
985
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
986
+ ),
987
+ config.joiner.failure(
988
+ input,
989
+ elements.map((e) => e.type.name).join(" | "),
990
+ explore,
991
+ ),
992
+ );
993
+ };
994
+
995
+ const explore_objects =
996
+ (config: IConfig) =>
997
+ (importer: FunctionImporter) =>
998
+ (input: ts.Expression, meta: Metadata, explore: IExplore) =>
999
+ meta.objects.length === 1
1000
+ ? decode_object(config)(importer)(input, meta.objects[0]!, explore)
1001
+ : ts.factory.createCallExpression(
1002
+ ts.factory.createIdentifier(
1003
+ importer.useLocal(`${config.prefix}u${meta.union_index!}`),
1004
+ ),
1005
+ undefined,
1006
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
1007
+ );
1008
+ }
1009
+
1010
+ const create_add =
1011
+ (binaries: CheckerProgrammer.IBinary[]) =>
1012
+ (defaultInput: ts.Expression) =>
1013
+ (
1014
+ exact: boolean,
1015
+ left: ts.Expression,
1016
+ right: ts.Expression = defaultInput,
1017
+ ) => {
1018
+ const factory = exact
1019
+ ? ts.factory.createStrictEquality
1020
+ : ts.factory.createStrictInequality;
1021
+ binaries.push({
1022
+ expression: factory(left, right),
1023
+ combined: false,
1024
+ });
1025
+ };