typia 6.10.2 → 6.10.3-dev.20240925

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