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,781 +1,781 @@
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 { FeatureProgrammer } from "../FeatureProgrammer";
19
- import { IsProgrammer } from "../IsProgrammer";
20
- import { CloneJoiner } from "../helpers/CloneJoiner";
21
- import { FunctionImporter } from "../helpers/FunctionImporter";
22
- import { UnionExplorer } from "../helpers/UnionExplorer";
23
- import { decode_union_object } from "../internal/decode_union_object";
24
- import { postfix_of_tuple } from "../internal/postfix_of_tuple";
25
- import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
26
-
27
- export namespace MiscCloneProgrammer {
28
- export const decompose = (props: {
29
- validated: boolean;
30
- project: IProject;
31
- importer: FunctionImporter;
32
- type: ts.Type;
33
- name: string | undefined;
34
- }): FeatureProgrammer.IDecomposed => {
35
- const config = configure(props.project)(props.importer);
36
- if (props.validated === false)
37
- config.addition = (collection) =>
38
- IsProgrammer.write_function_statements(props.project)(props.importer)(
39
- collection,
40
- );
41
- const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({
42
- ...props,
43
- config,
44
- });
45
- return {
46
- functions: composed.functions,
47
- statements: composed.statements,
48
- arrow: ts.factory.createArrowFunction(
49
- undefined,
50
- undefined,
51
- composed.parameters,
52
- composed.response,
53
- undefined,
54
- composed.body,
55
- ),
56
- };
57
- };
58
-
59
- export const write =
60
- (project: IProject) =>
61
- (modulo: ts.LeftHandSideExpression) =>
62
- (type: ts.Type, name?: string): ts.CallExpression => {
63
- const importer: FunctionImporter = new FunctionImporter(modulo.getText());
64
- const result: FeatureProgrammer.IDecomposed = decompose({
65
- validated: false,
66
- project,
67
- importer,
68
- type,
69
- name,
70
- });
71
- return FeatureProgrammer.writeDecomposed({
72
- modulo,
73
- importer,
74
- result,
75
- });
76
- };
77
-
78
- const write_array_functions =
79
- (config: FeatureProgrammer.IConfig) =>
80
- (importer: FunctionImporter) =>
81
- (collection: MetadataCollection): ts.VariableStatement[] =>
82
- collection
83
- .arrays()
84
- .filter((a) => a.recursive)
85
- .map((type, i) =>
86
- StatementFactory.constant(
87
- `${config.prefix}a${i}`,
88
- ts.factory.createArrowFunction(
89
- undefined,
90
- undefined,
91
- FeatureProgrammer.parameterDeclarations(config)(
92
- TypeFactory.keyword("any"),
93
- )(ts.factory.createIdentifier("input")),
94
- TypeFactory.keyword("any"),
95
- undefined,
96
- decode_array_inline(config)(importer)(
97
- ts.factory.createIdentifier("input"),
98
- MetadataArray.create({
99
- type,
100
- tags: [],
101
- }),
102
- {
103
- tracable: config.trace,
104
- source: "function",
105
- from: "array",
106
- postfix: "",
107
- },
108
- ),
109
- ),
110
- ),
111
- );
112
-
113
- const write_tuple_functions =
114
- (project: IProject) =>
115
- (config: FeatureProgrammer.IConfig) =>
116
- (importer: FunctionImporter) =>
117
- (collection: MetadataCollection): ts.VariableStatement[] =>
118
- collection
119
- .tuples()
120
- .filter((t) => t.recursive)
121
- .map((tuple, i) =>
122
- StatementFactory.constant(
123
- `${config.prefix}t${i}`,
124
- ts.factory.createArrowFunction(
125
- undefined,
126
- undefined,
127
- FeatureProgrammer.parameterDeclarations(config)(
128
- TypeFactory.keyword("any"),
129
- )(ts.factory.createIdentifier("input")),
130
- TypeFactory.keyword("any"),
131
- undefined,
132
- decode_tuple_inline(project)(config)(importer)(
133
- ts.factory.createIdentifier("input"),
134
- tuple,
135
- {
136
- tracable: config.trace,
137
- source: "function",
138
- from: "array",
139
- postfix: "",
140
- },
141
- ),
142
- ),
143
- ),
144
- );
145
-
146
- /* -----------------------------------------------------------
147
- DECODERS
148
- ----------------------------------------------------------- */
149
- const decode =
150
- (project: IProject) =>
151
- (config: FeatureProgrammer.IConfig) =>
152
- (importer: FunctionImporter) =>
153
- (
154
- input: ts.Expression,
155
- meta: Metadata,
156
- explore: FeatureProgrammer.IExplore,
157
- ): ts.Expression => {
158
- // ANY TYPE
159
- if (
160
- meta.any ||
161
- meta.arrays.some((a) => a.type.value.any) ||
162
- meta.tuples.some(
163
- (t) =>
164
- !!t.type.elements.length && t.type.elements.every((e) => e.any),
165
- )
166
- )
167
- return ts.factory.createCallExpression(importer.use("any"), undefined, [
168
- input,
169
- ]);
170
-
171
- interface IUnion {
172
- type: string;
173
- is: () => ts.Expression;
174
- value: () => ts.Expression;
175
- }
176
- const unions: IUnion[] = [];
177
-
178
- //----
179
- // LIST UP UNION TYPES
180
- //----
181
- // FUNCTIONAL
182
- if (meta.functions.length)
183
- unions.push({
184
- type: "functional",
185
- is: () =>
186
- ts.factory.createStrictEquality(
187
- ts.factory.createStringLiteral("function"),
188
- ts.factory.createTypeOfExpression(input),
189
- ),
190
- value: () => ts.factory.createIdentifier("undefined"),
191
- });
192
-
193
- // TUPLES
194
- for (const tuple of meta.tuples)
195
- unions.push({
196
- type: "tuple",
197
- is: () =>
198
- IsProgrammer.decode(project)(importer)(
199
- input,
200
- (() => {
201
- const partial = Metadata.initialize();
202
- partial.tuples.push(tuple);
203
- return partial;
204
- })(),
205
- explore,
206
- ),
207
- value: () =>
208
- decode_tuple(project)(config)(importer)(input, tuple, explore),
209
- });
210
-
211
- // ARRAYS
212
- if (meta.arrays.length)
213
- unions.push({
214
- type: "array",
215
- is: () => ExpressionFactory.isArray(input),
216
- value: () =>
217
- explore_arrays(project)(config)(importer)(input, meta.arrays, {
218
- ...explore,
219
- from: "array",
220
- }),
221
- });
222
-
223
- // NATIVE TYPES
224
- if (meta.sets.length)
225
- unions.push({
226
- type: "set",
227
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
228
- value: () =>
229
- explore_sets(project)(config)(importer)(input, meta.sets, {
230
- ...explore,
231
- from: "array",
232
- }),
233
- });
234
- if (meta.maps.length)
235
- unions.push({
236
- type: "map",
237
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
238
- value: () =>
239
- explore_maps(project)(config)(importer)(input, meta.maps, {
240
- ...explore,
241
- from: "array",
242
- }),
243
- });
244
- for (const native of meta.natives)
245
- unions.push({
246
- type: "native",
247
- is: () => ExpressionFactory.isInstanceOf(native)(input),
248
- value: () =>
249
- native === "Boolean" || native === "Number" || native === "String"
250
- ? ts.factory.createCallExpression(
251
- IdentifierFactory.access(input)("valueOf"),
252
- undefined,
253
- undefined,
254
- )
255
- : decode_native(native)(input),
256
- });
257
-
258
- // OBJECTS
259
- if (meta.objects.length)
260
- unions.push({
261
- type: "object",
262
- is: () =>
263
- ExpressionFactory.isObject({
264
- checkNull: true,
265
- checkArray: false,
266
- })(input),
267
- value: () =>
268
- explore_objects(config)(importer)(input, meta, {
269
- ...explore,
270
- from: "object",
271
- }),
272
- });
273
-
274
- // COMPOSITION
275
- if (unions.length === 0) return input;
276
- else if (unions.length === 1 && meta.size() === 1) {
277
- const value: ts.Expression =
278
- (meta.nullable || meta.isRequired() === false) && is_instance(meta)
279
- ? ts.factory.createConditionalExpression(
280
- input,
281
- undefined,
282
- unions[0]!.value(),
283
- undefined,
284
- input,
285
- )
286
- : unions[0]!.value();
287
- return ts.factory.createAsExpression(value, TypeFactory.keyword("any"));
288
- } else {
289
- let last: ts.Expression = input;
290
- for (const u of unions.reverse())
291
- last = ts.factory.createConditionalExpression(
292
- u.is(),
293
- undefined,
294
- u.value(),
295
- undefined,
296
- last,
297
- );
298
- return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
299
- }
300
- };
301
-
302
- const decode_object = (importer: FunctionImporter) =>
303
- FeatureProgrammer.decode_object({
304
- trace: false,
305
- path: false,
306
- prefix: PREFIX,
307
- })(importer);
308
-
309
- const decode_array =
310
- (config: FeatureProgrammer.IConfig) =>
311
- (importer: FunctionImporter) =>
312
- (
313
- input: ts.Expression,
314
- array: MetadataArray,
315
- explore: FeatureProgrammer.IExplore,
316
- ) =>
317
- array.type.recursive
318
- ? ts.factory.createCallExpression(
319
- ts.factory.createIdentifier(
320
- importer.useLocal(`${config.prefix}a${array.type.index}`),
321
- ),
322
- undefined,
323
- FeatureProgrammer.argumentsArray(config)({
324
- ...explore,
325
- source: "function",
326
- from: "array",
327
- })(input),
328
- )
329
- : decode_array_inline(config)(importer)(input, array, explore);
330
-
331
- const decode_array_inline =
332
- (config: FeatureProgrammer.IConfig) =>
333
- (importer: FunctionImporter) =>
334
- (
335
- input: ts.Expression,
336
- array: MetadataArray,
337
- explore: FeatureProgrammer.IExplore,
338
- ) =>
339
- FeatureProgrammer.decode_array(config)(importer)(CloneJoiner.array)(
340
- input,
341
- array,
342
- explore,
343
- );
344
-
345
- const decode_tuple =
346
- (project: IProject) =>
347
- (config: FeatureProgrammer.IConfig) =>
348
- (importer: FunctionImporter) =>
349
- (
350
- input: ts.Expression,
351
- tuple: MetadataTuple,
352
- explore: FeatureProgrammer.IExplore,
353
- ): ts.Expression =>
354
- tuple.type.recursive
355
- ? ts.factory.createCallExpression(
356
- ts.factory.createIdentifier(
357
- importer.useLocal(`${config.prefix}t${tuple.type.index}`),
358
- ),
359
- undefined,
360
- FeatureProgrammer.argumentsArray(config)({
361
- ...explore,
362
- source: "function",
363
- })(input),
364
- )
365
- : decode_tuple_inline(project)(config)(importer)(
366
- input,
367
- tuple.type,
368
- explore,
369
- );
370
-
371
- const decode_tuple_inline =
372
- (project: IProject) =>
373
- (config: FeatureProgrammer.IConfig) =>
374
- (importer: FunctionImporter) =>
375
- (
376
- input: ts.Expression,
377
- tuple: MetadataTupleType,
378
- explore: FeatureProgrammer.IExplore,
379
- ): ts.Expression => {
380
- const children: ts.Expression[] = tuple.elements
381
- .filter((m) => m.rest === null)
382
- .map((elem, index) =>
383
- decode(project)(config)(importer)(
384
- ts.factory.createElementAccessExpression(input, index),
385
- elem,
386
- {
387
- ...explore,
388
- from: "array",
389
- postfix: explore.postfix.length
390
- ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
391
- : `"[${index}]"`,
392
- },
393
- ),
394
- );
395
- const rest = (() => {
396
- if (tuple.elements.length === 0) return null;
397
-
398
- const last: Metadata = tuple.elements.at(-1)!;
399
- const rest: Metadata | null = last.rest;
400
- if (rest === null) return null;
401
-
402
- return decode(project)(config)(importer)(
403
- ts.factory.createCallExpression(
404
- IdentifierFactory.access(input)("slice"),
405
- undefined,
406
- [ExpressionFactory.number(tuple.elements.length - 1)],
407
- ),
408
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
409
- {
410
- ...explore,
411
- start: tuple.elements.length - 1,
412
- },
413
- );
414
- })();
415
- return CloneJoiner.tuple(children, rest);
416
- };
417
-
418
- /* -----------------------------------------------------------
419
- NATIVE CLASSES
420
- ----------------------------------------------------------- */
421
- const decode_native = (type: string) => (input: ts.Expression) =>
422
- type === "Date" ||
423
- type === "Uint8Array" ||
424
- type === "Uint8ClampedArray" ||
425
- type === "Uint16Array" ||
426
- type === "Uint32Array" ||
427
- type === "BigUint64Array" ||
428
- type === "Int8Array" ||
429
- type === "Int16Array" ||
430
- type === "Int32Array" ||
431
- type === "BigInt64Array" ||
432
- type === "Float32Array" ||
433
- type === "Float64Array" ||
434
- type === "RegExp"
435
- ? decode_native_copyable(type)(input)
436
- : type === "ArrayBuffer" || type === "SharedArrayBuffer"
437
- ? decode_native_buffer(type)(input)
438
- : type === "DataView"
439
- ? decode_native_data_view(input)
440
- : ts.factory.createCallExpression(
441
- ts.factory.createIdentifier(type),
442
- undefined,
443
- [],
444
- );
445
-
446
- const decode_native_copyable = (type: string) => (input: ts.Expression) =>
447
- ts.factory.createNewExpression(
448
- ts.factory.createIdentifier(type),
449
- undefined,
450
- [input],
451
- );
452
-
453
- const decode_native_buffer =
454
- (type: "ArrayBuffer" | "SharedArrayBuffer") => (input: ts.Expression) =>
455
- ExpressionFactory.selfCall(
456
- ts.factory.createBlock(
457
- [
458
- StatementFactory.constant(
459
- "buffer",
460
- ts.factory.createNewExpression(
461
- ts.factory.createIdentifier(type),
462
- undefined,
463
- [IdentifierFactory.access(input)("byteLength")],
464
- ),
465
- ),
466
- ts.factory.createExpressionStatement(
467
- ts.factory.createCallExpression(
468
- IdentifierFactory.access(
469
- ts.factory.createNewExpression(
470
- ts.factory.createIdentifier("Uint8Array"),
471
- undefined,
472
- [ts.factory.createIdentifier("buffer")],
473
- ),
474
- )("set"),
475
- undefined,
476
- [
477
- ts.factory.createNewExpression(
478
- ts.factory.createIdentifier("Uint8Array"),
479
- undefined,
480
- [input],
481
- ),
482
- ],
483
- ),
484
- ),
485
- ts.factory.createReturnStatement(
486
- ts.factory.createIdentifier("buffer"),
487
- ),
488
- ],
489
- true,
490
- ),
491
- );
492
-
493
- const decode_native_data_view = (input: ts.Expression) =>
494
- ts.factory.createNewExpression(
495
- ts.factory.createIdentifier("DataView"),
496
- undefined,
497
- [IdentifierFactory.access(input)("buffer")],
498
- );
499
-
500
- /* -----------------------------------------------------------
501
- EXPLORERS FOR UNION TYPES
502
- ----------------------------------------------------------- */
503
- const explore_sets =
504
- (project: IProject) =>
505
- (config: FeatureProgrammer.IConfig) =>
506
- (importer: FunctionImporter) =>
507
- (
508
- input: ts.Expression,
509
- sets: Metadata[],
510
- explore: FeatureProgrammer.IExplore,
511
- ): ts.Expression =>
512
- ts.factory.createCallExpression(
513
- UnionExplorer.set({
514
- checker: IsProgrammer.decode(project)(importer),
515
- decoder: (input, array, explore) =>
516
- ts.factory.createNewExpression(
517
- ts.factory.createIdentifier("Set"),
518
- [TypeFactory.keyword("any")],
519
- [decode_array(config)(importer)(input, array, explore)],
520
- ),
521
- empty: ts.factory.createNewExpression(
522
- ts.factory.createIdentifier("Set"),
523
- [TypeFactory.keyword("any")],
524
- [],
525
- ),
526
- success: ts.factory.createTrue(),
527
- failure: (input, expected) =>
528
- create_throw_error(importer)(expected)(input),
529
- })([])(input, sets, explore),
530
- undefined,
531
- undefined,
532
- );
533
-
534
- const explore_maps =
535
- (project: IProject) =>
536
- (config: FeatureProgrammer.IConfig) =>
537
- (importer: FunctionImporter) =>
538
- (
539
- input: ts.Expression,
540
- maps: Metadata.Entry[],
541
- explore: FeatureProgrammer.IExplore,
542
- ): ts.Expression =>
543
- ts.factory.createCallExpression(
544
- UnionExplorer.map({
545
- checker: (top, entry, explore) => {
546
- const func = IsProgrammer.decode(project)(importer);
547
- return ts.factory.createLogicalAnd(
548
- func(ts.factory.createElementAccessExpression(top, 0), entry[0], {
549
- ...explore,
550
- postfix: `${explore.postfix}[0]`,
551
- }),
552
- func(ts.factory.createElementAccessExpression(top, 1), entry[1], {
553
- ...explore,
554
- postfix: `${explore.postfix}[1]`,
555
- }),
556
- );
557
- },
558
- decoder: (input, array, explore) =>
559
- ts.factory.createNewExpression(
560
- ts.factory.createIdentifier("Map"),
561
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
562
- [decode_array(config)(importer)(input, array, explore)],
563
- ),
564
- empty: ts.factory.createNewExpression(
565
- ts.factory.createIdentifier("Map"),
566
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
567
- [],
568
- ),
569
- success: ts.factory.createTrue(),
570
- failure: (input, expected) =>
571
- create_throw_error(importer)(expected)(input),
572
- })([])(input, maps, explore),
573
- undefined,
574
- undefined,
575
- );
576
-
577
- const explore_objects =
578
- (config: FeatureProgrammer.IConfig) =>
579
- (importer: FunctionImporter) =>
580
- (
581
- input: ts.Expression,
582
- meta: Metadata,
583
- explore: FeatureProgrammer.IExplore,
584
- ) =>
585
- meta.objects.length === 1
586
- ? decode_object(importer)(input, meta.objects[0]!, explore)
587
- : ts.factory.createCallExpression(
588
- ts.factory.createIdentifier(
589
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
590
- ),
591
- undefined,
592
- FeatureProgrammer.argumentsArray(config)(explore)(input),
593
- );
594
-
595
- const explore_arrays =
596
- (project: IProject) =>
597
- (config: FeatureProgrammer.IConfig) =>
598
- (importer: FunctionImporter) =>
599
- (
600
- input: ts.Expression,
601
- elements: MetadataArray[],
602
- explore: FeatureProgrammer.IExplore,
603
- ): ts.Expression =>
604
- explore_array_like_union_types(config)(importer)(
605
- UnionExplorer.array({
606
- checker: IsProgrammer.decode(project)(importer),
607
- decoder: decode_array(config)(importer),
608
- empty: ts.factory.createIdentifier("[]"),
609
- success: ts.factory.createTrue(),
610
- failure: (input, expected) =>
611
- create_throw_error(importer)(expected)(input),
612
- }),
613
- )(input, elements, explore);
614
-
615
- const explore_array_like_union_types =
616
- (config: FeatureProgrammer.IConfig) =>
617
- (importer: FunctionImporter) =>
618
- <T extends MetadataArray | MetadataTuple>(
619
- factory: (
620
- parameters: ts.ParameterDeclaration[],
621
- ) => (
622
- input: ts.Expression,
623
- elements: T[],
624
- explore: FeatureProgrammer.IExplore,
625
- ) => ts.ArrowFunction,
626
- ) =>
627
- (
628
- input: ts.Expression,
629
- elements: T[],
630
- explore: FeatureProgrammer.IExplore,
631
- ): ts.Expression => {
632
- const arrow =
633
- (parameters: ts.ParameterDeclaration[]) =>
634
- (explore: FeatureProgrammer.IExplore) =>
635
- (input: ts.Expression): ts.ArrowFunction =>
636
- factory(parameters)(input, elements, explore);
637
- if (elements.every((e) => e.type.recursive === false))
638
- ts.factory.createCallExpression(
639
- arrow([])(explore)(input),
640
- undefined,
641
- [],
642
- );
643
-
644
- explore = {
645
- ...explore,
646
- source: "function",
647
- from: "array",
648
- };
649
- return ts.factory.createCallExpression(
650
- ts.factory.createIdentifier(
651
- importer.emplaceUnion(
652
- config.prefix,
653
- elements.map((e) => e.type.name).join(" | "),
654
- () =>
655
- arrow(
656
- FeatureProgrammer.parameterDeclarations(config)(
657
- TypeFactory.keyword("any"),
658
- )(ts.factory.createIdentifier("input")),
659
- )({
660
- ...explore,
661
- postfix: "",
662
- })(ts.factory.createIdentifier("input")),
663
- ),
664
- ),
665
- undefined,
666
- FeatureProgrammer.argumentsArray(config)(explore)(input),
667
- );
668
- };
669
-
670
- /* -----------------------------------------------------------
671
- CONFIGURATIONS
672
- ----------------------------------------------------------- */
673
- const PREFIX = "$c";
674
-
675
- const configure =
676
- (project: IProject) =>
677
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
678
- const config: FeatureProgrammer.IConfig = {
679
- types: {
680
- input: (type, name) =>
681
- ts.factory.createTypeReferenceNode(
682
- name ?? TypeFactory.getFullName(project.checker)(type),
683
- ),
684
- output: (type, name) =>
685
- ts.factory.createImportTypeNode(
686
- ts.factory.createLiteralTypeNode(
687
- ts.factory.createStringLiteral("typia"),
688
- ),
689
- undefined,
690
- ts.factory.createIdentifier("Resolved"),
691
- [
692
- ts.factory.createTypeReferenceNode(
693
- name ?? TypeFactory.getFullName(project.checker)(type),
694
- ),
695
- ],
696
- false,
697
- ),
698
- },
699
- prefix: PREFIX,
700
- trace: false,
701
- path: false,
702
- initializer,
703
- decoder: () => decode(project)(config)(importer),
704
- objector: {
705
- checker: () => IsProgrammer.decode(project)(importer),
706
- decoder: () => decode_object(importer),
707
- joiner: CloneJoiner.object,
708
- unionizer: decode_union_object(
709
- IsProgrammer.decode_object(project)(importer),
710
- )(decode_object(importer))((exp) => exp)((input, expected) =>
711
- create_throw_error(importer)(expected)(input),
712
- ),
713
- failure: (input, expected) =>
714
- create_throw_error(importer)(expected)(input),
715
- },
716
- generator: {
717
- arrays: () => write_array_functions(config)(importer),
718
- tuples: () => write_tuple_functions(project)(config)(importer),
719
- },
720
- };
721
- return config;
722
- };
723
-
724
- const initializer: FeatureProgrammer.IConfig["initializer"] =
725
- (project) => (importer) => (type) => {
726
- const collection = new MetadataCollection();
727
- const result = MetadataFactory.analyze(
728
- project.checker,
729
- project.context,
730
- )({
731
- escape: false,
732
- constant: true,
733
- absorb: true,
734
- validate: (meta) => {
735
- const output: string[] = [];
736
- if (meta.natives.some((n) => n === "WeakSet"))
737
- output.push("unable to clone WeakSet");
738
- else if (meta.natives.some((n) => n === "WeakMap"))
739
- output.push("unable to clone WeakMap");
740
- return output;
741
- },
742
- })(collection)(type);
743
- if (result.success === false)
744
- throw TransformerError.from(`typia.misc.${importer.method}`)(
745
- result.errors,
746
- );
747
- return [collection, result.data];
748
- };
749
-
750
- const create_throw_error =
751
- (importer: FunctionImporter) =>
752
- (expected: string) =>
753
- (value: ts.Expression) =>
754
- ts.factory.createExpressionStatement(
755
- ts.factory.createCallExpression(
756
- importer.use("throws"),
757
- [],
758
- [
759
- ts.factory.createObjectLiteralExpression(
760
- [
761
- ts.factory.createPropertyAssignment(
762
- "expected",
763
- ts.factory.createStringLiteral(expected),
764
- ),
765
- ts.factory.createPropertyAssignment("value", value),
766
- ],
767
- true,
768
- ),
769
- ],
770
- ),
771
- );
772
-
773
- const is_instance = (meta: Metadata): boolean =>
774
- !!meta.objects.length ||
775
- !!meta.arrays.length ||
776
- !!meta.tuples.length ||
777
- !!meta.sets.length ||
778
- !!meta.maps.length ||
779
- !!meta.natives.length ||
780
- (meta.rest !== null && is_instance(meta.rest));
781
- }
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 { FeatureProgrammer } from "../FeatureProgrammer";
19
+ import { IsProgrammer } from "../IsProgrammer";
20
+ import { CloneJoiner } from "../helpers/CloneJoiner";
21
+ import { FunctionImporter } from "../helpers/FunctionImporter";
22
+ import { UnionExplorer } from "../helpers/UnionExplorer";
23
+ import { decode_union_object } from "../internal/decode_union_object";
24
+ import { postfix_of_tuple } from "../internal/postfix_of_tuple";
25
+ import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
26
+
27
+ export namespace MiscCloneProgrammer {
28
+ export const decompose = (props: {
29
+ validated: boolean;
30
+ project: IProject;
31
+ importer: FunctionImporter;
32
+ type: ts.Type;
33
+ name: string | undefined;
34
+ }): FeatureProgrammer.IDecomposed => {
35
+ const config = configure(props.project)(props.importer);
36
+ if (props.validated === false)
37
+ config.addition = (collection) =>
38
+ IsProgrammer.write_function_statements(props.project)(props.importer)(
39
+ collection,
40
+ );
41
+ const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({
42
+ ...props,
43
+ config,
44
+ });
45
+ return {
46
+ functions: composed.functions,
47
+ statements: composed.statements,
48
+ arrow: ts.factory.createArrowFunction(
49
+ undefined,
50
+ undefined,
51
+ composed.parameters,
52
+ composed.response,
53
+ undefined,
54
+ composed.body,
55
+ ),
56
+ };
57
+ };
58
+
59
+ export const write =
60
+ (project: IProject) =>
61
+ (modulo: ts.LeftHandSideExpression) =>
62
+ (type: ts.Type, name?: string): ts.CallExpression => {
63
+ const importer: FunctionImporter = new FunctionImporter(modulo.getText());
64
+ const result: FeatureProgrammer.IDecomposed = decompose({
65
+ validated: false,
66
+ project,
67
+ importer,
68
+ type,
69
+ name,
70
+ });
71
+ return FeatureProgrammer.writeDecomposed({
72
+ modulo,
73
+ importer,
74
+ result,
75
+ });
76
+ };
77
+
78
+ const write_array_functions =
79
+ (config: FeatureProgrammer.IConfig) =>
80
+ (importer: FunctionImporter) =>
81
+ (collection: MetadataCollection): ts.VariableStatement[] =>
82
+ collection
83
+ .arrays()
84
+ .filter((a) => a.recursive)
85
+ .map((type, i) =>
86
+ StatementFactory.constant(
87
+ `${config.prefix}a${i}`,
88
+ ts.factory.createArrowFunction(
89
+ undefined,
90
+ undefined,
91
+ FeatureProgrammer.parameterDeclarations(config)(
92
+ TypeFactory.keyword("any"),
93
+ )(ts.factory.createIdentifier("input")),
94
+ TypeFactory.keyword("any"),
95
+ undefined,
96
+ decode_array_inline(config)(importer)(
97
+ ts.factory.createIdentifier("input"),
98
+ MetadataArray.create({
99
+ type,
100
+ tags: [],
101
+ }),
102
+ {
103
+ tracable: config.trace,
104
+ source: "function",
105
+ from: "array",
106
+ postfix: "",
107
+ },
108
+ ),
109
+ ),
110
+ ),
111
+ );
112
+
113
+ const write_tuple_functions =
114
+ (project: IProject) =>
115
+ (config: FeatureProgrammer.IConfig) =>
116
+ (importer: FunctionImporter) =>
117
+ (collection: MetadataCollection): ts.VariableStatement[] =>
118
+ collection
119
+ .tuples()
120
+ .filter((t) => t.recursive)
121
+ .map((tuple, i) =>
122
+ StatementFactory.constant(
123
+ `${config.prefix}t${i}`,
124
+ ts.factory.createArrowFunction(
125
+ undefined,
126
+ undefined,
127
+ FeatureProgrammer.parameterDeclarations(config)(
128
+ TypeFactory.keyword("any"),
129
+ )(ts.factory.createIdentifier("input")),
130
+ TypeFactory.keyword("any"),
131
+ undefined,
132
+ decode_tuple_inline(project)(config)(importer)(
133
+ ts.factory.createIdentifier("input"),
134
+ tuple,
135
+ {
136
+ tracable: config.trace,
137
+ source: "function",
138
+ from: "array",
139
+ postfix: "",
140
+ },
141
+ ),
142
+ ),
143
+ ),
144
+ );
145
+
146
+ /* -----------------------------------------------------------
147
+ DECODERS
148
+ ----------------------------------------------------------- */
149
+ const decode =
150
+ (project: IProject) =>
151
+ (config: FeatureProgrammer.IConfig) =>
152
+ (importer: FunctionImporter) =>
153
+ (
154
+ input: ts.Expression,
155
+ meta: Metadata,
156
+ explore: FeatureProgrammer.IExplore,
157
+ ): ts.Expression => {
158
+ // ANY TYPE
159
+ if (
160
+ meta.any ||
161
+ meta.arrays.some((a) => a.type.value.any) ||
162
+ meta.tuples.some(
163
+ (t) =>
164
+ !!t.type.elements.length && t.type.elements.every((e) => e.any),
165
+ )
166
+ )
167
+ return ts.factory.createCallExpression(importer.use("any"), undefined, [
168
+ input,
169
+ ]);
170
+
171
+ interface IUnion {
172
+ type: string;
173
+ is: () => ts.Expression;
174
+ value: () => ts.Expression;
175
+ }
176
+ const unions: IUnion[] = [];
177
+
178
+ //----
179
+ // LIST UP UNION TYPES
180
+ //----
181
+ // FUNCTIONAL
182
+ if (meta.functions.length)
183
+ unions.push({
184
+ type: "functional",
185
+ is: () =>
186
+ ts.factory.createStrictEquality(
187
+ ts.factory.createStringLiteral("function"),
188
+ ts.factory.createTypeOfExpression(input),
189
+ ),
190
+ value: () => ts.factory.createIdentifier("undefined"),
191
+ });
192
+
193
+ // TUPLES
194
+ for (const tuple of meta.tuples)
195
+ unions.push({
196
+ type: "tuple",
197
+ is: () =>
198
+ IsProgrammer.decode(project)(importer)(
199
+ input,
200
+ (() => {
201
+ const partial = Metadata.initialize();
202
+ partial.tuples.push(tuple);
203
+ return partial;
204
+ })(),
205
+ explore,
206
+ ),
207
+ value: () =>
208
+ decode_tuple(project)(config)(importer)(input, tuple, explore),
209
+ });
210
+
211
+ // ARRAYS
212
+ if (meta.arrays.length)
213
+ unions.push({
214
+ type: "array",
215
+ is: () => ExpressionFactory.isArray(input),
216
+ value: () =>
217
+ explore_arrays(project)(config)(importer)(input, meta.arrays, {
218
+ ...explore,
219
+ from: "array",
220
+ }),
221
+ });
222
+
223
+ // NATIVE TYPES
224
+ if (meta.sets.length)
225
+ unions.push({
226
+ type: "set",
227
+ is: () => ExpressionFactory.isInstanceOf("Set")(input),
228
+ value: () =>
229
+ explore_sets(project)(config)(importer)(input, meta.sets, {
230
+ ...explore,
231
+ from: "array",
232
+ }),
233
+ });
234
+ if (meta.maps.length)
235
+ unions.push({
236
+ type: "map",
237
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
238
+ value: () =>
239
+ explore_maps(project)(config)(importer)(input, meta.maps, {
240
+ ...explore,
241
+ from: "array",
242
+ }),
243
+ });
244
+ for (const native of meta.natives)
245
+ unions.push({
246
+ type: "native",
247
+ is: () => ExpressionFactory.isInstanceOf(native)(input),
248
+ value: () =>
249
+ native === "Boolean" || native === "Number" || native === "String"
250
+ ? ts.factory.createCallExpression(
251
+ IdentifierFactory.access(input)("valueOf"),
252
+ undefined,
253
+ undefined,
254
+ )
255
+ : decode_native(native)(input),
256
+ });
257
+
258
+ // OBJECTS
259
+ if (meta.objects.length)
260
+ unions.push({
261
+ type: "object",
262
+ is: () =>
263
+ ExpressionFactory.isObject({
264
+ checkNull: true,
265
+ checkArray: false,
266
+ })(input),
267
+ value: () =>
268
+ explore_objects(config)(importer)(input, meta, {
269
+ ...explore,
270
+ from: "object",
271
+ }),
272
+ });
273
+
274
+ // COMPOSITION
275
+ if (unions.length === 0) return input;
276
+ else if (unions.length === 1 && meta.size() === 1) {
277
+ const value: ts.Expression =
278
+ (meta.nullable || meta.isRequired() === false) && is_instance(meta)
279
+ ? ts.factory.createConditionalExpression(
280
+ input,
281
+ undefined,
282
+ unions[0]!.value(),
283
+ undefined,
284
+ input,
285
+ )
286
+ : unions[0]!.value();
287
+ return ts.factory.createAsExpression(value, TypeFactory.keyword("any"));
288
+ } else {
289
+ let last: ts.Expression = input;
290
+ for (const u of unions.reverse())
291
+ last = ts.factory.createConditionalExpression(
292
+ u.is(),
293
+ undefined,
294
+ u.value(),
295
+ undefined,
296
+ last,
297
+ );
298
+ return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
299
+ }
300
+ };
301
+
302
+ const decode_object = (importer: FunctionImporter) =>
303
+ FeatureProgrammer.decode_object({
304
+ trace: false,
305
+ path: false,
306
+ prefix: PREFIX,
307
+ })(importer);
308
+
309
+ const decode_array =
310
+ (config: FeatureProgrammer.IConfig) =>
311
+ (importer: FunctionImporter) =>
312
+ (
313
+ input: ts.Expression,
314
+ array: MetadataArray,
315
+ explore: FeatureProgrammer.IExplore,
316
+ ) =>
317
+ array.type.recursive
318
+ ? ts.factory.createCallExpression(
319
+ ts.factory.createIdentifier(
320
+ importer.useLocal(`${config.prefix}a${array.type.index}`),
321
+ ),
322
+ undefined,
323
+ FeatureProgrammer.argumentsArray(config)({
324
+ ...explore,
325
+ source: "function",
326
+ from: "array",
327
+ })(input),
328
+ )
329
+ : decode_array_inline(config)(importer)(input, array, explore);
330
+
331
+ const decode_array_inline =
332
+ (config: FeatureProgrammer.IConfig) =>
333
+ (importer: FunctionImporter) =>
334
+ (
335
+ input: ts.Expression,
336
+ array: MetadataArray,
337
+ explore: FeatureProgrammer.IExplore,
338
+ ) =>
339
+ FeatureProgrammer.decode_array(config)(importer)(CloneJoiner.array)(
340
+ input,
341
+ array,
342
+ explore,
343
+ );
344
+
345
+ const decode_tuple =
346
+ (project: IProject) =>
347
+ (config: FeatureProgrammer.IConfig) =>
348
+ (importer: FunctionImporter) =>
349
+ (
350
+ input: ts.Expression,
351
+ tuple: MetadataTuple,
352
+ explore: FeatureProgrammer.IExplore,
353
+ ): ts.Expression =>
354
+ tuple.type.recursive
355
+ ? ts.factory.createCallExpression(
356
+ ts.factory.createIdentifier(
357
+ importer.useLocal(`${config.prefix}t${tuple.type.index}`),
358
+ ),
359
+ undefined,
360
+ FeatureProgrammer.argumentsArray(config)({
361
+ ...explore,
362
+ source: "function",
363
+ })(input),
364
+ )
365
+ : decode_tuple_inline(project)(config)(importer)(
366
+ input,
367
+ tuple.type,
368
+ explore,
369
+ );
370
+
371
+ const decode_tuple_inline =
372
+ (project: IProject) =>
373
+ (config: FeatureProgrammer.IConfig) =>
374
+ (importer: FunctionImporter) =>
375
+ (
376
+ input: ts.Expression,
377
+ tuple: MetadataTupleType,
378
+ explore: FeatureProgrammer.IExplore,
379
+ ): ts.Expression => {
380
+ const children: ts.Expression[] = tuple.elements
381
+ .filter((m) => m.rest === null)
382
+ .map((elem, index) =>
383
+ decode(project)(config)(importer)(
384
+ ts.factory.createElementAccessExpression(input, index),
385
+ elem,
386
+ {
387
+ ...explore,
388
+ from: "array",
389
+ postfix: explore.postfix.length
390
+ ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
391
+ : `"[${index}]"`,
392
+ },
393
+ ),
394
+ );
395
+ const rest = (() => {
396
+ if (tuple.elements.length === 0) return null;
397
+
398
+ const last: Metadata = tuple.elements.at(-1)!;
399
+ const rest: Metadata | null = last.rest;
400
+ if (rest === null) return null;
401
+
402
+ return decode(project)(config)(importer)(
403
+ ts.factory.createCallExpression(
404
+ IdentifierFactory.access(input)("slice"),
405
+ undefined,
406
+ [ExpressionFactory.number(tuple.elements.length - 1)],
407
+ ),
408
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
409
+ {
410
+ ...explore,
411
+ start: tuple.elements.length - 1,
412
+ },
413
+ );
414
+ })();
415
+ return CloneJoiner.tuple(children, rest);
416
+ };
417
+
418
+ /* -----------------------------------------------------------
419
+ NATIVE CLASSES
420
+ ----------------------------------------------------------- */
421
+ const decode_native = (type: string) => (input: ts.Expression) =>
422
+ type === "Date" ||
423
+ type === "Uint8Array" ||
424
+ type === "Uint8ClampedArray" ||
425
+ type === "Uint16Array" ||
426
+ type === "Uint32Array" ||
427
+ type === "BigUint64Array" ||
428
+ type === "Int8Array" ||
429
+ type === "Int16Array" ||
430
+ type === "Int32Array" ||
431
+ type === "BigInt64Array" ||
432
+ type === "Float32Array" ||
433
+ type === "Float64Array" ||
434
+ type === "RegExp"
435
+ ? decode_native_copyable(type)(input)
436
+ : type === "ArrayBuffer" || type === "SharedArrayBuffer"
437
+ ? decode_native_buffer(type)(input)
438
+ : type === "DataView"
439
+ ? decode_native_data_view(input)
440
+ : ts.factory.createCallExpression(
441
+ ts.factory.createIdentifier(type),
442
+ undefined,
443
+ [],
444
+ );
445
+
446
+ const decode_native_copyable = (type: string) => (input: ts.Expression) =>
447
+ ts.factory.createNewExpression(
448
+ ts.factory.createIdentifier(type),
449
+ undefined,
450
+ [input],
451
+ );
452
+
453
+ const decode_native_buffer =
454
+ (type: "ArrayBuffer" | "SharedArrayBuffer") => (input: ts.Expression) =>
455
+ ExpressionFactory.selfCall(
456
+ ts.factory.createBlock(
457
+ [
458
+ StatementFactory.constant(
459
+ "buffer",
460
+ ts.factory.createNewExpression(
461
+ ts.factory.createIdentifier(type),
462
+ undefined,
463
+ [IdentifierFactory.access(input)("byteLength")],
464
+ ),
465
+ ),
466
+ ts.factory.createExpressionStatement(
467
+ ts.factory.createCallExpression(
468
+ IdentifierFactory.access(
469
+ ts.factory.createNewExpression(
470
+ ts.factory.createIdentifier("Uint8Array"),
471
+ undefined,
472
+ [ts.factory.createIdentifier("buffer")],
473
+ ),
474
+ )("set"),
475
+ undefined,
476
+ [
477
+ ts.factory.createNewExpression(
478
+ ts.factory.createIdentifier("Uint8Array"),
479
+ undefined,
480
+ [input],
481
+ ),
482
+ ],
483
+ ),
484
+ ),
485
+ ts.factory.createReturnStatement(
486
+ ts.factory.createIdentifier("buffer"),
487
+ ),
488
+ ],
489
+ true,
490
+ ),
491
+ );
492
+
493
+ const decode_native_data_view = (input: ts.Expression) =>
494
+ ts.factory.createNewExpression(
495
+ ts.factory.createIdentifier("DataView"),
496
+ undefined,
497
+ [IdentifierFactory.access(input)("buffer")],
498
+ );
499
+
500
+ /* -----------------------------------------------------------
501
+ EXPLORERS FOR UNION TYPES
502
+ ----------------------------------------------------------- */
503
+ const explore_sets =
504
+ (project: IProject) =>
505
+ (config: FeatureProgrammer.IConfig) =>
506
+ (importer: FunctionImporter) =>
507
+ (
508
+ input: ts.Expression,
509
+ sets: Metadata[],
510
+ explore: FeatureProgrammer.IExplore,
511
+ ): ts.Expression =>
512
+ ts.factory.createCallExpression(
513
+ UnionExplorer.set({
514
+ checker: IsProgrammer.decode(project)(importer),
515
+ decoder: (input, array, explore) =>
516
+ ts.factory.createNewExpression(
517
+ ts.factory.createIdentifier("Set"),
518
+ [TypeFactory.keyword("any")],
519
+ [decode_array(config)(importer)(input, array, explore)],
520
+ ),
521
+ empty: ts.factory.createNewExpression(
522
+ ts.factory.createIdentifier("Set"),
523
+ [TypeFactory.keyword("any")],
524
+ [],
525
+ ),
526
+ success: ts.factory.createTrue(),
527
+ failure: (input, expected) =>
528
+ create_throw_error(importer)(expected)(input),
529
+ })([])(input, sets, explore),
530
+ undefined,
531
+ undefined,
532
+ );
533
+
534
+ const explore_maps =
535
+ (project: IProject) =>
536
+ (config: FeatureProgrammer.IConfig) =>
537
+ (importer: FunctionImporter) =>
538
+ (
539
+ input: ts.Expression,
540
+ maps: Metadata.Entry[],
541
+ explore: FeatureProgrammer.IExplore,
542
+ ): ts.Expression =>
543
+ ts.factory.createCallExpression(
544
+ UnionExplorer.map({
545
+ checker: (top, entry, explore) => {
546
+ const func = IsProgrammer.decode(project)(importer);
547
+ return ts.factory.createLogicalAnd(
548
+ func(ts.factory.createElementAccessExpression(top, 0), entry[0], {
549
+ ...explore,
550
+ postfix: `${explore.postfix}[0]`,
551
+ }),
552
+ func(ts.factory.createElementAccessExpression(top, 1), entry[1], {
553
+ ...explore,
554
+ postfix: `${explore.postfix}[1]`,
555
+ }),
556
+ );
557
+ },
558
+ decoder: (input, array, explore) =>
559
+ ts.factory.createNewExpression(
560
+ ts.factory.createIdentifier("Map"),
561
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
562
+ [decode_array(config)(importer)(input, array, explore)],
563
+ ),
564
+ empty: ts.factory.createNewExpression(
565
+ ts.factory.createIdentifier("Map"),
566
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
567
+ [],
568
+ ),
569
+ success: ts.factory.createTrue(),
570
+ failure: (input, expected) =>
571
+ create_throw_error(importer)(expected)(input),
572
+ })([])(input, maps, explore),
573
+ undefined,
574
+ undefined,
575
+ );
576
+
577
+ const explore_objects =
578
+ (config: FeatureProgrammer.IConfig) =>
579
+ (importer: FunctionImporter) =>
580
+ (
581
+ input: ts.Expression,
582
+ meta: Metadata,
583
+ explore: FeatureProgrammer.IExplore,
584
+ ) =>
585
+ meta.objects.length === 1
586
+ ? decode_object(importer)(input, meta.objects[0]!, explore)
587
+ : ts.factory.createCallExpression(
588
+ ts.factory.createIdentifier(
589
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
590
+ ),
591
+ undefined,
592
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
593
+ );
594
+
595
+ const explore_arrays =
596
+ (project: IProject) =>
597
+ (config: FeatureProgrammer.IConfig) =>
598
+ (importer: FunctionImporter) =>
599
+ (
600
+ input: ts.Expression,
601
+ elements: MetadataArray[],
602
+ explore: FeatureProgrammer.IExplore,
603
+ ): ts.Expression =>
604
+ explore_array_like_union_types(config)(importer)(
605
+ UnionExplorer.array({
606
+ checker: IsProgrammer.decode(project)(importer),
607
+ decoder: decode_array(config)(importer),
608
+ empty: ts.factory.createIdentifier("[]"),
609
+ success: ts.factory.createTrue(),
610
+ failure: (input, expected) =>
611
+ create_throw_error(importer)(expected)(input),
612
+ }),
613
+ )(input, elements, explore);
614
+
615
+ const explore_array_like_union_types =
616
+ (config: FeatureProgrammer.IConfig) =>
617
+ (importer: FunctionImporter) =>
618
+ <T extends MetadataArray | MetadataTuple>(
619
+ factory: (
620
+ parameters: ts.ParameterDeclaration[],
621
+ ) => (
622
+ input: ts.Expression,
623
+ elements: T[],
624
+ explore: FeatureProgrammer.IExplore,
625
+ ) => ts.ArrowFunction,
626
+ ) =>
627
+ (
628
+ input: ts.Expression,
629
+ elements: T[],
630
+ explore: FeatureProgrammer.IExplore,
631
+ ): ts.Expression => {
632
+ const arrow =
633
+ (parameters: ts.ParameterDeclaration[]) =>
634
+ (explore: FeatureProgrammer.IExplore) =>
635
+ (input: ts.Expression): ts.ArrowFunction =>
636
+ factory(parameters)(input, elements, explore);
637
+ if (elements.every((e) => e.type.recursive === false))
638
+ ts.factory.createCallExpression(
639
+ arrow([])(explore)(input),
640
+ undefined,
641
+ [],
642
+ );
643
+
644
+ explore = {
645
+ ...explore,
646
+ source: "function",
647
+ from: "array",
648
+ };
649
+ return ts.factory.createCallExpression(
650
+ ts.factory.createIdentifier(
651
+ importer.emplaceUnion(
652
+ config.prefix,
653
+ elements.map((e) => e.type.name).join(" | "),
654
+ () =>
655
+ arrow(
656
+ FeatureProgrammer.parameterDeclarations(config)(
657
+ TypeFactory.keyword("any"),
658
+ )(ts.factory.createIdentifier("input")),
659
+ )({
660
+ ...explore,
661
+ postfix: "",
662
+ })(ts.factory.createIdentifier("input")),
663
+ ),
664
+ ),
665
+ undefined,
666
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
667
+ );
668
+ };
669
+
670
+ /* -----------------------------------------------------------
671
+ CONFIGURATIONS
672
+ ----------------------------------------------------------- */
673
+ const PREFIX = "$c";
674
+
675
+ const configure =
676
+ (project: IProject) =>
677
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
678
+ const config: FeatureProgrammer.IConfig = {
679
+ types: {
680
+ input: (type, name) =>
681
+ ts.factory.createTypeReferenceNode(
682
+ name ?? TypeFactory.getFullName(project.checker)(type),
683
+ ),
684
+ output: (type, name) =>
685
+ ts.factory.createImportTypeNode(
686
+ ts.factory.createLiteralTypeNode(
687
+ ts.factory.createStringLiteral("typia"),
688
+ ),
689
+ undefined,
690
+ ts.factory.createIdentifier("Resolved"),
691
+ [
692
+ ts.factory.createTypeReferenceNode(
693
+ name ?? TypeFactory.getFullName(project.checker)(type),
694
+ ),
695
+ ],
696
+ false,
697
+ ),
698
+ },
699
+ prefix: PREFIX,
700
+ trace: false,
701
+ path: false,
702
+ initializer,
703
+ decoder: () => decode(project)(config)(importer),
704
+ objector: {
705
+ checker: () => IsProgrammer.decode(project)(importer),
706
+ decoder: () => decode_object(importer),
707
+ joiner: CloneJoiner.object,
708
+ unionizer: decode_union_object(
709
+ IsProgrammer.decode_object(project)(importer),
710
+ )(decode_object(importer))((exp) => exp)((input, expected) =>
711
+ create_throw_error(importer)(expected)(input),
712
+ ),
713
+ failure: (input, expected) =>
714
+ create_throw_error(importer)(expected)(input),
715
+ },
716
+ generator: {
717
+ arrays: () => write_array_functions(config)(importer),
718
+ tuples: () => write_tuple_functions(project)(config)(importer),
719
+ },
720
+ };
721
+ return config;
722
+ };
723
+
724
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
725
+ (project) => (importer) => (type) => {
726
+ const collection = new MetadataCollection();
727
+ const result = MetadataFactory.analyze(
728
+ project.checker,
729
+ project.context,
730
+ )({
731
+ escape: false,
732
+ constant: true,
733
+ absorb: true,
734
+ validate: (meta) => {
735
+ const output: string[] = [];
736
+ if (meta.natives.some((n) => n === "WeakSet"))
737
+ output.push("unable to clone WeakSet");
738
+ else if (meta.natives.some((n) => n === "WeakMap"))
739
+ output.push("unable to clone WeakMap");
740
+ return output;
741
+ },
742
+ })(collection)(type);
743
+ if (result.success === false)
744
+ throw TransformerError.from(`typia.misc.${importer.method}`)(
745
+ result.errors,
746
+ );
747
+ return [collection, result.data];
748
+ };
749
+
750
+ const create_throw_error =
751
+ (importer: FunctionImporter) =>
752
+ (expected: string) =>
753
+ (value: ts.Expression) =>
754
+ ts.factory.createExpressionStatement(
755
+ ts.factory.createCallExpression(
756
+ importer.use("throws"),
757
+ [],
758
+ [
759
+ ts.factory.createObjectLiteralExpression(
760
+ [
761
+ ts.factory.createPropertyAssignment(
762
+ "expected",
763
+ ts.factory.createStringLiteral(expected),
764
+ ),
765
+ ts.factory.createPropertyAssignment("value", value),
766
+ ],
767
+ true,
768
+ ),
769
+ ],
770
+ ),
771
+ );
772
+
773
+ const is_instance = (meta: Metadata): boolean =>
774
+ !!meta.objects.length ||
775
+ !!meta.arrays.length ||
776
+ !!meta.tuples.length ||
777
+ !!meta.sets.length ||
778
+ !!meta.maps.length ||
779
+ !!meta.natives.length ||
780
+ (meta.rest !== null && is_instance(meta.rest));
781
+ }