typia 6.10.2-dev.20240920 → 6.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +118 -118
  3. package/package.json +1 -1
  4. package/src/AssertionGuard.ts +1 -1
  5. package/src/CamelCase.ts +75 -75
  6. package/src/IRandomGenerator.ts +66 -66
  7. package/src/IValidation.ts +21 -21
  8. package/src/PascalCase.ts +71 -71
  9. package/src/Primitive.ts +92 -92
  10. package/src/Resolved.ts +74 -74
  11. package/src/SnakeCase.ts +126 -126
  12. package/src/TypeGuardError.ts +37 -37
  13. package/src/executable/TypiaGenerateWizard.ts +83 -83
  14. package/src/executable/TypiaPatchWizard.ts +42 -42
  15. package/src/executable/TypiaSetupWizard.ts +174 -174
  16. package/src/executable/setup/ArgumentParser.ts +43 -43
  17. package/src/executable/setup/CommandExecutor.ts +8 -8
  18. package/src/executable/setup/FileRetriever.ts +22 -22
  19. package/src/executable/setup/PackageManager.ts +86 -86
  20. package/src/executable/setup/PluginConfigurator.ts +69 -69
  21. package/src/executable/typia.ts +55 -55
  22. package/src/factories/CommentFactory.ts +79 -79
  23. package/src/factories/ExpressionFactory.ts +150 -150
  24. package/src/factories/IdentifierFactory.ts +70 -70
  25. package/src/factories/JsonMetadataFactory.ts +53 -53
  26. package/src/factories/LiteralFactory.ts +47 -47
  27. package/src/factories/MetadataCollection.ts +274 -274
  28. package/src/factories/MetadataCommentTagFactory.ts +534 -534
  29. package/src/factories/MetadataFactory.ts +314 -314
  30. package/src/factories/MetadataTypeTagFactory.ts +336 -336
  31. package/src/factories/MetadataTypeTagSchemaFactory.ts +59 -59
  32. package/src/factories/NumericRangeFactory.ts +72 -72
  33. package/src/factories/ProtobufFactory.ts +267 -267
  34. package/src/factories/StatementFactory.ts +74 -74
  35. package/src/factories/TemplateFactory.ts +56 -56
  36. package/src/factories/TypeFactory.ts +118 -118
  37. package/src/factories/ValueFactory.ts +12 -12
  38. package/src/factories/internal/metadata/MetadataHelper.ts +21 -21
  39. package/src/factories/internal/metadata/emend_metadata_atomics.ts +45 -45
  40. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  41. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +42 -42
  42. package/src/factories/internal/metadata/emplace_metadata_object.ts +186 -186
  43. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  44. package/src/factories/internal/metadata/explore_metadata.ts +28 -28
  45. package/src/factories/internal/metadata/iterate_metadata.ts +100 -100
  46. package/src/factories/internal/metadata/iterate_metadata_alias.ts +34 -34
  47. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  48. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  49. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  50. package/src/factories/internal/metadata/iterate_metadata_collection.ts +131 -131
  51. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +28 -28
  52. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  53. package/src/factories/internal/metadata/iterate_metadata_escape.ts +52 -52
  54. package/src/factories/internal/metadata/iterate_metadata_function.ts +89 -89
  55. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +213 -213
  56. package/src/factories/internal/metadata/iterate_metadata_map.ts +50 -50
  57. package/src/factories/internal/metadata/iterate_metadata_native.ts +220 -220
  58. package/src/factories/internal/metadata/iterate_metadata_object.ts +33 -33
  59. package/src/factories/internal/metadata/iterate_metadata_set.ts +41 -41
  60. package/src/factories/internal/metadata/iterate_metadata_sort.ts +74 -74
  61. package/src/factories/internal/metadata/iterate_metadata_template.ts +44 -44
  62. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  63. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  64. package/src/functional/$FormDataReader/$FormDataReader.ts +83 -83
  65. package/src/functional/$FormDataReader/index.ts +1 -1
  66. package/src/functional/$HeadersReader/$HeadersReader.ts +26 -26
  67. package/src/functional/$HeadersReader/index.ts +1 -1
  68. package/src/functional/$ParameterReader/$ParameterReader.ts +29 -29
  69. package/src/functional/$ParameterReader/index.ts +1 -1
  70. package/src/functional/$ProtobufReader.ts +194 -194
  71. package/src/functional/$ProtobufSizer.ts +144 -144
  72. package/src/functional/$ProtobufWriter.ts +145 -145
  73. package/src/functional/$QueryReader/$QueryReader.ts +46 -46
  74. package/src/functional/$QueryReader/index.ts +1 -1
  75. package/src/functional/$any.ts +3 -3
  76. package/src/functional/$clone.ts +48 -48
  77. package/src/functional/$convention.ts +37 -37
  78. package/src/functional/$dictionary.ts +22 -22
  79. package/src/functional/$every.ts +11 -11
  80. package/src/functional/$guard.ts +21 -21
  81. package/src/functional/$is_between.ts +2 -2
  82. package/src/functional/$join.ts +46 -46
  83. package/src/functional/$number.ts +12 -12
  84. package/src/functional/$report.ts +13 -13
  85. package/src/functional/$rest.ts +3 -3
  86. package/src/functional/$stoll.ts +8 -8
  87. package/src/functional/$string.ts +43 -43
  88. package/src/functional/$strlen.ts +7 -7
  89. package/src/functional/$tail.ts +5 -5
  90. package/src/functional/$throws.ts +10 -10
  91. package/src/functional/$varint.ts +130 -130
  92. package/src/functional/$zigzag.ts +39 -39
  93. package/src/functional/IProtobufWriter.ts +18 -18
  94. package/src/functional/Namespace/functional.ts +5 -5
  95. package/src/functional/Namespace/http.ts +9 -9
  96. package/src/functional/Namespace/index.ts +77 -77
  97. package/src/functional/Namespace/json.ts +15 -15
  98. package/src/functional/Namespace/llm.ts +20 -20
  99. package/src/functional/Namespace/misc.ts +14 -14
  100. package/src/functional/Namespace/notations.ts +23 -23
  101. package/src/functional/Namespace/protobuf.ts +20 -20
  102. package/src/functional/is.ts +10 -10
  103. package/src/functional.ts +872 -872
  104. package/src/http.ts +1266 -1266
  105. package/src/index.ts +4 -4
  106. package/src/json.ts +738 -738
  107. package/src/llm.ts +186 -186
  108. package/src/misc.ts +757 -757
  109. package/src/module.ts +1023 -1023
  110. package/src/notations.ts +1020 -1020
  111. package/src/programmers/AssertProgrammer.ts +397 -397
  112. package/src/programmers/CheckerProgrammer.ts +1138 -1138
  113. package/src/programmers/FeatureProgrammer.ts +549 -549
  114. package/src/programmers/IsProgrammer.ts +220 -220
  115. package/src/programmers/RandomProgrammer.ts +955 -955
  116. package/src/programmers/TypiaProgrammer.ts +157 -157
  117. package/src/programmers/ValidateProgrammer.ts +382 -382
  118. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +141 -141
  119. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +108 -108
  120. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +98 -98
  121. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  122. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +101 -101
  123. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +106 -106
  124. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +123 -123
  125. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +267 -267
  126. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +126 -126
  127. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  128. package/src/programmers/helpers/AtomicPredicator.ts +24 -24
  129. package/src/programmers/helpers/CloneJoiner.ts +130 -130
  130. package/src/programmers/helpers/FunctionImporeter.ts +1 -1
  131. package/src/programmers/helpers/FunctionImporter.ts +97 -97
  132. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  133. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  134. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  135. package/src/programmers/helpers/NotationJoiner.ts +132 -132
  136. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  137. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  138. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  139. package/src/programmers/helpers/PruneJoiner.ts +139 -139
  140. package/src/programmers/helpers/RandomJoiner.ts +145 -145
  141. package/src/programmers/helpers/RandomRanger.ts +171 -171
  142. package/src/programmers/helpers/StringifyJoinder.ts +105 -105
  143. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  144. package/src/programmers/helpers/UnionExplorer.ts +269 -269
  145. package/src/programmers/helpers/UnionPredicator.ts +77 -77
  146. package/src/programmers/helpers/disable_function_importer_declare.ts +33 -33
  147. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +91 -91
  148. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +91 -91
  149. package/src/programmers/http/HttpAssertQueryProgrammer.ts +93 -93
  150. package/src/programmers/http/HttpFormDataProgrammer.ts +278 -278
  151. package/src/programmers/http/HttpHeadersProgrammer.ts +347 -347
  152. package/src/programmers/http/HttpIsFormDataProgrammer.ts +102 -102
  153. package/src/programmers/http/HttpIsHeadersProgrammer.ts +102 -102
  154. package/src/programmers/http/HttpIsQueryProgrammer.ts +104 -104
  155. package/src/programmers/http/HttpParameterProgrammer.ts +97 -97
  156. package/src/programmers/http/HttpQueryProgrammer.ts +298 -298
  157. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +85 -85
  158. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +85 -85
  159. package/src/programmers/http/HttpValidateQueryProgrammer.ts +87 -87
  160. package/src/programmers/internal/application_array.ts +61 -61
  161. package/src/programmers/internal/application_bigint.ts +25 -25
  162. package/src/programmers/internal/application_boolean.ts +25 -25
  163. package/src/programmers/internal/application_description.ts +12 -12
  164. package/src/programmers/internal/application_escaped.ts +74 -74
  165. package/src/programmers/internal/application_number.ts +25 -25
  166. package/src/programmers/internal/application_plugin.ts +19 -19
  167. package/src/programmers/internal/application_string.ts +25 -25
  168. package/src/programmers/internal/application_templates.ts +62 -62
  169. package/src/programmers/internal/application_title.ts +20 -20
  170. package/src/programmers/internal/application_union_discriminator.ts +35 -35
  171. package/src/programmers/internal/application_v30_alias.ts +52 -52
  172. package/src/programmers/internal/application_v30_constant.ts +18 -18
  173. package/src/programmers/internal/application_v30_native.ts +28 -28
  174. package/src/programmers/internal/application_v30_object.ts +149 -149
  175. package/src/programmers/internal/application_v30_schema.ts +161 -161
  176. package/src/programmers/internal/application_v30_tuple.ts +33 -33
  177. package/src/programmers/internal/application_v31_alias.ts +41 -41
  178. package/src/programmers/internal/application_v31_constant.ts +29 -29
  179. package/src/programmers/internal/application_v31_native.ts +24 -24
  180. package/src/programmers/internal/application_v31_object.ts +130 -130
  181. package/src/programmers/internal/application_v31_schema.ts +159 -159
  182. package/src/programmers/internal/application_v31_tuple.ts +21 -21
  183. package/src/programmers/internal/check_array_length.ts +45 -45
  184. package/src/programmers/internal/check_bigint.ts +49 -49
  185. package/src/programmers/internal/check_dynamic_key.ts +174 -174
  186. package/src/programmers/internal/check_dynamic_properties.ts +211 -211
  187. package/src/programmers/internal/check_everything.ts +23 -23
  188. package/src/programmers/internal/check_native.ts +21 -21
  189. package/src/programmers/internal/check_number.ts +107 -107
  190. package/src/programmers/internal/check_object.ts +61 -61
  191. package/src/programmers/internal/check_string.ts +48 -48
  192. package/src/programmers/internal/check_template.ts +46 -46
  193. package/src/programmers/internal/check_union_array_like.ts +307 -307
  194. package/src/programmers/internal/decode_union_object.ts +99 -99
  195. package/src/programmers/internal/feature_object_entries.ts +58 -58
  196. package/src/programmers/internal/llm_schema_array.ts +22 -22
  197. package/src/programmers/internal/llm_schema_escaped.ts +61 -61
  198. package/src/programmers/internal/llm_schema_native.ts +17 -17
  199. package/src/programmers/internal/llm_schema_object.ts +129 -129
  200. package/src/programmers/internal/llm_schema_station.ts +185 -185
  201. package/src/programmers/internal/llm_schema_tuple.ts +31 -31
  202. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  203. package/src/programmers/internal/postfix_of_tuple.ts +2 -2
  204. package/src/programmers/internal/prune_object_properties.ts +60 -60
  205. package/src/programmers/internal/random_custom.ts +37 -37
  206. package/src/programmers/internal/stringify_dynamic_properties.ts +157 -157
  207. package/src/programmers/internal/stringify_native.ts +7 -7
  208. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  209. package/src/programmers/internal/template_to_pattern.ts +15 -15
  210. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  211. package/src/programmers/json/JsonApplicationProgrammer.ts +82 -82
  212. package/src/programmers/json/JsonAssertParseProgrammer.ts +96 -96
  213. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +104 -104
  214. package/src/programmers/json/JsonIsParseProgrammer.ts +110 -110
  215. package/src/programmers/json/JsonIsStringifyProgrammer.ts +102 -102
  216. package/src/programmers/json/JsonStringifyProgrammer.ts +909 -909
  217. package/src/programmers/json/JsonValidateParseProgrammer.ts +87 -87
  218. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +111 -111
  219. package/src/programmers/llm/LlmApplicationProgrammer.ts +216 -216
  220. package/src/programmers/llm/LlmSchemaProgrammer.ts +49 -49
  221. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +87 -87
  222. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +105 -105
  223. package/src/programmers/misc/MiscCloneProgrammer.ts +781 -781
  224. package/src/programmers/misc/MiscIsCloneProgrammer.ts +93 -93
  225. package/src/programmers/misc/MiscIsPruneProgrammer.ts +91 -91
  226. package/src/programmers/misc/MiscLiteralsProgrammer.ts +70 -70
  227. package/src/programmers/misc/MiscPruneProgrammer.ts +560 -560
  228. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +104 -104
  229. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +101 -101
  230. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +91 -91
  231. package/src/programmers/notations/NotationGeneralProgrammer.ts +714 -714
  232. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +97 -97
  233. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +110 -110
  234. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +91 -91
  235. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +95 -95
  236. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +646 -646
  237. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +852 -852
  238. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +104 -104
  239. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +93 -93
  240. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +160 -160
  241. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +85 -85
  242. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +109 -109
  243. package/src/protobuf.ts +999 -999
  244. package/src/reflect.ts +63 -63
  245. package/src/schemas/json/IJsonApplication.ts +22 -22
  246. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  247. package/src/schemas/metadata/IMetadata.ts +36 -36
  248. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  249. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  250. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  251. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  252. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  253. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  254. package/src/schemas/metadata/IMetadataConstant.ts +18 -18
  255. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  256. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  257. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  258. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  259. package/src/schemas/metadata/IMetadataFunction.ts +8 -8
  260. package/src/schemas/metadata/IMetadataObject.ts +13 -13
  261. package/src/schemas/metadata/IMetadataParameter.ts +9 -9
  262. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  263. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  264. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  265. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  266. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  267. package/src/schemas/metadata/Metadata.ts +616 -616
  268. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  269. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  270. package/src/schemas/metadata/MetadataArray.ts +49 -49
  271. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  272. package/src/schemas/metadata/MetadataAtomic.ts +87 -87
  273. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  274. package/src/schemas/metadata/MetadataConstant.ts +34 -34
  275. package/src/schemas/metadata/MetadataConstantValue.ts +62 -62
  276. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  277. package/src/schemas/metadata/MetadataFunction.ts +49 -49
  278. package/src/schemas/metadata/MetadataObject.ts +139 -139
  279. package/src/schemas/metadata/MetadataParameter.ts +50 -50
  280. package/src/schemas/metadata/MetadataProperty.ts +56 -56
  281. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  282. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  283. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  284. package/src/tags/Constant.ts +15 -15
  285. package/src/tags/ContentMediaType.ts +10 -10
  286. package/src/tags/Default.ts +22 -22
  287. package/src/tags/ExclusiveMaximum.ts +25 -25
  288. package/src/tags/ExclusiveMinimum.ts +25 -25
  289. package/src/tags/Format.ts +16 -16
  290. package/src/tags/JsonSchemaPlugin.ts +8 -8
  291. package/src/tags/MaxItems.ts +12 -12
  292. package/src/tags/MaxLength.ts +12 -12
  293. package/src/tags/Maximum.ts +19 -19
  294. package/src/tags/MinItems.ts +12 -12
  295. package/src/tags/MinLength.ts +12 -12
  296. package/src/tags/Minimum.ts +19 -19
  297. package/src/tags/MultipleOf.ts +21 -21
  298. package/src/tags/Pattern.ts +31 -31
  299. package/src/tags/TagBase.ts +76 -76
  300. package/src/tags/Type.ts +32 -32
  301. package/src/tags/UniqueItems.ts +14 -14
  302. package/src/tags/index.ts +18 -18
  303. package/src/tags/internal/FormatCheatSheet.ts +73 -73
  304. package/src/transform.ts +35 -35
  305. package/src/transformers/CallExpressionTransformer.ts +508 -508
  306. package/src/transformers/FileTransformer.ts +91 -91
  307. package/src/transformers/IProject.ts +15 -15
  308. package/src/transformers/ITransformOptions.ts +62 -62
  309. package/src/transformers/ImportTransformer.ts +66 -66
  310. package/src/transformers/NodeTransformer.ts +13 -13
  311. package/src/transformers/TransformerError.ts +60 -60
  312. package/src/transformers/features/AssertTransformer.ts +16 -16
  313. package/src/transformers/features/CreateAssertTransformer.ts +16 -16
  314. package/src/transformers/features/CreateIsTransformer.ts +10 -10
  315. package/src/transformers/features/CreateRandomTransformer.ts +40 -40
  316. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  317. package/src/transformers/features/IsTransformer.ts +10 -10
  318. package/src/transformers/features/RandomTransformer.ts +44 -44
  319. package/src/transformers/features/ValidateTransformer.ts +11 -11
  320. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  321. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +12 -12
  322. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +11 -11
  323. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +9 -9
  324. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +9 -9
  325. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +9 -9
  326. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +9 -9
  327. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +9 -9
  328. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +9 -9
  329. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +9 -9
  330. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +9 -9
  331. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +12 -12
  332. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +12 -12
  333. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +11 -11
  334. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +10 -10
  335. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +9 -9
  336. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +9 -9
  337. package/src/transformers/features/http/HttpFormDataTransformer.ts +9 -9
  338. package/src/transformers/features/http/HttpHeadersTransformer.ts +9 -9
  339. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +9 -9
  340. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +9 -9
  341. package/src/transformers/features/http/HttpIsQueryTransformer.ts +9 -9
  342. package/src/transformers/features/http/HttpParameterTransformer.ts +9 -9
  343. package/src/transformers/features/http/HttpQueryTransformer.ts +9 -9
  344. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +10 -10
  345. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +10 -10
  346. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +9 -9
  347. package/src/transformers/features/json/JsonApplicationTransformer.ts +124 -124
  348. package/src/transformers/features/json/JsonAssertParseTransformer.ts +9 -9
  349. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  350. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +9 -9
  351. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  352. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  353. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +9 -9
  354. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  355. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +11 -11
  356. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  357. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  358. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +9 -9
  359. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  360. package/src/transformers/features/json/JsonValidateParseTransformer.ts +9 -9
  361. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  362. package/src/transformers/features/llm/LlmApplicationTransformer.ts +83 -83
  363. package/src/transformers/features/llm/LlmSchemaTransformer.ts +53 -53
  364. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +9 -9
  365. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +9 -9
  366. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  367. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +9 -9
  368. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +9 -9
  369. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  370. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  371. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  372. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  373. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +11 -11
  374. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +11 -11
  375. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  376. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  377. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  378. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  379. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +9 -9
  380. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +9 -9
  381. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +15 -15
  382. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +15 -15
  383. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +15 -15
  384. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +15 -15
  385. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +15 -15
  386. package/src/transformers/features/notations/NotationGeneralTransformer.ts +11 -11
  387. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +15 -15
  388. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +15 -15
  389. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  390. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  391. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +12 -12
  392. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +12 -12
  393. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +9 -9
  394. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +9 -9
  395. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +9 -9
  396. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +9 -9
  397. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +12 -12
  398. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +12 -12
  399. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +9 -9
  400. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +9 -9
  401. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +9 -9
  402. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +9 -9
  403. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  404. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +10 -10
  405. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +10 -10
  406. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +63 -63
  407. package/src/transformers/features/reflect/ReflectNameTransformer.ts +66 -66
  408. package/src/transformers/internal/GenericTransformer.ts +104 -104
  409. package/src/typings/Atomic.ts +13 -13
  410. package/src/typings/ClassProperties.ts +5 -5
  411. package/src/typings/Customizable.ts +5 -5
  412. package/src/typings/Equal.ts +18 -18
  413. package/src/typings/IsTuple.ts +9 -9
  414. package/src/typings/NativeClass.ts +23 -23
  415. package/src/typings/OmitNever.ts +3 -3
  416. package/src/typings/ProtobufAtomic.ts +19 -19
  417. package/src/typings/SpecialFields.ts +3 -3
  418. package/src/typings/ValidationPipe.ts +9 -9
  419. package/src/typings/ValueOf.ts +20 -20
  420. package/src/typings/Writable.ts +11 -11
  421. package/src/utils/ArrayUtil.ts +41 -41
  422. package/src/utils/Escaper.ts +50 -50
  423. package/src/utils/MapUtil.ts +12 -12
  424. package/src/utils/NameEncoder.ts +32 -32
  425. package/src/utils/NamingConvention/NamingConvention.ts +89 -89
  426. package/src/utils/NamingConvention/index.ts +1 -1
  427. package/src/utils/PatternUtil.ts +29 -29
  428. package/src/utils/RandomGenerator/RandomGenerator.ts +119 -119
  429. package/src/utils/RandomGenerator/index.ts +1 -1
  430. package/src/utils/Singleton.ts +16 -16
  431. package/src/utils/StringUtil/StringUtil.ts +7 -7
  432. package/src/utils/StringUtil/index.ts +1 -1
@@ -1,955 +1,955 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../factories/MetadataCollection";
6
- import { MetadataFactory } from "../factories/MetadataFactory";
7
- import { StatementFactory } from "../factories/StatementFactory";
8
- import { TemplateFactory } from "../factories/TemplateFactory";
9
- import { TypeFactory } from "../factories/TypeFactory";
10
-
11
- import { Metadata } from "../schemas/metadata/Metadata";
12
- import { MetadataArray } from "../schemas/metadata/MetadataArray";
13
- import { MetadataArrayType } from "../schemas/metadata/MetadataArrayType";
14
- import { MetadataAtomic } from "../schemas/metadata/MetadataAtomic";
15
- import { MetadataObject } from "../schemas/metadata/MetadataObject";
16
- import { MetadataTemplate } from "../schemas/metadata/MetadataTemplate";
17
- import { MetadataTuple } from "../schemas/metadata/MetadataTuple";
18
- import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
19
-
20
- import { IProject } from "../transformers/IProject";
21
- import { TransformerError } from "../transformers/TransformerError";
22
-
23
- import { Escaper } from "../utils/Escaper";
24
-
25
- import { Format } from "../tags";
26
- import { FeatureProgrammer } from "./FeatureProgrammer";
27
- import { FunctionImporter } from "./helpers/FunctionImporter";
28
- import { RandomJoiner } from "./helpers/RandomJoiner";
29
- import { RandomRanger } from "./helpers/RandomRanger";
30
- import { random_custom } from "./internal/random_custom";
31
-
32
- export namespace RandomProgrammer {
33
- export const decompose = (props: {
34
- project: IProject;
35
- importer: FunctionImporter;
36
- type: ts.Type;
37
- name: string | undefined;
38
- init: ts.Expression | undefined;
39
- }): FeatureProgrammer.IDecomposed => {
40
- const collection: MetadataCollection = new MetadataCollection();
41
- const result = MetadataFactory.analyze(
42
- props.project.checker,
43
- props.project.context,
44
- )({
45
- escape: false,
46
- constant: true,
47
- absorb: true,
48
- validate: (meta) => {
49
- const output: string[] = [];
50
- if (meta.natives.some((n) => n === "WeakSet"))
51
- output.push(`WeakSet is not supported.`);
52
- else if (meta.natives.some((n) => n === "WeakMap"))
53
- output.push(`WeakMap is not supported.`);
54
- return output;
55
- },
56
- })(collection)(props.type);
57
- if (result.success === false)
58
- throw TransformerError.from(`typia.${props.importer.method}`)(
59
- result.errors,
60
- );
61
-
62
- // GENERATE FUNCTION
63
- const functions: Record<string, ts.VariableStatement> = Object.fromEntries([
64
- ...write_object_functions(props.importer)(collection).map((v, i) => [
65
- Prefix.object(i),
66
- v,
67
- ]),
68
- ...write_array_functions(props.importer)(collection).map((v, i) => [
69
- Prefix.array(i),
70
- v,
71
- ]),
72
- ...write_tuple_functions(props.importer)(collection).map((v, i) => [
73
- Prefix.tuple(i),
74
- v,
75
- ]),
76
- ]);
77
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
78
- undefined,
79
- undefined,
80
- [
81
- IdentifierFactory.parameter(
82
- "generator",
83
- ts.factory.createTypeReferenceNode("Partial<typia.IRandomGenerator>"),
84
- props.init ?? ts.factory.createToken(ts.SyntaxKind.QuestionToken),
85
- ),
86
- ],
87
- ts.factory.createImportTypeNode(
88
- ts.factory.createLiteralTypeNode(
89
- ts.factory.createStringLiteral("typia"),
90
- ),
91
- undefined,
92
- ts.factory.createIdentifier("Resolved"),
93
- [
94
- ts.factory.createTypeReferenceNode(
95
- props.name ??
96
- TypeFactory.getFullName(props.project.checker)(props.type),
97
- ),
98
- ],
99
- false,
100
- ),
101
- undefined,
102
- ts.factory.createBlock(
103
- [
104
- ts.factory.createExpressionStatement(
105
- ts.factory.createBinaryExpression(
106
- ts.factory.createIdentifier("_generator"),
107
- ts.SyntaxKind.EqualsToken,
108
- ts.factory.createIdentifier("generator"),
109
- ),
110
- ),
111
- ts.factory.createReturnStatement(
112
- decode(props.importer)({
113
- function: false,
114
- recursive: false,
115
- })(result.data),
116
- ),
117
- ],
118
- true,
119
- ),
120
- );
121
- return {
122
- functions,
123
- statements: [StatementFactory.mut("_generator")],
124
- arrow,
125
- };
126
- };
127
-
128
- export const write =
129
- (project: IProject) =>
130
- (modulo: ts.LeftHandSideExpression) =>
131
- (init?: ts.Expression) =>
132
- (type: ts.Type, name?: string) => {
133
- const importer: FunctionImporter = new FunctionImporter(modulo.getText());
134
- const result: FeatureProgrammer.IDecomposed = decompose({
135
- project,
136
- importer,
137
- type,
138
- name,
139
- init,
140
- });
141
- return FeatureProgrammer.writeDecomposed({
142
- modulo,
143
- importer,
144
- result,
145
- });
146
- };
147
-
148
- const write_object_functions =
149
- (importer: FunctionImporter) =>
150
- (collection: MetadataCollection): ts.VariableStatement[] =>
151
- collection.objects().map((obj, i) =>
152
- StatementFactory.constant(
153
- Prefix.object(i),
154
- ts.factory.createArrowFunction(
155
- undefined,
156
- undefined,
157
- [
158
- IdentifierFactory.parameter(
159
- "_recursive",
160
- TypeFactory.keyword("boolean"),
161
- ts.factory.createIdentifier(String(obj.recursive)),
162
- ),
163
- IdentifierFactory.parameter(
164
- "_depth",
165
- TypeFactory.keyword("number"),
166
- ExpressionFactory.number(0),
167
- ),
168
- ],
169
- TypeFactory.keyword("any"),
170
- undefined,
171
- RandomJoiner.object(COALESCE(importer))(
172
- decode(importer)({
173
- recursive: obj.recursive,
174
- function: true,
175
- }),
176
- )(obj),
177
- ),
178
- ),
179
- );
180
-
181
- const write_array_functions =
182
- (importer: FunctionImporter) =>
183
- (collection: MetadataCollection): ts.VariableStatement[] =>
184
- collection
185
- .arrays()
186
- .filter((a) => a.recursive)
187
- .map((array, i) =>
188
- StatementFactory.constant(
189
- Prefix.array(i),
190
- ts.factory.createArrowFunction(
191
- undefined,
192
- undefined,
193
- [
194
- IdentifierFactory.parameter(
195
- "length",
196
- TypeFactory.keyword("number"),
197
- ),
198
- IdentifierFactory.parameter(
199
- "unique",
200
- TypeFactory.keyword("boolean"),
201
- ),
202
- IdentifierFactory.parameter(
203
- "_recursive",
204
- TypeFactory.keyword("boolean"),
205
- ts.factory.createTrue(),
206
- ),
207
- IdentifierFactory.parameter(
208
- "_depth",
209
- TypeFactory.keyword("number"),
210
- ExpressionFactory.number(0),
211
- ),
212
- ],
213
- TypeFactory.keyword("any"),
214
- undefined,
215
- RandomJoiner.array(COALESCE(importer))(
216
- decode(importer)({
217
- recursive: true,
218
- function: true,
219
- }),
220
- )({
221
- recursive: true,
222
- function: true,
223
- })(
224
- ts.factory.createIdentifier("length"),
225
- ts.factory.createIdentifier("unique"),
226
- )(array.value),
227
- ),
228
- ),
229
- );
230
-
231
- const write_tuple_functions =
232
- (importer: FunctionImporter) =>
233
- (collection: MetadataCollection): ts.VariableStatement[] =>
234
- collection
235
- .tuples()
236
- .filter((a) => a.recursive)
237
- .map((tuple, i) =>
238
- StatementFactory.constant(
239
- Prefix.tuple(i),
240
- ts.factory.createArrowFunction(
241
- undefined,
242
- undefined,
243
- [
244
- IdentifierFactory.parameter(
245
- "_recursive",
246
- TypeFactory.keyword("boolean"),
247
- ts.factory.createTrue(),
248
- ),
249
- IdentifierFactory.parameter(
250
- "_depth",
251
- TypeFactory.keyword("number"),
252
- ExpressionFactory.number(0),
253
- ),
254
- ],
255
- TypeFactory.keyword("any"),
256
- undefined,
257
- RandomJoiner.tuple(
258
- decode(importer)({
259
- function: true,
260
- recursive: true,
261
- }),
262
- )(tuple.elements),
263
- ),
264
- ),
265
- );
266
-
267
- /* -----------------------------------------------------------
268
- DECODERS
269
- ----------------------------------------------------------- */
270
- const decode =
271
- (importer: FunctionImporter) =>
272
- (explore: IExplore) =>
273
- (meta: Metadata): ts.Expression => {
274
- const expressions: ts.Expression[] = [];
275
- if (meta.any)
276
- expressions.push(ts.factory.createStringLiteral("any type used..."));
277
-
278
- // NULL COALESCING
279
- if (meta.isRequired() === false || meta.functions.length)
280
- expressions.push(ts.factory.createIdentifier("undefined"));
281
- if (meta.nullable === true) expressions.push(ts.factory.createNull());
282
-
283
- // CONSTANT TYPES
284
- for (const constant of meta.constants)
285
- for (const { value } of constant.values)
286
- expressions.push(decode_atomic(value));
287
-
288
- // ATOMIC VARIABLES
289
- for (const template of meta.templates)
290
- expressions.push(decode_template(importer)(explore)(template));
291
- for (const atomic of meta.atomics)
292
- if (atomic.type === "boolean")
293
- expressions.push(decode_boolean(importer));
294
- else if (atomic.type === "number")
295
- expressions.push(...decode_number(importer)(atomic));
296
- else if (atomic.type === "string")
297
- expressions.push(...decode_string(importer)(atomic));
298
- else if (atomic.type === "bigint")
299
- expressions.push(...decode_bigint(importer)(atomic));
300
-
301
- // INSTANCE TYPES
302
- if (meta.escaped)
303
- expressions.push(decode(importer)(explore)(meta.escaped.returns));
304
- for (const array of meta.arrays)
305
- expressions.push(...decode_array(importer)(explore)(array));
306
- for (const tuple of meta.tuples)
307
- expressions.push(decode_tuple(importer)(explore)(tuple));
308
- for (const o of meta.objects)
309
- expressions.push(decode_object(importer)(explore)(o));
310
- for (const native of meta.natives)
311
- expressions.push(decode_native(importer)(native));
312
- for (const set of meta.sets)
313
- expressions.push(decode_set(importer)(explore)(set));
314
- for (const map of meta.maps)
315
- expressions.push(decode_map(importer)(explore)(map));
316
-
317
- // PICK UP A TYPE
318
- if (expressions.length === 1) return expressions[0]!;
319
- return ts.factory.createCallExpression(
320
- ts.factory.createCallExpression(importer.use("pick"), undefined, [
321
- ts.factory.createArrayLiteralExpression(
322
- expressions.map((expr) =>
323
- ts.factory.createArrowFunction(
324
- undefined,
325
- undefined,
326
- [],
327
- undefined,
328
- undefined,
329
- expr,
330
- ),
331
- ),
332
- true,
333
- ),
334
- ]),
335
- undefined,
336
- undefined,
337
- );
338
- };
339
-
340
- const decode_boolean = (importer: FunctionImporter) =>
341
- ts.factory.createCallExpression(
342
- COALESCE(importer)("boolean"),
343
- undefined,
344
- undefined,
345
- );
346
-
347
- const decode_atomic = (value: Atomic) =>
348
- typeof value === "boolean"
349
- ? ts.factory.createIdentifier(value.toString())
350
- : typeof value === "number"
351
- ? ExpressionFactory.number(value)
352
- : typeof value === "string"
353
- ? ts.factory.createStringLiteral(value)
354
- : ExpressionFactory.bigint(Number(value));
355
-
356
- const decode_template =
357
- (importer: FunctionImporter) =>
358
- (explore: IExplore) =>
359
- (template: MetadataTemplate) =>
360
- TemplateFactory.generate(
361
- template.row.map((meta) => decode(importer)(explore)(meta)),
362
- );
363
-
364
- const decode_number =
365
- (importer: FunctionImporter) =>
366
- (atomic: MetadataAtomic): ts.Expression[] =>
367
- (atomic.tags.length ? atomic.tags : [[]]).map((tags) => {
368
- const type = tags.find(
369
- (t) =>
370
- t.kind === "type" && (t.value === "int32" || t.value === "int64"),
371
- )
372
- ? "int"
373
- : tags.find(
374
- (t) =>
375
- t.kind === "type" &&
376
- (t.value === "uint32" || t.value === "uint64"),
377
- )
378
- ? "uint"
379
- : "double";
380
- const multiply = tags.find((t) => t.kind === "multipleOf");
381
- return random_custom(COALESCE(importer))("number")(tags)(
382
- RandomRanger.number({
383
- type,
384
- transform: (value) => ExpressionFactory.number(value),
385
- setter: (args) =>
386
- ts.factory.createCallExpression(
387
- type !== "double" || multiply !== undefined
388
- ? COALESCE(importer)("integer")
389
- : COALESCE(importer)("number"),
390
- undefined,
391
- args.map((val) => ExpressionFactory.number(val)),
392
- ),
393
- })({
394
- minimum: 0,
395
- maximum: 100,
396
- gap: 10,
397
- })(tags),
398
- );
399
- });
400
-
401
- const decode_bigint =
402
- (importer: FunctionImporter) =>
403
- (atomic: MetadataAtomic): ts.Expression[] =>
404
- (atomic.tags.length ? atomic.tags : [[]]).map((tags) =>
405
- random_custom(COALESCE(importer))("bigint")(tags)(
406
- RandomRanger.number({
407
- type: tags.find(
408
- (t) =>
409
- t.kind === "type" &&
410
- (t.value === "uint" || t.value === "uint64"),
411
- )
412
- ? "uint"
413
- : "int",
414
- transform: (value) => ExpressionFactory.bigint(value),
415
- setter: (args) =>
416
- ts.factory.createCallExpression(
417
- COALESCE(importer)("bigint"),
418
- undefined,
419
- args.map((value) => ExpressionFactory.bigint(value)),
420
- ),
421
- })({
422
- minimum: 0,
423
- maximum: 100,
424
- gap: 10,
425
- })(tags),
426
- ),
427
- );
428
-
429
- const decode_string =
430
- (importer: FunctionImporter) =>
431
- (atomic: MetadataAtomic): ts.Expression[] =>
432
- (atomic.tags.length ? atomic.tags : [[]]).map((tags) =>
433
- random_custom(COALESCE(importer))("string")(tags)(
434
- (() => {
435
- for (const t of tags)
436
- if (t.kind === "format")
437
- return ts.factory.createCallExpression(
438
- COALESCE(importer)(emendFormat(t.value)),
439
- undefined,
440
- undefined,
441
- );
442
- else if (t.kind === "pattern")
443
- return ts.factory.createCallExpression(
444
- COALESCE(importer)("pattern"),
445
- undefined,
446
- [
447
- ts.factory.createIdentifier(
448
- `RegExp(${JSON.stringify(t.value)})`,
449
- ),
450
- ],
451
- );
452
-
453
- const tail = RandomRanger.length(COALESCE(importer))({
454
- minimum: 5,
455
- maximum: 25,
456
- gap: 5,
457
- })({
458
- minimum: "minLength",
459
- maximum: "maxLength",
460
- })(tags);
461
- return ts.factory.createCallExpression(
462
- COALESCE(importer)("string"),
463
- undefined,
464
- tail ? [tail] : undefined,
465
- );
466
- })(),
467
- ),
468
- );
469
-
470
- const decode_array =
471
- (importer: FunctionImporter) =>
472
- (explore: IExplore) =>
473
- (array: MetadataArray): ts.Expression[] => {
474
- const fixed: Array<
475
- [ts.Expression | undefined, ts.Expression | undefined]
476
- > = (array.tags.length ? array.tags : [[]]).map((tags) => [
477
- RandomRanger.length(COALESCE(importer))({
478
- minimum: 0,
479
- maximum: 3,
480
- gap: 3,
481
- })({
482
- minimum: "minItems",
483
- maximum: "maxItems",
484
- })(tags),
485
- (() => {
486
- const uniqueItems = tags.find((t) => t.kind === "uniqueItems");
487
- return uniqueItems === undefined
488
- ? undefined
489
- : uniqueItems.value === false
490
- ? ts.factory.createFalse()
491
- : ts.factory.createTrue();
492
- })(),
493
- ]);
494
- if (array.type.recursive)
495
- return fixed.map(([len, unique]) =>
496
- ts.factory.createCallExpression(
497
- ts.factory.createIdentifier(
498
- importer.useLocal(Prefix.array(array.type.index!)),
499
- ),
500
- undefined,
501
- [
502
- len ?? COALESCE(importer)("length"),
503
- unique ?? ts.factory.createFalse(),
504
- ts.factory.createTrue(),
505
- explore.recursive
506
- ? ts.factory.createAdd(
507
- ExpressionFactory.number(1),
508
- ts.factory.createIdentifier("_depth"),
509
- )
510
- : ExpressionFactory.number(0),
511
- ],
512
- ),
513
- );
514
- return fixed.map(([len, unique]) => {
515
- const expr: ts.Expression = RandomJoiner.array(COALESCE(importer))(
516
- decode(importer)(explore),
517
- )(explore)(
518
- len,
519
- unique,
520
- )(array.type.value);
521
- return explore.recursive
522
- ? ts.factory.createConditionalExpression(
523
- ts.factory.createLogicalAnd(
524
- ts.factory.createIdentifier("_recursive"),
525
- ts.factory.createLessThan(
526
- ExpressionFactory.number(5),
527
- ts.factory.createIdentifier("_depth"),
528
- ),
529
- ),
530
- undefined,
531
- ts.factory.createIdentifier("[]"),
532
- undefined,
533
- expr,
534
- )
535
- : expr;
536
- });
537
- };
538
-
539
- const decode_tuple =
540
- (importer: FunctionImporter) =>
541
- (explore: IExplore) =>
542
- (tuple: MetadataTuple): ts.Expression =>
543
- tuple.type.recursive
544
- ? ts.factory.createCallExpression(
545
- ts.factory.createIdentifier(
546
- importer.useLocal(Prefix.tuple(tuple.type.index!)),
547
- ),
548
- undefined,
549
- [
550
- ts.factory.createTrue(),
551
- explore.recursive
552
- ? ts.factory.createAdd(
553
- ExpressionFactory.number(1),
554
- ts.factory.createIdentifier("_depth"),
555
- )
556
- : ExpressionFactory.number(0),
557
- ],
558
- )
559
- : RandomJoiner.tuple(decode(importer)(explore))(tuple.type.elements);
560
-
561
- const decode_object =
562
- (importer: FunctionImporter) =>
563
- (explore: IExplore) =>
564
- (object: MetadataObject) =>
565
- ts.factory.createCallExpression(
566
- ts.factory.createIdentifier(
567
- importer.useLocal(Prefix.object(object.index)),
568
- ),
569
- undefined,
570
- explore.function
571
- ? [
572
- explore.recursive
573
- ? ts.factory.createTrue()
574
- : ts.factory.createIdentifier("_recursive"),
575
- ts.factory.createConditionalExpression(
576
- ts.factory.createIdentifier("_recursive"),
577
- undefined,
578
- ts.factory.createAdd(
579
- ExpressionFactory.number(1),
580
- ts.factory.createIdentifier("_depth"),
581
- ),
582
- undefined,
583
- ts.factory.createIdentifier("_depth"),
584
- ),
585
- ]
586
- : undefined,
587
- );
588
-
589
- /* -----------------------------------------------------------
590
- NATIVE CLASSES
591
- ----------------------------------------------------------- */
592
- const decode_set =
593
- (importer: FunctionImporter) => (explore: IExplore) => (meta: Metadata) =>
594
- ts.factory.createNewExpression(
595
- ts.factory.createIdentifier("Set"),
596
- undefined,
597
- [
598
- decode_array(importer)(explore)(
599
- MetadataArray.create({
600
- tags: [],
601
- type: MetadataArrayType.create({
602
- value: meta,
603
- recursive: false,
604
- index: null,
605
- nullables: [],
606
- name: `Set<${meta.getName()}>`,
607
- }),
608
- }),
609
- )[0]!,
610
- ],
611
- );
612
-
613
- const decode_map =
614
- (importer: FunctionImporter) =>
615
- (explore: IExplore) =>
616
- (map: Metadata.Entry) =>
617
- ts.factory.createNewExpression(
618
- ts.factory.createIdentifier("Map"),
619
- undefined,
620
- [
621
- decode_array(importer)(explore)(
622
- MetadataArray.create({
623
- tags: [],
624
- type: MetadataArrayType.create({
625
- name: `Map<${map.key.getName()}, ${map.value.getName()}>`,
626
- index: null,
627
- recursive: false,
628
- nullables: [],
629
- value: Metadata.create({
630
- ...Metadata.initialize(),
631
- tuples: [
632
- (() => {
633
- const type = MetadataTupleType.create({
634
- name: `[${map.key.getName()}, ${map.value.getName()}]`,
635
- index: null,
636
- recursive: false,
637
- nullables: [],
638
- elements: [map.key, map.value],
639
- });
640
- type.of_map = true;
641
- return MetadataTuple.create({
642
- type,
643
- tags: [],
644
- });
645
- })(),
646
- ],
647
- }),
648
- }),
649
- }),
650
- )[0]!,
651
- ],
652
- );
653
-
654
- const decode_native =
655
- (importer: FunctionImporter) =>
656
- (type: string): ts.Expression => {
657
- if (type === "Boolean") return decode_boolean(importer);
658
- else if (type === "Number")
659
- return decode_number(importer)(
660
- MetadataAtomic.create({
661
- type: "number",
662
- tags: [],
663
- }),
664
- )[0]!;
665
- else if (type === "String")
666
- return decode_string(importer)(
667
- MetadataAtomic.create({
668
- type: "string",
669
- tags: [],
670
- }),
671
- )[0]!;
672
- else if (type === "Date") return decode_native_date(importer);
673
- else if (
674
- type === "Uint8Array" ||
675
- type === "Uint8ClampedArray" ||
676
- type === "Uint16Array" ||
677
- type === "Uint32Array" ||
678
- type === "BigUint64Array" ||
679
- type === "Int8Array" ||
680
- type === "Int16Array" ||
681
- type === "Int32Array" ||
682
- type === "BigInt64Array" ||
683
- type === "Float32Array" ||
684
- type === "Float64Array"
685
- )
686
- return decode_native_byte_array(importer)(type);
687
- else if (type === "ArrayBuffer" || type === "SharedArrayBuffer")
688
- return decode_native_array_buffer(importer)(type);
689
- else if (type === "DataView") return decode_native_data_view(importer);
690
- else if (type === "Blob") return decode_native_blob(importer);
691
- else if (type === "File") return decode_native_file(importer);
692
- else if (type === "RegExp") return decode_regexp();
693
- else
694
- return ts.factory.createNewExpression(
695
- ts.factory.createIdentifier(type),
696
- undefined,
697
- [],
698
- );
699
- };
700
-
701
- const decode_native_date = (importer: FunctionImporter) =>
702
- ts.factory.createNewExpression(
703
- ts.factory.createIdentifier("Date"),
704
- undefined,
705
- [
706
- ts.factory.createCallExpression(
707
- COALESCE(importer)("datetime"),
708
- undefined,
709
- [],
710
- ),
711
- ],
712
- );
713
-
714
- const decode_native_byte_array =
715
- (importer: FunctionImporter) =>
716
- (
717
- type:
718
- | "Uint8Array"
719
- | "Uint8ClampedArray"
720
- | "Uint16Array"
721
- | "Uint32Array"
722
- | "BigUint64Array"
723
- | "Int8Array"
724
- | "Int16Array"
725
- | "Int32Array"
726
- | "BigInt64Array"
727
- | "Float32Array"
728
- | "Float64Array",
729
- ): ts.Expression => {
730
- new BigInt64Array();
731
- const [minimum, maximum]: [number, number] = (() => {
732
- if (type === "Uint8Array" || type === "Uint8ClampedArray")
733
- return [0, 255];
734
- else if (type === "Uint16Array") return [0, 65535];
735
- else if (type === "Uint32Array") return [0, 4294967295];
736
- else if (type === "BigUint64Array") return [0, 18446744073709551615];
737
- else if (type === "Int8Array") return [-128, 127];
738
- else if (type === "Int16Array") return [-32768, 32767];
739
- else if (type === "Int32Array") return [-2147483648, 2147483647];
740
- else if (type === "BigInt64Array")
741
- return [-9223372036854775808, 9223372036854775807];
742
- else if (type === "Float32Array")
743
- return [-1.175494351e38, 3.4028235e38];
744
- return [Number.MIN_VALUE, Number.MAX_VALUE];
745
- })();
746
- const literal =
747
- type === "BigInt64Array" || type === "BigUint64Array"
748
- ? ExpressionFactory.bigint
749
- : ExpressionFactory.number;
750
- return ts.factory.createNewExpression(
751
- ts.factory.createIdentifier(type),
752
- [],
753
- [
754
- ts.factory.createCallExpression(
755
- COALESCE(importer)("array"),
756
- undefined,
757
- [
758
- ts.factory.createArrowFunction(
759
- undefined,
760
- undefined,
761
- [],
762
- TypeFactory.keyword("any"),
763
- undefined,
764
- ts.factory.createCallExpression(
765
- COALESCE(importer)(
766
- type === "Float32Array" || type === "Float64Array"
767
- ? "number"
768
- : type === "BigInt64Array" || type === "BigUint64Array"
769
- ? "bigint"
770
- : "integer",
771
- ),
772
- undefined,
773
- [literal(minimum), literal(maximum)],
774
- ),
775
- ),
776
- ],
777
- ),
778
- ],
779
- );
780
- };
781
-
782
- const decode_native_blob = (importer: FunctionImporter) =>
783
- ts.factory.createNewExpression(
784
- ts.factory.createIdentifier("Blob"),
785
- undefined,
786
- [
787
- ts.factory.createArrayLiteralExpression(
788
- [decode_native_byte_array(importer)("Uint8Array")],
789
- true,
790
- ),
791
- ],
792
- );
793
-
794
- const decode_native_file = (importer: FunctionImporter) =>
795
- ts.factory.createNewExpression(
796
- ts.factory.createIdentifier("File"),
797
- undefined,
798
- [
799
- ts.factory.createArrayLiteralExpression(
800
- [decode_native_byte_array(importer)("Uint8Array")],
801
- true,
802
- ),
803
- ts.factory.createTemplateExpression(ts.factory.createTemplateHead(""), [
804
- ts.factory.createTemplateSpan(
805
- ts.factory.createCallExpression(
806
- COALESCE(importer)("string"),
807
- undefined,
808
- [ts.factory.createNumericLiteral(8)],
809
- ),
810
- ts.factory.createTemplateMiddle("."),
811
- ),
812
- ts.factory.createTemplateSpan(
813
- ts.factory.createCallExpression(
814
- COALESCE(importer)("string"),
815
- undefined,
816
- [ts.factory.createNumericLiteral(3)],
817
- ),
818
- ts.factory.createTemplateTail(""),
819
- ),
820
- ]),
821
- ],
822
- );
823
-
824
- const decode_native_array_buffer =
825
- (importer: FunctionImporter) =>
826
- (type: "ArrayBuffer" | "SharedArrayBuffer"): ts.Expression =>
827
- type === "ArrayBuffer"
828
- ? IdentifierFactory.access(
829
- decode_native_byte_array(importer)("Uint8Array"),
830
- )("buffer")
831
- : ExpressionFactory.selfCall(
832
- ts.factory.createBlock(
833
- [
834
- StatementFactory.constant(
835
- "length",
836
- ts.factory.createCallExpression(
837
- COALESCE(importer)("integer"),
838
- undefined,
839
- [],
840
- ),
841
- ),
842
- StatementFactory.constant(
843
- "buffer",
844
- ts.factory.createNewExpression(
845
- ts.factory.createIdentifier("SharedArrayBuffer"),
846
- [],
847
- [ts.factory.createIdentifier("length")],
848
- ),
849
- ),
850
- StatementFactory.constant(
851
- "bytes",
852
- ts.factory.createNewExpression(
853
- ts.factory.createIdentifier("Uint8Array"),
854
- [],
855
- [ts.factory.createIdentifier("buffer")],
856
- ),
857
- ),
858
- ts.factory.createExpressionStatement(
859
- ts.factory.createCallExpression(
860
- IdentifierFactory.access(
861
- ts.factory.createIdentifier("bytes"),
862
- )("set"),
863
- undefined,
864
- [
865
- ts.factory.createCallExpression(
866
- COALESCE(importer)("array"),
867
- undefined,
868
- [
869
- ts.factory.createArrowFunction(
870
- undefined,
871
- undefined,
872
- [],
873
- TypeFactory.keyword("any"),
874
- undefined,
875
- ts.factory.createCallExpression(
876
- COALESCE(importer)("integer"),
877
- undefined,
878
- [
879
- ExpressionFactory.number(0),
880
- ExpressionFactory.number(255),
881
- ],
882
- ),
883
- ),
884
- ts.factory.createIdentifier("length"),
885
- ],
886
- ),
887
- ExpressionFactory.number(0),
888
- ],
889
- ),
890
- ),
891
- ts.factory.createReturnStatement(
892
- ts.factory.createIdentifier("buffer"),
893
- ),
894
- ],
895
- true,
896
- ),
897
- );
898
-
899
- const decode_native_data_view = (importer: FunctionImporter) =>
900
- ts.factory.createNewExpression(
901
- ts.factory.createIdentifier("DataView"),
902
- [],
903
- [
904
- IdentifierFactory.access(
905
- decode_native_byte_array(importer)("Uint8Array"),
906
- )("buffer"),
907
- ],
908
- );
909
-
910
- const decode_regexp = () =>
911
- ts.factory.createNewExpression(
912
- ts.factory.createIdentifier("RegExp"),
913
- [],
914
- [ts.factory.createIdentifier("/(?:)/")],
915
- );
916
- }
917
-
918
- type Atomic = boolean | number | string | bigint;
919
- interface IExplore {
920
- function: boolean;
921
- recursive: boolean;
922
- }
923
-
924
- const Prefix = {
925
- object: (i: number) => `$ro${i}`,
926
- array: (i: number) => `$ra${i}`,
927
- tuple: (i: number) => `$rt${i}`,
928
- };
929
-
930
- const COALESCE = (importer: FunctionImporter) => (name: string) =>
931
- ExpressionFactory.coalesce(
932
- Escaper.variable(name)
933
- ? ts.factory.createPropertyAccessChain(
934
- ts.factory.createIdentifier("_generator"),
935
- ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
936
- ts.factory.createIdentifier(name),
937
- )
938
- : ts.factory.createElementAccessChain(
939
- ts.factory.createIdentifier("_generator"),
940
- ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
941
- ts.factory.createStringLiteral(name),
942
- ),
943
- )(IdentifierFactory.access(importer.use("generator"))(name));
944
-
945
- const emendFormat = (key: keyof Format.Validator) =>
946
- key === "date-time"
947
- ? "datetime"
948
- : key
949
- .split("-")
950
- .map((str, i) =>
951
- i === 0 || str.length === 0
952
- ? str
953
- : str[0]!.toUpperCase() + str.substring(1),
954
- )
955
- .join("");
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../factories/MetadataFactory";
7
+ import { StatementFactory } from "../factories/StatementFactory";
8
+ import { TemplateFactory } from "../factories/TemplateFactory";
9
+ import { TypeFactory } from "../factories/TypeFactory";
10
+
11
+ import { Metadata } from "../schemas/metadata/Metadata";
12
+ import { MetadataArray } from "../schemas/metadata/MetadataArray";
13
+ import { MetadataArrayType } from "../schemas/metadata/MetadataArrayType";
14
+ import { MetadataAtomic } from "../schemas/metadata/MetadataAtomic";
15
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
16
+ import { MetadataTemplate } from "../schemas/metadata/MetadataTemplate";
17
+ import { MetadataTuple } from "../schemas/metadata/MetadataTuple";
18
+ import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
19
+
20
+ import { IProject } from "../transformers/IProject";
21
+ import { TransformerError } from "../transformers/TransformerError";
22
+
23
+ import { Escaper } from "../utils/Escaper";
24
+
25
+ import { Format } from "../tags";
26
+ import { FeatureProgrammer } from "./FeatureProgrammer";
27
+ import { FunctionImporter } from "./helpers/FunctionImporter";
28
+ import { RandomJoiner } from "./helpers/RandomJoiner";
29
+ import { RandomRanger } from "./helpers/RandomRanger";
30
+ import { random_custom } from "./internal/random_custom";
31
+
32
+ export namespace RandomProgrammer {
33
+ export const decompose = (props: {
34
+ project: IProject;
35
+ importer: FunctionImporter;
36
+ type: ts.Type;
37
+ name: string | undefined;
38
+ init: ts.Expression | undefined;
39
+ }): FeatureProgrammer.IDecomposed => {
40
+ const collection: MetadataCollection = new MetadataCollection();
41
+ const result = MetadataFactory.analyze(
42
+ props.project.checker,
43
+ props.project.context,
44
+ )({
45
+ escape: false,
46
+ constant: true,
47
+ absorb: true,
48
+ validate: (meta) => {
49
+ const output: string[] = [];
50
+ if (meta.natives.some((n) => n === "WeakSet"))
51
+ output.push(`WeakSet is not supported.`);
52
+ else if (meta.natives.some((n) => n === "WeakMap"))
53
+ output.push(`WeakMap is not supported.`);
54
+ return output;
55
+ },
56
+ })(collection)(props.type);
57
+ if (result.success === false)
58
+ throw TransformerError.from(`typia.${props.importer.method}`)(
59
+ result.errors,
60
+ );
61
+
62
+ // GENERATE FUNCTION
63
+ const functions: Record<string, ts.VariableStatement> = Object.fromEntries([
64
+ ...write_object_functions(props.importer)(collection).map((v, i) => [
65
+ Prefix.object(i),
66
+ v,
67
+ ]),
68
+ ...write_array_functions(props.importer)(collection).map((v, i) => [
69
+ Prefix.array(i),
70
+ v,
71
+ ]),
72
+ ...write_tuple_functions(props.importer)(collection).map((v, i) => [
73
+ Prefix.tuple(i),
74
+ v,
75
+ ]),
76
+ ]);
77
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
78
+ undefined,
79
+ undefined,
80
+ [
81
+ IdentifierFactory.parameter(
82
+ "generator",
83
+ ts.factory.createTypeReferenceNode("Partial<typia.IRandomGenerator>"),
84
+ props.init ?? ts.factory.createToken(ts.SyntaxKind.QuestionToken),
85
+ ),
86
+ ],
87
+ ts.factory.createImportTypeNode(
88
+ ts.factory.createLiteralTypeNode(
89
+ ts.factory.createStringLiteral("typia"),
90
+ ),
91
+ undefined,
92
+ ts.factory.createIdentifier("Resolved"),
93
+ [
94
+ ts.factory.createTypeReferenceNode(
95
+ props.name ??
96
+ TypeFactory.getFullName(props.project.checker)(props.type),
97
+ ),
98
+ ],
99
+ false,
100
+ ),
101
+ undefined,
102
+ ts.factory.createBlock(
103
+ [
104
+ ts.factory.createExpressionStatement(
105
+ ts.factory.createBinaryExpression(
106
+ ts.factory.createIdentifier("_generator"),
107
+ ts.SyntaxKind.EqualsToken,
108
+ ts.factory.createIdentifier("generator"),
109
+ ),
110
+ ),
111
+ ts.factory.createReturnStatement(
112
+ decode(props.importer)({
113
+ function: false,
114
+ recursive: false,
115
+ })(result.data),
116
+ ),
117
+ ],
118
+ true,
119
+ ),
120
+ );
121
+ return {
122
+ functions,
123
+ statements: [StatementFactory.mut("_generator")],
124
+ arrow,
125
+ };
126
+ };
127
+
128
+ export const write =
129
+ (project: IProject) =>
130
+ (modulo: ts.LeftHandSideExpression) =>
131
+ (init?: ts.Expression) =>
132
+ (type: ts.Type, name?: string) => {
133
+ const importer: FunctionImporter = new FunctionImporter(modulo.getText());
134
+ const result: FeatureProgrammer.IDecomposed = decompose({
135
+ project,
136
+ importer,
137
+ type,
138
+ name,
139
+ init,
140
+ });
141
+ return FeatureProgrammer.writeDecomposed({
142
+ modulo,
143
+ importer,
144
+ result,
145
+ });
146
+ };
147
+
148
+ const write_object_functions =
149
+ (importer: FunctionImporter) =>
150
+ (collection: MetadataCollection): ts.VariableStatement[] =>
151
+ collection.objects().map((obj, i) =>
152
+ StatementFactory.constant(
153
+ Prefix.object(i),
154
+ ts.factory.createArrowFunction(
155
+ undefined,
156
+ undefined,
157
+ [
158
+ IdentifierFactory.parameter(
159
+ "_recursive",
160
+ TypeFactory.keyword("boolean"),
161
+ ts.factory.createIdentifier(String(obj.recursive)),
162
+ ),
163
+ IdentifierFactory.parameter(
164
+ "_depth",
165
+ TypeFactory.keyword("number"),
166
+ ExpressionFactory.number(0),
167
+ ),
168
+ ],
169
+ TypeFactory.keyword("any"),
170
+ undefined,
171
+ RandomJoiner.object(COALESCE(importer))(
172
+ decode(importer)({
173
+ recursive: obj.recursive,
174
+ function: true,
175
+ }),
176
+ )(obj),
177
+ ),
178
+ ),
179
+ );
180
+
181
+ const write_array_functions =
182
+ (importer: FunctionImporter) =>
183
+ (collection: MetadataCollection): ts.VariableStatement[] =>
184
+ collection
185
+ .arrays()
186
+ .filter((a) => a.recursive)
187
+ .map((array, i) =>
188
+ StatementFactory.constant(
189
+ Prefix.array(i),
190
+ ts.factory.createArrowFunction(
191
+ undefined,
192
+ undefined,
193
+ [
194
+ IdentifierFactory.parameter(
195
+ "length",
196
+ TypeFactory.keyword("number"),
197
+ ),
198
+ IdentifierFactory.parameter(
199
+ "unique",
200
+ TypeFactory.keyword("boolean"),
201
+ ),
202
+ IdentifierFactory.parameter(
203
+ "_recursive",
204
+ TypeFactory.keyword("boolean"),
205
+ ts.factory.createTrue(),
206
+ ),
207
+ IdentifierFactory.parameter(
208
+ "_depth",
209
+ TypeFactory.keyword("number"),
210
+ ExpressionFactory.number(0),
211
+ ),
212
+ ],
213
+ TypeFactory.keyword("any"),
214
+ undefined,
215
+ RandomJoiner.array(COALESCE(importer))(
216
+ decode(importer)({
217
+ recursive: true,
218
+ function: true,
219
+ }),
220
+ )({
221
+ recursive: true,
222
+ function: true,
223
+ })(
224
+ ts.factory.createIdentifier("length"),
225
+ ts.factory.createIdentifier("unique"),
226
+ )(array.value),
227
+ ),
228
+ ),
229
+ );
230
+
231
+ const write_tuple_functions =
232
+ (importer: FunctionImporter) =>
233
+ (collection: MetadataCollection): ts.VariableStatement[] =>
234
+ collection
235
+ .tuples()
236
+ .filter((a) => a.recursive)
237
+ .map((tuple, i) =>
238
+ StatementFactory.constant(
239
+ Prefix.tuple(i),
240
+ ts.factory.createArrowFunction(
241
+ undefined,
242
+ undefined,
243
+ [
244
+ IdentifierFactory.parameter(
245
+ "_recursive",
246
+ TypeFactory.keyword("boolean"),
247
+ ts.factory.createTrue(),
248
+ ),
249
+ IdentifierFactory.parameter(
250
+ "_depth",
251
+ TypeFactory.keyword("number"),
252
+ ExpressionFactory.number(0),
253
+ ),
254
+ ],
255
+ TypeFactory.keyword("any"),
256
+ undefined,
257
+ RandomJoiner.tuple(
258
+ decode(importer)({
259
+ function: true,
260
+ recursive: true,
261
+ }),
262
+ )(tuple.elements),
263
+ ),
264
+ ),
265
+ );
266
+
267
+ /* -----------------------------------------------------------
268
+ DECODERS
269
+ ----------------------------------------------------------- */
270
+ const decode =
271
+ (importer: FunctionImporter) =>
272
+ (explore: IExplore) =>
273
+ (meta: Metadata): ts.Expression => {
274
+ const expressions: ts.Expression[] = [];
275
+ if (meta.any)
276
+ expressions.push(ts.factory.createStringLiteral("any type used..."));
277
+
278
+ // NULL COALESCING
279
+ if (meta.isRequired() === false || meta.functions.length)
280
+ expressions.push(ts.factory.createIdentifier("undefined"));
281
+ if (meta.nullable === true) expressions.push(ts.factory.createNull());
282
+
283
+ // CONSTANT TYPES
284
+ for (const constant of meta.constants)
285
+ for (const { value } of constant.values)
286
+ expressions.push(decode_atomic(value));
287
+
288
+ // ATOMIC VARIABLES
289
+ for (const template of meta.templates)
290
+ expressions.push(decode_template(importer)(explore)(template));
291
+ for (const atomic of meta.atomics)
292
+ if (atomic.type === "boolean")
293
+ expressions.push(decode_boolean(importer));
294
+ else if (atomic.type === "number")
295
+ expressions.push(...decode_number(importer)(atomic));
296
+ else if (atomic.type === "string")
297
+ expressions.push(...decode_string(importer)(atomic));
298
+ else if (atomic.type === "bigint")
299
+ expressions.push(...decode_bigint(importer)(atomic));
300
+
301
+ // INSTANCE TYPES
302
+ if (meta.escaped)
303
+ expressions.push(decode(importer)(explore)(meta.escaped.returns));
304
+ for (const array of meta.arrays)
305
+ expressions.push(...decode_array(importer)(explore)(array));
306
+ for (const tuple of meta.tuples)
307
+ expressions.push(decode_tuple(importer)(explore)(tuple));
308
+ for (const o of meta.objects)
309
+ expressions.push(decode_object(importer)(explore)(o));
310
+ for (const native of meta.natives)
311
+ expressions.push(decode_native(importer)(native));
312
+ for (const set of meta.sets)
313
+ expressions.push(decode_set(importer)(explore)(set));
314
+ for (const map of meta.maps)
315
+ expressions.push(decode_map(importer)(explore)(map));
316
+
317
+ // PICK UP A TYPE
318
+ if (expressions.length === 1) return expressions[0]!;
319
+ return ts.factory.createCallExpression(
320
+ ts.factory.createCallExpression(importer.use("pick"), undefined, [
321
+ ts.factory.createArrayLiteralExpression(
322
+ expressions.map((expr) =>
323
+ ts.factory.createArrowFunction(
324
+ undefined,
325
+ undefined,
326
+ [],
327
+ undefined,
328
+ undefined,
329
+ expr,
330
+ ),
331
+ ),
332
+ true,
333
+ ),
334
+ ]),
335
+ undefined,
336
+ undefined,
337
+ );
338
+ };
339
+
340
+ const decode_boolean = (importer: FunctionImporter) =>
341
+ ts.factory.createCallExpression(
342
+ COALESCE(importer)("boolean"),
343
+ undefined,
344
+ undefined,
345
+ );
346
+
347
+ const decode_atomic = (value: Atomic) =>
348
+ typeof value === "boolean"
349
+ ? ts.factory.createIdentifier(value.toString())
350
+ : typeof value === "number"
351
+ ? ExpressionFactory.number(value)
352
+ : typeof value === "string"
353
+ ? ts.factory.createStringLiteral(value)
354
+ : ExpressionFactory.bigint(Number(value));
355
+
356
+ const decode_template =
357
+ (importer: FunctionImporter) =>
358
+ (explore: IExplore) =>
359
+ (template: MetadataTemplate) =>
360
+ TemplateFactory.generate(
361
+ template.row.map((meta) => decode(importer)(explore)(meta)),
362
+ );
363
+
364
+ const decode_number =
365
+ (importer: FunctionImporter) =>
366
+ (atomic: MetadataAtomic): ts.Expression[] =>
367
+ (atomic.tags.length ? atomic.tags : [[]]).map((tags) => {
368
+ const type = tags.find(
369
+ (t) =>
370
+ t.kind === "type" && (t.value === "int32" || t.value === "int64"),
371
+ )
372
+ ? "int"
373
+ : tags.find(
374
+ (t) =>
375
+ t.kind === "type" &&
376
+ (t.value === "uint32" || t.value === "uint64"),
377
+ )
378
+ ? "uint"
379
+ : "double";
380
+ const multiply = tags.find((t) => t.kind === "multipleOf");
381
+ return random_custom(COALESCE(importer))("number")(tags)(
382
+ RandomRanger.number({
383
+ type,
384
+ transform: (value) => ExpressionFactory.number(value),
385
+ setter: (args) =>
386
+ ts.factory.createCallExpression(
387
+ type !== "double" || multiply !== undefined
388
+ ? COALESCE(importer)("integer")
389
+ : COALESCE(importer)("number"),
390
+ undefined,
391
+ args.map((val) => ExpressionFactory.number(val)),
392
+ ),
393
+ })({
394
+ minimum: 0,
395
+ maximum: 100,
396
+ gap: 10,
397
+ })(tags),
398
+ );
399
+ });
400
+
401
+ const decode_bigint =
402
+ (importer: FunctionImporter) =>
403
+ (atomic: MetadataAtomic): ts.Expression[] =>
404
+ (atomic.tags.length ? atomic.tags : [[]]).map((tags) =>
405
+ random_custom(COALESCE(importer))("bigint")(tags)(
406
+ RandomRanger.number({
407
+ type: tags.find(
408
+ (t) =>
409
+ t.kind === "type" &&
410
+ (t.value === "uint" || t.value === "uint64"),
411
+ )
412
+ ? "uint"
413
+ : "int",
414
+ transform: (value) => ExpressionFactory.bigint(value),
415
+ setter: (args) =>
416
+ ts.factory.createCallExpression(
417
+ COALESCE(importer)("bigint"),
418
+ undefined,
419
+ args.map((value) => ExpressionFactory.bigint(value)),
420
+ ),
421
+ })({
422
+ minimum: 0,
423
+ maximum: 100,
424
+ gap: 10,
425
+ })(tags),
426
+ ),
427
+ );
428
+
429
+ const decode_string =
430
+ (importer: FunctionImporter) =>
431
+ (atomic: MetadataAtomic): ts.Expression[] =>
432
+ (atomic.tags.length ? atomic.tags : [[]]).map((tags) =>
433
+ random_custom(COALESCE(importer))("string")(tags)(
434
+ (() => {
435
+ for (const t of tags)
436
+ if (t.kind === "format")
437
+ return ts.factory.createCallExpression(
438
+ COALESCE(importer)(emendFormat(t.value)),
439
+ undefined,
440
+ undefined,
441
+ );
442
+ else if (t.kind === "pattern")
443
+ return ts.factory.createCallExpression(
444
+ COALESCE(importer)("pattern"),
445
+ undefined,
446
+ [
447
+ ts.factory.createIdentifier(
448
+ `RegExp(${JSON.stringify(t.value)})`,
449
+ ),
450
+ ],
451
+ );
452
+
453
+ const tail = RandomRanger.length(COALESCE(importer))({
454
+ minimum: 5,
455
+ maximum: 25,
456
+ gap: 5,
457
+ })({
458
+ minimum: "minLength",
459
+ maximum: "maxLength",
460
+ })(tags);
461
+ return ts.factory.createCallExpression(
462
+ COALESCE(importer)("string"),
463
+ undefined,
464
+ tail ? [tail] : undefined,
465
+ );
466
+ })(),
467
+ ),
468
+ );
469
+
470
+ const decode_array =
471
+ (importer: FunctionImporter) =>
472
+ (explore: IExplore) =>
473
+ (array: MetadataArray): ts.Expression[] => {
474
+ const fixed: Array<
475
+ [ts.Expression | undefined, ts.Expression | undefined]
476
+ > = (array.tags.length ? array.tags : [[]]).map((tags) => [
477
+ RandomRanger.length(COALESCE(importer))({
478
+ minimum: 0,
479
+ maximum: 3,
480
+ gap: 3,
481
+ })({
482
+ minimum: "minItems",
483
+ maximum: "maxItems",
484
+ })(tags),
485
+ (() => {
486
+ const uniqueItems = tags.find((t) => t.kind === "uniqueItems");
487
+ return uniqueItems === undefined
488
+ ? undefined
489
+ : uniqueItems.value === false
490
+ ? ts.factory.createFalse()
491
+ : ts.factory.createTrue();
492
+ })(),
493
+ ]);
494
+ if (array.type.recursive)
495
+ return fixed.map(([len, unique]) =>
496
+ ts.factory.createCallExpression(
497
+ ts.factory.createIdentifier(
498
+ importer.useLocal(Prefix.array(array.type.index!)),
499
+ ),
500
+ undefined,
501
+ [
502
+ len ?? COALESCE(importer)("length"),
503
+ unique ?? ts.factory.createFalse(),
504
+ ts.factory.createTrue(),
505
+ explore.recursive
506
+ ? ts.factory.createAdd(
507
+ ExpressionFactory.number(1),
508
+ ts.factory.createIdentifier("_depth"),
509
+ )
510
+ : ExpressionFactory.number(0),
511
+ ],
512
+ ),
513
+ );
514
+ return fixed.map(([len, unique]) => {
515
+ const expr: ts.Expression = RandomJoiner.array(COALESCE(importer))(
516
+ decode(importer)(explore),
517
+ )(explore)(
518
+ len,
519
+ unique,
520
+ )(array.type.value);
521
+ return explore.recursive
522
+ ? ts.factory.createConditionalExpression(
523
+ ts.factory.createLogicalAnd(
524
+ ts.factory.createIdentifier("_recursive"),
525
+ ts.factory.createLessThan(
526
+ ExpressionFactory.number(5),
527
+ ts.factory.createIdentifier("_depth"),
528
+ ),
529
+ ),
530
+ undefined,
531
+ ts.factory.createIdentifier("[]"),
532
+ undefined,
533
+ expr,
534
+ )
535
+ : expr;
536
+ });
537
+ };
538
+
539
+ const decode_tuple =
540
+ (importer: FunctionImporter) =>
541
+ (explore: IExplore) =>
542
+ (tuple: MetadataTuple): ts.Expression =>
543
+ tuple.type.recursive
544
+ ? ts.factory.createCallExpression(
545
+ ts.factory.createIdentifier(
546
+ importer.useLocal(Prefix.tuple(tuple.type.index!)),
547
+ ),
548
+ undefined,
549
+ [
550
+ ts.factory.createTrue(),
551
+ explore.recursive
552
+ ? ts.factory.createAdd(
553
+ ExpressionFactory.number(1),
554
+ ts.factory.createIdentifier("_depth"),
555
+ )
556
+ : ExpressionFactory.number(0),
557
+ ],
558
+ )
559
+ : RandomJoiner.tuple(decode(importer)(explore))(tuple.type.elements);
560
+
561
+ const decode_object =
562
+ (importer: FunctionImporter) =>
563
+ (explore: IExplore) =>
564
+ (object: MetadataObject) =>
565
+ ts.factory.createCallExpression(
566
+ ts.factory.createIdentifier(
567
+ importer.useLocal(Prefix.object(object.index)),
568
+ ),
569
+ undefined,
570
+ explore.function
571
+ ? [
572
+ explore.recursive
573
+ ? ts.factory.createTrue()
574
+ : ts.factory.createIdentifier("_recursive"),
575
+ ts.factory.createConditionalExpression(
576
+ ts.factory.createIdentifier("_recursive"),
577
+ undefined,
578
+ ts.factory.createAdd(
579
+ ExpressionFactory.number(1),
580
+ ts.factory.createIdentifier("_depth"),
581
+ ),
582
+ undefined,
583
+ ts.factory.createIdentifier("_depth"),
584
+ ),
585
+ ]
586
+ : undefined,
587
+ );
588
+
589
+ /* -----------------------------------------------------------
590
+ NATIVE CLASSES
591
+ ----------------------------------------------------------- */
592
+ const decode_set =
593
+ (importer: FunctionImporter) => (explore: IExplore) => (meta: Metadata) =>
594
+ ts.factory.createNewExpression(
595
+ ts.factory.createIdentifier("Set"),
596
+ undefined,
597
+ [
598
+ decode_array(importer)(explore)(
599
+ MetadataArray.create({
600
+ tags: [],
601
+ type: MetadataArrayType.create({
602
+ value: meta,
603
+ recursive: false,
604
+ index: null,
605
+ nullables: [],
606
+ name: `Set<${meta.getName()}>`,
607
+ }),
608
+ }),
609
+ )[0]!,
610
+ ],
611
+ );
612
+
613
+ const decode_map =
614
+ (importer: FunctionImporter) =>
615
+ (explore: IExplore) =>
616
+ (map: Metadata.Entry) =>
617
+ ts.factory.createNewExpression(
618
+ ts.factory.createIdentifier("Map"),
619
+ undefined,
620
+ [
621
+ decode_array(importer)(explore)(
622
+ MetadataArray.create({
623
+ tags: [],
624
+ type: MetadataArrayType.create({
625
+ name: `Map<${map.key.getName()}, ${map.value.getName()}>`,
626
+ index: null,
627
+ recursive: false,
628
+ nullables: [],
629
+ value: Metadata.create({
630
+ ...Metadata.initialize(),
631
+ tuples: [
632
+ (() => {
633
+ const type = MetadataTupleType.create({
634
+ name: `[${map.key.getName()}, ${map.value.getName()}]`,
635
+ index: null,
636
+ recursive: false,
637
+ nullables: [],
638
+ elements: [map.key, map.value],
639
+ });
640
+ type.of_map = true;
641
+ return MetadataTuple.create({
642
+ type,
643
+ tags: [],
644
+ });
645
+ })(),
646
+ ],
647
+ }),
648
+ }),
649
+ }),
650
+ )[0]!,
651
+ ],
652
+ );
653
+
654
+ const decode_native =
655
+ (importer: FunctionImporter) =>
656
+ (type: string): ts.Expression => {
657
+ if (type === "Boolean") return decode_boolean(importer);
658
+ else if (type === "Number")
659
+ return decode_number(importer)(
660
+ MetadataAtomic.create({
661
+ type: "number",
662
+ tags: [],
663
+ }),
664
+ )[0]!;
665
+ else if (type === "String")
666
+ return decode_string(importer)(
667
+ MetadataAtomic.create({
668
+ type: "string",
669
+ tags: [],
670
+ }),
671
+ )[0]!;
672
+ else if (type === "Date") return decode_native_date(importer);
673
+ else if (
674
+ type === "Uint8Array" ||
675
+ type === "Uint8ClampedArray" ||
676
+ type === "Uint16Array" ||
677
+ type === "Uint32Array" ||
678
+ type === "BigUint64Array" ||
679
+ type === "Int8Array" ||
680
+ type === "Int16Array" ||
681
+ type === "Int32Array" ||
682
+ type === "BigInt64Array" ||
683
+ type === "Float32Array" ||
684
+ type === "Float64Array"
685
+ )
686
+ return decode_native_byte_array(importer)(type);
687
+ else if (type === "ArrayBuffer" || type === "SharedArrayBuffer")
688
+ return decode_native_array_buffer(importer)(type);
689
+ else if (type === "DataView") return decode_native_data_view(importer);
690
+ else if (type === "Blob") return decode_native_blob(importer);
691
+ else if (type === "File") return decode_native_file(importer);
692
+ else if (type === "RegExp") return decode_regexp();
693
+ else
694
+ return ts.factory.createNewExpression(
695
+ ts.factory.createIdentifier(type),
696
+ undefined,
697
+ [],
698
+ );
699
+ };
700
+
701
+ const decode_native_date = (importer: FunctionImporter) =>
702
+ ts.factory.createNewExpression(
703
+ ts.factory.createIdentifier("Date"),
704
+ undefined,
705
+ [
706
+ ts.factory.createCallExpression(
707
+ COALESCE(importer)("datetime"),
708
+ undefined,
709
+ [],
710
+ ),
711
+ ],
712
+ );
713
+
714
+ const decode_native_byte_array =
715
+ (importer: FunctionImporter) =>
716
+ (
717
+ type:
718
+ | "Uint8Array"
719
+ | "Uint8ClampedArray"
720
+ | "Uint16Array"
721
+ | "Uint32Array"
722
+ | "BigUint64Array"
723
+ | "Int8Array"
724
+ | "Int16Array"
725
+ | "Int32Array"
726
+ | "BigInt64Array"
727
+ | "Float32Array"
728
+ | "Float64Array",
729
+ ): ts.Expression => {
730
+ new BigInt64Array();
731
+ const [minimum, maximum]: [number, number] = (() => {
732
+ if (type === "Uint8Array" || type === "Uint8ClampedArray")
733
+ return [0, 255];
734
+ else if (type === "Uint16Array") return [0, 65535];
735
+ else if (type === "Uint32Array") return [0, 4294967295];
736
+ else if (type === "BigUint64Array") return [0, 18446744073709551615];
737
+ else if (type === "Int8Array") return [-128, 127];
738
+ else if (type === "Int16Array") return [-32768, 32767];
739
+ else if (type === "Int32Array") return [-2147483648, 2147483647];
740
+ else if (type === "BigInt64Array")
741
+ return [-9223372036854775808, 9223372036854775807];
742
+ else if (type === "Float32Array")
743
+ return [-1.175494351e38, 3.4028235e38];
744
+ return [Number.MIN_VALUE, Number.MAX_VALUE];
745
+ })();
746
+ const literal =
747
+ type === "BigInt64Array" || type === "BigUint64Array"
748
+ ? ExpressionFactory.bigint
749
+ : ExpressionFactory.number;
750
+ return ts.factory.createNewExpression(
751
+ ts.factory.createIdentifier(type),
752
+ [],
753
+ [
754
+ ts.factory.createCallExpression(
755
+ COALESCE(importer)("array"),
756
+ undefined,
757
+ [
758
+ ts.factory.createArrowFunction(
759
+ undefined,
760
+ undefined,
761
+ [],
762
+ TypeFactory.keyword("any"),
763
+ undefined,
764
+ ts.factory.createCallExpression(
765
+ COALESCE(importer)(
766
+ type === "Float32Array" || type === "Float64Array"
767
+ ? "number"
768
+ : type === "BigInt64Array" || type === "BigUint64Array"
769
+ ? "bigint"
770
+ : "integer",
771
+ ),
772
+ undefined,
773
+ [literal(minimum), literal(maximum)],
774
+ ),
775
+ ),
776
+ ],
777
+ ),
778
+ ],
779
+ );
780
+ };
781
+
782
+ const decode_native_blob = (importer: FunctionImporter) =>
783
+ ts.factory.createNewExpression(
784
+ ts.factory.createIdentifier("Blob"),
785
+ undefined,
786
+ [
787
+ ts.factory.createArrayLiteralExpression(
788
+ [decode_native_byte_array(importer)("Uint8Array")],
789
+ true,
790
+ ),
791
+ ],
792
+ );
793
+
794
+ const decode_native_file = (importer: FunctionImporter) =>
795
+ ts.factory.createNewExpression(
796
+ ts.factory.createIdentifier("File"),
797
+ undefined,
798
+ [
799
+ ts.factory.createArrayLiteralExpression(
800
+ [decode_native_byte_array(importer)("Uint8Array")],
801
+ true,
802
+ ),
803
+ ts.factory.createTemplateExpression(ts.factory.createTemplateHead(""), [
804
+ ts.factory.createTemplateSpan(
805
+ ts.factory.createCallExpression(
806
+ COALESCE(importer)("string"),
807
+ undefined,
808
+ [ts.factory.createNumericLiteral(8)],
809
+ ),
810
+ ts.factory.createTemplateMiddle("."),
811
+ ),
812
+ ts.factory.createTemplateSpan(
813
+ ts.factory.createCallExpression(
814
+ COALESCE(importer)("string"),
815
+ undefined,
816
+ [ts.factory.createNumericLiteral(3)],
817
+ ),
818
+ ts.factory.createTemplateTail(""),
819
+ ),
820
+ ]),
821
+ ],
822
+ );
823
+
824
+ const decode_native_array_buffer =
825
+ (importer: FunctionImporter) =>
826
+ (type: "ArrayBuffer" | "SharedArrayBuffer"): ts.Expression =>
827
+ type === "ArrayBuffer"
828
+ ? IdentifierFactory.access(
829
+ decode_native_byte_array(importer)("Uint8Array"),
830
+ )("buffer")
831
+ : ExpressionFactory.selfCall(
832
+ ts.factory.createBlock(
833
+ [
834
+ StatementFactory.constant(
835
+ "length",
836
+ ts.factory.createCallExpression(
837
+ COALESCE(importer)("integer"),
838
+ undefined,
839
+ [],
840
+ ),
841
+ ),
842
+ StatementFactory.constant(
843
+ "buffer",
844
+ ts.factory.createNewExpression(
845
+ ts.factory.createIdentifier("SharedArrayBuffer"),
846
+ [],
847
+ [ts.factory.createIdentifier("length")],
848
+ ),
849
+ ),
850
+ StatementFactory.constant(
851
+ "bytes",
852
+ ts.factory.createNewExpression(
853
+ ts.factory.createIdentifier("Uint8Array"),
854
+ [],
855
+ [ts.factory.createIdentifier("buffer")],
856
+ ),
857
+ ),
858
+ ts.factory.createExpressionStatement(
859
+ ts.factory.createCallExpression(
860
+ IdentifierFactory.access(
861
+ ts.factory.createIdentifier("bytes"),
862
+ )("set"),
863
+ undefined,
864
+ [
865
+ ts.factory.createCallExpression(
866
+ COALESCE(importer)("array"),
867
+ undefined,
868
+ [
869
+ ts.factory.createArrowFunction(
870
+ undefined,
871
+ undefined,
872
+ [],
873
+ TypeFactory.keyword("any"),
874
+ undefined,
875
+ ts.factory.createCallExpression(
876
+ COALESCE(importer)("integer"),
877
+ undefined,
878
+ [
879
+ ExpressionFactory.number(0),
880
+ ExpressionFactory.number(255),
881
+ ],
882
+ ),
883
+ ),
884
+ ts.factory.createIdentifier("length"),
885
+ ],
886
+ ),
887
+ ExpressionFactory.number(0),
888
+ ],
889
+ ),
890
+ ),
891
+ ts.factory.createReturnStatement(
892
+ ts.factory.createIdentifier("buffer"),
893
+ ),
894
+ ],
895
+ true,
896
+ ),
897
+ );
898
+
899
+ const decode_native_data_view = (importer: FunctionImporter) =>
900
+ ts.factory.createNewExpression(
901
+ ts.factory.createIdentifier("DataView"),
902
+ [],
903
+ [
904
+ IdentifierFactory.access(
905
+ decode_native_byte_array(importer)("Uint8Array"),
906
+ )("buffer"),
907
+ ],
908
+ );
909
+
910
+ const decode_regexp = () =>
911
+ ts.factory.createNewExpression(
912
+ ts.factory.createIdentifier("RegExp"),
913
+ [],
914
+ [ts.factory.createIdentifier("/(?:)/")],
915
+ );
916
+ }
917
+
918
+ type Atomic = boolean | number | string | bigint;
919
+ interface IExplore {
920
+ function: boolean;
921
+ recursive: boolean;
922
+ }
923
+
924
+ const Prefix = {
925
+ object: (i: number) => `$ro${i}`,
926
+ array: (i: number) => `$ra${i}`,
927
+ tuple: (i: number) => `$rt${i}`,
928
+ };
929
+
930
+ const COALESCE = (importer: FunctionImporter) => (name: string) =>
931
+ ExpressionFactory.coalesce(
932
+ Escaper.variable(name)
933
+ ? ts.factory.createPropertyAccessChain(
934
+ ts.factory.createIdentifier("_generator"),
935
+ ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
936
+ ts.factory.createIdentifier(name),
937
+ )
938
+ : ts.factory.createElementAccessChain(
939
+ ts.factory.createIdentifier("_generator"),
940
+ ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
941
+ ts.factory.createStringLiteral(name),
942
+ ),
943
+ )(IdentifierFactory.access(importer.use("generator"))(name));
944
+
945
+ const emendFormat = (key: keyof Format.Validator) =>
946
+ key === "date-time"
947
+ ? "datetime"
948
+ : key
949
+ .split("-")
950
+ .map((str, i) =>
951
+ i === 0 || str.length === 0
952
+ ? str
953
+ : str[0]!.toUpperCase() + str.substring(1),
954
+ )
955
+ .join("");