typia 6.10.2-dev.20240920 → 6.10.2

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