typia 5.5.5 → 5.5.6-dev.20240319

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