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,549 +1,549 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../factories/IdentifierFactory";
4
- import { MetadataCollection } from "../factories/MetadataCollection";
5
- import { StatementFactory } from "../factories/StatementFactory";
6
- import { TypeFactory } from "../factories/TypeFactory";
7
- import { ValueFactory } from "../factories/ValueFactory";
8
-
9
- import { Metadata } from "../schemas/metadata/Metadata";
10
- import { MetadataArray } from "../schemas/metadata/MetadataArray";
11
- import { MetadataObject } from "../schemas/metadata/MetadataObject";
12
-
13
- import { IProject } from "../transformers/IProject";
14
-
15
- import { CheckerProgrammer } from "./CheckerProgrammer";
16
- import { FunctionImporter } from "./helpers/FunctionImporter";
17
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
18
- import { UnionExplorer } from "./helpers/UnionExplorer";
19
- import { feature_object_entries } from "./internal/feature_object_entries";
20
-
21
- export namespace FeatureProgrammer {
22
- /* -----------------------------------------------------------
23
- PARAMETERS
24
- ----------------------------------------------------------- */
25
- export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
26
- types: IConfig.ITypes;
27
-
28
- /**
29
- * Prefix name of internal functions for specific types.
30
- */
31
- prefix: string;
32
-
33
- /**
34
- * Whether to archive access path or not.
35
- */
36
- path: boolean;
37
-
38
- /**
39
- * Whether to trace exception or not.
40
- */
41
- trace: boolean;
42
-
43
- addition?: undefined | ((collection: MetadataCollection) => ts.Statement[]);
44
-
45
- /**
46
- * Initializer of metadata.
47
- */
48
- initializer: (
49
- project: IProject,
50
- ) => (
51
- importer: FunctionImporter,
52
- ) => (type: ts.Type) => [MetadataCollection, Metadata];
53
-
54
- /**
55
- * Decoder, station of every types.
56
- */
57
- decoder: () => Decoder<Metadata, Output>;
58
-
59
- /**
60
- * Object configurator.
61
- */
62
- objector: IConfig.IObjector<Output>;
63
-
64
- /**
65
- * Generator of functions for object types.
66
- */
67
- generator: IConfig.IGenerator;
68
- }
69
- export namespace IConfig {
70
- export interface ITypes {
71
- input: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
72
- output: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
73
- }
74
-
75
- export interface IObjector<Output extends ts.ConciseBody = ts.ConciseBody> {
76
- /**
77
- * Type checker when union object type comes.
78
- */
79
- checker: () => Decoder<Metadata, ts.Expression>;
80
-
81
- /**
82
- * Decoder, function call expression generator of specific typed objects.
83
- */
84
- decoder: () => Decoder<MetadataObject, ts.Expression>;
85
-
86
- /**
87
- * Joiner of expressions from properties.
88
- */
89
- joiner(
90
- input: ts.Expression,
91
- entries: IExpressionEntry<Output>[],
92
- parent: MetadataObject,
93
- ): ts.ConciseBody;
94
-
95
- /**
96
- * Union type specificator.
97
- *
98
- * Expression of an algorithm specifying object type and calling
99
- * the `decoder` function of the specified object type.
100
- */
101
- unionizer: Decoder<MetadataObject[], ts.Expression>;
102
-
103
- /**
104
- * Handler of union type specification failure.
105
- *
106
- * @param value Expression of input parameter
107
- * @param expected Expected type name
108
- * @param explore Exploration info
109
- * @returns Statement of failure
110
- */
111
- failure(
112
- value: ts.Expression,
113
- expected: string,
114
- explore?: undefined | IExplore,
115
- ): ts.Statement;
116
-
117
- /**
118
- * Transformer of type checking expression by discrimination.
119
- *
120
- * When an object type has been specified by a discrimination without full
121
- * iteration, the `unionizer` will decode the object instance after
122
- * the last type checking.
123
- *
124
- * In such circumtance, you can transform the last type checking function.
125
- *
126
- * @param exp Current expression about type checking
127
- * @returns Transformed expression
128
- * @deprecated
129
- */
130
- is?: undefined | ((exp: ts.Expression) => ts.Expression);
131
-
132
- /**
133
- * Transformer of non-undefined type checking by discrimination.
134
- *
135
- * When specifying an union type of objects, `typia` tries to find
136
- * descrimination way just by checking only one property type.
137
- * If succeeded to find the discrimination way, `typia` will check the target
138
- * property type and in the checking, non-undefined type checking would be
139
- * done.
140
- *
141
- * In such process, you can transform the non-undefined type checking.
142
- *
143
- * @param exp
144
- * @returns Transformed expression
145
- * @deprecated
146
- */
147
- required?: undefined | ((exp: ts.Expression) => ts.Expression);
148
-
149
- /**
150
- * Conditon wrapper when unable to specify any object type.
151
- *
152
- * When failed to specify an object type through discrimination, full
153
- * iteration type checking would be happend. In such circumstance, you
154
- * can wrap the condition with additional function.
155
- *
156
- * @param condition Current condition
157
- * @returns A function wrapped current condition
158
- */
159
- full?:
160
- | undefined
161
- | ((
162
- condition: ts.Expression,
163
- ) => (
164
- input: ts.Expression,
165
- expected: string,
166
- explore: IExplore,
167
- ) => ts.Expression);
168
-
169
- /**
170
- * Return type.
171
- */
172
- type?: undefined | ts.TypeNode;
173
- }
174
- export interface IGenerator {
175
- objects?:
176
- | undefined
177
- | (() => (col: MetadataCollection) => ts.VariableStatement[]);
178
- unions?:
179
- | undefined
180
- | (() => (col: MetadataCollection) => ts.VariableStatement[]);
181
- arrays(): (col: MetadataCollection) => ts.VariableStatement[];
182
- tuples(): (col: MetadataCollection) => ts.VariableStatement[];
183
- }
184
- }
185
-
186
- export interface IExplore {
187
- tracable: boolean;
188
- source: "top" | "function";
189
- from: "top" | "array" | "object";
190
- postfix: string;
191
- start?: undefined | number;
192
- }
193
-
194
- export interface Decoder<T, Output extends ts.ConciseBody = ts.ConciseBody> {
195
- (input: ts.Expression, target: T, explore: IExplore): Output;
196
- }
197
-
198
- /* -----------------------------------------------------------
199
- GENERATORS
200
- ----------------------------------------------------------- */
201
- export interface IComposed {
202
- body: ts.ConciseBody;
203
- parameters: ts.ParameterDeclaration[];
204
- functions: Record<string, ts.VariableStatement>;
205
- statements: ts.Statement[];
206
- response: ts.TypeNode;
207
- }
208
- export interface IDecomposed {
209
- functions: Record<string, ts.VariableStatement>;
210
- statements: ts.Statement[];
211
- arrow: ts.ArrowFunction;
212
- }
213
-
214
- export const compose = (props: {
215
- project: IProject;
216
- config: IConfig;
217
- importer: FunctionImporter;
218
- type: ts.Type;
219
- name: string | undefined;
220
- }): IComposed => {
221
- const [collection, meta] = props.config.initializer(props.project)(
222
- props.importer,
223
- )(props.type);
224
- return {
225
- body: props.config.decoder()(ValueFactory.INPUT(), meta, {
226
- tracable: props.config.path || props.config.trace,
227
- source: "top",
228
- from: "top",
229
- postfix: '""',
230
- }),
231
- statements: props.config.addition
232
- ? props.config.addition(collection)
233
- : [],
234
- functions: {
235
- ...Object.fromEntries(
236
- (
237
- props.config.generator.objects?.() ??
238
- write_object_functions(props.config)(props.importer)
239
- )(collection).map((v, i) => [`${props.config.prefix}o${i}`, v]),
240
- ),
241
- ...Object.fromEntries(
242
- (
243
- props.config.generator.unions?.() ??
244
- write_union_functions(props.config)
245
- )(collection).map((v, i) => [`${props.config.prefix}u${i}`, v]),
246
- ),
247
- ...Object.fromEntries(
248
- props.config.generator
249
- .arrays()(collection)
250
- .map((v, i) => [`${props.config.prefix}a${i}`, v]),
251
- ),
252
- ...Object.fromEntries(
253
- props.config.generator
254
- .tuples()(collection)
255
- .map((v, i) => [`${props.config.prefix}t${i}`, v]),
256
- ),
257
- },
258
- parameters: parameterDeclarations(props.config)(
259
- props.config.types.input(props.type, props.name),
260
- )(ValueFactory.INPUT()),
261
- response: props.config.types.output(props.type, props.name),
262
- };
263
- };
264
-
265
- export const writeDecomposed = (props: {
266
- modulo: ts.LeftHandSideExpression;
267
- importer: FunctionImporter;
268
- result: IDecomposed;
269
- }): ts.CallExpression =>
270
- ts.factory.createCallExpression(
271
- ts.factory.createArrowFunction(
272
- undefined,
273
- undefined,
274
- [],
275
- undefined,
276
- undefined,
277
- ts.factory.createBlock([
278
- ...props.importer.declare(props.modulo),
279
- ...Object.entries(props.result.functions)
280
- .filter(([k]) => props.importer.hasLocal(k))
281
- .map(([_k, v]) => v),
282
- ...props.result.statements,
283
- ts.factory.createReturnStatement(props.result.arrow),
284
- ]),
285
- ),
286
- undefined,
287
- undefined,
288
- );
289
-
290
- export const write =
291
- (project: IProject) =>
292
- (config: IConfig) =>
293
- (importer: FunctionImporter) =>
294
- (type: ts.Type, name?: string): ts.ArrowFunction => {
295
- const [collection, meta] = config.initializer(project)(importer)(type);
296
-
297
- // ITERATE OVER ALL METADATA
298
- const output: ts.ConciseBody = config.decoder()(
299
- ValueFactory.INPUT(),
300
- meta,
301
- {
302
- tracable: config.path || config.trace,
303
- source: "top",
304
- from: "top",
305
- postfix: '""',
306
- },
307
- );
308
-
309
- // RETURNS THE OPTIMAL ARROW FUNCTION
310
- const functions = {
311
- objects: (
312
- config.generator.objects?.() ??
313
- write_object_functions(config)(importer)
314
- )(collection),
315
- unions: (config.generator.unions?.() ?? write_union_functions(config))(
316
- collection,
317
- ),
318
- arrays: config.generator.arrays()(collection),
319
- tuples: config.generator.tuples()(collection),
320
- };
321
- const added: ts.Statement[] = (config.addition ?? (() => []))(collection);
322
-
323
- return ts.factory.createArrowFunction(
324
- undefined,
325
- undefined,
326
- parameterDeclarations(config)(config.types.input(type, name))(
327
- ValueFactory.INPUT(),
328
- ),
329
- config.types.output(type, name),
330
- undefined,
331
- ts.factory.createBlock(
332
- [
333
- ...added,
334
- ...functions.objects.filter((_, i) =>
335
- importer.hasLocal(`${config.prefix}o${i}`),
336
- ),
337
- ...functions.unions.filter((_, i) =>
338
- importer.hasLocal(`${config.prefix}u${i}`),
339
- ),
340
- ...functions.arrays.filter((_, i) =>
341
- importer.hasLocal(`${config.prefix}a${i}`),
342
- ),
343
- ...functions.tuples.filter((_, i) =>
344
- importer.hasLocal(`${config.prefix}t${i}`),
345
- ),
346
- ...(ts.isBlock(output)
347
- ? output.statements
348
- : [ts.factory.createReturnStatement(output)]),
349
- ],
350
- true,
351
- ),
352
- );
353
- };
354
-
355
- export const write_object_functions =
356
- (config: IConfig) =>
357
- (importer: FunctionImporter) =>
358
- (collection: MetadataCollection) =>
359
- collection
360
- .objects()
361
- .map((obj) =>
362
- StatementFactory.constant(
363
- `${config.prefix}o${obj.index}`,
364
- ts.factory.createArrowFunction(
365
- undefined,
366
- undefined,
367
- parameterDeclarations(config)(TypeFactory.keyword("any"))(
368
- ValueFactory.INPUT(),
369
- ),
370
- config.objector.type ?? TypeFactory.keyword("any"),
371
- undefined,
372
- config.objector.joiner(
373
- ts.factory.createIdentifier("input"),
374
- feature_object_entries(config)(importer)(obj)(
375
- ts.factory.createIdentifier("input"),
376
- ),
377
- obj,
378
- ),
379
- ),
380
- ),
381
- );
382
-
383
- export const write_union_functions =
384
- (config: IConfig) => (collection: MetadataCollection) =>
385
- collection
386
- .unions()
387
- .map((union, i) =>
388
- StatementFactory.constant(
389
- `${config.prefix}u${i}`,
390
- write_union(config)(union),
391
- ),
392
- );
393
-
394
- const write_union = (config: IConfig) => {
395
- const explorer = UnionExplorer.object(config);
396
- const input = ValueFactory.INPUT();
397
-
398
- return (meta: MetadataObject[]) =>
399
- ts.factory.createArrowFunction(
400
- undefined,
401
- undefined,
402
- parameterDeclarations(config)(TypeFactory.keyword("any"))(
403
- ValueFactory.INPUT(),
404
- ),
405
- TypeFactory.keyword("any"),
406
- undefined,
407
- explorer(input, meta, {
408
- tracable: config.path || config.trace,
409
- source: "function",
410
- from: "object",
411
- postfix: "",
412
- }),
413
- );
414
- };
415
-
416
- /* -----------------------------------------------------------
417
- DECODERS
418
- ----------------------------------------------------------- */
419
- export const decode_array =
420
- (config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">) =>
421
- (importer: FunctionImporter) =>
422
- (
423
- combiner: (
424
- input: ts.Expression,
425
- arrow: ts.ArrowFunction,
426
- ) => ts.Expression,
427
- ) => {
428
- const rand: string = importer.increment().toString();
429
- const tail =
430
- config.path || config.trace
431
- ? [
432
- IdentifierFactory.parameter(
433
- "_index" + rand,
434
- TypeFactory.keyword("number"),
435
- ),
436
- ]
437
- : [];
438
-
439
- return (
440
- input: ts.Expression,
441
- array: MetadataArray,
442
- explore: IExplore,
443
- ) => {
444
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
445
- undefined,
446
- undefined,
447
- [
448
- IdentifierFactory.parameter("elem", TypeFactory.keyword("any")),
449
- ...tail,
450
- ],
451
- undefined,
452
- undefined,
453
- config.decoder()(ValueFactory.INPUT("elem"), array.type.value, {
454
- tracable: explore.tracable,
455
- source: explore.source,
456
- from: "array",
457
- postfix: index(explore.start ?? null)(explore.postfix)(rand),
458
- }),
459
- );
460
- return combiner(input, arrow);
461
- };
462
- };
463
-
464
- export const decode_object =
465
- (config: Pick<IConfig, "trace" | "path" | "prefix">) =>
466
- (importer: FunctionImporter) =>
467
- (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
468
- ts.factory.createCallExpression(
469
- ts.factory.createIdentifier(
470
- importer.useLocal(`${config.prefix}o${obj.index}`),
471
- ),
472
- undefined,
473
- argumentsArray(config)(explore)(input),
474
- );
475
-
476
- /* -----------------------------------------------------------
477
- UTILITIES FOR INTERNAL FUNCTIONS
478
- ----------------------------------------------------------- */
479
- export const index =
480
- (start: number | null) => (prev: string) => (rand: string) => {
481
- const tail: string =
482
- start !== null
483
- ? `"[" + (${start} + _index${rand}) + "]"`
484
- : `"[" + _index${rand} + "]"`;
485
- if (prev === "") return tail;
486
- else if (prev[prev.length - 1] === `"`)
487
- return prev.substring(0, prev.length - 1) + tail.substring(1);
488
- return prev + ` + ${tail}`;
489
- };
490
-
491
- export const argumentsArray =
492
- (config: Pick<IConfig, "path" | "trace">) =>
493
- (explore: FeatureProgrammer.IExplore) => {
494
- const tail: ts.Expression[] =
495
- config.path === false && config.trace === false
496
- ? []
497
- : config.path === true && config.trace === true
498
- ? [
499
- ts.factory.createIdentifier(
500
- explore.postfix ? `_path + ${explore.postfix}` : "_path",
501
- ),
502
- explore.source === "function"
503
- ? ts.factory.createIdentifier(
504
- `${explore.tracable} && _exceptionable`,
505
- )
506
- : explore.tracable
507
- ? ts.factory.createTrue()
508
- : ts.factory.createFalse(),
509
- ]
510
- : config.path === true
511
- ? [
512
- ts.factory.createIdentifier(
513
- explore.postfix ? `_path + ${explore.postfix}` : "_path",
514
- ),
515
- ]
516
- : [
517
- explore.source === "function"
518
- ? ts.factory.createIdentifier(
519
- `${explore.tracable} && _exceptionable`,
520
- )
521
- : explore.tracable
522
- ? ts.factory.createTrue()
523
- : ts.factory.createFalse(),
524
- ];
525
- return (input: ts.Expression) => [input, ...tail];
526
- };
527
-
528
- export const parameterDeclarations =
529
- (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
530
- (type: ts.TypeNode) => {
531
- const tail: ts.ParameterDeclaration[] = [];
532
- if (props.path)
533
- tail.push(
534
- IdentifierFactory.parameter("_path", TypeFactory.keyword("string")),
535
- );
536
- if (props.trace)
537
- tail.push(
538
- IdentifierFactory.parameter(
539
- "_exceptionable",
540
- TypeFactory.keyword("boolean"),
541
- ts.factory.createTrue(),
542
- ),
543
- );
544
- return (input: ts.Identifier): ts.ParameterDeclaration[] => [
545
- IdentifierFactory.parameter(input, type),
546
- ...tail,
547
- ];
548
- };
549
- }
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { MetadataCollection } from "../factories/MetadataCollection";
5
+ import { StatementFactory } from "../factories/StatementFactory";
6
+ import { TypeFactory } from "../factories/TypeFactory";
7
+ import { ValueFactory } from "../factories/ValueFactory";
8
+
9
+ import { Metadata } from "../schemas/metadata/Metadata";
10
+ import { MetadataArray } from "../schemas/metadata/MetadataArray";
11
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
12
+
13
+ import { IProject } from "../transformers/IProject";
14
+
15
+ import { CheckerProgrammer } from "./CheckerProgrammer";
16
+ import { FunctionImporter } from "./helpers/FunctionImporter";
17
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
18
+ import { UnionExplorer } from "./helpers/UnionExplorer";
19
+ import { feature_object_entries } from "./internal/feature_object_entries";
20
+
21
+ export namespace FeatureProgrammer {
22
+ /* -----------------------------------------------------------
23
+ PARAMETERS
24
+ ----------------------------------------------------------- */
25
+ export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
26
+ types: IConfig.ITypes;
27
+
28
+ /**
29
+ * Prefix name of internal functions for specific types.
30
+ */
31
+ prefix: string;
32
+
33
+ /**
34
+ * Whether to archive access path or not.
35
+ */
36
+ path: boolean;
37
+
38
+ /**
39
+ * Whether to trace exception or not.
40
+ */
41
+ trace: boolean;
42
+
43
+ addition?: undefined | ((collection: MetadataCollection) => ts.Statement[]);
44
+
45
+ /**
46
+ * Initializer of metadata.
47
+ */
48
+ initializer: (
49
+ project: IProject,
50
+ ) => (
51
+ importer: FunctionImporter,
52
+ ) => (type: ts.Type) => [MetadataCollection, Metadata];
53
+
54
+ /**
55
+ * Decoder, station of every types.
56
+ */
57
+ decoder: () => Decoder<Metadata, Output>;
58
+
59
+ /**
60
+ * Object configurator.
61
+ */
62
+ objector: IConfig.IObjector<Output>;
63
+
64
+ /**
65
+ * Generator of functions for object types.
66
+ */
67
+ generator: IConfig.IGenerator;
68
+ }
69
+ export namespace IConfig {
70
+ export interface ITypes {
71
+ input: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
72
+ output: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
73
+ }
74
+
75
+ export interface IObjector<Output extends ts.ConciseBody = ts.ConciseBody> {
76
+ /**
77
+ * Type checker when union object type comes.
78
+ */
79
+ checker: () => Decoder<Metadata, ts.Expression>;
80
+
81
+ /**
82
+ * Decoder, function call expression generator of specific typed objects.
83
+ */
84
+ decoder: () => Decoder<MetadataObject, ts.Expression>;
85
+
86
+ /**
87
+ * Joiner of expressions from properties.
88
+ */
89
+ joiner(
90
+ input: ts.Expression,
91
+ entries: IExpressionEntry<Output>[],
92
+ parent: MetadataObject,
93
+ ): ts.ConciseBody;
94
+
95
+ /**
96
+ * Union type specificator.
97
+ *
98
+ * Expression of an algorithm specifying object type and calling
99
+ * the `decoder` function of the specified object type.
100
+ */
101
+ unionizer: Decoder<MetadataObject[], ts.Expression>;
102
+
103
+ /**
104
+ * Handler of union type specification failure.
105
+ *
106
+ * @param value Expression of input parameter
107
+ * @param expected Expected type name
108
+ * @param explore Exploration info
109
+ * @returns Statement of failure
110
+ */
111
+ failure(
112
+ value: ts.Expression,
113
+ expected: string,
114
+ explore?: undefined | IExplore,
115
+ ): ts.Statement;
116
+
117
+ /**
118
+ * Transformer of type checking expression by discrimination.
119
+ *
120
+ * When an object type has been specified by a discrimination without full
121
+ * iteration, the `unionizer` will decode the object instance after
122
+ * the last type checking.
123
+ *
124
+ * In such circumtance, you can transform the last type checking function.
125
+ *
126
+ * @param exp Current expression about type checking
127
+ * @returns Transformed expression
128
+ * @deprecated
129
+ */
130
+ is?: undefined | ((exp: ts.Expression) => ts.Expression);
131
+
132
+ /**
133
+ * Transformer of non-undefined type checking by discrimination.
134
+ *
135
+ * When specifying an union type of objects, `typia` tries to find
136
+ * descrimination way just by checking only one property type.
137
+ * If succeeded to find the discrimination way, `typia` will check the target
138
+ * property type and in the checking, non-undefined type checking would be
139
+ * done.
140
+ *
141
+ * In such process, you can transform the non-undefined type checking.
142
+ *
143
+ * @param exp
144
+ * @returns Transformed expression
145
+ * @deprecated
146
+ */
147
+ required?: undefined | ((exp: ts.Expression) => ts.Expression);
148
+
149
+ /**
150
+ * Conditon wrapper when unable to specify any object type.
151
+ *
152
+ * When failed to specify an object type through discrimination, full
153
+ * iteration type checking would be happend. In such circumstance, you
154
+ * can wrap the condition with additional function.
155
+ *
156
+ * @param condition Current condition
157
+ * @returns A function wrapped current condition
158
+ */
159
+ full?:
160
+ | undefined
161
+ | ((
162
+ condition: ts.Expression,
163
+ ) => (
164
+ input: ts.Expression,
165
+ expected: string,
166
+ explore: IExplore,
167
+ ) => ts.Expression);
168
+
169
+ /**
170
+ * Return type.
171
+ */
172
+ type?: undefined | ts.TypeNode;
173
+ }
174
+ export interface IGenerator {
175
+ objects?:
176
+ | undefined
177
+ | (() => (col: MetadataCollection) => ts.VariableStatement[]);
178
+ unions?:
179
+ | undefined
180
+ | (() => (col: MetadataCollection) => ts.VariableStatement[]);
181
+ arrays(): (col: MetadataCollection) => ts.VariableStatement[];
182
+ tuples(): (col: MetadataCollection) => ts.VariableStatement[];
183
+ }
184
+ }
185
+
186
+ export interface IExplore {
187
+ tracable: boolean;
188
+ source: "top" | "function";
189
+ from: "top" | "array" | "object";
190
+ postfix: string;
191
+ start?: undefined | number;
192
+ }
193
+
194
+ export interface Decoder<T, Output extends ts.ConciseBody = ts.ConciseBody> {
195
+ (input: ts.Expression, target: T, explore: IExplore): Output;
196
+ }
197
+
198
+ /* -----------------------------------------------------------
199
+ GENERATORS
200
+ ----------------------------------------------------------- */
201
+ export interface IComposed {
202
+ body: ts.ConciseBody;
203
+ parameters: ts.ParameterDeclaration[];
204
+ functions: Record<string, ts.VariableStatement>;
205
+ statements: ts.Statement[];
206
+ response: ts.TypeNode;
207
+ }
208
+ export interface IDecomposed {
209
+ functions: Record<string, ts.VariableStatement>;
210
+ statements: ts.Statement[];
211
+ arrow: ts.ArrowFunction;
212
+ }
213
+
214
+ export const compose = (props: {
215
+ project: IProject;
216
+ config: IConfig;
217
+ importer: FunctionImporter;
218
+ type: ts.Type;
219
+ name: string | undefined;
220
+ }): IComposed => {
221
+ const [collection, meta] = props.config.initializer(props.project)(
222
+ props.importer,
223
+ )(props.type);
224
+ return {
225
+ body: props.config.decoder()(ValueFactory.INPUT(), meta, {
226
+ tracable: props.config.path || props.config.trace,
227
+ source: "top",
228
+ from: "top",
229
+ postfix: '""',
230
+ }),
231
+ statements: props.config.addition
232
+ ? props.config.addition(collection)
233
+ : [],
234
+ functions: {
235
+ ...Object.fromEntries(
236
+ (
237
+ props.config.generator.objects?.() ??
238
+ write_object_functions(props.config)(props.importer)
239
+ )(collection).map((v, i) => [`${props.config.prefix}o${i}`, v]),
240
+ ),
241
+ ...Object.fromEntries(
242
+ (
243
+ props.config.generator.unions?.() ??
244
+ write_union_functions(props.config)
245
+ )(collection).map((v, i) => [`${props.config.prefix}u${i}`, v]),
246
+ ),
247
+ ...Object.fromEntries(
248
+ props.config.generator
249
+ .arrays()(collection)
250
+ .map((v, i) => [`${props.config.prefix}a${i}`, v]),
251
+ ),
252
+ ...Object.fromEntries(
253
+ props.config.generator
254
+ .tuples()(collection)
255
+ .map((v, i) => [`${props.config.prefix}t${i}`, v]),
256
+ ),
257
+ },
258
+ parameters: parameterDeclarations(props.config)(
259
+ props.config.types.input(props.type, props.name),
260
+ )(ValueFactory.INPUT()),
261
+ response: props.config.types.output(props.type, props.name),
262
+ };
263
+ };
264
+
265
+ export const writeDecomposed = (props: {
266
+ modulo: ts.LeftHandSideExpression;
267
+ importer: FunctionImporter;
268
+ result: IDecomposed;
269
+ }): ts.CallExpression =>
270
+ ts.factory.createCallExpression(
271
+ ts.factory.createArrowFunction(
272
+ undefined,
273
+ undefined,
274
+ [],
275
+ undefined,
276
+ undefined,
277
+ ts.factory.createBlock([
278
+ ...props.importer.declare(props.modulo),
279
+ ...Object.entries(props.result.functions)
280
+ .filter(([k]) => props.importer.hasLocal(k))
281
+ .map(([_k, v]) => v),
282
+ ...props.result.statements,
283
+ ts.factory.createReturnStatement(props.result.arrow),
284
+ ]),
285
+ ),
286
+ undefined,
287
+ undefined,
288
+ );
289
+
290
+ export const write =
291
+ (project: IProject) =>
292
+ (config: IConfig) =>
293
+ (importer: FunctionImporter) =>
294
+ (type: ts.Type, name?: string): ts.ArrowFunction => {
295
+ const [collection, meta] = config.initializer(project)(importer)(type);
296
+
297
+ // ITERATE OVER ALL METADATA
298
+ const output: ts.ConciseBody = config.decoder()(
299
+ ValueFactory.INPUT(),
300
+ meta,
301
+ {
302
+ tracable: config.path || config.trace,
303
+ source: "top",
304
+ from: "top",
305
+ postfix: '""',
306
+ },
307
+ );
308
+
309
+ // RETURNS THE OPTIMAL ARROW FUNCTION
310
+ const functions = {
311
+ objects: (
312
+ config.generator.objects?.() ??
313
+ write_object_functions(config)(importer)
314
+ )(collection),
315
+ unions: (config.generator.unions?.() ?? write_union_functions(config))(
316
+ collection,
317
+ ),
318
+ arrays: config.generator.arrays()(collection),
319
+ tuples: config.generator.tuples()(collection),
320
+ };
321
+ const added: ts.Statement[] = (config.addition ?? (() => []))(collection);
322
+
323
+ return ts.factory.createArrowFunction(
324
+ undefined,
325
+ undefined,
326
+ parameterDeclarations(config)(config.types.input(type, name))(
327
+ ValueFactory.INPUT(),
328
+ ),
329
+ config.types.output(type, name),
330
+ undefined,
331
+ ts.factory.createBlock(
332
+ [
333
+ ...added,
334
+ ...functions.objects.filter((_, i) =>
335
+ importer.hasLocal(`${config.prefix}o${i}`),
336
+ ),
337
+ ...functions.unions.filter((_, i) =>
338
+ importer.hasLocal(`${config.prefix}u${i}`),
339
+ ),
340
+ ...functions.arrays.filter((_, i) =>
341
+ importer.hasLocal(`${config.prefix}a${i}`),
342
+ ),
343
+ ...functions.tuples.filter((_, i) =>
344
+ importer.hasLocal(`${config.prefix}t${i}`),
345
+ ),
346
+ ...(ts.isBlock(output)
347
+ ? output.statements
348
+ : [ts.factory.createReturnStatement(output)]),
349
+ ],
350
+ true,
351
+ ),
352
+ );
353
+ };
354
+
355
+ export const write_object_functions =
356
+ (config: IConfig) =>
357
+ (importer: FunctionImporter) =>
358
+ (collection: MetadataCollection) =>
359
+ collection
360
+ .objects()
361
+ .map((obj) =>
362
+ StatementFactory.constant(
363
+ `${config.prefix}o${obj.index}`,
364
+ ts.factory.createArrowFunction(
365
+ undefined,
366
+ undefined,
367
+ parameterDeclarations(config)(TypeFactory.keyword("any"))(
368
+ ValueFactory.INPUT(),
369
+ ),
370
+ config.objector.type ?? TypeFactory.keyword("any"),
371
+ undefined,
372
+ config.objector.joiner(
373
+ ts.factory.createIdentifier("input"),
374
+ feature_object_entries(config)(importer)(obj)(
375
+ ts.factory.createIdentifier("input"),
376
+ ),
377
+ obj,
378
+ ),
379
+ ),
380
+ ),
381
+ );
382
+
383
+ export const write_union_functions =
384
+ (config: IConfig) => (collection: MetadataCollection) =>
385
+ collection
386
+ .unions()
387
+ .map((union, i) =>
388
+ StatementFactory.constant(
389
+ `${config.prefix}u${i}`,
390
+ write_union(config)(union),
391
+ ),
392
+ );
393
+
394
+ const write_union = (config: IConfig) => {
395
+ const explorer = UnionExplorer.object(config);
396
+ const input = ValueFactory.INPUT();
397
+
398
+ return (meta: MetadataObject[]) =>
399
+ ts.factory.createArrowFunction(
400
+ undefined,
401
+ undefined,
402
+ parameterDeclarations(config)(TypeFactory.keyword("any"))(
403
+ ValueFactory.INPUT(),
404
+ ),
405
+ TypeFactory.keyword("any"),
406
+ undefined,
407
+ explorer(input, meta, {
408
+ tracable: config.path || config.trace,
409
+ source: "function",
410
+ from: "object",
411
+ postfix: "",
412
+ }),
413
+ );
414
+ };
415
+
416
+ /* -----------------------------------------------------------
417
+ DECODERS
418
+ ----------------------------------------------------------- */
419
+ export const decode_array =
420
+ (config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">) =>
421
+ (importer: FunctionImporter) =>
422
+ (
423
+ combiner: (
424
+ input: ts.Expression,
425
+ arrow: ts.ArrowFunction,
426
+ ) => ts.Expression,
427
+ ) => {
428
+ const rand: string = importer.increment().toString();
429
+ const tail =
430
+ config.path || config.trace
431
+ ? [
432
+ IdentifierFactory.parameter(
433
+ "_index" + rand,
434
+ TypeFactory.keyword("number"),
435
+ ),
436
+ ]
437
+ : [];
438
+
439
+ return (
440
+ input: ts.Expression,
441
+ array: MetadataArray,
442
+ explore: IExplore,
443
+ ) => {
444
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
445
+ undefined,
446
+ undefined,
447
+ [
448
+ IdentifierFactory.parameter("elem", TypeFactory.keyword("any")),
449
+ ...tail,
450
+ ],
451
+ undefined,
452
+ undefined,
453
+ config.decoder()(ValueFactory.INPUT("elem"), array.type.value, {
454
+ tracable: explore.tracable,
455
+ source: explore.source,
456
+ from: "array",
457
+ postfix: index(explore.start ?? null)(explore.postfix)(rand),
458
+ }),
459
+ );
460
+ return combiner(input, arrow);
461
+ };
462
+ };
463
+
464
+ export const decode_object =
465
+ (config: Pick<IConfig, "trace" | "path" | "prefix">) =>
466
+ (importer: FunctionImporter) =>
467
+ (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
468
+ ts.factory.createCallExpression(
469
+ ts.factory.createIdentifier(
470
+ importer.useLocal(`${config.prefix}o${obj.index}`),
471
+ ),
472
+ undefined,
473
+ argumentsArray(config)(explore)(input),
474
+ );
475
+
476
+ /* -----------------------------------------------------------
477
+ UTILITIES FOR INTERNAL FUNCTIONS
478
+ ----------------------------------------------------------- */
479
+ export const index =
480
+ (start: number | null) => (prev: string) => (rand: string) => {
481
+ const tail: string =
482
+ start !== null
483
+ ? `"[" + (${start} + _index${rand}) + "]"`
484
+ : `"[" + _index${rand} + "]"`;
485
+ if (prev === "") return tail;
486
+ else if (prev[prev.length - 1] === `"`)
487
+ return prev.substring(0, prev.length - 1) + tail.substring(1);
488
+ return prev + ` + ${tail}`;
489
+ };
490
+
491
+ export const argumentsArray =
492
+ (config: Pick<IConfig, "path" | "trace">) =>
493
+ (explore: FeatureProgrammer.IExplore) => {
494
+ const tail: ts.Expression[] =
495
+ config.path === false && config.trace === false
496
+ ? []
497
+ : config.path === true && config.trace === true
498
+ ? [
499
+ ts.factory.createIdentifier(
500
+ explore.postfix ? `_path + ${explore.postfix}` : "_path",
501
+ ),
502
+ explore.source === "function"
503
+ ? ts.factory.createIdentifier(
504
+ `${explore.tracable} && _exceptionable`,
505
+ )
506
+ : explore.tracable
507
+ ? ts.factory.createTrue()
508
+ : ts.factory.createFalse(),
509
+ ]
510
+ : config.path === true
511
+ ? [
512
+ ts.factory.createIdentifier(
513
+ explore.postfix ? `_path + ${explore.postfix}` : "_path",
514
+ ),
515
+ ]
516
+ : [
517
+ explore.source === "function"
518
+ ? ts.factory.createIdentifier(
519
+ `${explore.tracable} && _exceptionable`,
520
+ )
521
+ : explore.tracable
522
+ ? ts.factory.createTrue()
523
+ : ts.factory.createFalse(),
524
+ ];
525
+ return (input: ts.Expression) => [input, ...tail];
526
+ };
527
+
528
+ export const parameterDeclarations =
529
+ (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
530
+ (type: ts.TypeNode) => {
531
+ const tail: ts.ParameterDeclaration[] = [];
532
+ if (props.path)
533
+ tail.push(
534
+ IdentifierFactory.parameter("_path", TypeFactory.keyword("string")),
535
+ );
536
+ if (props.trace)
537
+ tail.push(
538
+ IdentifierFactory.parameter(
539
+ "_exceptionable",
540
+ TypeFactory.keyword("boolean"),
541
+ ts.factory.createTrue(),
542
+ ),
543
+ );
544
+ return (input: ts.Identifier): ts.ParameterDeclaration[] => [
545
+ IdentifierFactory.parameter(input, type),
546
+ ...tail,
547
+ ];
548
+ };
549
+ }