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,560 +1,560 @@
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 { FunctionImporter } from "../helpers/FunctionImporter";
21
- import { PruneJoiner } from "../helpers/PruneJoiner";
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 MiscPruneProgrammer {
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.ConciseBody => {
158
- if (filter(meta) === false) return ts.factory.createBlock([]);
159
-
160
- interface IUnion {
161
- type: string;
162
- is: () => ts.Expression;
163
- value: () => ts.Expression | ts.Block | ts.ReturnStatement;
164
- }
165
- const unions: IUnion[] = [];
166
-
167
- //----
168
- // LIST UP UNION TYPES
169
- //----
170
- // TUPLES
171
- for (const tuple of meta.tuples.filter((tuple) =>
172
- tuple.type.elements.some((e) => filter(e.rest ?? e)),
173
- ))
174
- unions.push({
175
- type: "tuple",
176
- is: () =>
177
- IsProgrammer.decode(project)(importer)(
178
- input,
179
- (() => {
180
- const partial = Metadata.initialize();
181
- partial.tuples.push(tuple);
182
- return partial;
183
- })(),
184
- explore,
185
- ),
186
- value: () =>
187
- decode_tuple(project)(config)(importer)(input, tuple, explore),
188
- });
189
-
190
- // ARRAYS
191
- if (meta.arrays.filter((a) => filter(a.type.value)).length)
192
- unions.push({
193
- type: "array",
194
- is: () => ExpressionFactory.isArray(input),
195
- value: () =>
196
- explore_arrays(project)(config)(importer)(input, meta.arrays, {
197
- ...explore,
198
- from: "array",
199
- }),
200
- });
201
-
202
- // BUILT-IN CLASSES
203
- if (meta.natives.length)
204
- for (const native of meta.natives)
205
- unions.push({
206
- type: "native",
207
- is: () => ExpressionFactory.isInstanceOf(native)(input),
208
- value: () => ts.factory.createReturnStatement(),
209
- });
210
- if (meta.sets.length)
211
- unions.push({
212
- type: "set",
213
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
214
- value: () => ts.factory.createReturnStatement(),
215
- });
216
- if (meta.maps.length)
217
- unions.push({
218
- type: "map",
219
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
220
- value: () => ts.factory.createReturnStatement(),
221
- });
222
-
223
- // OBJECTS
224
- if (meta.objects.length)
225
- unions.push({
226
- type: "object",
227
- is: () =>
228
- ExpressionFactory.isObject({
229
- checkNull: true,
230
- checkArray: false,
231
- })(input),
232
- value: () =>
233
- explore_objects(config)(importer)(input, meta, {
234
- ...explore,
235
- from: "object",
236
- }),
237
- });
238
-
239
- //----
240
- // STATEMENTS
241
- //----
242
- const converter = (v: ts.Expression | ts.Block | ts.ReturnStatement) =>
243
- ts.isReturnStatement(v) || ts.isBlock(v)
244
- ? v
245
- : ts.factory.createExpressionStatement(v);
246
-
247
- const statements: ts.Statement[] = unions.map((u) =>
248
- ts.factory.createIfStatement(u.is(), converter(u.value())),
249
- );
250
- return ts.factory.createBlock(statements, true);
251
- };
252
-
253
- const decode_object = (importer: FunctionImporter) =>
254
- FeatureProgrammer.decode_object({
255
- trace: false,
256
- path: false,
257
- prefix: PREFIX,
258
- })(importer);
259
-
260
- const decode_array =
261
- (config: FeatureProgrammer.IConfig) =>
262
- (importer: FunctionImporter) =>
263
- (
264
- input: ts.Expression,
265
- array: MetadataArray,
266
- explore: FeatureProgrammer.IExplore,
267
- ) =>
268
- array.type.recursive
269
- ? ts.factory.createCallExpression(
270
- ts.factory.createIdentifier(
271
- importer.useLocal(`${config.prefix}a${array.type.index}`),
272
- ),
273
- undefined,
274
- FeatureProgrammer.argumentsArray(config)({
275
- ...explore,
276
- source: "function",
277
- from: "array",
278
- })(input),
279
- )
280
- : decode_array_inline(config)(importer)(input, array, explore);
281
-
282
- const decode_array_inline =
283
- (config: FeatureProgrammer.IConfig) =>
284
- (importer: FunctionImporter) =>
285
- (
286
- input: ts.Expression,
287
- array: MetadataArray,
288
- explore: FeatureProgrammer.IExplore,
289
- ): ts.Expression =>
290
- FeatureProgrammer.decode_array(config)(importer)(PruneJoiner.array)(
291
- input,
292
- array,
293
- explore,
294
- );
295
-
296
- const decode_tuple =
297
- (project: IProject) =>
298
- (config: FeatureProgrammer.IConfig) =>
299
- (importer: FunctionImporter) =>
300
- (
301
- input: ts.Expression,
302
- tuple: MetadataTuple,
303
- explore: FeatureProgrammer.IExplore,
304
- ): ts.Expression | ts.Block =>
305
- tuple.type.recursive
306
- ? ts.factory.createCallExpression(
307
- ts.factory.createIdentifier(
308
- importer.useLocal(`${config.prefix}t${tuple.type.index}`),
309
- ),
310
- undefined,
311
- FeatureProgrammer.argumentsArray(config)({
312
- ...explore,
313
- source: "function",
314
- })(input),
315
- )
316
- : decode_tuple_inline(project)(config)(importer)(
317
- input,
318
- tuple.type,
319
- explore,
320
- );
321
-
322
- const decode_tuple_inline =
323
- (project: IProject) =>
324
- (config: FeatureProgrammer.IConfig) =>
325
- (importer: FunctionImporter) =>
326
- (
327
- input: ts.Expression,
328
- tuple: MetadataTupleType,
329
- explore: FeatureProgrammer.IExplore,
330
- ): ts.Block => {
331
- const children: ts.ConciseBody[] = tuple.elements
332
- .map((elem, index) => [elem, index] as const)
333
- .filter(([elem]) => filter(elem) && elem.rest === null)
334
- .map(([elem, index]) =>
335
- decode(project)(config)(importer)(
336
- ts.factory.createElementAccessExpression(input, index),
337
- elem,
338
- {
339
- ...explore,
340
- from: "array",
341
- postfix: explore.postfix.length
342
- ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
343
- : `"[${index}]"`,
344
- },
345
- ),
346
- );
347
- const rest = (() => {
348
- if (tuple.elements.length === 0) return null;
349
-
350
- const last: Metadata = tuple.elements.at(-1)!;
351
- const rest: Metadata | null = last.rest;
352
- if (rest === null || filter(rest) === false) return null;
353
-
354
- return decode(project)(config)(importer)(
355
- ts.factory.createCallExpression(
356
- IdentifierFactory.access(input)("slice"),
357
- undefined,
358
- [ExpressionFactory.number(tuple.elements.length - 1)],
359
- ),
360
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
361
- {
362
- ...explore,
363
- start: tuple.elements.length - 1,
364
- },
365
- );
366
- })();
367
- return PruneJoiner.tuple(children, rest);
368
- };
369
-
370
- /* -----------------------------------------------------------
371
- UNION TYPE EXPLORERS
372
- ----------------------------------------------------------- */
373
- const explore_objects =
374
- (config: FeatureProgrammer.IConfig) =>
375
- (importer: FunctionImporter) =>
376
- (
377
- input: ts.Expression,
378
- meta: Metadata,
379
- explore: FeatureProgrammer.IExplore,
380
- ) => {
381
- if (meta.objects.length === 1)
382
- return decode_object(importer)(input, meta.objects[0]!, explore);
383
-
384
- return ts.factory.createCallExpression(
385
- ts.factory.createIdentifier(
386
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
387
- ),
388
- undefined,
389
- FeatureProgrammer.argumentsArray(config)(explore)(input),
390
- );
391
- };
392
-
393
- const explore_arrays =
394
- (project: IProject) =>
395
- (config: FeatureProgrammer.IConfig) =>
396
- (importer: FunctionImporter) =>
397
- (
398
- input: ts.Expression,
399
- elements: MetadataArray[],
400
- explore: FeatureProgrammer.IExplore,
401
- ): ts.Expression =>
402
- explore_array_like_union_types(config)(importer)(
403
- UnionExplorer.array({
404
- checker: IsProgrammer.decode(project)(importer),
405
- decoder: decode_array(config)(importer),
406
- empty: ts.factory.createStringLiteral("[]"),
407
- success: ts.factory.createTrue(),
408
- failure: (input, expected) =>
409
- create_throw_error(importer)(expected)(input),
410
- }),
411
- )(input, elements, explore);
412
-
413
- const explore_array_like_union_types =
414
- (config: FeatureProgrammer.IConfig) =>
415
- (importer: FunctionImporter) =>
416
- <T extends MetadataArray | MetadataTuple>(
417
- factory: (
418
- parameters: ts.ParameterDeclaration[],
419
- ) => (
420
- input: ts.Expression,
421
- elements: T[],
422
- explore: FeatureProgrammer.IExplore,
423
- ) => ts.ArrowFunction,
424
- ) =>
425
- (
426
- input: ts.Expression,
427
- elements: T[],
428
- explore: FeatureProgrammer.IExplore,
429
- ): ts.Expression => {
430
- const arrow =
431
- (parameters: ts.ParameterDeclaration[]) =>
432
- (explore: FeatureProgrammer.IExplore) =>
433
- (input: ts.Expression): ts.ArrowFunction =>
434
- factory(parameters)(input, elements, explore);
435
- if (elements.every((e) => e.type.recursive === false))
436
- ts.factory.createCallExpression(
437
- arrow([])(explore)(input),
438
- undefined,
439
- [],
440
- );
441
-
442
- explore = {
443
- ...explore,
444
- source: "function",
445
- from: "array",
446
- };
447
- return ts.factory.createCallExpression(
448
- ts.factory.createIdentifier(
449
- importer.emplaceUnion(
450
- config.prefix,
451
- elements.map((e) => e.type.name).join(" | "),
452
- () =>
453
- arrow(
454
- FeatureProgrammer.parameterDeclarations(config)(
455
- TypeFactory.keyword("any"),
456
- )(ts.factory.createIdentifier("input")),
457
- )({
458
- ...explore,
459
- postfix: "",
460
- })(ts.factory.createIdentifier("input")),
461
- ),
462
- ),
463
- undefined,
464
- FeatureProgrammer.argumentsArray(config)(explore)(input),
465
- );
466
- };
467
-
468
- // @todo -> must filter out recursive visit
469
- const filter = (meta: Metadata): boolean =>
470
- meta.any === false &&
471
- (meta.objects.length !== 0 ||
472
- meta.tuples.some(
473
- (t) =>
474
- !!t.type.elements.length &&
475
- t.type.elements.some((e) => filter(e.rest ?? e)),
476
- ) ||
477
- meta.arrays.some((e) => filter(e.type.value)));
478
-
479
- /* -----------------------------------------------------------
480
- CONFIGURATIONS
481
- ----------------------------------------------------------- */
482
- const PREFIX = "$p";
483
-
484
- const configure =
485
- (project: IProject) =>
486
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
487
- const config: FeatureProgrammer.IConfig = {
488
- types: {
489
- input: (type, name) =>
490
- ts.factory.createTypeReferenceNode(
491
- name ?? TypeFactory.getFullName(project.checker)(type),
492
- ),
493
- output: () => TypeFactory.keyword("void"),
494
- },
495
- prefix: PREFIX,
496
- trace: false,
497
- path: false,
498
- initializer,
499
- decoder: () => decode(project)(config)(importer),
500
- objector: {
501
- checker: () => IsProgrammer.decode(project)(importer),
502
- decoder: () => decode_object(importer),
503
- joiner: PruneJoiner.object,
504
- unionizer: decode_union_object(
505
- IsProgrammer.decode_object(project)(importer),
506
- )(decode_object(importer))((exp) => exp)((value, expected) =>
507
- create_throw_error(importer)(expected)(value),
508
- ),
509
- failure: (input, expected) =>
510
- create_throw_error(importer)(expected)(input),
511
- },
512
- generator: {
513
- arrays: () => write_array_functions(config)(importer),
514
- tuples: () => write_tuple_functions(project)(config)(importer),
515
- },
516
- };
517
- return config;
518
- };
519
-
520
- const initializer: FeatureProgrammer.IConfig["initializer"] =
521
- (project) => (importer) => (type) => {
522
- const collection = new MetadataCollection();
523
- const result = MetadataFactory.analyze(
524
- project.checker,
525
- project.context,
526
- )({
527
- escape: false,
528
- constant: true,
529
- absorb: true,
530
- })(collection)(type);
531
- if (result.success === false)
532
- throw TransformerError.from(`typia.misc.${importer.method}`)(
533
- result.errors,
534
- );
535
- return [collection, result.data];
536
- };
537
-
538
- const create_throw_error =
539
- (importer: FunctionImporter) =>
540
- (expected: string) =>
541
- (value: ts.Expression) =>
542
- ts.factory.createExpressionStatement(
543
- ts.factory.createCallExpression(
544
- importer.use("throws"),
545
- [],
546
- [
547
- ts.factory.createObjectLiteralExpression(
548
- [
549
- ts.factory.createPropertyAssignment(
550
- "expected",
551
- ts.factory.createStringLiteral(expected),
552
- ),
553
- ts.factory.createPropertyAssignment("value", value),
554
- ],
555
- true,
556
- ),
557
- ],
558
- ),
559
- );
560
- }
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 { FunctionImporter } from "../helpers/FunctionImporter";
21
+ import { PruneJoiner } from "../helpers/PruneJoiner";
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 MiscPruneProgrammer {
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.ConciseBody => {
158
+ if (filter(meta) === false) return ts.factory.createBlock([]);
159
+
160
+ interface IUnion {
161
+ type: string;
162
+ is: () => ts.Expression;
163
+ value: () => ts.Expression | ts.Block | ts.ReturnStatement;
164
+ }
165
+ const unions: IUnion[] = [];
166
+
167
+ //----
168
+ // LIST UP UNION TYPES
169
+ //----
170
+ // TUPLES
171
+ for (const tuple of meta.tuples.filter((tuple) =>
172
+ tuple.type.elements.some((e) => filter(e.rest ?? e)),
173
+ ))
174
+ unions.push({
175
+ type: "tuple",
176
+ is: () =>
177
+ IsProgrammer.decode(project)(importer)(
178
+ input,
179
+ (() => {
180
+ const partial = Metadata.initialize();
181
+ partial.tuples.push(tuple);
182
+ return partial;
183
+ })(),
184
+ explore,
185
+ ),
186
+ value: () =>
187
+ decode_tuple(project)(config)(importer)(input, tuple, explore),
188
+ });
189
+
190
+ // ARRAYS
191
+ if (meta.arrays.filter((a) => filter(a.type.value)).length)
192
+ unions.push({
193
+ type: "array",
194
+ is: () => ExpressionFactory.isArray(input),
195
+ value: () =>
196
+ explore_arrays(project)(config)(importer)(input, meta.arrays, {
197
+ ...explore,
198
+ from: "array",
199
+ }),
200
+ });
201
+
202
+ // BUILT-IN CLASSES
203
+ if (meta.natives.length)
204
+ for (const native of meta.natives)
205
+ unions.push({
206
+ type: "native",
207
+ is: () => ExpressionFactory.isInstanceOf(native)(input),
208
+ value: () => ts.factory.createReturnStatement(),
209
+ });
210
+ if (meta.sets.length)
211
+ unions.push({
212
+ type: "set",
213
+ is: () => ExpressionFactory.isInstanceOf("Set")(input),
214
+ value: () => ts.factory.createReturnStatement(),
215
+ });
216
+ if (meta.maps.length)
217
+ unions.push({
218
+ type: "map",
219
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
220
+ value: () => ts.factory.createReturnStatement(),
221
+ });
222
+
223
+ // OBJECTS
224
+ if (meta.objects.length)
225
+ unions.push({
226
+ type: "object",
227
+ is: () =>
228
+ ExpressionFactory.isObject({
229
+ checkNull: true,
230
+ checkArray: false,
231
+ })(input),
232
+ value: () =>
233
+ explore_objects(config)(importer)(input, meta, {
234
+ ...explore,
235
+ from: "object",
236
+ }),
237
+ });
238
+
239
+ //----
240
+ // STATEMENTS
241
+ //----
242
+ const converter = (v: ts.Expression | ts.Block | ts.ReturnStatement) =>
243
+ ts.isReturnStatement(v) || ts.isBlock(v)
244
+ ? v
245
+ : ts.factory.createExpressionStatement(v);
246
+
247
+ const statements: ts.Statement[] = unions.map((u) =>
248
+ ts.factory.createIfStatement(u.is(), converter(u.value())),
249
+ );
250
+ return ts.factory.createBlock(statements, true);
251
+ };
252
+
253
+ const decode_object = (importer: FunctionImporter) =>
254
+ FeatureProgrammer.decode_object({
255
+ trace: false,
256
+ path: false,
257
+ prefix: PREFIX,
258
+ })(importer);
259
+
260
+ const decode_array =
261
+ (config: FeatureProgrammer.IConfig) =>
262
+ (importer: FunctionImporter) =>
263
+ (
264
+ input: ts.Expression,
265
+ array: MetadataArray,
266
+ explore: FeatureProgrammer.IExplore,
267
+ ) =>
268
+ array.type.recursive
269
+ ? ts.factory.createCallExpression(
270
+ ts.factory.createIdentifier(
271
+ importer.useLocal(`${config.prefix}a${array.type.index}`),
272
+ ),
273
+ undefined,
274
+ FeatureProgrammer.argumentsArray(config)({
275
+ ...explore,
276
+ source: "function",
277
+ from: "array",
278
+ })(input),
279
+ )
280
+ : decode_array_inline(config)(importer)(input, array, explore);
281
+
282
+ const decode_array_inline =
283
+ (config: FeatureProgrammer.IConfig) =>
284
+ (importer: FunctionImporter) =>
285
+ (
286
+ input: ts.Expression,
287
+ array: MetadataArray,
288
+ explore: FeatureProgrammer.IExplore,
289
+ ): ts.Expression =>
290
+ FeatureProgrammer.decode_array(config)(importer)(PruneJoiner.array)(
291
+ input,
292
+ array,
293
+ explore,
294
+ );
295
+
296
+ const decode_tuple =
297
+ (project: IProject) =>
298
+ (config: FeatureProgrammer.IConfig) =>
299
+ (importer: FunctionImporter) =>
300
+ (
301
+ input: ts.Expression,
302
+ tuple: MetadataTuple,
303
+ explore: FeatureProgrammer.IExplore,
304
+ ): ts.Expression | ts.Block =>
305
+ tuple.type.recursive
306
+ ? ts.factory.createCallExpression(
307
+ ts.factory.createIdentifier(
308
+ importer.useLocal(`${config.prefix}t${tuple.type.index}`),
309
+ ),
310
+ undefined,
311
+ FeatureProgrammer.argumentsArray(config)({
312
+ ...explore,
313
+ source: "function",
314
+ })(input),
315
+ )
316
+ : decode_tuple_inline(project)(config)(importer)(
317
+ input,
318
+ tuple.type,
319
+ explore,
320
+ );
321
+
322
+ const decode_tuple_inline =
323
+ (project: IProject) =>
324
+ (config: FeatureProgrammer.IConfig) =>
325
+ (importer: FunctionImporter) =>
326
+ (
327
+ input: ts.Expression,
328
+ tuple: MetadataTupleType,
329
+ explore: FeatureProgrammer.IExplore,
330
+ ): ts.Block => {
331
+ const children: ts.ConciseBody[] = tuple.elements
332
+ .map((elem, index) => [elem, index] as const)
333
+ .filter(([elem]) => filter(elem) && elem.rest === null)
334
+ .map(([elem, index]) =>
335
+ decode(project)(config)(importer)(
336
+ ts.factory.createElementAccessExpression(input, index),
337
+ elem,
338
+ {
339
+ ...explore,
340
+ from: "array",
341
+ postfix: explore.postfix.length
342
+ ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
343
+ : `"[${index}]"`,
344
+ },
345
+ ),
346
+ );
347
+ const rest = (() => {
348
+ if (tuple.elements.length === 0) return null;
349
+
350
+ const last: Metadata = tuple.elements.at(-1)!;
351
+ const rest: Metadata | null = last.rest;
352
+ if (rest === null || filter(rest) === false) return null;
353
+
354
+ return decode(project)(config)(importer)(
355
+ ts.factory.createCallExpression(
356
+ IdentifierFactory.access(input)("slice"),
357
+ undefined,
358
+ [ExpressionFactory.number(tuple.elements.length - 1)],
359
+ ),
360
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
361
+ {
362
+ ...explore,
363
+ start: tuple.elements.length - 1,
364
+ },
365
+ );
366
+ })();
367
+ return PruneJoiner.tuple(children, rest);
368
+ };
369
+
370
+ /* -----------------------------------------------------------
371
+ UNION TYPE EXPLORERS
372
+ ----------------------------------------------------------- */
373
+ const explore_objects =
374
+ (config: FeatureProgrammer.IConfig) =>
375
+ (importer: FunctionImporter) =>
376
+ (
377
+ input: ts.Expression,
378
+ meta: Metadata,
379
+ explore: FeatureProgrammer.IExplore,
380
+ ) => {
381
+ if (meta.objects.length === 1)
382
+ return decode_object(importer)(input, meta.objects[0]!, explore);
383
+
384
+ return ts.factory.createCallExpression(
385
+ ts.factory.createIdentifier(
386
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
387
+ ),
388
+ undefined,
389
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
390
+ );
391
+ };
392
+
393
+ const explore_arrays =
394
+ (project: IProject) =>
395
+ (config: FeatureProgrammer.IConfig) =>
396
+ (importer: FunctionImporter) =>
397
+ (
398
+ input: ts.Expression,
399
+ elements: MetadataArray[],
400
+ explore: FeatureProgrammer.IExplore,
401
+ ): ts.Expression =>
402
+ explore_array_like_union_types(config)(importer)(
403
+ UnionExplorer.array({
404
+ checker: IsProgrammer.decode(project)(importer),
405
+ decoder: decode_array(config)(importer),
406
+ empty: ts.factory.createStringLiteral("[]"),
407
+ success: ts.factory.createTrue(),
408
+ failure: (input, expected) =>
409
+ create_throw_error(importer)(expected)(input),
410
+ }),
411
+ )(input, elements, explore);
412
+
413
+ const explore_array_like_union_types =
414
+ (config: FeatureProgrammer.IConfig) =>
415
+ (importer: FunctionImporter) =>
416
+ <T extends MetadataArray | MetadataTuple>(
417
+ factory: (
418
+ parameters: ts.ParameterDeclaration[],
419
+ ) => (
420
+ input: ts.Expression,
421
+ elements: T[],
422
+ explore: FeatureProgrammer.IExplore,
423
+ ) => ts.ArrowFunction,
424
+ ) =>
425
+ (
426
+ input: ts.Expression,
427
+ elements: T[],
428
+ explore: FeatureProgrammer.IExplore,
429
+ ): ts.Expression => {
430
+ const arrow =
431
+ (parameters: ts.ParameterDeclaration[]) =>
432
+ (explore: FeatureProgrammer.IExplore) =>
433
+ (input: ts.Expression): ts.ArrowFunction =>
434
+ factory(parameters)(input, elements, explore);
435
+ if (elements.every((e) => e.type.recursive === false))
436
+ ts.factory.createCallExpression(
437
+ arrow([])(explore)(input),
438
+ undefined,
439
+ [],
440
+ );
441
+
442
+ explore = {
443
+ ...explore,
444
+ source: "function",
445
+ from: "array",
446
+ };
447
+ return ts.factory.createCallExpression(
448
+ ts.factory.createIdentifier(
449
+ importer.emplaceUnion(
450
+ config.prefix,
451
+ elements.map((e) => e.type.name).join(" | "),
452
+ () =>
453
+ arrow(
454
+ FeatureProgrammer.parameterDeclarations(config)(
455
+ TypeFactory.keyword("any"),
456
+ )(ts.factory.createIdentifier("input")),
457
+ )({
458
+ ...explore,
459
+ postfix: "",
460
+ })(ts.factory.createIdentifier("input")),
461
+ ),
462
+ ),
463
+ undefined,
464
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
465
+ );
466
+ };
467
+
468
+ // @todo -> must filter out recursive visit
469
+ const filter = (meta: Metadata): boolean =>
470
+ meta.any === false &&
471
+ (meta.objects.length !== 0 ||
472
+ meta.tuples.some(
473
+ (t) =>
474
+ !!t.type.elements.length &&
475
+ t.type.elements.some((e) => filter(e.rest ?? e)),
476
+ ) ||
477
+ meta.arrays.some((e) => filter(e.type.value)));
478
+
479
+ /* -----------------------------------------------------------
480
+ CONFIGURATIONS
481
+ ----------------------------------------------------------- */
482
+ const PREFIX = "$p";
483
+
484
+ const configure =
485
+ (project: IProject) =>
486
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
487
+ const config: FeatureProgrammer.IConfig = {
488
+ types: {
489
+ input: (type, name) =>
490
+ ts.factory.createTypeReferenceNode(
491
+ name ?? TypeFactory.getFullName(project.checker)(type),
492
+ ),
493
+ output: () => TypeFactory.keyword("void"),
494
+ },
495
+ prefix: PREFIX,
496
+ trace: false,
497
+ path: false,
498
+ initializer,
499
+ decoder: () => decode(project)(config)(importer),
500
+ objector: {
501
+ checker: () => IsProgrammer.decode(project)(importer),
502
+ decoder: () => decode_object(importer),
503
+ joiner: PruneJoiner.object,
504
+ unionizer: decode_union_object(
505
+ IsProgrammer.decode_object(project)(importer),
506
+ )(decode_object(importer))((exp) => exp)((value, expected) =>
507
+ create_throw_error(importer)(expected)(value),
508
+ ),
509
+ failure: (input, expected) =>
510
+ create_throw_error(importer)(expected)(input),
511
+ },
512
+ generator: {
513
+ arrays: () => write_array_functions(config)(importer),
514
+ tuples: () => write_tuple_functions(project)(config)(importer),
515
+ },
516
+ };
517
+ return config;
518
+ };
519
+
520
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
521
+ (project) => (importer) => (type) => {
522
+ const collection = new MetadataCollection();
523
+ const result = MetadataFactory.analyze(
524
+ project.checker,
525
+ project.context,
526
+ )({
527
+ escape: false,
528
+ constant: true,
529
+ absorb: true,
530
+ })(collection)(type);
531
+ if (result.success === false)
532
+ throw TransformerError.from(`typia.misc.${importer.method}`)(
533
+ result.errors,
534
+ );
535
+ return [collection, result.data];
536
+ };
537
+
538
+ const create_throw_error =
539
+ (importer: FunctionImporter) =>
540
+ (expected: string) =>
541
+ (value: ts.Expression) =>
542
+ ts.factory.createExpressionStatement(
543
+ ts.factory.createCallExpression(
544
+ importer.use("throws"),
545
+ [],
546
+ [
547
+ ts.factory.createObjectLiteralExpression(
548
+ [
549
+ ts.factory.createPropertyAssignment(
550
+ "expected",
551
+ ts.factory.createStringLiteral(expected),
552
+ ),
553
+ ts.factory.createPropertyAssignment("value", value),
554
+ ],
555
+ true,
556
+ ),
557
+ ],
558
+ ),
559
+ );
560
+ }