typia 6.10.1 → 6.10.2-dev.20240920

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 (434) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +118 -118
  3. package/lib/programmers/helpers/RandomRanger.js +1 -1
  4. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  5. package/package.json +1 -1
  6. package/src/AssertionGuard.ts +1 -1
  7. package/src/CamelCase.ts +75 -75
  8. package/src/IRandomGenerator.ts +66 -66
  9. package/src/IValidation.ts +21 -21
  10. package/src/PascalCase.ts +71 -71
  11. package/src/Primitive.ts +92 -92
  12. package/src/Resolved.ts +74 -74
  13. package/src/SnakeCase.ts +126 -126
  14. package/src/TypeGuardError.ts +37 -37
  15. package/src/executable/TypiaGenerateWizard.ts +83 -83
  16. package/src/executable/TypiaPatchWizard.ts +42 -42
  17. package/src/executable/TypiaSetupWizard.ts +174 -174
  18. package/src/executable/setup/ArgumentParser.ts +43 -43
  19. package/src/executable/setup/CommandExecutor.ts +8 -8
  20. package/src/executable/setup/FileRetriever.ts +22 -22
  21. package/src/executable/setup/PackageManager.ts +86 -86
  22. package/src/executable/setup/PluginConfigurator.ts +69 -69
  23. package/src/executable/typia.ts +55 -55
  24. package/src/factories/CommentFactory.ts +79 -79
  25. package/src/factories/ExpressionFactory.ts +150 -150
  26. package/src/factories/IdentifierFactory.ts +70 -70
  27. package/src/factories/JsonMetadataFactory.ts +53 -53
  28. package/src/factories/LiteralFactory.ts +47 -47
  29. package/src/factories/MetadataCollection.ts +274 -274
  30. package/src/factories/MetadataCommentTagFactory.ts +534 -534
  31. package/src/factories/MetadataFactory.ts +314 -314
  32. package/src/factories/MetadataTypeTagFactory.ts +336 -336
  33. package/src/factories/MetadataTypeTagSchemaFactory.ts +59 -59
  34. package/src/factories/NumericRangeFactory.ts +72 -72
  35. package/src/factories/ProtobufFactory.ts +267 -267
  36. package/src/factories/StatementFactory.ts +74 -74
  37. package/src/factories/TemplateFactory.ts +56 -56
  38. package/src/factories/TypeFactory.ts +118 -118
  39. package/src/factories/ValueFactory.ts +12 -12
  40. package/src/factories/internal/metadata/MetadataHelper.ts +21 -21
  41. package/src/factories/internal/metadata/emend_metadata_atomics.ts +45 -45
  42. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  43. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +42 -42
  44. package/src/factories/internal/metadata/emplace_metadata_object.ts +186 -186
  45. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  46. package/src/factories/internal/metadata/explore_metadata.ts +28 -28
  47. package/src/factories/internal/metadata/iterate_metadata.ts +100 -100
  48. package/src/factories/internal/metadata/iterate_metadata_alias.ts +34 -34
  49. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  50. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  51. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  52. package/src/factories/internal/metadata/iterate_metadata_collection.ts +131 -131
  53. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +28 -28
  54. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  55. package/src/factories/internal/metadata/iterate_metadata_escape.ts +52 -52
  56. package/src/factories/internal/metadata/iterate_metadata_function.ts +89 -89
  57. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +213 -213
  58. package/src/factories/internal/metadata/iterate_metadata_map.ts +50 -50
  59. package/src/factories/internal/metadata/iterate_metadata_native.ts +220 -220
  60. package/src/factories/internal/metadata/iterate_metadata_object.ts +33 -33
  61. package/src/factories/internal/metadata/iterate_metadata_set.ts +41 -41
  62. package/src/factories/internal/metadata/iterate_metadata_sort.ts +74 -74
  63. package/src/factories/internal/metadata/iterate_metadata_template.ts +44 -44
  64. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  65. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  66. package/src/functional/$FormDataReader/$FormDataReader.ts +83 -83
  67. package/src/functional/$FormDataReader/index.ts +1 -1
  68. package/src/functional/$HeadersReader/$HeadersReader.ts +26 -26
  69. package/src/functional/$HeadersReader/index.ts +1 -1
  70. package/src/functional/$ParameterReader/$ParameterReader.ts +29 -29
  71. package/src/functional/$ParameterReader/index.ts +1 -1
  72. package/src/functional/$ProtobufReader.ts +194 -194
  73. package/src/functional/$ProtobufSizer.ts +144 -144
  74. package/src/functional/$ProtobufWriter.ts +145 -145
  75. package/src/functional/$QueryReader/$QueryReader.ts +46 -46
  76. package/src/functional/$QueryReader/index.ts +1 -1
  77. package/src/functional/$any.ts +3 -3
  78. package/src/functional/$clone.ts +48 -48
  79. package/src/functional/$convention.ts +37 -37
  80. package/src/functional/$dictionary.ts +22 -22
  81. package/src/functional/$every.ts +11 -11
  82. package/src/functional/$guard.ts +21 -21
  83. package/src/functional/$is_between.ts +2 -2
  84. package/src/functional/$join.ts +46 -46
  85. package/src/functional/$number.ts +12 -12
  86. package/src/functional/$report.ts +13 -13
  87. package/src/functional/$rest.ts +3 -3
  88. package/src/functional/$stoll.ts +8 -8
  89. package/src/functional/$string.ts +43 -43
  90. package/src/functional/$strlen.ts +7 -7
  91. package/src/functional/$tail.ts +5 -5
  92. package/src/functional/$throws.ts +10 -10
  93. package/src/functional/$varint.ts +130 -130
  94. package/src/functional/$zigzag.ts +39 -39
  95. package/src/functional/IProtobufWriter.ts +18 -18
  96. package/src/functional/Namespace/functional.ts +5 -5
  97. package/src/functional/Namespace/http.ts +9 -9
  98. package/src/functional/Namespace/index.ts +77 -77
  99. package/src/functional/Namespace/json.ts +15 -15
  100. package/src/functional/Namespace/llm.ts +20 -20
  101. package/src/functional/Namespace/misc.ts +14 -14
  102. package/src/functional/Namespace/notations.ts +23 -23
  103. package/src/functional/Namespace/protobuf.ts +20 -20
  104. package/src/functional/is.ts +10 -10
  105. package/src/functional.ts +872 -872
  106. package/src/http.ts +1266 -1266
  107. package/src/index.ts +4 -4
  108. package/src/json.ts +738 -738
  109. package/src/llm.ts +186 -186
  110. package/src/misc.ts +757 -757
  111. package/src/module.ts +1023 -1023
  112. package/src/notations.ts +1020 -1020
  113. package/src/programmers/AssertProgrammer.ts +397 -397
  114. package/src/programmers/CheckerProgrammer.ts +1138 -1138
  115. package/src/programmers/FeatureProgrammer.ts +549 -549
  116. package/src/programmers/IsProgrammer.ts +220 -220
  117. package/src/programmers/RandomProgrammer.ts +955 -955
  118. package/src/programmers/TypiaProgrammer.ts +157 -157
  119. package/src/programmers/ValidateProgrammer.ts +382 -382
  120. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +141 -141
  121. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +108 -108
  122. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +98 -98
  123. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  124. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +101 -101
  125. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +106 -106
  126. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +123 -123
  127. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +267 -267
  128. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +126 -126
  129. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  130. package/src/programmers/helpers/AtomicPredicator.ts +24 -24
  131. package/src/programmers/helpers/CloneJoiner.ts +130 -130
  132. package/src/programmers/helpers/FunctionImporeter.ts +1 -1
  133. package/src/programmers/helpers/FunctionImporter.ts +97 -97
  134. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  135. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  136. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  137. package/src/programmers/helpers/NotationJoiner.ts +132 -132
  138. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  139. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  140. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  141. package/src/programmers/helpers/PruneJoiner.ts +139 -139
  142. package/src/programmers/helpers/RandomJoiner.ts +145 -145
  143. package/src/programmers/helpers/RandomRanger.ts +171 -171
  144. package/src/programmers/helpers/StringifyJoinder.ts +105 -105
  145. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  146. package/src/programmers/helpers/UnionExplorer.ts +269 -269
  147. package/src/programmers/helpers/UnionPredicator.ts +77 -77
  148. package/src/programmers/helpers/disable_function_importer_declare.ts +33 -33
  149. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +91 -91
  150. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +91 -91
  151. package/src/programmers/http/HttpAssertQueryProgrammer.ts +93 -93
  152. package/src/programmers/http/HttpFormDataProgrammer.ts +278 -278
  153. package/src/programmers/http/HttpHeadersProgrammer.ts +347 -347
  154. package/src/programmers/http/HttpIsFormDataProgrammer.ts +102 -102
  155. package/src/programmers/http/HttpIsHeadersProgrammer.ts +102 -102
  156. package/src/programmers/http/HttpIsQueryProgrammer.ts +104 -104
  157. package/src/programmers/http/HttpParameterProgrammer.ts +97 -97
  158. package/src/programmers/http/HttpQueryProgrammer.ts +298 -298
  159. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +85 -85
  160. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +85 -85
  161. package/src/programmers/http/HttpValidateQueryProgrammer.ts +87 -87
  162. package/src/programmers/internal/application_array.ts +61 -61
  163. package/src/programmers/internal/application_bigint.ts +25 -25
  164. package/src/programmers/internal/application_boolean.ts +25 -25
  165. package/src/programmers/internal/application_description.ts +12 -12
  166. package/src/programmers/internal/application_escaped.ts +74 -74
  167. package/src/programmers/internal/application_number.ts +25 -25
  168. package/src/programmers/internal/application_plugin.ts +19 -19
  169. package/src/programmers/internal/application_string.ts +25 -25
  170. package/src/programmers/internal/application_templates.ts +62 -62
  171. package/src/programmers/internal/application_title.ts +20 -20
  172. package/src/programmers/internal/application_union_discriminator.ts +35 -35
  173. package/src/programmers/internal/application_v30_alias.ts +52 -52
  174. package/src/programmers/internal/application_v30_constant.ts +18 -18
  175. package/src/programmers/internal/application_v30_native.ts +28 -28
  176. package/src/programmers/internal/application_v30_object.ts +149 -149
  177. package/src/programmers/internal/application_v30_schema.ts +161 -161
  178. package/src/programmers/internal/application_v30_tuple.ts +33 -33
  179. package/src/programmers/internal/application_v31_alias.ts +41 -41
  180. package/src/programmers/internal/application_v31_constant.ts +29 -29
  181. package/src/programmers/internal/application_v31_native.ts +24 -24
  182. package/src/programmers/internal/application_v31_object.ts +130 -130
  183. package/src/programmers/internal/application_v31_schema.ts +159 -159
  184. package/src/programmers/internal/application_v31_tuple.ts +21 -21
  185. package/src/programmers/internal/check_array_length.ts +45 -45
  186. package/src/programmers/internal/check_bigint.ts +49 -49
  187. package/src/programmers/internal/check_dynamic_key.ts +174 -174
  188. package/src/programmers/internal/check_dynamic_properties.ts +211 -211
  189. package/src/programmers/internal/check_everything.ts +23 -23
  190. package/src/programmers/internal/check_native.ts +21 -21
  191. package/src/programmers/internal/check_number.ts +107 -107
  192. package/src/programmers/internal/check_object.ts +61 -61
  193. package/src/programmers/internal/check_string.ts +48 -48
  194. package/src/programmers/internal/check_template.ts +46 -46
  195. package/src/programmers/internal/check_union_array_like.ts +307 -307
  196. package/src/programmers/internal/decode_union_object.ts +99 -99
  197. package/src/programmers/internal/feature_object_entries.ts +58 -58
  198. package/src/programmers/internal/llm_schema_array.ts +22 -22
  199. package/src/programmers/internal/llm_schema_escaped.ts +61 -61
  200. package/src/programmers/internal/llm_schema_native.ts +17 -17
  201. package/src/programmers/internal/llm_schema_object.ts +129 -129
  202. package/src/programmers/internal/llm_schema_station.ts +185 -185
  203. package/src/programmers/internal/llm_schema_tuple.ts +31 -31
  204. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  205. package/src/programmers/internal/postfix_of_tuple.ts +2 -2
  206. package/src/programmers/internal/prune_object_properties.ts +60 -60
  207. package/src/programmers/internal/random_custom.ts +37 -37
  208. package/src/programmers/internal/stringify_dynamic_properties.ts +157 -157
  209. package/src/programmers/internal/stringify_native.ts +7 -7
  210. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  211. package/src/programmers/internal/template_to_pattern.ts +15 -15
  212. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  213. package/src/programmers/json/JsonApplicationProgrammer.ts +82 -82
  214. package/src/programmers/json/JsonAssertParseProgrammer.ts +96 -96
  215. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +104 -104
  216. package/src/programmers/json/JsonIsParseProgrammer.ts +110 -110
  217. package/src/programmers/json/JsonIsStringifyProgrammer.ts +102 -102
  218. package/src/programmers/json/JsonStringifyProgrammer.ts +909 -909
  219. package/src/programmers/json/JsonValidateParseProgrammer.ts +87 -87
  220. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +111 -111
  221. package/src/programmers/llm/LlmApplicationProgrammer.ts +216 -216
  222. package/src/programmers/llm/LlmSchemaProgrammer.ts +49 -49
  223. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +87 -87
  224. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +105 -105
  225. package/src/programmers/misc/MiscCloneProgrammer.ts +781 -781
  226. package/src/programmers/misc/MiscIsCloneProgrammer.ts +93 -93
  227. package/src/programmers/misc/MiscIsPruneProgrammer.ts +91 -91
  228. package/src/programmers/misc/MiscLiteralsProgrammer.ts +70 -70
  229. package/src/programmers/misc/MiscPruneProgrammer.ts +560 -560
  230. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +104 -104
  231. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +101 -101
  232. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +91 -91
  233. package/src/programmers/notations/NotationGeneralProgrammer.ts +714 -714
  234. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +97 -97
  235. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +110 -110
  236. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +91 -91
  237. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +95 -95
  238. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +646 -646
  239. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +852 -852
  240. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +104 -104
  241. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +93 -93
  242. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +160 -160
  243. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +85 -85
  244. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +109 -109
  245. package/src/protobuf.ts +999 -999
  246. package/src/reflect.ts +63 -63
  247. package/src/schemas/json/IJsonApplication.ts +22 -22
  248. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  249. package/src/schemas/metadata/IMetadata.ts +36 -36
  250. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  251. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  252. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  253. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  254. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  255. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  256. package/src/schemas/metadata/IMetadataConstant.ts +18 -18
  257. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  258. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  259. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  260. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  261. package/src/schemas/metadata/IMetadataFunction.ts +8 -8
  262. package/src/schemas/metadata/IMetadataObject.ts +13 -13
  263. package/src/schemas/metadata/IMetadataParameter.ts +9 -9
  264. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  265. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  266. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  267. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  268. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  269. package/src/schemas/metadata/Metadata.ts +616 -616
  270. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  271. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  272. package/src/schemas/metadata/MetadataArray.ts +49 -49
  273. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  274. package/src/schemas/metadata/MetadataAtomic.ts +87 -87
  275. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  276. package/src/schemas/metadata/MetadataConstant.ts +34 -34
  277. package/src/schemas/metadata/MetadataConstantValue.ts +62 -62
  278. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  279. package/src/schemas/metadata/MetadataFunction.ts +49 -49
  280. package/src/schemas/metadata/MetadataObject.ts +139 -139
  281. package/src/schemas/metadata/MetadataParameter.ts +50 -50
  282. package/src/schemas/metadata/MetadataProperty.ts +56 -56
  283. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  284. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  285. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  286. package/src/tags/Constant.ts +15 -15
  287. package/src/tags/ContentMediaType.ts +10 -10
  288. package/src/tags/Default.ts +22 -22
  289. package/src/tags/ExclusiveMaximum.ts +25 -25
  290. package/src/tags/ExclusiveMinimum.ts +25 -25
  291. package/src/tags/Format.ts +16 -16
  292. package/src/tags/JsonSchemaPlugin.ts +8 -8
  293. package/src/tags/MaxItems.ts +12 -12
  294. package/src/tags/MaxLength.ts +12 -12
  295. package/src/tags/Maximum.ts +19 -19
  296. package/src/tags/MinItems.ts +12 -12
  297. package/src/tags/MinLength.ts +12 -12
  298. package/src/tags/Minimum.ts +19 -19
  299. package/src/tags/MultipleOf.ts +21 -21
  300. package/src/tags/Pattern.ts +31 -31
  301. package/src/tags/TagBase.ts +76 -76
  302. package/src/tags/Type.ts +32 -32
  303. package/src/tags/UniqueItems.ts +14 -14
  304. package/src/tags/index.ts +18 -18
  305. package/src/tags/internal/FormatCheatSheet.ts +73 -73
  306. package/src/transform.ts +35 -35
  307. package/src/transformers/CallExpressionTransformer.ts +508 -508
  308. package/src/transformers/FileTransformer.ts +91 -91
  309. package/src/transformers/IProject.ts +15 -15
  310. package/src/transformers/ITransformOptions.ts +62 -62
  311. package/src/transformers/ImportTransformer.ts +66 -66
  312. package/src/transformers/NodeTransformer.ts +13 -13
  313. package/src/transformers/TransformerError.ts +60 -60
  314. package/src/transformers/features/AssertTransformer.ts +16 -16
  315. package/src/transformers/features/CreateAssertTransformer.ts +16 -16
  316. package/src/transformers/features/CreateIsTransformer.ts +10 -10
  317. package/src/transformers/features/CreateRandomTransformer.ts +40 -40
  318. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  319. package/src/transformers/features/IsTransformer.ts +10 -10
  320. package/src/transformers/features/RandomTransformer.ts +44 -44
  321. package/src/transformers/features/ValidateTransformer.ts +11 -11
  322. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  323. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +12 -12
  324. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +11 -11
  325. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +9 -9
  326. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +9 -9
  327. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +9 -9
  328. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +9 -9
  329. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +9 -9
  330. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +9 -9
  331. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +9 -9
  332. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +9 -9
  333. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +12 -12
  334. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +12 -12
  335. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +11 -11
  336. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +10 -10
  337. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +9 -9
  338. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +9 -9
  339. package/src/transformers/features/http/HttpFormDataTransformer.ts +9 -9
  340. package/src/transformers/features/http/HttpHeadersTransformer.ts +9 -9
  341. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +9 -9
  342. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +9 -9
  343. package/src/transformers/features/http/HttpIsQueryTransformer.ts +9 -9
  344. package/src/transformers/features/http/HttpParameterTransformer.ts +9 -9
  345. package/src/transformers/features/http/HttpQueryTransformer.ts +9 -9
  346. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +10 -10
  347. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +10 -10
  348. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +9 -9
  349. package/src/transformers/features/json/JsonApplicationTransformer.ts +124 -124
  350. package/src/transformers/features/json/JsonAssertParseTransformer.ts +9 -9
  351. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  352. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +9 -9
  353. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  354. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  355. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +9 -9
  356. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  357. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +11 -11
  358. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  359. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  360. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +9 -9
  361. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  362. package/src/transformers/features/json/JsonValidateParseTransformer.ts +9 -9
  363. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  364. package/src/transformers/features/llm/LlmApplicationTransformer.ts +83 -83
  365. package/src/transformers/features/llm/LlmSchemaTransformer.ts +53 -53
  366. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +9 -9
  367. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +9 -9
  368. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  369. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +9 -9
  370. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +9 -9
  371. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  372. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  373. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  374. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  375. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +11 -11
  376. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +11 -11
  377. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  378. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  379. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  380. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  381. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +9 -9
  382. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +9 -9
  383. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +15 -15
  384. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +15 -15
  385. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +15 -15
  386. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +15 -15
  387. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +15 -15
  388. package/src/transformers/features/notations/NotationGeneralTransformer.ts +11 -11
  389. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +15 -15
  390. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +15 -15
  391. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  392. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  393. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +12 -12
  394. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +12 -12
  395. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +9 -9
  396. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +9 -9
  397. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +9 -9
  398. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +9 -9
  399. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +12 -12
  400. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +12 -12
  401. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +9 -9
  402. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +9 -9
  403. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +9 -9
  404. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +9 -9
  405. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  406. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +10 -10
  407. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +10 -10
  408. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +63 -63
  409. package/src/transformers/features/reflect/ReflectNameTransformer.ts +66 -66
  410. package/src/transformers/internal/GenericTransformer.ts +104 -104
  411. package/src/typings/Atomic.ts +13 -13
  412. package/src/typings/ClassProperties.ts +5 -5
  413. package/src/typings/Customizable.ts +5 -5
  414. package/src/typings/Equal.ts +18 -18
  415. package/src/typings/IsTuple.ts +9 -9
  416. package/src/typings/NativeClass.ts +23 -23
  417. package/src/typings/OmitNever.ts +3 -3
  418. package/src/typings/ProtobufAtomic.ts +19 -19
  419. package/src/typings/SpecialFields.ts +3 -3
  420. package/src/typings/ValidationPipe.ts +9 -9
  421. package/src/typings/ValueOf.ts +20 -20
  422. package/src/typings/Writable.ts +11 -11
  423. package/src/utils/ArrayUtil.ts +41 -41
  424. package/src/utils/Escaper.ts +50 -50
  425. package/src/utils/MapUtil.ts +12 -12
  426. package/src/utils/NameEncoder.ts +32 -32
  427. package/src/utils/NamingConvention/NamingConvention.ts +89 -89
  428. package/src/utils/NamingConvention/index.ts +1 -1
  429. package/src/utils/PatternUtil.ts +29 -29
  430. package/src/utils/RandomGenerator/RandomGenerator.ts +119 -119
  431. package/src/utils/RandomGenerator/index.ts +1 -1
  432. package/src/utils/Singleton.ts +16 -16
  433. package/src/utils/StringUtil/StringUtil.ts +7 -7
  434. 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
+ }