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,714 +1,714 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../../factories/MetadataCollection";
6
- import { MetadataFactory } from "../../factories/MetadataFactory";
7
- import { StatementFactory } from "../../factories/StatementFactory";
8
- import { TypeFactory } from "../../factories/TypeFactory";
9
-
10
- import { Metadata } from "../../schemas/metadata/Metadata";
11
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
12
- import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
13
- import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
14
-
15
- import { IProject } from "../../transformers/IProject";
16
- import { TransformerError } from "../../transformers/TransformerError";
17
-
18
- import { StringUtil } from "../../utils/StringUtil";
19
-
20
- import { FeatureProgrammer } from "../FeatureProgrammer";
21
- import { IsProgrammer } from "../IsProgrammer";
22
- import { FunctionImporter } from "../helpers/FunctionImporter";
23
- import { NotationJoiner } from "../helpers/NotationJoiner";
24
- import { UnionExplorer } from "../helpers/UnionExplorer";
25
- import { decode_union_object } from "../internal/decode_union_object";
26
- import { postfix_of_tuple } from "../internal/postfix_of_tuple";
27
- import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
28
-
29
- export namespace NotationGeneralProgrammer {
30
- export const returnType =
31
- (rename: (str: string) => string) => (type: string) =>
32
- `typia.${StringUtil.capitalize(rename.name)}Case<${type}>`;
33
-
34
- export const decompose = (props: {
35
- rename: (str: string) => string;
36
- validated: boolean;
37
- project: IProject;
38
- importer: FunctionImporter;
39
- type: ts.Type;
40
- name: string | undefined;
41
- }): FeatureProgrammer.IDecomposed => {
42
- const config = configure(props.rename)(props.project)(props.importer);
43
- if (props.validated === false)
44
- config.addition = (collection) =>
45
- IsProgrammer.write_function_statements(props.project)(props.importer)(
46
- collection,
47
- );
48
- const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({
49
- ...props,
50
- config,
51
- });
52
- return {
53
- functions: composed.functions,
54
- statements: composed.statements,
55
- arrow: ts.factory.createArrowFunction(
56
- undefined,
57
- undefined,
58
- composed.parameters,
59
- ts.factory.createTypeReferenceNode(
60
- returnType(props.rename)(
61
- props.name ??
62
- TypeFactory.getFullName(props.project.checker)(props.type),
63
- ),
64
- ),
65
- undefined,
66
- composed.body,
67
- ),
68
- };
69
- };
70
-
71
- export const write =
72
- (rename: (str: string) => string) =>
73
- (project: IProject) =>
74
- (modulo: ts.LeftHandSideExpression) =>
75
- (type: ts.Type, name?: string) => {
76
- const importer: FunctionImporter = new FunctionImporter(modulo.getText());
77
- const result: FeatureProgrammer.IDecomposed = decompose({
78
- rename,
79
- validated: true,
80
- project,
81
- importer,
82
- type,
83
- name,
84
- });
85
- return FeatureProgrammer.writeDecomposed({
86
- importer,
87
- modulo,
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 (
174
- meta.any ||
175
- meta.arrays.some((a) => a.type.value.any) ||
176
- meta.tuples.some(
177
- (t) =>
178
- !!t.type.elements.length && t.type.elements.every((e) => e.any),
179
- )
180
- )
181
- return ts.factory.createCallExpression(importer.use("any"), undefined, [
182
- input,
183
- ]);
184
-
185
- interface IUnion {
186
- type: string;
187
- is: () => ts.Expression;
188
- value: () => ts.Expression;
189
- }
190
- const unions: IUnion[] = [];
191
-
192
- //----
193
- // LIST UP UNION TYPES
194
- //----
195
- // FUNCTIONAL
196
- if (meta.functions.length)
197
- unions.push({
198
- type: "functional",
199
- is: () =>
200
- ts.factory.createStrictEquality(
201
- ts.factory.createStringLiteral("function"),
202
- ts.factory.createTypeOfExpression(input),
203
- ),
204
- value: () => ts.factory.createIdentifier("undefined"),
205
- });
206
-
207
- // TUPLES
208
- for (const tuple of meta.tuples)
209
- unions.push({
210
- type: "tuple",
211
- is: () =>
212
- IsProgrammer.decode(project)(importer)(
213
- input,
214
- (() => {
215
- const partial = Metadata.initialize();
216
- partial.tuples.push(tuple);
217
- return partial;
218
- })(),
219
- explore,
220
- ),
221
- value: () =>
222
- decode_tuple(project)(config)(importer)(input, tuple, explore),
223
- });
224
-
225
- // ARRAYS
226
- if (meta.arrays.length)
227
- unions.push({
228
- type: "array",
229
- is: () => ExpressionFactory.isArray(input),
230
- value: () =>
231
- explore_arrays(project)(config)(importer)(input, meta.arrays, {
232
- ...explore,
233
- from: "array",
234
- }),
235
- });
236
-
237
- // NATIVE TYPES
238
- if (meta.sets.length)
239
- unions.push({
240
- type: "set",
241
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
242
- value: () =>
243
- explore_sets(project)(config)(importer)(input, meta.sets, {
244
- ...explore,
245
- from: "array",
246
- }),
247
- });
248
- if (meta.maps.length)
249
- unions.push({
250
- type: "map",
251
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
252
- value: () =>
253
- explore_maps(project)(config)(importer)(input, meta.maps, {
254
- ...explore,
255
- from: "array",
256
- }),
257
- });
258
- for (const native of meta.natives) {
259
- if (native === "WeakSet" || native === "WeakMap") continue;
260
- unions.push({
261
- type: "native",
262
- is: () => ExpressionFactory.isInstanceOf(native)(input),
263
- value: () =>
264
- native === "Boolean" || native === "Number" || native === "String"
265
- ? ts.factory.createCallExpression(
266
- IdentifierFactory.access(input)("valueOf"),
267
- undefined,
268
- undefined,
269
- )
270
- : decode_native(native)(input),
271
- });
272
- }
273
-
274
- // OBJECTS
275
- if (meta.objects.length)
276
- unions.push({
277
- type: "object",
278
- is: () =>
279
- ExpressionFactory.isObject({
280
- checkNull: true,
281
- checkArray: false,
282
- })(input),
283
- value: () =>
284
- explore_objects(config)(importer)(input, meta, {
285
- ...explore,
286
- from: "object",
287
- }),
288
- });
289
-
290
- // COMPOSITION
291
- if (unions.length === 0) return input;
292
- else if (unions.length === 1 && meta.size() === 1) {
293
- const value: ts.Expression =
294
- (meta.nullable || meta.isRequired() === false) && is_instance(meta)
295
- ? ts.factory.createConditionalExpression(
296
- input,
297
- undefined,
298
- unions[0]!.value(),
299
- undefined,
300
- input,
301
- )
302
- : unions[0]!.value();
303
- return ts.factory.createAsExpression(value, TypeFactory.keyword("any"));
304
- } else {
305
- let last: ts.Expression = input;
306
- for (const u of unions.reverse())
307
- last = ts.factory.createConditionalExpression(
308
- u.is(),
309
- undefined,
310
- u.value(),
311
- undefined,
312
- last,
313
- );
314
- return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
315
- }
316
- };
317
-
318
- const decode_object = (importer: FunctionImporter) =>
319
- FeatureProgrammer.decode_object({
320
- trace: false,
321
- path: false,
322
- prefix: PREFIX,
323
- })(importer);
324
-
325
- const decode_array =
326
- (config: FeatureProgrammer.IConfig) =>
327
- (importer: FunctionImporter) =>
328
- (
329
- input: ts.Expression,
330
- array: MetadataArray,
331
- explore: FeatureProgrammer.IExplore,
332
- ) =>
333
- array.type.recursive
334
- ? ts.factory.createCallExpression(
335
- ts.factory.createIdentifier(
336
- importer.useLocal(`${config.prefix}a${array.type.index}`),
337
- ),
338
- undefined,
339
- FeatureProgrammer.argumentsArray(config)({
340
- ...explore,
341
- source: "function",
342
- from: "array",
343
- })(input),
344
- )
345
- : decode_array_inline(config)(importer)(input, array, explore);
346
-
347
- const decode_array_inline =
348
- (config: FeatureProgrammer.IConfig) =>
349
- (importer: FunctionImporter) =>
350
- (
351
- input: ts.Expression,
352
- array: MetadataArray,
353
- explore: FeatureProgrammer.IExplore,
354
- ) =>
355
- FeatureProgrammer.decode_array(config)(importer)(NotationJoiner.array)(
356
- input,
357
- array,
358
- explore,
359
- );
360
-
361
- const decode_tuple =
362
- (project: IProject) =>
363
- (config: FeatureProgrammer.IConfig) =>
364
- (importer: FunctionImporter) =>
365
- (
366
- input: ts.Expression,
367
- tuple: MetadataTuple,
368
- explore: FeatureProgrammer.IExplore,
369
- ): ts.Expression =>
370
- tuple.type.recursive
371
- ? ts.factory.createCallExpression(
372
- ts.factory.createIdentifier(
373
- importer.useLocal(`${config.prefix}t${tuple.type.index}`),
374
- ),
375
- undefined,
376
- FeatureProgrammer.argumentsArray(config)({
377
- ...explore,
378
- source: "function",
379
- })(input),
380
- )
381
- : decode_tuple_inline(project)(config)(importer)(
382
- input,
383
- tuple.type,
384
- explore,
385
- );
386
-
387
- const decode_tuple_inline =
388
- (project: IProject) =>
389
- (config: FeatureProgrammer.IConfig) =>
390
- (importer: FunctionImporter) =>
391
- (
392
- input: ts.Expression,
393
- tuple: MetadataTupleType,
394
- explore: FeatureProgrammer.IExplore,
395
- ): ts.Expression => {
396
- const children: ts.Expression[] = tuple.elements
397
- .filter((m) => m.rest === null)
398
- .map((elem, index) =>
399
- decode(project)(config)(importer)(
400
- ts.factory.createElementAccessExpression(input, index),
401
- elem,
402
- {
403
- ...explore,
404
- from: "array",
405
- postfix: explore.postfix.length
406
- ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
407
- : `"[${index}]"`,
408
- },
409
- ),
410
- );
411
- const rest = (() => {
412
- if (tuple.elements.length === 0) return null;
413
-
414
- const last: Metadata = tuple.elements.at(-1)!;
415
- const rest: Metadata | null = last.rest;
416
- if (rest === null) return null;
417
-
418
- return decode(project)(config)(importer)(
419
- ts.factory.createCallExpression(
420
- IdentifierFactory.access(input)("slice"),
421
- undefined,
422
- [ExpressionFactory.number(tuple.elements.length - 1)],
423
- ),
424
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
425
- {
426
- ...explore,
427
- start: tuple.elements.length - 1,
428
- },
429
- );
430
- })();
431
- return NotationJoiner.tuple(children, rest);
432
- };
433
-
434
- /* -----------------------------------------------------------
435
- NATIVE CLASSES
436
- ----------------------------------------------------------- */
437
- const decode_native = (type: string) => (input: ts.Expression) =>
438
- type === "Date"
439
- ? ts.factory.createNewExpression(
440
- ts.factory.createIdentifier(type),
441
- undefined,
442
- [input],
443
- )
444
- : input;
445
-
446
- /* -----------------------------------------------------------
447
- EXPLORERS FOR UNION TYPES
448
- ----------------------------------------------------------- */
449
- const explore_sets =
450
- (project: IProject) =>
451
- (config: FeatureProgrammer.IConfig) =>
452
- (importer: FunctionImporter) =>
453
- (
454
- input: ts.Expression,
455
- sets: Metadata[],
456
- explore: FeatureProgrammer.IExplore,
457
- ): ts.Expression =>
458
- ts.factory.createCallExpression(
459
- UnionExplorer.set({
460
- checker: IsProgrammer.decode(project)(importer),
461
- decoder: (input, array, explore) =>
462
- ts.factory.createNewExpression(
463
- ts.factory.createIdentifier("Set"),
464
- [TypeFactory.keyword("any")],
465
- [decode_array(config)(importer)(input, array, explore)],
466
- ),
467
- empty: ts.factory.createNewExpression(
468
- ts.factory.createIdentifier("Set"),
469
- [TypeFactory.keyword("any")],
470
- [],
471
- ),
472
- success: ts.factory.createTrue(),
473
- failure: (input, expected) =>
474
- create_throw_error(importer)(expected)(input),
475
- })([])(input, sets, explore),
476
- undefined,
477
- undefined,
478
- );
479
-
480
- const explore_maps =
481
- (project: IProject) =>
482
- (config: FeatureProgrammer.IConfig) =>
483
- (importer: FunctionImporter) =>
484
- (
485
- input: ts.Expression,
486
- maps: Metadata.Entry[],
487
- explore: FeatureProgrammer.IExplore,
488
- ): ts.Expression =>
489
- ts.factory.createCallExpression(
490
- UnionExplorer.map({
491
- checker: (top, entry, explore) => {
492
- const func = IsProgrammer.decode(project)(importer);
493
- return ts.factory.createLogicalAnd(
494
- func(ts.factory.createElementAccessExpression(top, 0), entry[0], {
495
- ...explore,
496
- postfix: `${explore.postfix}[0]`,
497
- }),
498
- func(ts.factory.createElementAccessExpression(top, 1), entry[1], {
499
- ...explore,
500
- postfix: `${explore.postfix}[1]`,
501
- }),
502
- );
503
- },
504
- decoder: (input, array, explore) =>
505
- ts.factory.createNewExpression(
506
- ts.factory.createIdentifier("Map"),
507
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
508
- [decode_array(config)(importer)(input, array, explore)],
509
- ),
510
- empty: ts.factory.createNewExpression(
511
- ts.factory.createIdentifier("Map"),
512
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
513
- [],
514
- ),
515
- success: ts.factory.createTrue(),
516
- failure: (input, expected) =>
517
- create_throw_error(importer)(expected)(input),
518
- })([])(input, maps, explore),
519
- undefined,
520
- undefined,
521
- );
522
-
523
- const explore_objects =
524
- (config: FeatureProgrammer.IConfig) =>
525
- (importer: FunctionImporter) =>
526
- (
527
- input: ts.Expression,
528
- meta: Metadata,
529
- explore: FeatureProgrammer.IExplore,
530
- ) => {
531
- if (meta.objects.length === 1)
532
- return decode_object(importer)(input, meta.objects[0]!, explore);
533
-
534
- return ts.factory.createCallExpression(
535
- ts.factory.createIdentifier(
536
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
537
- ),
538
- undefined,
539
- FeatureProgrammer.argumentsArray(config)(explore)(input),
540
- );
541
- };
542
-
543
- const explore_arrays =
544
- (project: IProject) =>
545
- (config: FeatureProgrammer.IConfig) =>
546
- (importer: FunctionImporter) =>
547
- (
548
- input: ts.Expression,
549
- elements: MetadataArray[],
550
- explore: FeatureProgrammer.IExplore,
551
- ): ts.Expression =>
552
- explore_array_like_union_types(config)(importer)(
553
- UnionExplorer.array({
554
- checker: IsProgrammer.decode(project)(importer),
555
- decoder: decode_array(config)(importer),
556
- empty: ts.factory.createIdentifier("[]"),
557
- success: ts.factory.createTrue(),
558
- failure: (input, expected) =>
559
- create_throw_error(importer)(expected)(input),
560
- }),
561
- )(input, elements, explore);
562
-
563
- const explore_array_like_union_types =
564
- (config: FeatureProgrammer.IConfig) =>
565
- (importer: FunctionImporter) =>
566
- <T extends MetadataArray | MetadataTuple>(
567
- factory: (
568
- parameters: ts.ParameterDeclaration[],
569
- ) => (
570
- input: ts.Expression,
571
- elements: T[],
572
- explore: FeatureProgrammer.IExplore,
573
- ) => ts.ArrowFunction,
574
- ) =>
575
- (
576
- input: ts.Expression,
577
- elements: T[],
578
- explore: FeatureProgrammer.IExplore,
579
- ): ts.Expression => {
580
- const arrow =
581
- (parameters: ts.ParameterDeclaration[]) =>
582
- (explore: FeatureProgrammer.IExplore) =>
583
- (input: ts.Expression): ts.ArrowFunction =>
584
- factory(parameters)(input, elements, explore);
585
- if (elements.every((e) => e.type.recursive === false))
586
- ts.factory.createCallExpression(
587
- arrow([])(explore)(input),
588
- undefined,
589
- [],
590
- );
591
-
592
- explore = {
593
- ...explore,
594
- source: "function",
595
- from: "array",
596
- };
597
- return ts.factory.createCallExpression(
598
- ts.factory.createIdentifier(
599
- importer.emplaceUnion(
600
- config.prefix,
601
- elements.map((e) => e.type.name).join(" | "),
602
- () =>
603
- arrow(
604
- FeatureProgrammer.parameterDeclarations(config)(
605
- TypeFactory.keyword("any"),
606
- )(ts.factory.createIdentifier("input")),
607
- )({
608
- ...explore,
609
- postfix: "",
610
- })(ts.factory.createIdentifier("input")),
611
- ),
612
- ),
613
- undefined,
614
- FeatureProgrammer.argumentsArray(config)(explore)(input),
615
- );
616
- };
617
-
618
- /* -----------------------------------------------------------
619
- CONFIGURATIONS
620
- ----------------------------------------------------------- */
621
- const PREFIX = "$c";
622
-
623
- const configure =
624
- (rename: (str: string) => string) =>
625
- (project: IProject) =>
626
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
627
- const config: FeatureProgrammer.IConfig = {
628
- types: {
629
- input: (type, name) =>
630
- ts.factory.createTypeReferenceNode(
631
- name ?? TypeFactory.getFullName(project.checker)(type),
632
- ),
633
- output: (type, name) =>
634
- ts.factory.createTypeReferenceNode(
635
- returnType(rename)(
636
- name ?? TypeFactory.getFullName(project.checker)(type),
637
- ),
638
- ),
639
- },
640
- prefix: PREFIX,
641
- trace: false,
642
- path: false,
643
- initializer,
644
- decoder: () => decode(project)(config)(importer),
645
- objector: {
646
- checker: () => IsProgrammer.decode(project)(importer),
647
- decoder: () => decode_object(importer),
648
- joiner: NotationJoiner.object(rename),
649
- unionizer: decode_union_object(
650
- IsProgrammer.decode_object(project)(importer),
651
- )(decode_object(importer))((exp) => exp)((input, expected) =>
652
- create_throw_error(importer)(expected)(input),
653
- ),
654
- failure: (input, expected) =>
655
- create_throw_error(importer)(expected)(input),
656
- },
657
- generator: {
658
- arrays: () => write_array_functions(config)(importer),
659
- tuples: () => write_tuple_functions(project)(config)(importer),
660
- },
661
- };
662
- return config;
663
- };
664
-
665
- const initializer: FeatureProgrammer.IConfig["initializer"] =
666
- (project) => (importer) => (type) => {
667
- const collection = new MetadataCollection();
668
- const result = MetadataFactory.analyze(
669
- project.checker,
670
- project.context,
671
- )({
672
- escape: false,
673
- constant: true,
674
- absorb: true,
675
- })(collection)(type);
676
- if (result.success === false)
677
- throw TransformerError.from(`typia.misc.${importer.method}`)(
678
- result.errors,
679
- );
680
- return [collection, result.data];
681
- };
682
-
683
- const create_throw_error =
684
- (importer: FunctionImporter) =>
685
- (expected: string) =>
686
- (value: ts.Expression) =>
687
- ts.factory.createExpressionStatement(
688
- ts.factory.createCallExpression(
689
- importer.use("throws"),
690
- [],
691
- [
692
- ts.factory.createObjectLiteralExpression(
693
- [
694
- ts.factory.createPropertyAssignment(
695
- "expected",
696
- ts.factory.createStringLiteral(expected),
697
- ),
698
- ts.factory.createPropertyAssignment("value", value),
699
- ],
700
- true,
701
- ),
702
- ],
703
- ),
704
- );
705
-
706
- const is_instance = (meta: Metadata): boolean =>
707
- !!meta.objects.length ||
708
- !!meta.arrays.length ||
709
- !!meta.tuples.length ||
710
- !!meta.sets.length ||
711
- !!meta.maps.length ||
712
- !!meta.natives.length ||
713
- (meta.rest !== null && is_instance(meta.rest));
714
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../../factories/MetadataFactory";
7
+ import { StatementFactory } from "../../factories/StatementFactory";
8
+ import { TypeFactory } from "../../factories/TypeFactory";
9
+
10
+ import { Metadata } from "../../schemas/metadata/Metadata";
11
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
12
+ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
13
+ import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
14
+
15
+ import { IProject } from "../../transformers/IProject";
16
+ import { TransformerError } from "../../transformers/TransformerError";
17
+
18
+ import { StringUtil } from "../../utils/StringUtil";
19
+
20
+ import { FeatureProgrammer } from "../FeatureProgrammer";
21
+ import { IsProgrammer } from "../IsProgrammer";
22
+ import { FunctionImporter } from "../helpers/FunctionImporter";
23
+ import { NotationJoiner } from "../helpers/NotationJoiner";
24
+ import { UnionExplorer } from "../helpers/UnionExplorer";
25
+ import { decode_union_object } from "../internal/decode_union_object";
26
+ import { postfix_of_tuple } from "../internal/postfix_of_tuple";
27
+ import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
28
+
29
+ export namespace NotationGeneralProgrammer {
30
+ export const returnType =
31
+ (rename: (str: string) => string) => (type: string) =>
32
+ `typia.${StringUtil.capitalize(rename.name)}Case<${type}>`;
33
+
34
+ export const decompose = (props: {
35
+ rename: (str: string) => string;
36
+ validated: boolean;
37
+ project: IProject;
38
+ importer: FunctionImporter;
39
+ type: ts.Type;
40
+ name: string | undefined;
41
+ }): FeatureProgrammer.IDecomposed => {
42
+ const config = configure(props.rename)(props.project)(props.importer);
43
+ if (props.validated === false)
44
+ config.addition = (collection) =>
45
+ IsProgrammer.write_function_statements(props.project)(props.importer)(
46
+ collection,
47
+ );
48
+ const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({
49
+ ...props,
50
+ config,
51
+ });
52
+ return {
53
+ functions: composed.functions,
54
+ statements: composed.statements,
55
+ arrow: ts.factory.createArrowFunction(
56
+ undefined,
57
+ undefined,
58
+ composed.parameters,
59
+ ts.factory.createTypeReferenceNode(
60
+ returnType(props.rename)(
61
+ props.name ??
62
+ TypeFactory.getFullName(props.project.checker)(props.type),
63
+ ),
64
+ ),
65
+ undefined,
66
+ composed.body,
67
+ ),
68
+ };
69
+ };
70
+
71
+ export const write =
72
+ (rename: (str: string) => string) =>
73
+ (project: IProject) =>
74
+ (modulo: ts.LeftHandSideExpression) =>
75
+ (type: ts.Type, name?: string) => {
76
+ const importer: FunctionImporter = new FunctionImporter(modulo.getText());
77
+ const result: FeatureProgrammer.IDecomposed = decompose({
78
+ rename,
79
+ validated: true,
80
+ project,
81
+ importer,
82
+ type,
83
+ name,
84
+ });
85
+ return FeatureProgrammer.writeDecomposed({
86
+ importer,
87
+ modulo,
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 (
174
+ meta.any ||
175
+ meta.arrays.some((a) => a.type.value.any) ||
176
+ meta.tuples.some(
177
+ (t) =>
178
+ !!t.type.elements.length && t.type.elements.every((e) => e.any),
179
+ )
180
+ )
181
+ return ts.factory.createCallExpression(importer.use("any"), undefined, [
182
+ input,
183
+ ]);
184
+
185
+ interface IUnion {
186
+ type: string;
187
+ is: () => ts.Expression;
188
+ value: () => ts.Expression;
189
+ }
190
+ const unions: IUnion[] = [];
191
+
192
+ //----
193
+ // LIST UP UNION TYPES
194
+ //----
195
+ // FUNCTIONAL
196
+ if (meta.functions.length)
197
+ unions.push({
198
+ type: "functional",
199
+ is: () =>
200
+ ts.factory.createStrictEquality(
201
+ ts.factory.createStringLiteral("function"),
202
+ ts.factory.createTypeOfExpression(input),
203
+ ),
204
+ value: () => ts.factory.createIdentifier("undefined"),
205
+ });
206
+
207
+ // TUPLES
208
+ for (const tuple of meta.tuples)
209
+ unions.push({
210
+ type: "tuple",
211
+ is: () =>
212
+ IsProgrammer.decode(project)(importer)(
213
+ input,
214
+ (() => {
215
+ const partial = Metadata.initialize();
216
+ partial.tuples.push(tuple);
217
+ return partial;
218
+ })(),
219
+ explore,
220
+ ),
221
+ value: () =>
222
+ decode_tuple(project)(config)(importer)(input, tuple, explore),
223
+ });
224
+
225
+ // ARRAYS
226
+ if (meta.arrays.length)
227
+ unions.push({
228
+ type: "array",
229
+ is: () => ExpressionFactory.isArray(input),
230
+ value: () =>
231
+ explore_arrays(project)(config)(importer)(input, meta.arrays, {
232
+ ...explore,
233
+ from: "array",
234
+ }),
235
+ });
236
+
237
+ // NATIVE TYPES
238
+ if (meta.sets.length)
239
+ unions.push({
240
+ type: "set",
241
+ is: () => ExpressionFactory.isInstanceOf("Set")(input),
242
+ value: () =>
243
+ explore_sets(project)(config)(importer)(input, meta.sets, {
244
+ ...explore,
245
+ from: "array",
246
+ }),
247
+ });
248
+ if (meta.maps.length)
249
+ unions.push({
250
+ type: "map",
251
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
252
+ value: () =>
253
+ explore_maps(project)(config)(importer)(input, meta.maps, {
254
+ ...explore,
255
+ from: "array",
256
+ }),
257
+ });
258
+ for (const native of meta.natives) {
259
+ if (native === "WeakSet" || native === "WeakMap") continue;
260
+ unions.push({
261
+ type: "native",
262
+ is: () => ExpressionFactory.isInstanceOf(native)(input),
263
+ value: () =>
264
+ native === "Boolean" || native === "Number" || native === "String"
265
+ ? ts.factory.createCallExpression(
266
+ IdentifierFactory.access(input)("valueOf"),
267
+ undefined,
268
+ undefined,
269
+ )
270
+ : decode_native(native)(input),
271
+ });
272
+ }
273
+
274
+ // OBJECTS
275
+ if (meta.objects.length)
276
+ unions.push({
277
+ type: "object",
278
+ is: () =>
279
+ ExpressionFactory.isObject({
280
+ checkNull: true,
281
+ checkArray: false,
282
+ })(input),
283
+ value: () =>
284
+ explore_objects(config)(importer)(input, meta, {
285
+ ...explore,
286
+ from: "object",
287
+ }),
288
+ });
289
+
290
+ // COMPOSITION
291
+ if (unions.length === 0) return input;
292
+ else if (unions.length === 1 && meta.size() === 1) {
293
+ const value: ts.Expression =
294
+ (meta.nullable || meta.isRequired() === false) && is_instance(meta)
295
+ ? ts.factory.createConditionalExpression(
296
+ input,
297
+ undefined,
298
+ unions[0]!.value(),
299
+ undefined,
300
+ input,
301
+ )
302
+ : unions[0]!.value();
303
+ return ts.factory.createAsExpression(value, TypeFactory.keyword("any"));
304
+ } else {
305
+ let last: ts.Expression = input;
306
+ for (const u of unions.reverse())
307
+ last = ts.factory.createConditionalExpression(
308
+ u.is(),
309
+ undefined,
310
+ u.value(),
311
+ undefined,
312
+ last,
313
+ );
314
+ return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
315
+ }
316
+ };
317
+
318
+ const decode_object = (importer: FunctionImporter) =>
319
+ FeatureProgrammer.decode_object({
320
+ trace: false,
321
+ path: false,
322
+ prefix: PREFIX,
323
+ })(importer);
324
+
325
+ const decode_array =
326
+ (config: FeatureProgrammer.IConfig) =>
327
+ (importer: FunctionImporter) =>
328
+ (
329
+ input: ts.Expression,
330
+ array: MetadataArray,
331
+ explore: FeatureProgrammer.IExplore,
332
+ ) =>
333
+ array.type.recursive
334
+ ? ts.factory.createCallExpression(
335
+ ts.factory.createIdentifier(
336
+ importer.useLocal(`${config.prefix}a${array.type.index}`),
337
+ ),
338
+ undefined,
339
+ FeatureProgrammer.argumentsArray(config)({
340
+ ...explore,
341
+ source: "function",
342
+ from: "array",
343
+ })(input),
344
+ )
345
+ : decode_array_inline(config)(importer)(input, array, explore);
346
+
347
+ const decode_array_inline =
348
+ (config: FeatureProgrammer.IConfig) =>
349
+ (importer: FunctionImporter) =>
350
+ (
351
+ input: ts.Expression,
352
+ array: MetadataArray,
353
+ explore: FeatureProgrammer.IExplore,
354
+ ) =>
355
+ FeatureProgrammer.decode_array(config)(importer)(NotationJoiner.array)(
356
+ input,
357
+ array,
358
+ explore,
359
+ );
360
+
361
+ const decode_tuple =
362
+ (project: IProject) =>
363
+ (config: FeatureProgrammer.IConfig) =>
364
+ (importer: FunctionImporter) =>
365
+ (
366
+ input: ts.Expression,
367
+ tuple: MetadataTuple,
368
+ explore: FeatureProgrammer.IExplore,
369
+ ): ts.Expression =>
370
+ tuple.type.recursive
371
+ ? ts.factory.createCallExpression(
372
+ ts.factory.createIdentifier(
373
+ importer.useLocal(`${config.prefix}t${tuple.type.index}`),
374
+ ),
375
+ undefined,
376
+ FeatureProgrammer.argumentsArray(config)({
377
+ ...explore,
378
+ source: "function",
379
+ })(input),
380
+ )
381
+ : decode_tuple_inline(project)(config)(importer)(
382
+ input,
383
+ tuple.type,
384
+ explore,
385
+ );
386
+
387
+ const decode_tuple_inline =
388
+ (project: IProject) =>
389
+ (config: FeatureProgrammer.IConfig) =>
390
+ (importer: FunctionImporter) =>
391
+ (
392
+ input: ts.Expression,
393
+ tuple: MetadataTupleType,
394
+ explore: FeatureProgrammer.IExplore,
395
+ ): ts.Expression => {
396
+ const children: ts.Expression[] = tuple.elements
397
+ .filter((m) => m.rest === null)
398
+ .map((elem, index) =>
399
+ decode(project)(config)(importer)(
400
+ ts.factory.createElementAccessExpression(input, index),
401
+ elem,
402
+ {
403
+ ...explore,
404
+ from: "array",
405
+ postfix: explore.postfix.length
406
+ ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
407
+ : `"[${index}]"`,
408
+ },
409
+ ),
410
+ );
411
+ const rest = (() => {
412
+ if (tuple.elements.length === 0) return null;
413
+
414
+ const last: Metadata = tuple.elements.at(-1)!;
415
+ const rest: Metadata | null = last.rest;
416
+ if (rest === null) return null;
417
+
418
+ return decode(project)(config)(importer)(
419
+ ts.factory.createCallExpression(
420
+ IdentifierFactory.access(input)("slice"),
421
+ undefined,
422
+ [ExpressionFactory.number(tuple.elements.length - 1)],
423
+ ),
424
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
425
+ {
426
+ ...explore,
427
+ start: tuple.elements.length - 1,
428
+ },
429
+ );
430
+ })();
431
+ return NotationJoiner.tuple(children, rest);
432
+ };
433
+
434
+ /* -----------------------------------------------------------
435
+ NATIVE CLASSES
436
+ ----------------------------------------------------------- */
437
+ const decode_native = (type: string) => (input: ts.Expression) =>
438
+ type === "Date"
439
+ ? ts.factory.createNewExpression(
440
+ ts.factory.createIdentifier(type),
441
+ undefined,
442
+ [input],
443
+ )
444
+ : input;
445
+
446
+ /* -----------------------------------------------------------
447
+ EXPLORERS FOR UNION TYPES
448
+ ----------------------------------------------------------- */
449
+ const explore_sets =
450
+ (project: IProject) =>
451
+ (config: FeatureProgrammer.IConfig) =>
452
+ (importer: FunctionImporter) =>
453
+ (
454
+ input: ts.Expression,
455
+ sets: Metadata[],
456
+ explore: FeatureProgrammer.IExplore,
457
+ ): ts.Expression =>
458
+ ts.factory.createCallExpression(
459
+ UnionExplorer.set({
460
+ checker: IsProgrammer.decode(project)(importer),
461
+ decoder: (input, array, explore) =>
462
+ ts.factory.createNewExpression(
463
+ ts.factory.createIdentifier("Set"),
464
+ [TypeFactory.keyword("any")],
465
+ [decode_array(config)(importer)(input, array, explore)],
466
+ ),
467
+ empty: ts.factory.createNewExpression(
468
+ ts.factory.createIdentifier("Set"),
469
+ [TypeFactory.keyword("any")],
470
+ [],
471
+ ),
472
+ success: ts.factory.createTrue(),
473
+ failure: (input, expected) =>
474
+ create_throw_error(importer)(expected)(input),
475
+ })([])(input, sets, explore),
476
+ undefined,
477
+ undefined,
478
+ );
479
+
480
+ const explore_maps =
481
+ (project: IProject) =>
482
+ (config: FeatureProgrammer.IConfig) =>
483
+ (importer: FunctionImporter) =>
484
+ (
485
+ input: ts.Expression,
486
+ maps: Metadata.Entry[],
487
+ explore: FeatureProgrammer.IExplore,
488
+ ): ts.Expression =>
489
+ ts.factory.createCallExpression(
490
+ UnionExplorer.map({
491
+ checker: (top, entry, explore) => {
492
+ const func = IsProgrammer.decode(project)(importer);
493
+ return ts.factory.createLogicalAnd(
494
+ func(ts.factory.createElementAccessExpression(top, 0), entry[0], {
495
+ ...explore,
496
+ postfix: `${explore.postfix}[0]`,
497
+ }),
498
+ func(ts.factory.createElementAccessExpression(top, 1), entry[1], {
499
+ ...explore,
500
+ postfix: `${explore.postfix}[1]`,
501
+ }),
502
+ );
503
+ },
504
+ decoder: (input, array, explore) =>
505
+ ts.factory.createNewExpression(
506
+ ts.factory.createIdentifier("Map"),
507
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
508
+ [decode_array(config)(importer)(input, array, explore)],
509
+ ),
510
+ empty: ts.factory.createNewExpression(
511
+ ts.factory.createIdentifier("Map"),
512
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
513
+ [],
514
+ ),
515
+ success: ts.factory.createTrue(),
516
+ failure: (input, expected) =>
517
+ create_throw_error(importer)(expected)(input),
518
+ })([])(input, maps, explore),
519
+ undefined,
520
+ undefined,
521
+ );
522
+
523
+ const explore_objects =
524
+ (config: FeatureProgrammer.IConfig) =>
525
+ (importer: FunctionImporter) =>
526
+ (
527
+ input: ts.Expression,
528
+ meta: Metadata,
529
+ explore: FeatureProgrammer.IExplore,
530
+ ) => {
531
+ if (meta.objects.length === 1)
532
+ return decode_object(importer)(input, meta.objects[0]!, explore);
533
+
534
+ return ts.factory.createCallExpression(
535
+ ts.factory.createIdentifier(
536
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
537
+ ),
538
+ undefined,
539
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
540
+ );
541
+ };
542
+
543
+ const explore_arrays =
544
+ (project: IProject) =>
545
+ (config: FeatureProgrammer.IConfig) =>
546
+ (importer: FunctionImporter) =>
547
+ (
548
+ input: ts.Expression,
549
+ elements: MetadataArray[],
550
+ explore: FeatureProgrammer.IExplore,
551
+ ): ts.Expression =>
552
+ explore_array_like_union_types(config)(importer)(
553
+ UnionExplorer.array({
554
+ checker: IsProgrammer.decode(project)(importer),
555
+ decoder: decode_array(config)(importer),
556
+ empty: ts.factory.createIdentifier("[]"),
557
+ success: ts.factory.createTrue(),
558
+ failure: (input, expected) =>
559
+ create_throw_error(importer)(expected)(input),
560
+ }),
561
+ )(input, elements, explore);
562
+
563
+ const explore_array_like_union_types =
564
+ (config: FeatureProgrammer.IConfig) =>
565
+ (importer: FunctionImporter) =>
566
+ <T extends MetadataArray | MetadataTuple>(
567
+ factory: (
568
+ parameters: ts.ParameterDeclaration[],
569
+ ) => (
570
+ input: ts.Expression,
571
+ elements: T[],
572
+ explore: FeatureProgrammer.IExplore,
573
+ ) => ts.ArrowFunction,
574
+ ) =>
575
+ (
576
+ input: ts.Expression,
577
+ elements: T[],
578
+ explore: FeatureProgrammer.IExplore,
579
+ ): ts.Expression => {
580
+ const arrow =
581
+ (parameters: ts.ParameterDeclaration[]) =>
582
+ (explore: FeatureProgrammer.IExplore) =>
583
+ (input: ts.Expression): ts.ArrowFunction =>
584
+ factory(parameters)(input, elements, explore);
585
+ if (elements.every((e) => e.type.recursive === false))
586
+ ts.factory.createCallExpression(
587
+ arrow([])(explore)(input),
588
+ undefined,
589
+ [],
590
+ );
591
+
592
+ explore = {
593
+ ...explore,
594
+ source: "function",
595
+ from: "array",
596
+ };
597
+ return ts.factory.createCallExpression(
598
+ ts.factory.createIdentifier(
599
+ importer.emplaceUnion(
600
+ config.prefix,
601
+ elements.map((e) => e.type.name).join(" | "),
602
+ () =>
603
+ arrow(
604
+ FeatureProgrammer.parameterDeclarations(config)(
605
+ TypeFactory.keyword("any"),
606
+ )(ts.factory.createIdentifier("input")),
607
+ )({
608
+ ...explore,
609
+ postfix: "",
610
+ })(ts.factory.createIdentifier("input")),
611
+ ),
612
+ ),
613
+ undefined,
614
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
615
+ );
616
+ };
617
+
618
+ /* -----------------------------------------------------------
619
+ CONFIGURATIONS
620
+ ----------------------------------------------------------- */
621
+ const PREFIX = "$c";
622
+
623
+ const configure =
624
+ (rename: (str: string) => string) =>
625
+ (project: IProject) =>
626
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
627
+ const config: FeatureProgrammer.IConfig = {
628
+ types: {
629
+ input: (type, name) =>
630
+ ts.factory.createTypeReferenceNode(
631
+ name ?? TypeFactory.getFullName(project.checker)(type),
632
+ ),
633
+ output: (type, name) =>
634
+ ts.factory.createTypeReferenceNode(
635
+ returnType(rename)(
636
+ name ?? TypeFactory.getFullName(project.checker)(type),
637
+ ),
638
+ ),
639
+ },
640
+ prefix: PREFIX,
641
+ trace: false,
642
+ path: false,
643
+ initializer,
644
+ decoder: () => decode(project)(config)(importer),
645
+ objector: {
646
+ checker: () => IsProgrammer.decode(project)(importer),
647
+ decoder: () => decode_object(importer),
648
+ joiner: NotationJoiner.object(rename),
649
+ unionizer: decode_union_object(
650
+ IsProgrammer.decode_object(project)(importer),
651
+ )(decode_object(importer))((exp) => exp)((input, expected) =>
652
+ create_throw_error(importer)(expected)(input),
653
+ ),
654
+ failure: (input, expected) =>
655
+ create_throw_error(importer)(expected)(input),
656
+ },
657
+ generator: {
658
+ arrays: () => write_array_functions(config)(importer),
659
+ tuples: () => write_tuple_functions(project)(config)(importer),
660
+ },
661
+ };
662
+ return config;
663
+ };
664
+
665
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
666
+ (project) => (importer) => (type) => {
667
+ const collection = new MetadataCollection();
668
+ const result = MetadataFactory.analyze(
669
+ project.checker,
670
+ project.context,
671
+ )({
672
+ escape: false,
673
+ constant: true,
674
+ absorb: true,
675
+ })(collection)(type);
676
+ if (result.success === false)
677
+ throw TransformerError.from(`typia.misc.${importer.method}`)(
678
+ result.errors,
679
+ );
680
+ return [collection, result.data];
681
+ };
682
+
683
+ const create_throw_error =
684
+ (importer: FunctionImporter) =>
685
+ (expected: string) =>
686
+ (value: ts.Expression) =>
687
+ ts.factory.createExpressionStatement(
688
+ ts.factory.createCallExpression(
689
+ importer.use("throws"),
690
+ [],
691
+ [
692
+ ts.factory.createObjectLiteralExpression(
693
+ [
694
+ ts.factory.createPropertyAssignment(
695
+ "expected",
696
+ ts.factory.createStringLiteral(expected),
697
+ ),
698
+ ts.factory.createPropertyAssignment("value", value),
699
+ ],
700
+ true,
701
+ ),
702
+ ],
703
+ ),
704
+ );
705
+
706
+ const is_instance = (meta: Metadata): boolean =>
707
+ !!meta.objects.length ||
708
+ !!meta.arrays.length ||
709
+ !!meta.tuples.length ||
710
+ !!meta.sets.length ||
711
+ !!meta.maps.length ||
712
+ !!meta.natives.length ||
713
+ (meta.rest !== null && is_instance(meta.rest));
714
+ }