typia 6.6.2 → 6.7.0-dev.20240802

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