typia 5.0.0-dev.2023084 → 5.0.0

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 (584) hide show
  1. package/README.md +1 -2
  2. package/lib/IRandomGenerator.d.ts +4 -3
  3. package/lib/Resolved.d.ts +1 -1
  4. package/lib/executable/TypiaGenerateWizard.js +1 -1
  5. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  6. package/lib/executable/TypiaSetupWizard.js +1 -1
  7. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  8. package/lib/executable/setup/PackageManager.js +1 -1
  9. package/lib/executable/setup/PackageManager.js.map +1 -1
  10. package/lib/executable/setup/PluginConfigurator.js +2 -2
  11. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  12. package/lib/factories/ExpressionFactory.d.ts +3 -1
  13. package/lib/factories/ExpressionFactory.js +25 -1
  14. package/lib/factories/ExpressionFactory.js.map +1 -1
  15. package/lib/factories/IdentifierFactory.d.ts +2 -1
  16. package/lib/factories/IdentifierFactory.js +11 -0
  17. package/lib/factories/IdentifierFactory.js.map +1 -1
  18. package/lib/factories/JsonMetadataFactory.d.ts +7 -0
  19. package/lib/factories/JsonMetadataFactory.js +38 -0
  20. package/lib/factories/JsonMetadataFactory.js.map +1 -0
  21. package/lib/factories/LiteralFactory.js +6 -2
  22. package/lib/factories/LiteralFactory.js.map +1 -1
  23. package/lib/factories/MetadataCollection.d.ts +7 -7
  24. package/lib/factories/MetadataCollection.js +4 -6
  25. package/lib/factories/MetadataCollection.js.map +1 -1
  26. package/lib/factories/MetadataCommentTagFactory.js +543 -0
  27. package/lib/factories/MetadataCommentTagFactory.js.map +1 -0
  28. package/lib/factories/MetadataFactory.d.ts +22 -2
  29. package/lib/factories/MetadataFactory.js +248 -17
  30. package/lib/factories/MetadataFactory.js.map +1 -1
  31. package/lib/factories/MetadataTypeTagFactory.d.ts +7 -0
  32. package/lib/factories/MetadataTypeTagFactory.js +280 -0
  33. package/lib/factories/MetadataTypeTagFactory.js.map +1 -0
  34. package/lib/factories/NumericRangeFactory.d.ts +6 -0
  35. package/lib/factories/NumericRangeFactory.js +34 -0
  36. package/lib/factories/NumericRangeFactory.js.map +1 -0
  37. package/lib/factories/ProtobufFactory.js +137 -91
  38. package/lib/factories/ProtobufFactory.js.map +1 -1
  39. package/lib/factories/TypeFactory.d.ts +0 -1
  40. package/lib/factories/TypeFactory.js +0 -5
  41. package/lib/factories/TypeFactory.js.map +1 -1
  42. package/lib/factories/internal/metadata/emend_metadata_atomics.js +7 -1
  43. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  44. package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +1 -1
  45. package/lib/factories/internal/metadata/emplace_metadata_alias.js +20 -19
  46. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  47. package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +5 -0
  48. package/lib/factories/internal/metadata/emplace_metadata_array_type.js +51 -0
  49. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -0
  50. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +1 -1
  51. package/lib/factories/internal/metadata/emplace_metadata_object.js +100 -85
  52. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  53. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +2 -2
  54. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +34 -21
  55. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
  56. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  57. package/lib/factories/internal/metadata/explore_metadata.js +12 -12
  58. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  59. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  60. package/lib/factories/internal/metadata/iterate_metadata.js +39 -19
  61. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  62. package/lib/factories/internal/metadata/iterate_metadata_alias.d.ts +1 -1
  63. package/lib/factories/internal/metadata/iterate_metadata_alias.js +12 -10
  64. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  65. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +1 -1
  66. package/lib/factories/internal/metadata/iterate_metadata_array.js +13 -7
  67. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  68. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +2 -1
  69. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  70. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -1
  71. package/lib/factories/internal/metadata/iterate_metadata_collection.js +66 -56
  72. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  73. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +3 -0
  74. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +45 -0
  75. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -0
  76. package/lib/factories/internal/metadata/iterate_metadata_intersection.d.ts +1 -1
  77. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +175 -41
  78. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  79. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +1 -1
  80. package/lib/factories/internal/metadata/iterate_metadata_map.js +28 -15
  81. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  82. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +1 -1
  83. package/lib/factories/internal/metadata/iterate_metadata_object.js +16 -21
  84. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  85. package/lib/factories/internal/metadata/iterate_metadata_resolve.d.ts +1 -1
  86. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +28 -15
  87. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  88. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +1 -1
  89. package/lib/factories/internal/metadata/iterate_metadata_set.js +24 -11
  90. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  91. package/lib/factories/internal/metadata/iterate_metadata_sort.js +2 -2
  92. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  93. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +1 -1
  94. package/lib/factories/internal/metadata/iterate_metadata_template.js +28 -15
  95. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  96. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +1 -1
  97. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +12 -6
  98. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  99. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +1 -1
  100. package/lib/factories/internal/metadata/iterate_metadata_union.js +20 -7
  101. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  102. package/lib/functional/$any.js +2 -1
  103. package/lib/functional/$any.js.map +1 -1
  104. package/lib/functional/$clone.d.ts +2 -0
  105. package/lib/functional/$clone.js +8 -0
  106. package/lib/functional/$clone.js.map +1 -0
  107. package/lib/functional/Namespace.js +0 -16
  108. package/lib/functional/Namespace.js.map +1 -1
  109. package/lib/module.d.ts +2 -39
  110. package/lib/module.js +3 -17
  111. package/lib/module.js.map +1 -1
  112. package/lib/programmers/AssertProgrammer.js +28 -10
  113. package/lib/programmers/AssertProgrammer.js.map +1 -1
  114. package/lib/programmers/CheckerProgrammer.js +97 -70
  115. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  116. package/lib/programmers/FeatureProgrammer.d.ts +3 -5
  117. package/lib/programmers/FeatureProgrammer.js +7 -7
  118. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  119. package/lib/programmers/IsProgrammer.d.ts +1 -1
  120. package/lib/programmers/IsProgrammer.js +33 -22
  121. package/lib/programmers/IsProgrammer.js.map +1 -1
  122. package/lib/programmers/RandomProgrammer.js +196 -160
  123. package/lib/programmers/RandomProgrammer.js.map +1 -1
  124. package/lib/programmers/TypiaProgrammer.js +87 -28
  125. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  126. package/lib/programmers/ValidateProgrammer.js +28 -10
  127. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  128. package/lib/programmers/helpers/CloneJoiner.js +10 -2
  129. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  130. package/lib/programmers/helpers/ICheckEntry.d.ts +4 -3
  131. package/lib/programmers/helpers/ProtobufUtil.d.ts +6 -2
  132. package/lib/programmers/helpers/ProtobufUtil.js +175 -17
  133. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  134. package/lib/programmers/helpers/RandomJoiner.d.ts +3 -5
  135. package/lib/programmers/helpers/RandomJoiner.js +7 -10
  136. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  137. package/lib/programmers/helpers/RandomRanger.d.ts +5 -6
  138. package/lib/programmers/helpers/RandomRanger.js +13 -33
  139. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  140. package/lib/programmers/helpers/UnionExplorer.d.ts +7 -8
  141. package/lib/programmers/helpers/UnionExplorer.js +46 -35
  142. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  143. package/lib/programmers/internal/application_alias.js +0 -1
  144. package/lib/programmers/internal/application_alias.js.map +1 -1
  145. package/lib/programmers/internal/application_array.js +60 -20
  146. package/lib/programmers/internal/application_array.js.map +1 -1
  147. package/lib/programmers/internal/application_escaped.d.ts +4 -0
  148. package/lib/programmers/internal/{application_resolved.js → application_escaped.js} +6 -6
  149. package/lib/programmers/internal/application_escaped.js.map +1 -0
  150. package/lib/programmers/internal/application_number.js +95 -69
  151. package/lib/programmers/internal/application_number.js.map +1 -1
  152. package/lib/programmers/internal/application_object.js +0 -3
  153. package/lib/programmers/internal/application_object.js.map +1 -1
  154. package/lib/programmers/internal/application_schema.js +41 -24
  155. package/lib/programmers/internal/application_schema.js.map +1 -1
  156. package/lib/programmers/internal/application_string.js +56 -22
  157. package/lib/programmers/internal/application_string.js.map +1 -1
  158. package/lib/programmers/internal/application_tuple.js +10 -9
  159. package/lib/programmers/internal/application_tuple.js.map +1 -1
  160. package/lib/programmers/internal/check_array_length.js +25 -25
  161. package/lib/programmers/internal/check_array_length.js.map +1 -1
  162. package/lib/programmers/internal/check_bigint.js +20 -109
  163. package/lib/programmers/internal/check_bigint.js.map +1 -1
  164. package/lib/programmers/internal/check_dynamic_properties.js +1 -1
  165. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  166. package/lib/programmers/internal/check_number.js +57 -147
  167. package/lib/programmers/internal/check_number.js.map +1 -1
  168. package/lib/programmers/internal/check_string.js +21 -33
  169. package/lib/programmers/internal/check_string.js.map +1 -1
  170. package/lib/programmers/internal/check_template.js +31 -49
  171. package/lib/programmers/internal/check_template.js.map +1 -1
  172. package/lib/programmers/internal/check_union_array_like.js +7 -6
  173. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  174. package/lib/programmers/internal/feature_object_entries.js +1 -1
  175. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  176. package/lib/programmers/internal/random_custom.js +8 -2
  177. package/lib/programmers/internal/random_custom.js.map +1 -1
  178. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +9 -5
  179. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  180. package/lib/programmers/json/JsonApplicationProgrammer.js +5 -1
  181. package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
  182. package/lib/programmers/json/JsonAssertParseProgrammer.js +2 -0
  183. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  184. package/lib/programmers/json/JsonIsParseProgrammer.js +2 -0
  185. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  186. package/lib/programmers/json/JsonStringifyProgrammer.js +48 -85
  187. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  188. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -0
  189. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  190. package/lib/programmers/misc/MiscCloneProgrammer.js +34 -25
  191. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  192. package/lib/programmers/{IsPruneProgrammer.d.ts → misc/MiscIsPruneProgrammer.d.ts} +2 -2
  193. package/lib/programmers/{IsPruneProgrammer.js → misc/MiscIsPruneProgrammer.js} +11 -11
  194. package/lib/programmers/misc/MiscIsPruneProgrammer.js.map +1 -0
  195. package/lib/programmers/misc/MiscLiteralsProgrammer.js +10 -5
  196. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  197. package/lib/programmers/misc/MiscPruneProgrammer.js +34 -25
  198. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  199. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +48 -48
  200. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  201. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +152 -69
  202. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  203. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +80 -85
  204. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  205. package/lib/protobuf.d.ts +34 -34
  206. package/lib/schemas/json/IJsonSchema.d.ts +10 -38
  207. package/lib/schemas/metadata/IMetadata.d.ts +9 -2
  208. package/lib/schemas/metadata/IMetadataAlias.d.ts +0 -2
  209. package/lib/schemas/metadata/IMetadataArray.d.ts +4 -6
  210. package/lib/schemas/metadata/IMetadataArrayType.d.ts +8 -0
  211. package/lib/{CustomValidatorMap.js → schemas/metadata/IMetadataArrayType.js} +1 -1
  212. package/lib/schemas/metadata/IMetadataArrayType.js.map +1 -0
  213. package/lib/schemas/metadata/IMetadataAtomic.d.ts +3 -10
  214. package/lib/schemas/metadata/IMetadataCollection.d.ts +4 -4
  215. package/lib/schemas/metadata/IMetadataProperty.d.ts +0 -2
  216. package/lib/schemas/metadata/IMetadataTuple.d.ts +4 -6
  217. package/lib/schemas/metadata/IMetadataTupleType.d.ts +8 -0
  218. package/lib/schemas/metadata/IMetadataTupleType.js +3 -0
  219. package/lib/schemas/metadata/IMetadataTupleType.js.map +1 -0
  220. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +8 -0
  221. package/lib/schemas/metadata/IMetadataTypeTag.js +3 -0
  222. package/lib/schemas/metadata/IMetadataTypeTag.js.map +1 -0
  223. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  224. package/lib/schemas/metadata/Metadata.js +177 -122
  225. package/lib/schemas/metadata/Metadata.js.map +1 -1
  226. package/lib/schemas/metadata/MetadataAlias.d.ts +0 -2
  227. package/lib/schemas/metadata/MetadataAlias.js +0 -3
  228. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  229. package/lib/schemas/metadata/MetadataArray.d.ts +8 -6
  230. package/lib/schemas/metadata/MetadataArray.js +48 -19
  231. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  232. package/lib/schemas/metadata/MetadataArrayType.d.ts +14 -0
  233. package/lib/schemas/metadata/MetadataArrayType.js +36 -0
  234. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -0
  235. package/lib/schemas/metadata/MetadataAtomic.d.ts +9 -0
  236. package/lib/schemas/metadata/MetadataAtomic.js +59 -0
  237. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -0
  238. package/lib/schemas/metadata/MetadataProperty.d.ts +0 -2
  239. package/lib/schemas/metadata/MetadataProperty.js +0 -3
  240. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  241. package/lib/schemas/metadata/MetadataTuple.d.ts +8 -8
  242. package/lib/schemas/metadata/MetadataTuple.js +4 -19
  243. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  244. package/lib/schemas/metadata/MetadataTupleType.d.ts +13 -0
  245. package/lib/schemas/metadata/MetadataTupleType.js +40 -0
  246. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -0
  247. package/lib/tags/ExclusiveMaximum.d.ts +10 -8
  248. package/lib/tags/ExclusiveMinimum.d.ts +10 -8
  249. package/lib/tags/Format.d.ts +8 -8
  250. package/lib/tags/MaxItems.d.ts +8 -8
  251. package/lib/tags/MaxLength.d.ts +8 -8
  252. package/lib/tags/Maximum.d.ts +10 -8
  253. package/lib/tags/MinItems.d.ts +8 -8
  254. package/lib/tags/MinLength.d.ts +8 -8
  255. package/lib/tags/Minimum.d.ts +10 -8
  256. package/lib/tags/MultipleOf.d.ts +10 -8
  257. package/lib/tags/Pattern.d.ts +7 -8
  258. package/lib/tags/TagBase.d.ts +52 -6
  259. package/lib/tags/Type.d.ts +14 -13
  260. package/lib/tags/index.d.ts +1 -0
  261. package/lib/tags/index.js +1 -0
  262. package/lib/tags/index.js.map +1 -1
  263. package/lib/transform.d.ts +2 -1
  264. package/lib/transform.js +11 -3
  265. package/lib/transform.js.map +1 -1
  266. package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
  267. package/lib/transformers/CallExpressionTransformer.js +2 -1
  268. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  269. package/lib/transformers/FileTransformer.d.ts +1 -1
  270. package/lib/transformers/FileTransformer.js +30 -7
  271. package/lib/transformers/FileTransformer.js.map +1 -1
  272. package/lib/transformers/IProject.d.ts +4 -0
  273. package/lib/transformers/NodeTransformer.d.ts +1 -1
  274. package/lib/transformers/TransformerError.d.ts +12 -0
  275. package/lib/transformers/TransformerError.js +66 -0
  276. package/lib/transformers/TransformerError.js.map +1 -0
  277. package/lib/transformers/features/AssertTransformer.d.ts +1 -0
  278. package/lib/transformers/features/CreateAssertTransformer.d.ts +1 -0
  279. package/lib/transformers/features/CreateIsTransformer.d.ts +1 -0
  280. package/lib/transformers/features/CreateRandomTransformer.js +9 -4
  281. package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
  282. package/lib/transformers/features/CreateValidateTransformer.d.ts +1 -0
  283. package/lib/transformers/features/IsTransformer.d.ts +1 -0
  284. package/lib/transformers/features/RandomTransformer.js +9 -4
  285. package/lib/transformers/features/RandomTransformer.js.map +1 -1
  286. package/lib/transformers/features/ValidateTransformer.d.ts +1 -0
  287. package/lib/transformers/features/json/JsonApplicationTransformer.js +79 -17
  288. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  289. package/lib/transformers/features/json/JsonAssertParseTransformer.d.ts +1 -0
  290. package/lib/transformers/features/json/JsonAssertStringifyTransformer.d.ts +1 -0
  291. package/lib/transformers/features/json/JsonCreateAssertParseTransformer.d.ts +1 -0
  292. package/lib/transformers/features/json/JsonCreateAssertStringifyTransformer.d.ts +1 -0
  293. package/lib/transformers/features/json/JsonCreateIsParseTransformer.d.ts +1 -0
  294. package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.d.ts +1 -0
  295. package/lib/transformers/features/json/JsonCreateStringifyTransformer.d.ts +1 -0
  296. package/lib/transformers/features/json/JsonCreateValidateParseTransformer.d.ts +1 -0
  297. package/lib/transformers/features/json/JsonCreateValidateStringifyProgrammer.d.ts +1 -0
  298. package/lib/transformers/features/json/JsonIsParseTransformer.d.ts +1 -0
  299. package/lib/transformers/features/json/JsonIsStringifyTransformer.d.ts +1 -0
  300. package/lib/transformers/features/json/JsonStringifyTransformer.d.ts +1 -0
  301. package/lib/transformers/features/json/JsonValidateParseTransformer.d.ts +1 -0
  302. package/lib/transformers/features/json/JsonValidateStringifyTransformer.d.ts +1 -0
  303. package/lib/transformers/features/misc/MetadataTransformer.js +13 -5
  304. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  305. package/lib/transformers/features/misc/MiscAssertCloneTransformer.d.ts +1 -0
  306. package/lib/transformers/features/misc/MiscAssertPruneTransformer.d.ts +1 -0
  307. package/lib/transformers/features/misc/MiscCloneTransformer.d.ts +1 -0
  308. package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.d.ts +1 -0
  309. package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.d.ts +1 -0
  310. package/lib/transformers/features/misc/MiscCreateCloneTransformer.d.ts +1 -0
  311. package/lib/transformers/features/misc/MiscCreateIsCloneTransformer.d.ts +1 -0
  312. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.d.ts +1 -0
  313. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js +2 -2
  314. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js.map +1 -1
  315. package/lib/transformers/features/misc/MiscCreatePruneTransformer.d.ts +1 -0
  316. package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.d.ts +1 -0
  317. package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.d.ts +1 -0
  318. package/lib/transformers/features/misc/MiscIsCloneTransformer.d.ts +1 -0
  319. package/lib/transformers/features/misc/MiscIsPruneTransformer.d.ts +1 -0
  320. package/lib/transformers/features/misc/MiscIsPruneTransformer.js +2 -2
  321. package/lib/transformers/features/misc/MiscIsPruneTransformer.js.map +1 -1
  322. package/lib/transformers/features/misc/MiscLiteralsTransformer.js +9 -4
  323. package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
  324. package/lib/transformers/features/misc/MiscPruneTransformer.d.ts +1 -0
  325. package/lib/transformers/features/misc/MiscValidateCloneTransformer.d.ts +1 -0
  326. package/lib/transformers/features/misc/MiscValidatePruneTransformer.d.ts +1 -0
  327. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.d.ts +1 -0
  328. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.d.ts +1 -0
  329. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.d.ts +1 -0
  330. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.d.ts +1 -0
  331. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.d.ts +1 -0
  332. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.d.ts +1 -0
  333. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.d.ts +1 -0
  334. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.d.ts +1 -0
  335. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.d.ts +1 -0
  336. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.d.ts +1 -0
  337. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.d.ts +1 -0
  338. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.d.ts +1 -0
  339. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.d.ts +1 -0
  340. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.d.ts +1 -0
  341. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +9 -2
  342. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  343. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.d.ts +1 -0
  344. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.d.ts +1 -0
  345. package/lib/transformers/internal/GenericTransformer.js +17 -4
  346. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  347. package/lib/typings/ProtobufAtomic.d.ts +5 -0
  348. package/lib/{schemas/metadata/ICommentTag.js → typings/ProtobufAtomic.js} +1 -1
  349. package/lib/typings/ProtobufAtomic.js.map +1 -0
  350. package/lib/typings/ValidationPipe.d.ts +7 -0
  351. package/lib/{schemas/metadata/IMetadataTag.js → typings/ValidationPipe.js} +1 -1
  352. package/lib/typings/ValidationPipe.js.map +1 -0
  353. package/package.json +6 -2
  354. package/src/IRandomGenerator.ts +4 -3
  355. package/src/Primitive.ts +135 -135
  356. package/src/Resolved.ts +116 -116
  357. package/src/executable/TypiaGenerateWizard.ts +1 -1
  358. package/src/executable/TypiaSetupWizard.ts +1 -1
  359. package/src/executable/setup/PackageManager.ts +1 -1
  360. package/src/executable/setup/PluginConfigurator.ts +2 -2
  361. package/src/factories/ExpressionFactory.ts +46 -2
  362. package/src/factories/IdentifierFactory.ts +15 -0
  363. package/src/factories/JsonMetadataFactory.ts +43 -0
  364. package/src/factories/LiteralFactory.ts +11 -3
  365. package/src/factories/MetadataCollection.ts +18 -18
  366. package/src/factories/MetadataCommentTagFactory.ts +629 -0
  367. package/src/factories/MetadataFactory.ts +214 -46
  368. package/src/factories/MetadataTypeTagFactory.ts +313 -0
  369. package/src/factories/NumericRangeFactory.ts +33 -0
  370. package/src/factories/ProtobufFactory.ts +272 -268
  371. package/src/factories/TypeFactory.ts +0 -5
  372. package/src/factories/internal/metadata/emend_metadata_atomics.ts +40 -35
  373. package/src/factories/internal/metadata/emplace_metadata_alias.ts +12 -11
  374. package/src/factories/internal/metadata/{emplace_metadata_array.ts → emplace_metadata_array_type.ts} +14 -7
  375. package/src/factories/internal/metadata/emplace_metadata_object.ts +20 -6
  376. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +13 -3
  377. package/src/factories/internal/metadata/explore_metadata.ts +32 -38
  378. package/src/factories/internal/metadata/iterate_metadata.ts +44 -24
  379. package/src/factories/internal/metadata/iterate_metadata_alias.ts +7 -2
  380. package/src/factories/internal/metadata/iterate_metadata_array.ts +19 -6
  381. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -63
  382. package/src/factories/internal/metadata/iterate_metadata_collection.ts +141 -133
  383. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -0
  384. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +141 -28
  385. package/src/factories/internal/metadata/iterate_metadata_map.ts +20 -4
  386. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -210
  387. package/src/factories/internal/metadata/iterate_metadata_object.ts +12 -11
  388. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -49
  389. package/src/factories/internal/metadata/iterate_metadata_set.ts +11 -2
  390. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  391. package/src/factories/internal/metadata/iterate_metadata_template.ts +12 -3
  392. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +18 -5
  393. package/src/factories/internal/metadata/iterate_metadata_union.ts +10 -7
  394. package/src/functional/$ProtobufWriter.ts +151 -151
  395. package/src/functional/$any.ts +3 -1
  396. package/src/functional/$clone.ts +4 -0
  397. package/src/functional/Namespace.ts +0 -16
  398. package/src/json.ts +648 -648
  399. package/src/misc.ts +651 -651
  400. package/src/module.ts +656 -709
  401. package/src/programmers/AssertProgrammer.ts +317 -281
  402. package/src/programmers/CheckerProgrammer.ts +1137 -1174
  403. package/src/programmers/FeatureProgrammer.ts +13 -32
  404. package/src/programmers/IsProgrammer.ts +252 -241
  405. package/src/programmers/RandomProgrammer.ts +878 -874
  406. package/src/programmers/TypiaProgrammer.ts +36 -2
  407. package/src/programmers/ValidateProgrammer.ts +346 -307
  408. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  409. package/src/programmers/helpers/CloneJoiner.ts +57 -20
  410. package/src/programmers/helpers/FunctionImporeter.ts +91 -91
  411. package/src/programmers/helpers/ICheckEntry.ts +4 -3
  412. package/src/programmers/helpers/ProtobufUtil.ts +125 -29
  413. package/src/programmers/helpers/RandomJoiner.ts +11 -33
  414. package/src/programmers/helpers/RandomRanger.ts +16 -51
  415. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  416. package/src/programmers/helpers/UnionExplorer.ts +46 -51
  417. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  418. package/src/programmers/internal/application_alias.ts +0 -1
  419. package/src/programmers/internal/application_array.ts +33 -10
  420. package/src/programmers/internal/application_default_string.ts +37 -37
  421. package/src/programmers/internal/{application_resolved.ts → application_escaped.ts} +55 -55
  422. package/src/programmers/internal/application_number.ts +76 -70
  423. package/src/programmers/internal/application_object.ts +0 -3
  424. package/src/programmers/internal/application_schema.ts +175 -157
  425. package/src/programmers/internal/application_string.ts +33 -27
  426. package/src/programmers/internal/application_tuple.ts +12 -11
  427. package/src/programmers/internal/check_array_length.ts +34 -28
  428. package/src/programmers/internal/check_bigint.ts +26 -91
  429. package/src/programmers/internal/check_dynamic_properties.ts +1 -2
  430. package/src/programmers/internal/check_number.ts +83 -236
  431. package/src/programmers/internal/check_string.ts +37 -17
  432. package/src/programmers/internal/check_template.ts +17 -12
  433. package/src/programmers/internal/check_union_array_like.ts +4 -18
  434. package/src/programmers/internal/feature_object_entries.ts +12 -18
  435. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  436. package/src/programmers/internal/random_custom.ts +11 -3
  437. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  438. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +9 -5
  439. package/src/programmers/json/JsonApplicationProgrammer.ts +6 -3
  440. package/src/programmers/json/JsonAssertParseProgrammer.ts +7 -2
  441. package/src/programmers/json/JsonIsParseProgrammer.ts +7 -2
  442. package/src/programmers/json/JsonStringifyProgrammer.ts +964 -995
  443. package/src/programmers/json/JsonValidateParseProgrammer.ts +7 -2
  444. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +1 -1
  445. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  446. package/src/programmers/misc/MiscCloneProgrammer.ts +774 -775
  447. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  448. package/src/programmers/{IsPruneProgrammer.ts → misc/MiscIsPruneProgrammer.ts} +7 -7
  449. package/src/programmers/misc/MiscLiteralsProgrammer.ts +69 -64
  450. package/src/programmers/misc/MiscPruneProgrammer.ts +550 -544
  451. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  452. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  453. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +655 -673
  454. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +883 -814
  455. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -85
  456. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +23 -36
  457. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  458. package/src/protobuf.ts +881 -881
  459. package/src/schemas/json/IJsonSchema.ts +11 -38
  460. package/src/schemas/metadata/IMetadata.ts +34 -27
  461. package/src/schemas/metadata/IMetadataAlias.ts +0 -2
  462. package/src/schemas/metadata/IMetadataArray.ts +4 -7
  463. package/src/schemas/metadata/IMetadataArrayType.ts +10 -0
  464. package/src/schemas/metadata/IMetadataAtomic.ts +3 -10
  465. package/src/schemas/metadata/IMetadataCollection.ts +4 -4
  466. package/src/schemas/metadata/IMetadataDictionary.ts +4 -4
  467. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  468. package/src/schemas/metadata/IMetadataProperty.ts +0 -2
  469. package/src/schemas/metadata/IMetadataTuple.ts +4 -7
  470. package/src/schemas/metadata/IMetadataTupleType.ts +10 -0
  471. package/src/schemas/metadata/IMetadataTypeTag.ts +8 -0
  472. package/src/schemas/metadata/Metadata.ts +685 -643
  473. package/src/schemas/metadata/MetadataAlias.ts +0 -5
  474. package/src/schemas/metadata/MetadataArray.ts +28 -34
  475. package/src/schemas/metadata/MetadataArrayType.ts +57 -0
  476. package/src/schemas/metadata/MetadataAtomic.ts +42 -0
  477. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  478. package/src/schemas/metadata/MetadataProperty.ts +0 -5
  479. package/src/schemas/metadata/MetadataTuple.ts +9 -35
  480. package/src/schemas/metadata/MetadataTupleType.ts +67 -0
  481. package/src/tags/ExclusiveMaximum.ts +13 -8
  482. package/src/tags/ExclusiveMinimum.ts +13 -8
  483. package/src/tags/Format.ts +21 -20
  484. package/src/tags/MaxItems.ts +9 -8
  485. package/src/tags/MaxLength.ts +9 -8
  486. package/src/tags/Maximum.ts +13 -8
  487. package/src/tags/MinItems.ts +9 -8
  488. package/src/tags/MinLength.ts +9 -8
  489. package/src/tags/Minimum.ts +13 -8
  490. package/src/tags/MultipleOf.ts +15 -10
  491. package/src/tags/Pattern.ts +8 -8
  492. package/src/tags/TagBase.ts +64 -13
  493. package/src/tags/Type.ts +26 -29
  494. package/src/tags/index.ts +1 -0
  495. package/src/transform.ts +13 -5
  496. package/src/transformers/CallExpressionTransformer.ts +6 -3
  497. package/src/transformers/FileTransformer.ts +23 -13
  498. package/src/transformers/IProject.ts +4 -0
  499. package/src/transformers/NodeTransformer.ts +1 -1
  500. package/src/transformers/TransformerError.ts +55 -0
  501. package/src/transformers/features/CreateRandomTransformer.ts +11 -7
  502. package/src/transformers/features/RandomTransformer.ts +11 -7
  503. package/src/transformers/features/json/JsonApplicationTransformer.ts +116 -111
  504. package/src/transformers/features/misc/MetadataTransformer.ts +61 -53
  505. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +2 -2
  506. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +2 -2
  507. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +11 -7
  508. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +9 -7
  509. package/src/transformers/internal/GenericTransformer.ts +17 -10
  510. package/src/typings/Atomic.ts +1 -0
  511. package/src/typings/ProtobufAtomic.ts +19 -0
  512. package/src/typings/ValidationPipe.ts +9 -0
  513. package/src/utils/RandomGenerator.ts +83 -83
  514. package/lib/CustomValidatorMap.d.ts +0 -110
  515. package/lib/CustomValidatorMap.js.map +0 -1
  516. package/lib/factories/MetadataTagFactory.d.ts +0 -6
  517. package/lib/factories/MetadataTagFactory.js +0 -312
  518. package/lib/factories/MetadataTagFactory.js.map +0 -1
  519. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +0 -5
  520. package/lib/factories/internal/metadata/emplace_metadata_array.js +0 -38
  521. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +0 -1
  522. package/lib/factories/internal/metadata/iterate_metadata_tag.d.ts +0 -2
  523. package/lib/factories/internal/metadata/iterate_metadata_tag.js +0 -50
  524. package/lib/factories/internal/metadata/iterate_metadata_tag.js.map +0 -1
  525. package/lib/functional/$is_custom.d.ts +0 -2
  526. package/lib/functional/$is_custom.js +0 -13
  527. package/lib/functional/$is_custom.js.map +0 -1
  528. package/lib/functional/$is_date.d.ts +0 -1
  529. package/lib/functional/$is_date.js +0 -7
  530. package/lib/functional/$is_date.js.map +0 -1
  531. package/lib/functional/$is_datetime.d.ts +0 -1
  532. package/lib/functional/$is_datetime.js +0 -8
  533. package/lib/functional/$is_datetime.js.map +0 -1
  534. package/lib/functional/$is_email.d.ts +0 -1
  535. package/lib/functional/$is_email.js +0 -7
  536. package/lib/functional/$is_email.js.map +0 -1
  537. package/lib/functional/$is_ipv4.d.ts +0 -1
  538. package/lib/functional/$is_ipv4.js +0 -7
  539. package/lib/functional/$is_ipv4.js.map +0 -1
  540. package/lib/functional/$is_ipv6.d.ts +0 -1
  541. package/lib/functional/$is_ipv6.js +0 -7
  542. package/lib/functional/$is_ipv6.js.map +0 -1
  543. package/lib/functional/$is_url.d.ts +0 -1
  544. package/lib/functional/$is_url.js +0 -7
  545. package/lib/functional/$is_url.js.map +0 -1
  546. package/lib/functional/$is_uuid.d.ts +0 -1
  547. package/lib/functional/$is_uuid.js +0 -7
  548. package/lib/functional/$is_uuid.js.map +0 -1
  549. package/lib/programmers/IsPruneProgrammer.js.map +0 -1
  550. package/lib/programmers/internal/application_resolved.d.ts +0 -4
  551. package/lib/programmers/internal/application_resolved.js.map +0 -1
  552. package/lib/programmers/internal/check_array.js +0 -44
  553. package/lib/programmers/internal/check_array.js.map +0 -1
  554. package/lib/programmers/internal/check_custom.d.ts +0 -1
  555. package/lib/programmers/internal/check_custom.js +0 -30
  556. package/lib/programmers/internal/check_custom.js.map +0 -1
  557. package/lib/programmers/internal/check_string_tags.d.ts +0 -1
  558. package/lib/programmers/internal/check_string_tags.js +0 -89
  559. package/lib/programmers/internal/check_string_tags.js.map +0 -1
  560. package/lib/programmers/internal/get_comment_tags.d.ts +0 -1
  561. package/lib/programmers/internal/get_comment_tags.js +0 -25
  562. package/lib/programmers/internal/get_comment_tags.js.map +0 -1
  563. package/lib/schemas/metadata/ICommentTag.d.ts +0 -4
  564. package/lib/schemas/metadata/ICommentTag.js.map +0 -1
  565. package/lib/schemas/metadata/IMetadataTag.d.ts +0 -63
  566. package/lib/schemas/metadata/IMetadataTag.js.map +0 -1
  567. package/src/CustomValidatorMap.ts +0 -126
  568. package/src/factories/MetadataTagFactory.ts +0 -366
  569. package/src/factories/internal/metadata/iterate_metadata_tag.ts +0 -31
  570. package/src/functional/$is_custom.ts +0 -14
  571. package/src/functional/$is_date.ts +0 -3
  572. package/src/functional/$is_datetime.ts +0 -2
  573. package/src/functional/$is_email.ts +0 -4
  574. package/src/functional/$is_ipv4.ts +0 -4
  575. package/src/functional/$is_ipv6.ts +0 -4
  576. package/src/functional/$is_url.ts +0 -4
  577. package/src/functional/$is_uuid.ts +0 -4
  578. package/src/programmers/internal/check_array.ts +0 -30
  579. package/src/programmers/internal/check_custom.ts +0 -31
  580. package/src/programmers/internal/check_string_tags.ts +0 -67
  581. package/src/programmers/internal/get_comment_tags.ts +0 -23
  582. package/src/schemas/metadata/ICommentTag.ts +0 -4
  583. package/src/schemas/metadata/IMetadataTag.ts +0 -112
  584. /package/lib/{programmers/internal/check_array.d.ts → factories/MetadataCommentTagFactory.d.ts} +0 -0
@@ -1,995 +1,964 @@
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 { IJsDocTagInfo } from "../../schemas/metadata/IJsDocTagInfo";
12
- import { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
13
- import { Metadata } from "../../schemas/metadata/Metadata";
14
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
15
- import { MetadataObject } from "../../schemas/metadata/MetadataObject";
16
- import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
17
-
18
- import { IProject } from "../../transformers/IProject";
19
-
20
- import { Atomic } from "../../typings/Atomic";
21
-
22
- import { ArrayUtil } from "../../utils/ArrayUtil";
23
-
24
- import { FeatureProgrammer } from "../FeatureProgrammer";
25
- import { IsProgrammer } from "../IsProgrammer";
26
- import { AtomicPredicator } from "../helpers/AtomicPredicator";
27
- import { FunctionImporter } from "../helpers/FunctionImporeter";
28
- import { IExpressionEntry } from "../helpers/IExpressionEntry";
29
- import { OptionPredicator } from "../helpers/OptionPredicator";
30
- import { StringifyJoiner } from "../helpers/StringifyJoinder";
31
- import { StringifyPredicator } from "../helpers/StringifyPredicator";
32
- import { UnionExplorer } from "../helpers/UnionExplorer";
33
- import { check_native } from "../internal/check_native";
34
- import { decode_union_object } from "../internal/decode_union_object";
35
- import { feature_object_entries } from "../internal/feature_object_entries";
36
- import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
37
-
38
- export namespace JsonStringifyProgrammer {
39
- /* -----------------------------------------------------------
40
- WRITER
41
- ----------------------------------------------------------- */
42
-
43
- export const write =
44
- (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
45
- const importer: FunctionImporter = new FunctionImporter(
46
- modulo.getText(),
47
- );
48
- const config: FeatureProgrammer.IConfig =
49
- configure(project)(importer);
50
-
51
- return FeatureProgrammer.write(project)({
52
- ...config,
53
- addition: (collection) => [
54
- ...IsProgrammer.write_function_statements(project)(
55
- importer,
56
- )(collection),
57
- ...importer.declare(modulo),
58
- ],
59
- })(importer);
60
- };
61
-
62
- const write_array_functions =
63
- (config: FeatureProgrammer.IConfig) =>
64
- (importer: FunctionImporter) =>
65
- (collection: MetadataCollection): ts.VariableStatement[] =>
66
- collection
67
- .arrays()
68
- .filter((a) => a.recursive)
69
- .map((array, i) =>
70
- StatementFactory.constant(
71
- `${config.prefix}a${i}`,
72
- ts.factory.createArrowFunction(
73
- undefined,
74
- undefined,
75
- FeatureProgrammer.parameterDeclarations(config)(
76
- TypeFactory.keyword("any"),
77
- )(ts.factory.createIdentifier("input")),
78
- TypeFactory.keyword("any"),
79
- undefined,
80
- decode_array_inline(config)(importer)(
81
- ts.factory.createIdentifier("input"),
82
- array,
83
- {
84
- tracable: config.trace,
85
- source: "function",
86
- from: "array",
87
- postfix: "",
88
- },
89
- ),
90
- ),
91
- ),
92
- );
93
-
94
- const write_tuple_functions =
95
- (project: IProject) =>
96
- (config: FeatureProgrammer.IConfig) =>
97
- (importer: FunctionImporter) =>
98
- (collection: MetadataCollection): ts.VariableStatement[] =>
99
- collection
100
- .tuples()
101
- .filter((t) => t.recursive)
102
- .map((tuple, i) =>
103
- StatementFactory.constant(
104
- `${config.prefix}t${i}`,
105
- ts.factory.createArrowFunction(
106
- undefined,
107
- undefined,
108
- FeatureProgrammer.parameterDeclarations(config)(
109
- TypeFactory.keyword("any"),
110
- )(ts.factory.createIdentifier("input")),
111
- TypeFactory.keyword("any"),
112
- undefined,
113
- decode_tuple_inline(project)(config)(importer)(
114
- ts.factory.createIdentifier("input"),
115
- tuple,
116
- {
117
- tracable: config.trace,
118
- source: "function",
119
- from: "array",
120
- postfix: "",
121
- },
122
- ),
123
- ),
124
- ),
125
- );
126
-
127
- /* -----------------------------------------------------------
128
- DECODERS
129
- ----------------------------------------------------------- */
130
- const decode =
131
- (project: IProject) =>
132
- (config: FeatureProgrammer.IConfig) =>
133
- (importer: FunctionImporter) =>
134
- (
135
- input: ts.Expression,
136
- meta: Metadata,
137
- explore: FeatureProgrammer.IExplore,
138
- ): ts.Expression => {
139
- // ANY TYPE
140
- if (meta.any === true)
141
- return wrap_required(
142
- input,
143
- meta,
144
- explore,
145
- )(
146
- wrap_functional(
147
- input,
148
- meta,
149
- explore,
150
- )(
151
- ts.factory.createCallExpression(
152
- ts.factory.createIdentifier("JSON.stringify"),
153
- undefined,
154
- [input],
155
- ),
156
- ),
157
- );
158
-
159
- // ONLY NULL OR UNDEFINED
160
- const size: number = meta.size();
161
- if (
162
- size === 0 &&
163
- (meta.isRequired() === false || meta.nullable === true)
164
- ) {
165
- if (meta.isRequired() === false && meta.nullable === true)
166
- return explore.from === "array"
167
- ? ts.factory.createStringLiteral("null")
168
- : ts.factory.createConditionalExpression(
169
- ts.factory.createStrictEquality(
170
- ts.factory.createNull(),
171
- input,
172
- ),
173
- undefined,
174
- ts.factory.createStringLiteral("null"),
175
- undefined,
176
- ts.factory.createIdentifier("undefined"),
177
- );
178
- else if (meta.isRequired() === false)
179
- return explore.from === "array"
180
- ? ts.factory.createStringLiteral("null")
181
- : ts.factory.createIdentifier("undefined");
182
- else return ts.factory.createStringLiteral("null");
183
- }
184
-
185
- //----
186
- // LIST UP UNION TYPES
187
- //----
188
- const unions: IUnion[] = [];
189
-
190
- // toJSON() METHOD
191
- if (meta.escaped !== null)
192
- unions.push({
193
- type: "resolved",
194
- is: () => IsProgrammer.decode_to_json(false)(input),
195
- value: () =>
196
- decode_to_json(project)(config)(importer)(
197
- input,
198
- meta.escaped!.returns,
199
- explore,
200
- ),
201
- });
202
- else if (meta.functional === true)
203
- unions.push({
204
- type: "functional",
205
- is: () => IsProgrammer.decode_functional(input),
206
- value: () => decode_functional(explore),
207
- });
208
-
209
- // TEMPLATES
210
- if (
211
- meta.templates.length ||
212
- ArrayUtil.has(meta.constants, (c) => c.type === "string")
213
- )
214
- if (AtomicPredicator.template(meta)) {
215
- const partial = Metadata.initialize();
216
- partial.atomics.push({ type: "string", tags: [] }),
217
- unions.push({
218
- type: "template literal",
219
- is: () =>
220
- IsProgrammer.decode(project)(importer)(
221
- input,
222
- partial,
223
- explore,
224
- [],
225
- [],
226
- ),
227
- value: () =>
228
- decode_atomic(project)(importer)(
229
- input,
230
- "string",
231
- explore,
232
- ),
233
- });
234
- }
235
-
236
- // CONSTANTS
237
- for (const constant of meta.constants)
238
- if (AtomicPredicator.constant(meta)(constant.type) === false)
239
- continue;
240
- else if (constant.type !== "string")
241
- unions.push({
242
- type: "atomic",
243
- is: () =>
244
- IsProgrammer.decode(project)(importer)(
245
- input,
246
- (() => {
247
- const partial = Metadata.initialize();
248
- partial.atomics.push({
249
- type: constant.type,
250
- tags: [],
251
- });
252
- return partial;
253
- })(),
254
- explore,
255
- [],
256
- [],
257
- ),
258
- value: () =>
259
- decode_atomic(project)(importer)(
260
- input,
261
- constant.type,
262
- explore,
263
- ),
264
- });
265
- else if (meta.templates.length === 0)
266
- unions.push({
267
- type: "const string",
268
- is: () =>
269
- IsProgrammer.decode(project)(importer)(
270
- input,
271
- (() => {
272
- const partial = Metadata.initialize();
273
- partial.atomics.push({
274
- type: "string",
275
- tags: [],
276
- });
277
- return partial;
278
- })(),
279
- explore,
280
- [],
281
- [],
282
- ),
283
- value: () =>
284
- decode_constant_string(project)(importer)(
285
- input,
286
- [...constant.values] as string[],
287
- explore,
288
- ),
289
- });
290
-
291
- /// ATOMICS
292
- for (const a of meta.atomics)
293
- if (AtomicPredicator.atomic(meta)(a.type))
294
- unions.push({
295
- type: "atomic",
296
- is: () =>
297
- IsProgrammer.decode(project)(importer)(
298
- input,
299
- (() => {
300
- const partial = Metadata.initialize();
301
- partial.atomics.push(a);
302
- return partial;
303
- })(),
304
- explore,
305
- [],
306
- [],
307
- ),
308
- value: () =>
309
- decode_atomic(project)(importer)(
310
- input,
311
- a.type,
312
- explore,
313
- ),
314
- });
315
-
316
- // TUPLES
317
- for (const tuple of meta.tuples) {
318
- for (const child of tuple.elements)
319
- if (StringifyPredicator.undefindable(meta))
320
- throw new Error(
321
- `Error on typia.json.stringify(): tuple cannot contain undefined value - (${child.getName()}).`,
322
- );
323
- unions.push({
324
- type: "tuple",
325
- is: () =>
326
- IsProgrammer.decode(project)(importer)(
327
- input,
328
- (() => {
329
- const partial = Metadata.initialize();
330
- partial.tuples.push(tuple);
331
- return partial;
332
- })(),
333
- explore,
334
- [],
335
- [],
336
- ),
337
- value: () =>
338
- decode_tuple(project)(config)(importer)(
339
- input,
340
- tuple,
341
- explore,
342
- ),
343
- });
344
- }
345
-
346
- // ARRAYS
347
- if (meta.arrays.length) {
348
- for (const child of meta.arrays)
349
- if (StringifyPredicator.undefindable(child.value))
350
- throw new Error(
351
- `Error on typia.json.stringify(): array cannot contain undefined value (${child.value.getName()}).`,
352
- );
353
- const value: () => ts.Expression =
354
- meta.arrays.length === 1
355
- ? () =>
356
- decode_array(config)(importer)(
357
- input,
358
- meta.arrays[0]!,
359
- {
360
- ...explore,
361
- from: "array",
362
- },
363
- )
364
- : meta.arrays.some((elem) => elem.value.any)
365
- ? () =>
366
- ts.factory.createCallExpression(
367
- ts.factory.createIdentifier("JSON.stringify"),
368
- undefined,
369
- [input],
370
- )
371
- : () =>
372
- explore_arrays(project)(config)(importer)(
373
- input,
374
- meta.arrays,
375
- {
376
- ...explore,
377
- from: "array",
378
- },
379
- );
380
-
381
- unions.push({
382
- type: "array",
383
- is: () => ExpressionFactory.isArray(input),
384
- value,
385
- });
386
- }
387
-
388
- // BUILT-IN CLASSES
389
- if (meta.natives.length)
390
- for (const native of meta.natives)
391
- unions.push({
392
- type: "object",
393
- is: () => check_native(native)(input),
394
- value: () =>
395
- AtomicPredicator.native(native)
396
- ? decode_atomic(project)(importer)(
397
- input,
398
- native.toLowerCase() as Atomic.Literal,
399
- explore,
400
- )
401
- : ts.factory.createStringLiteral("{}"),
402
- });
403
-
404
- // SETS
405
- if (meta.sets.length)
406
- unions.push({
407
- type: "object",
408
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
409
- value: () => ts.factory.createStringLiteral("{}"),
410
- });
411
-
412
- // MAPS
413
- if (meta.maps.length)
414
- unions.push({
415
- type: "object",
416
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
417
- value: () => ts.factory.createStringLiteral("{}"),
418
- });
419
-
420
- // OBJECTS
421
- if (meta.objects.length)
422
- unions.push({
423
- type: "object",
424
- is: () =>
425
- ExpressionFactory.isObject({
426
- checkNull: true,
427
- checkArray: meta.objects.some((obj) =>
428
- obj.properties.every(
429
- (prop) =>
430
- !prop.key.isSoleLiteral() ||
431
- !prop.value.isRequired(),
432
- ),
433
- ),
434
- })(input),
435
- value: () =>
436
- meta.isParentResolved() === false &&
437
- meta.objects.length === 1 &&
438
- meta.objects[0]!._Is_simple(
439
- explore.from === "top" ? 0 : 1,
440
- )
441
- ? (() => {
442
- const obj: MetadataObject = meta.objects[0]!;
443
- const entries: IExpressionEntry<ts.Expression>[] =
444
- feature_object_entries({
445
- decoder: () =>
446
- decode(project)(config)(importer),
447
- trace: false,
448
- path: false,
449
- })(importer)(obj)(
450
- ts.factory.createAsExpression(
451
- input,
452
- TypeFactory.keyword("any"),
453
- ),
454
- );
455
- return StringifyJoiner.object(importer)(
456
- ts.factory.createAsExpression(
457
- input,
458
- TypeFactory.keyword("any"),
459
- ),
460
- entries,
461
- );
462
- })()
463
- : explore_objects(config)(importer)(input, meta, {
464
- ...explore,
465
- from: "object",
466
- }),
467
- });
468
-
469
- //----
470
- // RETURNS
471
- //----
472
- // CHECK NULL AND UNDEFINED
473
- const wrapper = (output: ts.Expression) =>
474
- wrap_required(
475
- input,
476
- meta,
477
- explore,
478
- )(wrap_nullable(input, meta)(output));
479
-
480
- // DIRECT RETURN
481
- if (unions.length === 0)
482
- return ts.factory.createCallExpression(
483
- ts.factory.createIdentifier("JSON.stringify"),
484
- undefined,
485
- [input],
486
- );
487
- else if (unions.length === 1) return wrapper(unions[0]!.value());
488
-
489
- // RETURN WITH TYPE CHECKING
490
- return wrapper(
491
- ts.factory.createCallExpression(
492
- ts.factory.createArrowFunction(
493
- undefined,
494
- undefined,
495
- [],
496
- undefined,
497
- undefined,
498
- iterate(importer, input, unions, meta.getName()),
499
- ),
500
- undefined,
501
- undefined,
502
- ),
503
- );
504
- };
505
-
506
- const decode_object = (importer: FunctionImporter) =>
507
- FeatureProgrammer.decode_object({
508
- trace: false,
509
- path: false,
510
- prefix: PREFIX,
511
- })(importer);
512
-
513
- const decode_array =
514
- (config: FeatureProgrammer.IConfig) =>
515
- (importer: FunctionImporter) =>
516
- (
517
- input: ts.Expression,
518
- array: MetadataArray,
519
- explore: FeatureProgrammer.IExplore,
520
- ) =>
521
- array.recursive
522
- ? ts.factory.createCallExpression(
523
- ts.factory.createIdentifier(
524
- importer.useLocal(`${config.prefix}a${array.index}`),
525
- ),
526
- undefined,
527
- FeatureProgrammer.argumentsArray(config)({
528
- ...explore,
529
- source: "function",
530
- from: "array",
531
- })(input),
532
- )
533
- : decode_array_inline(config)(importer)(input, array, explore);
534
-
535
- const decode_array_inline =
536
- (config: FeatureProgrammer.IConfig) =>
537
- (importer: FunctionImporter) =>
538
- (
539
- input: ts.Expression,
540
- array: MetadataArray,
541
- explore: FeatureProgrammer.IExplore,
542
- ) =>
543
- FeatureProgrammer.decode_array(config)(importer)(
544
- StringifyJoiner.array,
545
- )(input, array, explore, [], []);
546
-
547
- const decode_tuple =
548
- (project: IProject) =>
549
- (config: FeatureProgrammer.IConfig) =>
550
- (importer: FunctionImporter) =>
551
- (
552
- input: ts.Expression,
553
- tuple: MetadataTuple,
554
- explore: FeatureProgrammer.IExplore,
555
- ): ts.Expression =>
556
- tuple.recursive
557
- ? ts.factory.createCallExpression(
558
- ts.factory.createIdentifier(
559
- importer.useLocal(`${config.prefix}t${tuple.index}`),
560
- ),
561
- undefined,
562
- FeatureProgrammer.argumentsArray(config)({
563
- ...explore,
564
- source: "function",
565
- })(input),
566
- )
567
- : decode_tuple_inline(project)(config)(importer)(
568
- input,
569
- tuple,
570
- explore,
571
- );
572
-
573
- const decode_tuple_inline =
574
- (project: IProject) =>
575
- (config: FeatureProgrammer.IConfig) =>
576
- (importer: FunctionImporter) =>
577
- (
578
- input: ts.Expression,
579
- tuple: MetadataTuple,
580
- explore: FeatureProgrammer.IExplore,
581
- ): ts.Expression => {
582
- const children: ts.Expression[] = tuple.elements
583
- .filter((elem) => elem.rest === null)
584
- .map((elem, index) =>
585
- decode(project)(config)(importer)(
586
- ts.factory.createElementAccessExpression(input, index),
587
- elem,
588
- {
589
- ...explore,
590
- from: "array",
591
- postfix: explore.postfix.length
592
- ? `${explore.postfix.slice(0, -1)}[${index}]"`
593
- : `"[${index}]"`,
594
- },
595
- ),
596
- );
597
- const rest = (() => {
598
- if (tuple.elements.length === 0) return null;
599
- const last = tuple.elements.at(-1)!;
600
- if (last.rest === null) return null;
601
-
602
- const code = decode(project)(config)(importer)(
603
- ts.factory.createCallExpression(
604
- IdentifierFactory.access(input)("slice"),
605
- undefined,
606
- [
607
- ts.factory.createNumericLiteral(
608
- tuple.elements.length - 1,
609
- ),
610
- ],
611
- ),
612
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
613
- {
614
- ...explore,
615
- start: tuple.elements.length - 1,
616
- },
617
- );
618
- return ts.factory.createCallExpression(
619
- importer.use("rest"),
620
- undefined,
621
- [code],
622
- );
623
- })();
624
- return StringifyJoiner.tuple(children, rest);
625
- };
626
-
627
- const decode_atomic =
628
- (project: IProject) =>
629
- (importer: FunctionImporter) =>
630
- (
631
- input: ts.Expression,
632
- type: string,
633
- explore: FeatureProgrammer.IExplore,
634
- ) => {
635
- if (type === "string")
636
- return ts.factory.createCallExpression(
637
- importer.use("string"),
638
- undefined,
639
- [input],
640
- );
641
- else if (
642
- type === "number" &&
643
- OptionPredicator.numeric(project.options)
644
- )
645
- input = ts.factory.createCallExpression(
646
- importer.use("number"),
647
- undefined,
648
- [input],
649
- );
650
-
651
- return explore.from !== "top"
652
- ? input
653
- : ts.factory.createCallExpression(
654
- IdentifierFactory.access(input)("toString"),
655
- undefined,
656
- undefined,
657
- );
658
- };
659
-
660
- const decode_constant_string =
661
- (project: IProject) =>
662
- (importer: FunctionImporter) =>
663
- (
664
- input: ts.Expression,
665
- values: string[],
666
- explore: FeatureProgrammer.IExplore,
667
- ): ts.Expression => {
668
- if (values.every((v) => !StringifyPredicator.require_escape(v)))
669
- return [
670
- ts.factory.createStringLiteral('"'),
671
- input,
672
- ts.factory.createStringLiteral('"'),
673
- ].reduce((x, y) => ts.factory.createAdd(x, y));
674
- else
675
- return decode_atomic(project)(importer)(
676
- input,
677
- "string",
678
- explore,
679
- );
680
- };
681
-
682
- const decode_to_json =
683
- (project: IProject) =>
684
- (config: FeatureProgrammer.IConfig) =>
685
- (importer: FunctionImporter) =>
686
- (
687
- input: ts.Expression,
688
- resolved: Metadata,
689
- explore: FeatureProgrammer.IExplore,
690
- ): ts.Expression => {
691
- return decode(project)(config)(importer)(
692
- ts.factory.createCallExpression(
693
- IdentifierFactory.access(input)("toJSON"),
694
- undefined,
695
- [],
696
- ),
697
- resolved,
698
- explore,
699
- );
700
- };
701
-
702
- const decode_functional = (explore: FeatureProgrammer.IExplore) =>
703
- explore.from === "array"
704
- ? ts.factory.createStringLiteral("null")
705
- : ts.factory.createIdentifier("undefined");
706
-
707
- /* -----------------------------------------------------------
708
- EXPLORERS
709
- ----------------------------------------------------------- */
710
- const explore_objects =
711
- (config: FeatureProgrammer.IConfig) =>
712
- (importer: FunctionImporter) =>
713
- (
714
- input: ts.Expression,
715
- meta: Metadata,
716
- explore: FeatureProgrammer.IExplore,
717
- ) =>
718
- meta.objects.length === 1
719
- ? decode_object(importer)(input, meta.objects[0]!, explore)
720
- : ts.factory.createCallExpression(
721
- ts.factory.createIdentifier(
722
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
723
- ),
724
- undefined,
725
- FeatureProgrammer.argumentsArray(config)(explore)(input),
726
- );
727
-
728
- const explore_arrays =
729
- (project: IProject) =>
730
- (config: FeatureProgrammer.IConfig) =>
731
- (importer: FunctionImporter) =>
732
- (
733
- input: ts.Expression,
734
- elements: MetadataArray[],
735
- explore: FeatureProgrammer.IExplore,
736
- ): ts.Expression =>
737
- explore_array_like_union_types(config)(importer)(
738
- UnionExplorer.array({
739
- checker: IsProgrammer.decode(project)(importer),
740
- decoder: decode_array(config)(importer),
741
- empty: ts.factory.createStringLiteral("[]"),
742
- success: ts.factory.createTrue(),
743
- failure: (input, expected) =>
744
- create_throw_error(importer)(expected)(input),
745
- }),
746
- )(input, elements, explore);
747
-
748
- const explore_array_like_union_types =
749
- (config: FeatureProgrammer.IConfig) =>
750
- (importer: FunctionImporter) =>
751
- <T extends MetadataArray | MetadataTuple>(
752
- factory: (
753
- parameters: ts.ParameterDeclaration[],
754
- ) => (
755
- input: ts.Expression,
756
- elements: T[],
757
- explore: FeatureProgrammer.IExplore,
758
- tags: IMetadataTag[],
759
- jsDocTags: IJsDocTagInfo[],
760
- ) => ts.ArrowFunction,
761
- ) =>
762
- (
763
- input: ts.Expression,
764
- elements: T[],
765
- explore: FeatureProgrammer.IExplore,
766
- ): ts.Expression => {
767
- const arrow =
768
- (parameters: ts.ParameterDeclaration[]) =>
769
- (explore: FeatureProgrammer.IExplore) =>
770
- (input: ts.Expression): ts.ArrowFunction =>
771
- factory(parameters)(input, elements, explore, [], []);
772
- if (elements.every((e) => e.recursive === false))
773
- ts.factory.createCallExpression(
774
- arrow([])(explore)(input),
775
- undefined,
776
- [],
777
- );
778
-
779
- explore = {
780
- ...explore,
781
- source: "function",
782
- from: "array",
783
- };
784
- return ts.factory.createCallExpression(
785
- ts.factory.createIdentifier(
786
- importer.emplaceUnion(
787
- config.prefix,
788
- elements.map((e) => e.name).join(" | "),
789
- () =>
790
- arrow(
791
- FeatureProgrammer.parameterDeclarations(config)(
792
- TypeFactory.keyword("any"),
793
- )(ts.factory.createIdentifier("input")),
794
- )({
795
- ...explore,
796
- postfix: "",
797
- })(ts.factory.createIdentifier("input")),
798
- ),
799
- ),
800
- undefined,
801
- FeatureProgrammer.argumentsArray(config)(explore)(input),
802
- );
803
- };
804
-
805
- /* -----------------------------------------------------------
806
- RETURN SCRIPTS
807
- ----------------------------------------------------------- */
808
- const wrap_required = (
809
- input: ts.Expression,
810
- meta: Metadata,
811
- explore: FeatureProgrammer.IExplore,
812
- ): ((expression: ts.Expression) => ts.Expression) => {
813
- if (meta.isRequired() === true && meta.any === false)
814
- return (expression) => expression;
815
- return (expression) =>
816
- ts.factory.createConditionalExpression(
817
- ts.factory.createStrictInequality(
818
- ts.factory.createIdentifier("undefined"),
819
- input,
820
- ),
821
- undefined,
822
- expression,
823
- undefined,
824
- explore.from === "array"
825
- ? ts.factory.createStringLiteral("null")
826
- : ts.factory.createIdentifier("undefined"),
827
- );
828
- };
829
-
830
- const wrap_nullable = (
831
- input: ts.Expression,
832
- meta: Metadata,
833
- ): ((expression: ts.Expression) => ts.Expression) => {
834
- if (meta.nullable === false) return (expression) => expression;
835
- return (expression) =>
836
- ts.factory.createConditionalExpression(
837
- ts.factory.createStrictInequality(
838
- ts.factory.createNull(),
839
- input,
840
- ),
841
- undefined,
842
- expression,
843
- undefined,
844
- ts.factory.createStringLiteral("null"),
845
- );
846
- };
847
-
848
- const wrap_functional = (
849
- input: ts.Expression,
850
- meta: Metadata,
851
- explore: FeatureProgrammer.IExplore,
852
- ): ((expression: ts.Expression) => ts.Expression) => {
853
- if (meta.functional === false) return (expression) => expression;
854
- return (expression) =>
855
- ts.factory.createConditionalExpression(
856
- ts.factory.createStrictInequality(
857
- ts.factory.createStringLiteral("function"),
858
- ValueFactory.TYPEOF(input),
859
- ),
860
- undefined,
861
- expression,
862
- undefined,
863
- decode_functional(explore),
864
- );
865
- };
866
-
867
- const iterate = (
868
- importer: FunctionImporter,
869
- input: ts.Expression,
870
- unions: IUnion[],
871
- expected: string,
872
- ) =>
873
- ts.factory.createBlock(
874
- [
875
- ...unions.map((u) =>
876
- ts.factory.createIfStatement(
877
- u.is(),
878
- ts.factory.createReturnStatement(u.value()),
879
- ),
880
- ),
881
- create_throw_error(importer)(expected)(input),
882
- ],
883
- true,
884
- );
885
-
886
- /* -----------------------------------------------------------
887
- CONFIGURATIONS
888
- ----------------------------------------------------------- */
889
- const PREFIX = "$s";
890
-
891
- const configure =
892
- (project: IProject) =>
893
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
894
- const config: FeatureProgrammer.IConfig = {
895
- types: {
896
- input: (type, name) =>
897
- ts.factory.createTypeReferenceNode(
898
- name ??
899
- TypeFactory.getFullName(project.checker)(type),
900
- ),
901
- output: () => TypeFactory.keyword("string"),
902
- },
903
- prefix: PREFIX,
904
- trace: false,
905
- path: false,
906
- initializer,
907
- decoder: () => decode(project)(config)(importer),
908
- objector: {
909
- checker: () => (input, meta, explore) =>
910
- IsProgrammer.decode(project)(importer)(
911
- input,
912
- meta,
913
- explore,
914
- [],
915
- [],
916
- ),
917
- decoder: () => decode_object(importer),
918
- joiner: StringifyJoiner.object(importer),
919
- unionizer: decode_union_object(
920
- IsProgrammer.decode_object(importer),
921
- )(decode_object(importer))((exp) => exp)(
922
- (value, expected) =>
923
- create_throw_error(importer)(expected)(value),
924
- ),
925
- failure: (input, expected) =>
926
- create_throw_error(importer)(expected)(input),
927
- },
928
- generator: {
929
- arrays: () => write_array_functions(config)(importer),
930
- tuples: () =>
931
- write_tuple_functions(project)(config)(importer),
932
- },
933
- };
934
- return config;
935
- };
936
-
937
- const initializer: FeatureProgrammer.IConfig["initializer"] =
938
- ({ checker }) =>
939
- (type) => {
940
- const collection: MetadataCollection = new MetadataCollection();
941
- const meta: Metadata = MetadataFactory.analyze(checker)({
942
- escape: true,
943
- constant: true,
944
- absorb: true,
945
- validate: (meta) => {
946
- if (meta.atomics.find((a) => a.type === "bigint"))
947
- throw new Error(NO_BIGINT);
948
- else if (
949
- meta.arrays.some(
950
- (array) => array.value.isRequired() === false,
951
- )
952
- )
953
- throw new Error(NO_UNDEFINED_IN_ARRAY);
954
- },
955
- })(collection)(type);
956
- return [collection, meta];
957
- };
958
-
959
- const create_throw_error =
960
- (importer: FunctionImporter) =>
961
- (expected: string) =>
962
- (value: ts.Expression) =>
963
- ts.factory.createExpressionStatement(
964
- ts.factory.createCallExpression(
965
- importer.use("throws"),
966
- [],
967
- [
968
- ts.factory.createObjectLiteralExpression(
969
- [
970
- ts.factory.createPropertyAssignment(
971
- "expected",
972
- ts.factory.createStringLiteral(expected),
973
- ),
974
- ts.factory.createPropertyAssignment(
975
- "value",
976
- value,
977
- ),
978
- ],
979
- true,
980
- ),
981
- ],
982
- ),
983
- );
984
- }
985
-
986
- interface IUnion {
987
- type: string;
988
- is: () => ts.Expression;
989
- value: () => ts.Expression;
990
- }
991
-
992
- const NO_BIGINT =
993
- "Error on typia.json.stringify(): does not allow bigint type.";
994
- const NO_UNDEFINED_IN_ARRAY =
995
- "Error on typia.json.stringify(): does not allow undefined type in array.";
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+ import { JsonMetadataFactory } from "../../factories/JsonMetadataFactory";
6
+ import { MetadataCollection } from "../../factories/MetadataCollection";
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 { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic";
14
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
15
+ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
16
+ import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
17
+
18
+ import { IProject } from "../../transformers/IProject";
19
+
20
+ import { Atomic } from "../../typings/Atomic";
21
+
22
+ import { ArrayUtil } from "../../utils/ArrayUtil";
23
+
24
+ import { FeatureProgrammer } from "../FeatureProgrammer";
25
+ import { IsProgrammer } from "../IsProgrammer";
26
+ import { AtomicPredicator } from "../helpers/AtomicPredicator";
27
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
28
+ import { IExpressionEntry } from "../helpers/IExpressionEntry";
29
+ import { OptionPredicator } from "../helpers/OptionPredicator";
30
+ import { StringifyJoiner } from "../helpers/StringifyJoinder";
31
+ import { StringifyPredicator } from "../helpers/StringifyPredicator";
32
+ import { UnionExplorer } from "../helpers/UnionExplorer";
33
+ import { check_native } from "../internal/check_native";
34
+ import { decode_union_object } from "../internal/decode_union_object";
35
+ import { feature_object_entries } from "../internal/feature_object_entries";
36
+ import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
37
+
38
+ export namespace JsonStringifyProgrammer {
39
+ /* -----------------------------------------------------------
40
+ WRITER
41
+ ----------------------------------------------------------- */
42
+
43
+ export const write =
44
+ (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
45
+ const importer: FunctionImporter = new FunctionImporter(
46
+ modulo.getText(),
47
+ );
48
+ const config: FeatureProgrammer.IConfig =
49
+ configure(project)(importer);
50
+
51
+ return FeatureProgrammer.write(project)({
52
+ ...config,
53
+ addition: (collection) => [
54
+ ...IsProgrammer.write_function_statements(project)(
55
+ importer,
56
+ )(collection),
57
+ ...importer.declare(modulo),
58
+ ],
59
+ })(importer);
60
+ };
61
+
62
+ const write_array_functions =
63
+ (config: FeatureProgrammer.IConfig) =>
64
+ (importer: FunctionImporter) =>
65
+ (collection: MetadataCollection): ts.VariableStatement[] =>
66
+ collection
67
+ .arrays()
68
+ .filter((a) => a.recursive)
69
+ .map((type, i) =>
70
+ StatementFactory.constant(
71
+ `${config.prefix}a${i}`,
72
+ ts.factory.createArrowFunction(
73
+ undefined,
74
+ undefined,
75
+ FeatureProgrammer.parameterDeclarations(config)(
76
+ TypeFactory.keyword("any"),
77
+ )(ts.factory.createIdentifier("input")),
78
+ TypeFactory.keyword("any"),
79
+ undefined,
80
+ decode_array_inline(config)(importer)(
81
+ ts.factory.createIdentifier("input"),
82
+ MetadataArray.create({
83
+ type,
84
+ tags: [],
85
+ }),
86
+ {
87
+ tracable: config.trace,
88
+ source: "function",
89
+ from: "array",
90
+ postfix: "",
91
+ },
92
+ ),
93
+ ),
94
+ ),
95
+ );
96
+
97
+ const write_tuple_functions =
98
+ (project: IProject) =>
99
+ (config: FeatureProgrammer.IConfig) =>
100
+ (importer: FunctionImporter) =>
101
+ (collection: MetadataCollection): ts.VariableStatement[] =>
102
+ collection
103
+ .tuples()
104
+ .filter((t) => t.recursive)
105
+ .map((tuple, i) =>
106
+ StatementFactory.constant(
107
+ `${config.prefix}t${i}`,
108
+ ts.factory.createArrowFunction(
109
+ undefined,
110
+ undefined,
111
+ FeatureProgrammer.parameterDeclarations(config)(
112
+ TypeFactory.keyword("any"),
113
+ )(ts.factory.createIdentifier("input")),
114
+ TypeFactory.keyword("any"),
115
+ undefined,
116
+ decode_tuple_inline(project)(config)(importer)(
117
+ ts.factory.createIdentifier("input"),
118
+ tuple,
119
+ {
120
+ tracable: config.trace,
121
+ source: "function",
122
+ from: "array",
123
+ postfix: "",
124
+ },
125
+ ),
126
+ ),
127
+ ),
128
+ );
129
+
130
+ /* -----------------------------------------------------------
131
+ DECODERS
132
+ ----------------------------------------------------------- */
133
+ const decode =
134
+ (project: IProject) =>
135
+ (config: FeatureProgrammer.IConfig) =>
136
+ (importer: FunctionImporter) =>
137
+ (
138
+ input: ts.Expression,
139
+ meta: Metadata,
140
+ explore: FeatureProgrammer.IExplore,
141
+ ): ts.Expression => {
142
+ // ANY TYPE
143
+ if (meta.any === true)
144
+ return wrap_required(
145
+ input,
146
+ meta,
147
+ explore,
148
+ )(
149
+ wrap_functional(
150
+ input,
151
+ meta,
152
+ explore,
153
+ )(
154
+ ts.factory.createCallExpression(
155
+ ts.factory.createIdentifier("JSON.stringify"),
156
+ undefined,
157
+ [input],
158
+ ),
159
+ ),
160
+ );
161
+
162
+ // ONLY NULL OR UNDEFINED
163
+ const size: number = meta.size();
164
+ if (
165
+ size === 0 &&
166
+ (meta.isRequired() === false || meta.nullable === true)
167
+ ) {
168
+ if (meta.isRequired() === false && meta.nullable === true)
169
+ return explore.from === "array"
170
+ ? ts.factory.createStringLiteral("null")
171
+ : ts.factory.createConditionalExpression(
172
+ ts.factory.createStrictEquality(
173
+ ts.factory.createNull(),
174
+ input,
175
+ ),
176
+ undefined,
177
+ ts.factory.createStringLiteral("null"),
178
+ undefined,
179
+ ts.factory.createIdentifier("undefined"),
180
+ );
181
+ else if (meta.isRequired() === false)
182
+ return explore.from === "array"
183
+ ? ts.factory.createStringLiteral("null")
184
+ : ts.factory.createIdentifier("undefined");
185
+ else return ts.factory.createStringLiteral("null");
186
+ }
187
+
188
+ //----
189
+ // LIST UP UNION TYPES
190
+ //----
191
+ const unions: IUnion[] = [];
192
+
193
+ // toJSON() METHOD
194
+ if (meta.escaped !== null)
195
+ unions.push({
196
+ type: "resolved",
197
+ is: () => IsProgrammer.decode_to_json(false)(input),
198
+ value: () =>
199
+ decode_to_json(project)(config)(importer)(
200
+ input,
201
+ meta.escaped!.returns,
202
+ explore,
203
+ ),
204
+ });
205
+ else if (meta.functional === true)
206
+ unions.push({
207
+ type: "functional",
208
+ is: () => IsProgrammer.decode_functional(input),
209
+ value: () => decode_functional(explore),
210
+ });
211
+
212
+ // TEMPLATES
213
+ if (
214
+ meta.templates.length ||
215
+ ArrayUtil.has(meta.constants, (c) => c.type === "string")
216
+ )
217
+ if (AtomicPredicator.template(meta)) {
218
+ const partial = Metadata.initialize();
219
+ partial.atomics.push(
220
+ MetadataAtomic.create({ type: "string", tags: [] }),
221
+ ),
222
+ unions.push({
223
+ type: "template literal",
224
+ is: () =>
225
+ IsProgrammer.decode(project)(importer)(
226
+ input,
227
+ partial,
228
+ explore,
229
+ ),
230
+ value: () =>
231
+ decode_atomic(project)(importer)(
232
+ input,
233
+ "string",
234
+ explore,
235
+ ),
236
+ });
237
+ }
238
+
239
+ // CONSTANTS
240
+ for (const constant of meta.constants)
241
+ if (AtomicPredicator.constant(meta)(constant.type) === false)
242
+ continue;
243
+ else if (constant.type !== "string")
244
+ unions.push({
245
+ type: "atomic",
246
+ is: () =>
247
+ IsProgrammer.decode(project)(importer)(
248
+ input,
249
+ (() => {
250
+ const partial = Metadata.initialize();
251
+ partial.atomics.push(
252
+ MetadataAtomic.create({
253
+ type: constant.type,
254
+ tags: [],
255
+ }),
256
+ );
257
+ return partial;
258
+ })(),
259
+ explore,
260
+ ),
261
+ value: () =>
262
+ decode_atomic(project)(importer)(
263
+ input,
264
+ constant.type,
265
+ explore,
266
+ ),
267
+ });
268
+ else if (meta.templates.length === 0)
269
+ unions.push({
270
+ type: "const string",
271
+ is: () =>
272
+ IsProgrammer.decode(project)(importer)(
273
+ input,
274
+ (() => {
275
+ const partial = Metadata.initialize();
276
+ partial.atomics.push(
277
+ MetadataAtomic.create({
278
+ type: "string",
279
+ tags: [],
280
+ }),
281
+ );
282
+ return partial;
283
+ })(),
284
+ explore,
285
+ ),
286
+ value: () =>
287
+ decode_constant_string(project)(importer)(
288
+ input,
289
+ [...constant.values] as string[],
290
+ explore,
291
+ ),
292
+ });
293
+
294
+ /// ATOMICS
295
+ for (const a of meta.atomics)
296
+ if (AtomicPredicator.atomic(meta)(a.type))
297
+ unions.push({
298
+ type: "atomic",
299
+ is: () =>
300
+ IsProgrammer.decode(project)(importer)(
301
+ input,
302
+ (() => {
303
+ const partial = Metadata.initialize();
304
+ partial.atomics.push(a);
305
+ return partial;
306
+ })(),
307
+ explore,
308
+ ),
309
+ value: () =>
310
+ decode_atomic(project)(importer)(
311
+ input,
312
+ a.type,
313
+ explore,
314
+ ),
315
+ });
316
+
317
+ // TUPLES
318
+ for (const tuple of meta.tuples)
319
+ unions.push({
320
+ type: "tuple",
321
+ is: () =>
322
+ IsProgrammer.decode(project)(importer)(
323
+ input,
324
+ (() => {
325
+ const partial = Metadata.initialize();
326
+ partial.tuples.push(tuple);
327
+ return partial;
328
+ })(),
329
+ explore,
330
+ ),
331
+ value: () =>
332
+ decode_tuple(project)(config)(importer)(
333
+ input,
334
+ tuple,
335
+ explore,
336
+ ),
337
+ });
338
+
339
+ // ARRAYS
340
+ if (meta.arrays.length) {
341
+ const value: () => ts.Expression =
342
+ meta.arrays.length === 1
343
+ ? () =>
344
+ decode_array(config)(importer)(
345
+ input,
346
+ meta.arrays[0]!,
347
+ {
348
+ ...explore,
349
+ from: "array",
350
+ },
351
+ )
352
+ : meta.arrays.some((elem) => elem.type.value.any)
353
+ ? () =>
354
+ ts.factory.createCallExpression(
355
+ ts.factory.createIdentifier("JSON.stringify"),
356
+ undefined,
357
+ [input],
358
+ )
359
+ : () =>
360
+ explore_arrays(project)(config)(importer)(
361
+ input,
362
+ meta.arrays,
363
+ {
364
+ ...explore,
365
+ from: "array",
366
+ },
367
+ );
368
+
369
+ unions.push({
370
+ type: "array",
371
+ is: () => ExpressionFactory.isArray(input),
372
+ value,
373
+ });
374
+ }
375
+
376
+ // BUILT-IN CLASSES
377
+ if (meta.natives.length)
378
+ for (const native of meta.natives)
379
+ unions.push({
380
+ type: "object",
381
+ is: () => check_native(native)(input),
382
+ value: () =>
383
+ AtomicPredicator.native(native)
384
+ ? decode_atomic(project)(importer)(
385
+ input,
386
+ native.toLowerCase() as Atomic.Literal,
387
+ explore,
388
+ )
389
+ : ts.factory.createStringLiteral("{}"),
390
+ });
391
+
392
+ // SETS
393
+ if (meta.sets.length)
394
+ unions.push({
395
+ type: "object",
396
+ is: () => ExpressionFactory.isInstanceOf("Set")(input),
397
+ value: () => ts.factory.createStringLiteral("{}"),
398
+ });
399
+
400
+ // MAPS
401
+ if (meta.maps.length)
402
+ unions.push({
403
+ type: "object",
404
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
405
+ value: () => ts.factory.createStringLiteral("{}"),
406
+ });
407
+
408
+ // OBJECTS
409
+ if (meta.objects.length)
410
+ unions.push({
411
+ type: "object",
412
+ is: () =>
413
+ ExpressionFactory.isObject({
414
+ checkNull: true,
415
+ checkArray: meta.objects.some((obj) =>
416
+ obj.properties.every(
417
+ (prop) =>
418
+ !prop.key.isSoleLiteral() ||
419
+ !prop.value.isRequired(),
420
+ ),
421
+ ),
422
+ })(input),
423
+ value: () =>
424
+ meta.isParentResolved() === false &&
425
+ meta.objects.length === 1 &&
426
+ meta.objects[0]!._Is_simple(
427
+ explore.from === "top" ? 0 : 1,
428
+ )
429
+ ? (() => {
430
+ const obj: MetadataObject = meta.objects[0]!;
431
+ const entries: IExpressionEntry<ts.Expression>[] =
432
+ feature_object_entries({
433
+ decoder: () =>
434
+ decode(project)(config)(importer),
435
+ trace: false,
436
+ path: false,
437
+ })(importer)(obj)(
438
+ ts.factory.createAsExpression(
439
+ input,
440
+ TypeFactory.keyword("any"),
441
+ ),
442
+ );
443
+ return StringifyJoiner.object(importer)(
444
+ ts.factory.createAsExpression(
445
+ input,
446
+ TypeFactory.keyword("any"),
447
+ ),
448
+ entries,
449
+ );
450
+ })()
451
+ : explore_objects(config)(importer)(input, meta, {
452
+ ...explore,
453
+ from: "object",
454
+ }),
455
+ });
456
+
457
+ //----
458
+ // RETURNS
459
+ //----
460
+ // CHECK NULL AND UNDEFINED
461
+ const wrapper = (output: ts.Expression) =>
462
+ wrap_required(
463
+ input,
464
+ meta,
465
+ explore,
466
+ )(wrap_nullable(input, meta)(output));
467
+
468
+ // DIRECT RETURN
469
+ if (unions.length === 0)
470
+ return ts.factory.createCallExpression(
471
+ ts.factory.createIdentifier("JSON.stringify"),
472
+ undefined,
473
+ [input],
474
+ );
475
+ else if (unions.length === 1) return wrapper(unions[0]!.value());
476
+
477
+ // RETURN WITH TYPE CHECKING
478
+ return wrapper(
479
+ ts.factory.createCallExpression(
480
+ ts.factory.createArrowFunction(
481
+ undefined,
482
+ undefined,
483
+ [],
484
+ undefined,
485
+ undefined,
486
+ iterate(importer, input, unions, meta.getName()),
487
+ ),
488
+ undefined,
489
+ undefined,
490
+ ),
491
+ );
492
+ };
493
+
494
+ const decode_object = (importer: FunctionImporter) =>
495
+ FeatureProgrammer.decode_object({
496
+ trace: false,
497
+ path: false,
498
+ prefix: PREFIX,
499
+ })(importer);
500
+
501
+ const decode_array =
502
+ (config: FeatureProgrammer.IConfig) =>
503
+ (importer: FunctionImporter) =>
504
+ (
505
+ input: ts.Expression,
506
+ array: MetadataArray,
507
+ explore: FeatureProgrammer.IExplore,
508
+ ) =>
509
+ array.type.recursive
510
+ ? ts.factory.createCallExpression(
511
+ ts.factory.createIdentifier(
512
+ importer.useLocal(
513
+ `${config.prefix}a${array.type.index}`,
514
+ ),
515
+ ),
516
+ undefined,
517
+ FeatureProgrammer.argumentsArray(config)({
518
+ ...explore,
519
+ source: "function",
520
+ from: "array",
521
+ })(input),
522
+ )
523
+ : decode_array_inline(config)(importer)(input, array, explore);
524
+
525
+ const decode_array_inline =
526
+ (config: FeatureProgrammer.IConfig) =>
527
+ (importer: FunctionImporter) =>
528
+ (
529
+ input: ts.Expression,
530
+ array: MetadataArray,
531
+ explore: FeatureProgrammer.IExplore,
532
+ ) =>
533
+ FeatureProgrammer.decode_array(config)(importer)(
534
+ StringifyJoiner.array,
535
+ )(input, array, explore);
536
+
537
+ const decode_tuple =
538
+ (project: IProject) =>
539
+ (config: FeatureProgrammer.IConfig) =>
540
+ (importer: FunctionImporter) =>
541
+ (
542
+ input: ts.Expression,
543
+ tuple: MetadataTuple,
544
+ explore: FeatureProgrammer.IExplore,
545
+ ): ts.Expression =>
546
+ tuple.type.recursive
547
+ ? ts.factory.createCallExpression(
548
+ ts.factory.createIdentifier(
549
+ importer.useLocal(
550
+ `${config.prefix}t${tuple.type.index}`,
551
+ ),
552
+ ),
553
+ undefined,
554
+ FeatureProgrammer.argumentsArray(config)({
555
+ ...explore,
556
+ source: "function",
557
+ })(input),
558
+ )
559
+ : decode_tuple_inline(project)(config)(importer)(
560
+ input,
561
+ tuple.type,
562
+ explore,
563
+ );
564
+
565
+ const decode_tuple_inline =
566
+ (project: IProject) =>
567
+ (config: FeatureProgrammer.IConfig) =>
568
+ (importer: FunctionImporter) =>
569
+ (
570
+ input: ts.Expression,
571
+ tuple: MetadataTupleType,
572
+ explore: FeatureProgrammer.IExplore,
573
+ ): ts.Expression => {
574
+ const children: ts.Expression[] = tuple.elements
575
+ .filter((elem) => elem.rest === null)
576
+ .map((elem, index) =>
577
+ decode(project)(config)(importer)(
578
+ ts.factory.createElementAccessExpression(input, index),
579
+ elem,
580
+ {
581
+ ...explore,
582
+ from: "array",
583
+ postfix: explore.postfix.length
584
+ ? `${explore.postfix.slice(0, -1)}[${index}]"`
585
+ : `"[${index}]"`,
586
+ },
587
+ ),
588
+ );
589
+ const rest = (() => {
590
+ if (tuple.elements.length === 0) return null;
591
+ const last = tuple.elements.at(-1)!;
592
+ if (last.rest === null) return null;
593
+
594
+ const code = decode(project)(config)(importer)(
595
+ ts.factory.createCallExpression(
596
+ IdentifierFactory.access(input)("slice"),
597
+ undefined,
598
+ [
599
+ ts.factory.createNumericLiteral(
600
+ tuple.elements.length - 1,
601
+ ),
602
+ ],
603
+ ),
604
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
605
+ {
606
+ ...explore,
607
+ start: tuple.elements.length - 1,
608
+ },
609
+ );
610
+ return ts.factory.createCallExpression(
611
+ importer.use("rest"),
612
+ undefined,
613
+ [code],
614
+ );
615
+ })();
616
+ return StringifyJoiner.tuple(children, rest);
617
+ };
618
+
619
+ const decode_atomic =
620
+ (project: IProject) =>
621
+ (importer: FunctionImporter) =>
622
+ (
623
+ input: ts.Expression,
624
+ type: string,
625
+ explore: FeatureProgrammer.IExplore,
626
+ ) => {
627
+ if (type === "string")
628
+ return ts.factory.createCallExpression(
629
+ importer.use("string"),
630
+ undefined,
631
+ [input],
632
+ );
633
+ else if (
634
+ type === "number" &&
635
+ OptionPredicator.numeric(project.options)
636
+ )
637
+ input = ts.factory.createCallExpression(
638
+ importer.use("number"),
639
+ undefined,
640
+ [input],
641
+ );
642
+
643
+ return explore.from !== "top"
644
+ ? input
645
+ : ts.factory.createCallExpression(
646
+ IdentifierFactory.access(input)("toString"),
647
+ undefined,
648
+ undefined,
649
+ );
650
+ };
651
+
652
+ const decode_constant_string =
653
+ (project: IProject) =>
654
+ (importer: FunctionImporter) =>
655
+ (
656
+ input: ts.Expression,
657
+ values: string[],
658
+ explore: FeatureProgrammer.IExplore,
659
+ ): ts.Expression => {
660
+ if (values.every((v) => !StringifyPredicator.require_escape(v)))
661
+ return [
662
+ ts.factory.createStringLiteral('"'),
663
+ input,
664
+ ts.factory.createStringLiteral('"'),
665
+ ].reduce((x, y) => ts.factory.createAdd(x, y));
666
+ else
667
+ return decode_atomic(project)(importer)(
668
+ input,
669
+ "string",
670
+ explore,
671
+ );
672
+ };
673
+
674
+ const decode_to_json =
675
+ (project: IProject) =>
676
+ (config: FeatureProgrammer.IConfig) =>
677
+ (importer: FunctionImporter) =>
678
+ (
679
+ input: ts.Expression,
680
+ resolved: Metadata,
681
+ explore: FeatureProgrammer.IExplore,
682
+ ): ts.Expression => {
683
+ return decode(project)(config)(importer)(
684
+ ts.factory.createCallExpression(
685
+ IdentifierFactory.access(input)("toJSON"),
686
+ undefined,
687
+ [],
688
+ ),
689
+ resolved,
690
+ explore,
691
+ );
692
+ };
693
+
694
+ const decode_functional = (explore: FeatureProgrammer.IExplore) =>
695
+ explore.from === "array"
696
+ ? ts.factory.createStringLiteral("null")
697
+ : ts.factory.createIdentifier("undefined");
698
+
699
+ /* -----------------------------------------------------------
700
+ EXPLORERS
701
+ ----------------------------------------------------------- */
702
+ const explore_objects =
703
+ (config: FeatureProgrammer.IConfig) =>
704
+ (importer: FunctionImporter) =>
705
+ (
706
+ input: ts.Expression,
707
+ meta: Metadata,
708
+ explore: FeatureProgrammer.IExplore,
709
+ ) =>
710
+ meta.objects.length === 1
711
+ ? decode_object(importer)(input, meta.objects[0]!, explore)
712
+ : ts.factory.createCallExpression(
713
+ ts.factory.createIdentifier(
714
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
715
+ ),
716
+ undefined,
717
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
718
+ );
719
+
720
+ const explore_arrays =
721
+ (project: IProject) =>
722
+ (config: FeatureProgrammer.IConfig) =>
723
+ (importer: FunctionImporter) =>
724
+ (
725
+ input: ts.Expression,
726
+ elements: MetadataArray[],
727
+ explore: FeatureProgrammer.IExplore,
728
+ ): ts.Expression =>
729
+ explore_array_like_union_types(config)(importer)(
730
+ UnionExplorer.array({
731
+ checker: IsProgrammer.decode(project)(importer),
732
+ decoder: decode_array(config)(importer),
733
+ empty: ts.factory.createStringLiteral("[]"),
734
+ success: ts.factory.createTrue(),
735
+ failure: (input, expected) =>
736
+ create_throw_error(importer)(expected)(input),
737
+ }),
738
+ )(input, elements, explore);
739
+
740
+ const explore_array_like_union_types =
741
+ (config: FeatureProgrammer.IConfig) =>
742
+ (importer: FunctionImporter) =>
743
+ <T extends MetadataArray | MetadataTuple>(
744
+ factory: (
745
+ parameters: ts.ParameterDeclaration[],
746
+ ) => (
747
+ input: ts.Expression,
748
+ elements: T[],
749
+ explore: FeatureProgrammer.IExplore,
750
+ ) => ts.ArrowFunction,
751
+ ) =>
752
+ (
753
+ input: ts.Expression,
754
+ elements: T[],
755
+ explore: FeatureProgrammer.IExplore,
756
+ ): ts.Expression => {
757
+ const arrow =
758
+ (parameters: ts.ParameterDeclaration[]) =>
759
+ (explore: FeatureProgrammer.IExplore) =>
760
+ (input: ts.Expression): ts.ArrowFunction =>
761
+ factory(parameters)(input, elements, explore);
762
+ if (elements.every((e) => e.type.recursive === false))
763
+ ts.factory.createCallExpression(
764
+ arrow([])(explore)(input),
765
+ undefined,
766
+ [],
767
+ );
768
+
769
+ explore = {
770
+ ...explore,
771
+ source: "function",
772
+ from: "array",
773
+ };
774
+ return ts.factory.createCallExpression(
775
+ ts.factory.createIdentifier(
776
+ importer.emplaceUnion(
777
+ config.prefix,
778
+ elements.map((e) => e.type.name).join(" | "),
779
+ () =>
780
+ arrow(
781
+ FeatureProgrammer.parameterDeclarations(config)(
782
+ TypeFactory.keyword("any"),
783
+ )(ts.factory.createIdentifier("input")),
784
+ )({
785
+ ...explore,
786
+ postfix: "",
787
+ })(ts.factory.createIdentifier("input")),
788
+ ),
789
+ ),
790
+ undefined,
791
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
792
+ );
793
+ };
794
+
795
+ /* -----------------------------------------------------------
796
+ RETURN SCRIPTS
797
+ ----------------------------------------------------------- */
798
+ const wrap_required = (
799
+ input: ts.Expression,
800
+ meta: Metadata,
801
+ explore: FeatureProgrammer.IExplore,
802
+ ): ((expression: ts.Expression) => ts.Expression) => {
803
+ if (meta.isRequired() === true && meta.any === false)
804
+ return (expression) => expression;
805
+ return (expression) =>
806
+ ts.factory.createConditionalExpression(
807
+ ts.factory.createStrictInequality(
808
+ ts.factory.createIdentifier("undefined"),
809
+ input,
810
+ ),
811
+ undefined,
812
+ expression,
813
+ undefined,
814
+ explore.from === "array"
815
+ ? ts.factory.createStringLiteral("null")
816
+ : ts.factory.createIdentifier("undefined"),
817
+ );
818
+ };
819
+
820
+ const wrap_nullable = (
821
+ input: ts.Expression,
822
+ meta: Metadata,
823
+ ): ((expression: ts.Expression) => ts.Expression) => {
824
+ if (meta.nullable === false) return (expression) => expression;
825
+ return (expression) =>
826
+ ts.factory.createConditionalExpression(
827
+ ts.factory.createStrictInequality(
828
+ ts.factory.createNull(),
829
+ input,
830
+ ),
831
+ undefined,
832
+ expression,
833
+ undefined,
834
+ ts.factory.createStringLiteral("null"),
835
+ );
836
+ };
837
+
838
+ const wrap_functional = (
839
+ input: ts.Expression,
840
+ meta: Metadata,
841
+ explore: FeatureProgrammer.IExplore,
842
+ ): ((expression: ts.Expression) => ts.Expression) => {
843
+ if (meta.functional === false) return (expression) => expression;
844
+ return (expression) =>
845
+ ts.factory.createConditionalExpression(
846
+ ts.factory.createStrictInequality(
847
+ ts.factory.createStringLiteral("function"),
848
+ ValueFactory.TYPEOF(input),
849
+ ),
850
+ undefined,
851
+ expression,
852
+ undefined,
853
+ decode_functional(explore),
854
+ );
855
+ };
856
+
857
+ const iterate = (
858
+ importer: FunctionImporter,
859
+ input: ts.Expression,
860
+ unions: IUnion[],
861
+ expected: string,
862
+ ) =>
863
+ ts.factory.createBlock(
864
+ [
865
+ ...unions.map((u) =>
866
+ ts.factory.createIfStatement(
867
+ u.is(),
868
+ ts.factory.createReturnStatement(u.value()),
869
+ ),
870
+ ),
871
+ create_throw_error(importer)(expected)(input),
872
+ ],
873
+ true,
874
+ );
875
+
876
+ /* -----------------------------------------------------------
877
+ CONFIGURATIONS
878
+ ----------------------------------------------------------- */
879
+ const PREFIX = "$s";
880
+
881
+ const configure =
882
+ (project: IProject) =>
883
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
884
+ const config: FeatureProgrammer.IConfig = {
885
+ types: {
886
+ input: (type, name) =>
887
+ ts.factory.createTypeReferenceNode(
888
+ name ??
889
+ TypeFactory.getFullName(project.checker)(type),
890
+ ),
891
+ output: () => TypeFactory.keyword("string"),
892
+ },
893
+ prefix: PREFIX,
894
+ trace: false,
895
+ path: false,
896
+ initializer,
897
+ decoder: () => decode(project)(config)(importer),
898
+ objector: {
899
+ checker: () => (input, meta, explore) =>
900
+ IsProgrammer.decode(project)(importer)(
901
+ input,
902
+ meta,
903
+ explore,
904
+ ),
905
+ decoder: () => decode_object(importer),
906
+ joiner: StringifyJoiner.object(importer),
907
+ unionizer: decode_union_object(
908
+ IsProgrammer.decode_object(importer),
909
+ )(decode_object(importer))((exp) => exp)(
910
+ (value, expected) =>
911
+ create_throw_error(importer)(expected)(value),
912
+ ),
913
+ failure: (input, expected) =>
914
+ create_throw_error(importer)(expected)(input),
915
+ },
916
+ generator: {
917
+ arrays: () => write_array_functions(config)(importer),
918
+ tuples: () =>
919
+ write_tuple_functions(project)(config)(importer),
920
+ },
921
+ };
922
+ return config;
923
+ };
924
+
925
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
926
+ ({ checker }) =>
927
+ (importer) =>
928
+ (type) =>
929
+ JsonMetadataFactory.analyze(`typia.json.${importer.method}`)(
930
+ checker,
931
+ )(type);
932
+
933
+ const create_throw_error =
934
+ (importer: FunctionImporter) =>
935
+ (expected: string) =>
936
+ (value: ts.Expression) =>
937
+ ts.factory.createExpressionStatement(
938
+ ts.factory.createCallExpression(
939
+ importer.use("throws"),
940
+ [],
941
+ [
942
+ ts.factory.createObjectLiteralExpression(
943
+ [
944
+ ts.factory.createPropertyAssignment(
945
+ "expected",
946
+ ts.factory.createStringLiteral(expected),
947
+ ),
948
+ ts.factory.createPropertyAssignment(
949
+ "value",
950
+ value,
951
+ ),
952
+ ],
953
+ true,
954
+ ),
955
+ ],
956
+ ),
957
+ );
958
+ }
959
+
960
+ interface IUnion {
961
+ type: string;
962
+ is: () => ts.Expression;
963
+ value: () => ts.Expression;
964
+ }