typia 5.5.6-dev.20240319 → 5.5.6-dev.20240320

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