typia 9.7.1 → 10.0.0-dev.20251107

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 (424) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +153 -153
  3. package/lib/AssertionGuard.d.mts +27 -25
  4. package/lib/AssertionGuard.d.ts +27 -25
  5. package/lib/CamelCase.d.mts +1 -1
  6. package/lib/CamelCase.d.ts +1 -1
  7. package/lib/IRandomGenerator.d.mts +44 -42
  8. package/lib/IRandomGenerator.d.ts +44 -42
  9. package/lib/IReadableURLSearchParams.d.mts +2 -2
  10. package/lib/IReadableURLSearchParams.d.ts +2 -2
  11. package/lib/PascalCase.d.mts +1 -1
  12. package/lib/PascalCase.d.ts +1 -1
  13. package/lib/Primitive.d.mts +20 -22
  14. package/lib/Primitive.d.ts +20 -22
  15. package/lib/Resolved.d.mts +16 -18
  16. package/lib/Resolved.d.ts +16 -18
  17. package/lib/SnakeCase.d.mts +3 -2
  18. package/lib/SnakeCase.d.ts +3 -2
  19. package/lib/TypeGuardError.d.mts +88 -61
  20. package/lib/TypeGuardError.d.ts +88 -61
  21. package/lib/TypeGuardError.js +40 -29
  22. package/lib/TypeGuardError.js.map +1 -1
  23. package/lib/TypeGuardError.mjs +70 -48
  24. package/lib/factories/MetadataCollection.js +4 -12
  25. package/lib/factories/MetadataCollection.js.map +1 -1
  26. package/lib/factories/MetadataCollection.mjs +4 -12
  27. package/lib/factories/MetadataCommentTagFactory.js +5 -15
  28. package/lib/factories/MetadataCommentTagFactory.js.map +1 -1
  29. package/lib/factories/MetadataCommentTagFactory.mjs +5 -15
  30. package/lib/factories/MetadataFactory.js +1 -3
  31. package/lib/factories/MetadataFactory.js.map +1 -1
  32. package/lib/factories/MetadataFactory.mjs +1 -3
  33. package/lib/factories/ProtobufFactory.js +2 -4
  34. package/lib/factories/ProtobufFactory.js.map +1 -1
  35. package/lib/factories/ProtobufFactory.mjs +2 -4
  36. package/lib/functional.d.mts +196 -195
  37. package/lib/functional.d.ts +196 -195
  38. package/lib/functional.js +18 -54
  39. package/lib/functional.js.map +1 -1
  40. package/lib/functional.mjs +18 -54
  41. package/lib/http.d.mts +303 -319
  42. package/lib/http.d.ts +303 -319
  43. package/lib/http.js +26 -78
  44. package/lib/http.js.map +1 -1
  45. package/lib/http.mjs +26 -78
  46. package/lib/internal/_ProtobufReader.d.mts +3 -9
  47. package/lib/internal/_ProtobufReader.d.ts +3 -9
  48. package/lib/internal/_ProtobufReader.js.map +1 -1
  49. package/lib/internal/_ProtobufReader.mjs +3 -9
  50. package/lib/internal/_ProtobufSizer.d.mts +4 -12
  51. package/lib/internal/_ProtobufSizer.d.ts +4 -12
  52. package/lib/internal/_ProtobufSizer.js.map +1 -1
  53. package/lib/internal/_ProtobufSizer.mjs +4 -12
  54. package/lib/internal/_ProtobufWriter.d.mts +5 -15
  55. package/lib/internal/_ProtobufWriter.d.ts +5 -15
  56. package/lib/internal/_ProtobufWriter.js.map +1 -1
  57. package/lib/internal/_ProtobufWriter.mjs +5 -15
  58. package/lib/internal/_jsonStringifyString.d.mts +4 -4
  59. package/lib/internal/_jsonStringifyString.d.ts +4 -4
  60. package/lib/internal/_jsonStringifyString.js +4 -4
  61. package/lib/internal/_jsonStringifyString.mjs +4 -4
  62. package/lib/json.d.mts +174 -195
  63. package/lib/json.d.ts +174 -195
  64. package/lib/json.js +16 -48
  65. package/lib/json.js.map +1 -1
  66. package/lib/json.mjs +16 -48
  67. package/lib/llm.d.mts +275 -192
  68. package/lib/llm.d.ts +275 -192
  69. package/lib/llm.js +4 -12
  70. package/lib/llm.js.map +1 -1
  71. package/lib/llm.mjs +4 -12
  72. package/lib/misc.d.mts +149 -172
  73. package/lib/misc.d.ts +149 -172
  74. package/lib/misc.js +17 -51
  75. package/lib/misc.js.map +1 -1
  76. package/lib/misc.mjs +17 -51
  77. package/lib/module.d.mts +263 -275
  78. package/lib/module.d.ts +263 -275
  79. package/lib/module.js +18 -54
  80. package/lib/module.js.map +1 -1
  81. package/lib/module.mjs +18 -54
  82. package/lib/notations.d.mts +153 -174
  83. package/lib/notations.d.ts +153 -174
  84. package/lib/notations.js +24 -72
  85. package/lib/notations.js.map +1 -1
  86. package/lib/notations.mjs +24 -72
  87. package/lib/programmers/FeatureProgrammer.d.mts +19 -41
  88. package/lib/programmers/FeatureProgrammer.d.ts +19 -41
  89. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  90. package/lib/programmers/ImportProgrammer.js +3 -9
  91. package/lib/programmers/ImportProgrammer.js.map +1 -1
  92. package/lib/programmers/ImportProgrammer.mjs +3 -9
  93. package/lib/programmers/RandomProgrammer.js +6 -0
  94. package/lib/programmers/RandomProgrammer.js.map +1 -1
  95. package/lib/programmers/RandomProgrammer.mjs +6 -0
  96. package/lib/programmers/helpers/ProtobufWire.d.mts +13 -13
  97. package/lib/programmers/helpers/ProtobufWire.d.ts +13 -13
  98. package/lib/programmers/internal/check_array_length.js +2 -6
  99. package/lib/programmers/internal/check_array_length.js.map +1 -1
  100. package/lib/programmers/internal/check_array_length.mjs +2 -6
  101. package/lib/programmers/internal/check_bigint.js +2 -6
  102. package/lib/programmers/internal/check_bigint.js.map +1 -1
  103. package/lib/programmers/internal/check_bigint.mjs +2 -6
  104. package/lib/programmers/internal/check_dynamic_key.js +2 -6
  105. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  106. package/lib/programmers/internal/check_dynamic_key.mjs +2 -6
  107. package/lib/programmers/internal/check_dynamic_properties.js +3 -9
  108. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  109. package/lib/programmers/internal/check_dynamic_properties.mjs +3 -9
  110. package/lib/programmers/internal/check_everything.js +1 -3
  111. package/lib/programmers/internal/check_everything.js.map +1 -1
  112. package/lib/programmers/internal/check_everything.mjs +1 -3
  113. package/lib/programmers/internal/check_native.js +2 -6
  114. package/lib/programmers/internal/check_native.js.map +1 -1
  115. package/lib/programmers/internal/check_native.mjs +2 -6
  116. package/lib/programmers/internal/check_number.js +2 -6
  117. package/lib/programmers/internal/check_number.js.map +1 -1
  118. package/lib/programmers/internal/check_number.mjs +2 -6
  119. package/lib/programmers/internal/check_object.js +2 -6
  120. package/lib/programmers/internal/check_object.js.map +1 -1
  121. package/lib/programmers/internal/check_object.mjs +2 -6
  122. package/lib/programmers/internal/check_string.js +2 -6
  123. package/lib/programmers/internal/check_string.js.map +1 -1
  124. package/lib/programmers/internal/check_string.mjs +2 -6
  125. package/lib/programmers/internal/check_template.js +1 -3
  126. package/lib/programmers/internal/check_template.js.map +1 -1
  127. package/lib/programmers/internal/check_template.mjs +1 -3
  128. package/lib/programmers/internal/check_union_array_like.js +1 -3
  129. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  130. package/lib/programmers/internal/check_union_array_like.mjs +1 -3
  131. package/lib/programmers/internal/decode_union_object.js +2 -6
  132. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  133. package/lib/programmers/internal/decode_union_object.mjs +2 -6
  134. package/lib/programmers/internal/feature_object_entries.js +1 -3
  135. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  136. package/lib/programmers/internal/feature_object_entries.mjs +1 -3
  137. package/lib/programmers/internal/json_schema_escaped.js +2 -6
  138. package/lib/programmers/internal/json_schema_escaped.js.map +1 -1
  139. package/lib/programmers/internal/json_schema_escaped.mjs +2 -6
  140. package/lib/programmers/internal/json_schema_object.js +3 -9
  141. package/lib/programmers/internal/json_schema_object.js.map +1 -1
  142. package/lib/programmers/internal/json_schema_object.mjs +3 -9
  143. package/lib/programmers/internal/json_schema_station.d.mts +2 -2
  144. package/lib/programmers/internal/json_schema_station.d.ts +2 -2
  145. package/lib/programmers/internal/metadata_to_pattern.js +1 -3
  146. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  147. package/lib/programmers/internal/metadata_to_pattern.mjs +1 -3
  148. package/lib/programmers/internal/postfix_of_tuple.js +1 -3
  149. package/lib/programmers/internal/postfix_of_tuple.js.map +1 -1
  150. package/lib/programmers/internal/postfix_of_tuple.mjs +1 -3
  151. package/lib/programmers/internal/prune_object_properties.js +1 -3
  152. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  153. package/lib/programmers/internal/prune_object_properties.mjs +1 -3
  154. package/lib/programmers/internal/stringify_dynamic_properties.js +2 -6
  155. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  156. package/lib/programmers/internal/stringify_dynamic_properties.mjs +2 -6
  157. package/lib/programmers/internal/stringify_native.js +1 -3
  158. package/lib/programmers/internal/stringify_native.js.map +1 -1
  159. package/lib/programmers/internal/stringify_native.mjs +1 -3
  160. package/lib/programmers/internal/stringify_regular_properties.js +2 -6
  161. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  162. package/lib/programmers/internal/stringify_regular_properties.mjs +2 -6
  163. package/lib/programmers/internal/template_to_pattern.js +1 -3
  164. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  165. package/lib/programmers/internal/template_to_pattern.mjs +1 -3
  166. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +1 -3
  167. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  168. package/lib/programmers/internal/wrap_metadata_rest_tuple.mjs +1 -3
  169. package/lib/programmers/json/JsonStringifyProgrammer.js +2 -2
  170. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  171. package/lib/programmers/json/JsonStringifyProgrammer.mjs +2 -2
  172. package/lib/programmers/llm/LlmApplicationProgrammer.js +5 -1
  173. package/lib/programmers/llm/LlmApplicationProgrammer.js.map +1 -1
  174. package/lib/programmers/llm/LlmApplicationProgrammer.mjs +5 -1
  175. package/lib/programmers/llm/LlmSchemaProgrammer.js +1 -4
  176. package/lib/programmers/llm/LlmSchemaProgrammer.js.map +1 -1
  177. package/lib/programmers/llm/LlmSchemaProgrammer.mjs +1 -35
  178. package/lib/protobuf.d.mts +290 -297
  179. package/lib/protobuf.d.ts +290 -297
  180. package/lib/protobuf.js +17 -51
  181. package/lib/protobuf.js.map +1 -1
  182. package/lib/protobuf.mjs +17 -51
  183. package/lib/reflect.d.mts +2 -4
  184. package/lib/reflect.d.ts +2 -4
  185. package/lib/reflect.js +1 -3
  186. package/lib/reflect.js.map +1 -1
  187. package/lib/reflect.mjs +1 -3
  188. package/lib/schemas/json/IJsonApplication.d.mts +4 -4
  189. package/lib/schemas/json/IJsonApplication.d.ts +4 -4
  190. package/lib/schemas/json/IJsonSchemaCollection.d.mts +73 -56
  191. package/lib/schemas/json/IJsonSchemaCollection.d.ts +73 -56
  192. package/lib/schemas/json/IJsonSchemaUnit.d.mts +83 -70
  193. package/lib/schemas/json/IJsonSchemaUnit.d.ts +83 -70
  194. package/lib/schemas/metadata/Metadata.d.mts +1 -3
  195. package/lib/schemas/metadata/Metadata.d.ts +1 -3
  196. package/lib/schemas/metadata/Metadata.js +9 -27
  197. package/lib/schemas/metadata/Metadata.js.map +1 -1
  198. package/lib/schemas/metadata/Metadata.mjs +9 -27
  199. package/lib/schemas/metadata/MetadataAliasType.d.mts +1 -3
  200. package/lib/schemas/metadata/MetadataAliasType.d.ts +1 -3
  201. package/lib/schemas/metadata/MetadataAliasType.js +3 -9
  202. package/lib/schemas/metadata/MetadataAliasType.js.map +1 -1
  203. package/lib/schemas/metadata/MetadataAliasType.mjs +3 -9
  204. package/lib/schemas/metadata/MetadataApplication.d.mts +1 -3
  205. package/lib/schemas/metadata/MetadataApplication.d.ts +1 -3
  206. package/lib/schemas/metadata/MetadataApplication.js +2 -6
  207. package/lib/schemas/metadata/MetadataApplication.js.map +1 -1
  208. package/lib/schemas/metadata/MetadataApplication.mjs +2 -6
  209. package/lib/schemas/metadata/MetadataArray.d.mts +1 -3
  210. package/lib/schemas/metadata/MetadataArray.d.ts +1 -3
  211. package/lib/schemas/metadata/MetadataArray.js +1 -3
  212. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  213. package/lib/schemas/metadata/MetadataArray.mjs +1 -3
  214. package/lib/schemas/metadata/MetadataArrayType.d.mts +1 -3
  215. package/lib/schemas/metadata/MetadataArrayType.d.ts +1 -3
  216. package/lib/schemas/metadata/MetadataArrayType.js +3 -9
  217. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -1
  218. package/lib/schemas/metadata/MetadataArrayType.mjs +3 -9
  219. package/lib/schemas/metadata/MetadataAtomic.js +1 -3
  220. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  221. package/lib/schemas/metadata/MetadataAtomic.mjs +1 -3
  222. package/lib/schemas/metadata/MetadataEscaped.d.mts +1 -3
  223. package/lib/schemas/metadata/MetadataEscaped.d.ts +1 -3
  224. package/lib/schemas/metadata/MetadataEscaped.js +3 -9
  225. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -1
  226. package/lib/schemas/metadata/MetadataEscaped.mjs +3 -9
  227. package/lib/schemas/metadata/MetadataFunction.d.mts +1 -3
  228. package/lib/schemas/metadata/MetadataFunction.d.ts +1 -3
  229. package/lib/schemas/metadata/MetadataFunction.js +2 -6
  230. package/lib/schemas/metadata/MetadataFunction.js.map +1 -1
  231. package/lib/schemas/metadata/MetadataFunction.mjs +2 -6
  232. package/lib/schemas/metadata/MetadataObject.d.mts +1 -3
  233. package/lib/schemas/metadata/MetadataObject.d.ts +1 -3
  234. package/lib/schemas/metadata/MetadataObject.js +1 -3
  235. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  236. package/lib/schemas/metadata/MetadataObject.mjs +1 -3
  237. package/lib/schemas/metadata/MetadataObjectType.d.mts +1 -3
  238. package/lib/schemas/metadata/MetadataObjectType.d.ts +1 -3
  239. package/lib/schemas/metadata/MetadataObjectType.js +5 -15
  240. package/lib/schemas/metadata/MetadataObjectType.js.map +1 -1
  241. package/lib/schemas/metadata/MetadataObjectType.mjs +6 -18
  242. package/lib/schemas/metadata/MetadataParameter.js +1 -3
  243. package/lib/schemas/metadata/MetadataParameter.js.map +1 -1
  244. package/lib/schemas/metadata/MetadataParameter.mjs +1 -3
  245. package/lib/schemas/metadata/MetadataProperty.d.mts +1 -3
  246. package/lib/schemas/metadata/MetadataProperty.d.ts +1 -3
  247. package/lib/schemas/metadata/MetadataProperty.js +3 -9
  248. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  249. package/lib/schemas/metadata/MetadataProperty.mjs +3 -9
  250. package/lib/schemas/metadata/MetadataTemplate.js +1 -3
  251. package/lib/schemas/metadata/MetadataTemplate.js.map +1 -1
  252. package/lib/schemas/metadata/MetadataTemplate.mjs +1 -3
  253. package/lib/schemas/metadata/MetadataTuple.d.mts +1 -3
  254. package/lib/schemas/metadata/MetadataTuple.d.ts +1 -3
  255. package/lib/schemas/metadata/MetadataTuple.js +2 -6
  256. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  257. package/lib/schemas/metadata/MetadataTuple.mjs +2 -6
  258. package/lib/schemas/metadata/MetadataTupleType.js +2 -6
  259. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -1
  260. package/lib/schemas/metadata/MetadataTupleType.mjs +3 -9
  261. package/lib/tags/Constant.d.mts +16 -16
  262. package/lib/tags/Constant.d.ts +16 -16
  263. package/lib/tags/ContentMediaType.d.mts +7 -7
  264. package/lib/tags/ContentMediaType.d.ts +7 -7
  265. package/lib/tags/Default.d.mts +19 -19
  266. package/lib/tags/Default.d.ts +19 -19
  267. package/lib/tags/Example.d.mts +18 -18
  268. package/lib/tags/Example.d.ts +18 -18
  269. package/lib/tags/Examples.d.mts +23 -23
  270. package/lib/tags/Examples.d.ts +23 -23
  271. package/lib/tags/ExclusiveMaximum.d.mts +8 -5
  272. package/lib/tags/ExclusiveMaximum.d.ts +8 -5
  273. package/lib/tags/ExclusiveMinimum.d.mts +8 -5
  274. package/lib/tags/ExclusiveMinimum.d.ts +8 -5
  275. package/lib/tags/Format.d.mts +12 -8
  276. package/lib/tags/Format.d.ts +12 -8
  277. package/lib/tags/JsonSchemaPlugin.d.mts +20 -18
  278. package/lib/tags/JsonSchemaPlugin.d.ts +20 -18
  279. package/lib/tags/MaxItems.d.mts +9 -9
  280. package/lib/tags/MaxItems.d.ts +9 -9
  281. package/lib/tags/MaxLength.d.mts +6 -5
  282. package/lib/tags/MaxLength.d.ts +6 -5
  283. package/lib/tags/Maximum.d.mts +9 -7
  284. package/lib/tags/Maximum.d.ts +9 -7
  285. package/lib/tags/MinItems.d.mts +9 -9
  286. package/lib/tags/MinItems.d.ts +9 -9
  287. package/lib/tags/MinLength.d.mts +6 -5
  288. package/lib/tags/MinLength.d.ts +6 -5
  289. package/lib/tags/Minimum.d.mts +9 -7
  290. package/lib/tags/Minimum.d.ts +9 -7
  291. package/lib/tags/MultipleOf.d.mts +10 -7
  292. package/lib/tags/MultipleOf.d.ts +10 -7
  293. package/lib/tags/Pattern.d.mts +7 -4
  294. package/lib/tags/Pattern.d.ts +7 -4
  295. package/lib/tags/Sequence.d.mts +19 -17
  296. package/lib/tags/Sequence.d.ts +19 -17
  297. package/lib/tags/TagBase.d.mts +21 -28
  298. package/lib/tags/TagBase.d.ts +21 -28
  299. package/lib/tags/Type.d.mts +12 -11
  300. package/lib/tags/Type.d.ts +12 -11
  301. package/lib/tags/UniqueItems.d.mts +10 -9
  302. package/lib/tags/UniqueItems.d.ts +10 -9
  303. package/lib/tags/internal/FormatCheatSheet.d.mts +1 -3
  304. package/lib/tags/internal/FormatCheatSheet.d.ts +1 -3
  305. package/lib/tags/internal/FormatCheatSheet.js +1 -3
  306. package/lib/tags/internal/FormatCheatSheet.js.map +1 -1
  307. package/lib/tags/internal/FormatCheatSheet.mjs +1 -3
  308. package/lib/transformers/ITransformOptions.d.mts +27 -19
  309. package/lib/transformers/ITransformOptions.d.ts +27 -19
  310. package/lib/transformers/ImportTransformer.js +5 -10
  311. package/lib/transformers/ImportTransformer.js.map +1 -1
  312. package/lib/transformers/ImportTransformer.mjs +5 -10
  313. package/lib/transformers/NoTransformConfigurationError.js +1 -3
  314. package/lib/transformers/NoTransformConfigurationError.js.map +1 -1
  315. package/lib/transformers/NoTransformConfigurationError.mjs +1 -3
  316. package/lib/transformers/features/llm/LlmApplicationTransformer.js +1 -3
  317. package/lib/transformers/features/llm/LlmApplicationTransformer.js.map +1 -1
  318. package/lib/transformers/features/llm/LlmApplicationTransformer.mjs +1 -3
  319. package/lib/typings/Equal.d.mts +6 -6
  320. package/lib/typings/Equal.d.ts +6 -6
  321. package/package.json +121 -120
  322. package/src/AssertionGuard.ts +41 -39
  323. package/src/CamelCase.ts +75 -75
  324. package/src/IRandomGenerator.ts +337 -335
  325. package/src/IReadableURLSearchParams.ts +9 -9
  326. package/src/PascalCase.ts +71 -71
  327. package/src/Primitive.ts +90 -92
  328. package/src/Resolved.ts +72 -74
  329. package/src/SnakeCase.ts +127 -126
  330. package/src/TypeGuardError.ts +216 -179
  331. package/src/factories/MetadataCollection.ts +270 -278
  332. package/src/factories/MetadataCommentTagFactory.ts +632 -648
  333. package/src/factories/MetadataFactory.ts +402 -404
  334. package/src/factories/ProtobufFactory.ts +873 -875
  335. package/src/functional.ts +705 -740
  336. package/src/http.ts +972 -1040
  337. package/src/internal/_ProtobufReader.ts +188 -194
  338. package/src/internal/_ProtobufSizer.ts +137 -145
  339. package/src/internal/_ProtobufWriter.ts +135 -145
  340. package/src/internal/_jsonStringifyString.ts +42 -42
  341. package/src/json.ts +643 -696
  342. package/src/llm.ts +615 -540
  343. package/src/misc.ts +594 -651
  344. package/src/module.ts +889 -937
  345. package/src/notations.ts +751 -820
  346. package/src/programmers/FeatureProgrammer.ts +605 -627
  347. package/src/programmers/ImportProgrammer.ts +179 -185
  348. package/src/programmers/RandomProgrammer.ts +1195 -1190
  349. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  350. package/src/programmers/internal/check_array_length.ts +43 -47
  351. package/src/programmers/internal/check_bigint.ts +46 -50
  352. package/src/programmers/internal/check_dynamic_key.ts +197 -201
  353. package/src/programmers/internal/check_dynamic_properties.ts +231 -237
  354. package/src/programmers/internal/check_everything.ts +21 -23
  355. package/src/programmers/internal/check_native.ts +23 -27
  356. package/src/programmers/internal/check_number.ts +108 -112
  357. package/src/programmers/internal/check_object.ts +72 -78
  358. package/src/programmers/internal/check_string.ts +46 -50
  359. package/src/programmers/internal/check_template.ts +46 -48
  360. package/src/programmers/internal/check_union_array_like.ts +331 -335
  361. package/src/programmers/internal/decode_union_object.ts +110 -116
  362. package/src/programmers/internal/feature_object_entries.ts +59 -61
  363. package/src/programmers/internal/json_schema_escaped.ts +78 -82
  364. package/src/programmers/internal/json_schema_object.ts +150 -158
  365. package/src/programmers/internal/json_schema_station.ts +2 -2
  366. package/src/programmers/internal/metadata_to_pattern.ts +40 -42
  367. package/src/programmers/internal/postfix_of_tuple.ts +3 -5
  368. package/src/programmers/internal/prune_object_properties.ts +69 -71
  369. package/src/programmers/internal/stringify_dynamic_properties.ts +158 -162
  370. package/src/programmers/internal/stringify_native.ts +5 -7
  371. package/src/programmers/internal/stringify_regular_properties.ts +77 -81
  372. package/src/programmers/internal/template_to_pattern.ts +21 -23
  373. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +21 -23
  374. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  375. package/src/programmers/llm/LlmApplicationProgrammer.ts +10 -1
  376. package/src/programmers/llm/LlmSchemaProgrammer.ts +2 -7
  377. package/src/protobuf.ts +820 -861
  378. package/src/reflect.ts +46 -50
  379. package/src/schemas/json/IJsonApplication.ts +77 -77
  380. package/src/schemas/json/IJsonSchemaCollection.ts +212 -195
  381. package/src/schemas/json/IJsonSchemaUnit.ts +263 -250
  382. package/src/schemas/metadata/IMetadataTypeTag.ts +14 -16
  383. package/src/schemas/metadata/Metadata.ts +669 -687
  384. package/src/schemas/metadata/MetadataAliasType.ts +57 -63
  385. package/src/schemas/metadata/MetadataApplication.ts +40 -44
  386. package/src/schemas/metadata/MetadataArray.ts +47 -49
  387. package/src/schemas/metadata/MetadataArrayType.ts +51 -57
  388. package/src/schemas/metadata/MetadataAtomic.ts +85 -87
  389. package/src/schemas/metadata/MetadataEscaped.ts +45 -51
  390. package/src/schemas/metadata/MetadataFunction.ts +45 -49
  391. package/src/schemas/metadata/MetadataObject.ts +46 -48
  392. package/src/schemas/metadata/MetadataObjectType.ts +137 -149
  393. package/src/schemas/metadata/MetadataParameter.ts +52 -54
  394. package/src/schemas/metadata/MetadataProperty.ts +53 -59
  395. package/src/schemas/metadata/MetadataTemplate.ts +78 -80
  396. package/src/schemas/metadata/MetadataTuple.ts +28 -32
  397. package/src/schemas/metadata/MetadataTupleType.ts +61 -67
  398. package/src/tags/Constant.ts +47 -47
  399. package/src/tags/ContentMediaType.ts +27 -27
  400. package/src/tags/Default.ts +52 -52
  401. package/src/tags/Example.ts +56 -56
  402. package/src/tags/Examples.ts +56 -56
  403. package/src/tags/ExclusiveMaximum.ts +44 -41
  404. package/src/tags/ExclusiveMinimum.ts +44 -41
  405. package/src/tags/Format.ts +78 -74
  406. package/src/tags/JsonSchemaPlugin.ts +36 -34
  407. package/src/tags/MaxItems.ts +31 -31
  408. package/src/tags/MaxLength.ts +25 -24
  409. package/src/tags/Maximum.ts +39 -37
  410. package/src/tags/MinItems.ts +31 -31
  411. package/src/tags/MinLength.ts +25 -24
  412. package/src/tags/Minimum.ts +39 -37
  413. package/src/tags/MultipleOf.ts +42 -39
  414. package/src/tags/Pattern.ts +49 -46
  415. package/src/tags/Sequence.ts +37 -35
  416. package/src/tags/TagBase.ts +102 -109
  417. package/src/tags/Type.ts +64 -63
  418. package/src/tags/UniqueItems.ts +34 -33
  419. package/src/tags/internal/FormatCheatSheet.ts +71 -73
  420. package/src/transformers/ITransformOptions.ts +70 -62
  421. package/src/transformers/ImportTransformer.ts +253 -258
  422. package/src/transformers/NoTransformConfigurationError.ts +16 -18
  423. package/src/transformers/features/llm/LlmApplicationTransformer.ts +224 -226
  424. package/src/typings/Equal.ts +18 -18
@@ -1,1190 +1,1195 @@
1
- import { OpenApi } from "@samchon/openapi";
2
- import ts from "typescript";
3
-
4
- import { ExpressionFactory } from "../factories/ExpressionFactory";
5
- import { IdentifierFactory } from "../factories/IdentifierFactory";
6
- import { LiteralFactory } from "../factories/LiteralFactory";
7
- import { MetadataCollection } from "../factories/MetadataCollection";
8
- import { MetadataCommentTagFactory } from "../factories/MetadataCommentTagFactory";
9
- import { MetadataFactory } from "../factories/MetadataFactory";
10
- import { StatementFactory } from "../factories/StatementFactory";
11
- import { TemplateFactory } from "../factories/TemplateFactory";
12
- import { TypeFactory } from "../factories/TypeFactory";
13
-
14
- import { Metadata } from "../schemas/metadata/Metadata";
15
- import { MetadataArray } from "../schemas/metadata/MetadataArray";
16
- import { MetadataArrayType } from "../schemas/metadata/MetadataArrayType";
17
- import { MetadataAtomic } from "../schemas/metadata/MetadataAtomic";
18
- import { MetadataMap } from "../schemas/metadata/MetadataMap";
19
- import { MetadataObjectType } from "../schemas/metadata/MetadataObjectType";
20
- import { MetadataSet } from "../schemas/metadata/MetadataSet";
21
- import { MetadataTemplate } from "../schemas/metadata/MetadataTemplate";
22
- import { MetadataTuple } from "../schemas/metadata/MetadataTuple";
23
- import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
24
-
25
- import { ITypiaContext } from "../transformers/ITypiaContext";
26
- import { TransformerError } from "../transformers/TransformerError";
27
-
28
- import { StringUtil } from "../utils/StringUtil";
29
-
30
- import { FeatureProgrammer } from "./FeatureProgrammer";
31
- import { FunctionProgrammer } from "./helpers/FunctionProgrammer";
32
- import { RandomJoiner } from "./helpers/RandomJoiner";
33
- import { json_schema_array } from "./internal/json_schema_array";
34
- import { json_schema_bigint } from "./internal/json_schema_bigint";
35
- import { json_schema_boolean } from "./internal/json_schema_boolean";
36
- import { json_schema_number } from "./internal/json_schema_number";
37
- import { json_schema_string } from "./internal/json_schema_string";
38
-
39
- export namespace RandomProgrammer {
40
- export interface IProps {
41
- context: ITypiaContext;
42
- modulo: ts.LeftHandSideExpression;
43
- type: ts.Type;
44
- name: string | undefined;
45
- init: ts.Expression | undefined;
46
- }
47
- export interface IDecomposeProps {
48
- context: ITypiaContext;
49
- functor: FunctionProgrammer;
50
- type: ts.Type;
51
- name: string | undefined;
52
- init: ts.Expression | undefined;
53
- }
54
-
55
- export const decompose = (
56
- props: IDecomposeProps,
57
- ): FeatureProgrammer.IDecomposed => {
58
- const collection: MetadataCollection = new MetadataCollection();
59
- const result = MetadataFactory.analyze({
60
- checker: props.context.checker,
61
- transformer: props.context.transformer,
62
- options: {
63
- escape: false,
64
- constant: true,
65
- absorb: true,
66
- validate: (meta) => {
67
- const output: string[] = [];
68
- if (meta.natives.some((native) => native.name === "WeakSet"))
69
- output.push(`WeakSet is not supported.`);
70
- else if (meta.natives.some((native) => native.name === "WeakMap"))
71
- output.push(`WeakMap is not supported.`);
72
- return output;
73
- },
74
- },
75
- collection,
76
- type: props.type,
77
- });
78
- if (result.success === false)
79
- throw TransformerError.from({
80
- code: props.functor.method,
81
- errors: result.errors,
82
- });
83
-
84
- // GENERATE FUNCTION
85
- const functions: Record<string, ts.VariableStatement> = Object.fromEntries([
86
- ...write_object_functions({
87
- context: props.context,
88
- functor: props.functor,
89
- collection,
90
- }).map((v, i) => [Prefix.object(i), v]),
91
- ...write_array_functions({
92
- context: props.context,
93
- functor: props.functor,
94
- collection,
95
- }).map((v, i) => [Prefix.array(i), v]),
96
- ...write_tuple_functions({
97
- context: props.context,
98
- functor: props.functor,
99
- collection,
100
- }).map((v, i) => [Prefix.tuple(i), v]),
101
- ]);
102
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
103
- undefined,
104
- undefined,
105
- [
106
- IdentifierFactory.parameter(
107
- "generator",
108
- ts.factory.createTypeReferenceNode("Partial", [
109
- props.context.importer.type({
110
- file: "typia",
111
- name: "IRandomGenerator",
112
- }),
113
- ]),
114
- props.init ?? ts.factory.createToken(ts.SyntaxKind.QuestionToken),
115
- ),
116
- ],
117
- props.context.importer.type({
118
- file: "typia",
119
- name: "Resolved",
120
- arguments: [
121
- ts.factory.createTypeReferenceNode(
122
- props.name ??
123
- TypeFactory.getFullName({
124
- checker: props.context.checker,
125
- type: props.type,
126
- }),
127
- ),
128
- ],
129
- }),
130
- undefined,
131
- ts.factory.createBlock(
132
- [
133
- ts.factory.createExpressionStatement(
134
- ts.factory.createBinaryExpression(
135
- ts.factory.createIdentifier("_generator"),
136
- ts.SyntaxKind.EqualsToken,
137
- ts.factory.createIdentifier("generator"),
138
- ),
139
- ),
140
- ts.factory.createReturnStatement(
141
- decode({
142
- context: props.context,
143
- functor: props.functor,
144
- explore: {
145
- function: false,
146
- recursive: false,
147
- },
148
- metadata: result.data,
149
- }),
150
- ),
151
- ],
152
- true,
153
- ),
154
- );
155
- return {
156
- functions,
157
- statements: [
158
- StatementFactory.mut({
159
- name: "_generator",
160
- type: ts.factory.createUnionTypeNode([
161
- ts.factory.createTypeReferenceNode("Partial", [
162
- props.context.importer.type({
163
- file: "typia",
164
- name: "IRandomGenerator",
165
- }),
166
- ]),
167
- ts.factory.createTypeReferenceNode("undefined"),
168
- ]),
169
- }),
170
- ],
171
- arrow,
172
- };
173
- };
174
-
175
- export const write = (props: IProps) => {
176
- const functor: FunctionProgrammer = new FunctionProgrammer(
177
- props.modulo.getText(),
178
- );
179
- const result: FeatureProgrammer.IDecomposed = decompose({
180
- ...props,
181
- functor,
182
- });
183
- return FeatureProgrammer.writeDecomposed({
184
- modulo: props.modulo,
185
- functor,
186
- result,
187
- });
188
- };
189
-
190
- const write_object_functions = (props: {
191
- context: ITypiaContext;
192
- functor: FunctionProgrammer;
193
- collection: MetadataCollection;
194
- }): ts.VariableStatement[] =>
195
- props.collection.objects().map((obj, i) =>
196
- StatementFactory.constant({
197
- name: Prefix.object(i),
198
- value: ts.factory.createArrowFunction(
199
- undefined,
200
- undefined,
201
- [
202
- IdentifierFactory.parameter(
203
- "_recursive",
204
- TypeFactory.keyword("boolean"),
205
- ts.factory.createIdentifier(String(obj.recursive)),
206
- ),
207
- IdentifierFactory.parameter(
208
- "_depth",
209
- TypeFactory.keyword("number"),
210
- ExpressionFactory.number(0),
211
- ),
212
- ],
213
- TypeFactory.keyword("any"),
214
- undefined,
215
- RandomJoiner.object({
216
- decode: (metadata) =>
217
- decode({
218
- context: props.context,
219
- functor: props.functor,
220
- explore: {
221
- recursive: obj.recursive,
222
- function: true,
223
- },
224
- metadata,
225
- }),
226
- object: obj,
227
- }),
228
- ),
229
- }),
230
- );
231
-
232
- const write_array_functions = (props: {
233
- context: ITypiaContext;
234
- functor: FunctionProgrammer;
235
- collection: MetadataCollection;
236
- }): ts.VariableStatement[] =>
237
- props.collection
238
- .arrays()
239
- .filter((a) => a.recursive)
240
- .map((array, i) =>
241
- StatementFactory.constant({
242
- name: Prefix.array(i),
243
- value: ts.factory.createArrowFunction(
244
- undefined,
245
- undefined,
246
- [
247
- IdentifierFactory.parameter(
248
- "_schema",
249
- TypeFactory.keyword("boolean"),
250
- ),
251
- IdentifierFactory.parameter(
252
- "_recursive",
253
- TypeFactory.keyword("boolean"),
254
- ts.factory.createTrue(),
255
- ),
256
- IdentifierFactory.parameter(
257
- "_depth",
258
- TypeFactory.keyword("number"),
259
- ExpressionFactory.number(0),
260
- ),
261
- ],
262
- TypeFactory.keyword("any"),
263
- undefined,
264
- RandomJoiner.array({
265
- decode: (metadata) =>
266
- decode({
267
- context: props.context,
268
- functor: props.functor,
269
- explore: {
270
- recursive: true,
271
- function: true,
272
- },
273
- metadata,
274
- }),
275
- recursive: true,
276
- expression: coalesce({
277
- context: props.context,
278
- method: "array",
279
- internal: "randomArray",
280
- }),
281
- array,
282
- schema: undefined,
283
- }),
284
- ),
285
- }),
286
- );
287
-
288
- const write_tuple_functions = (props: {
289
- context: ITypiaContext;
290
- functor: FunctionProgrammer;
291
- collection: MetadataCollection;
292
- }): ts.VariableStatement[] =>
293
- props.collection
294
- .tuples()
295
- .filter((a) => a.recursive)
296
- .map((tuple, i) =>
297
- StatementFactory.constant({
298
- name: Prefix.tuple(i),
299
- value: ts.factory.createArrowFunction(
300
- undefined,
301
- undefined,
302
- [
303
- IdentifierFactory.parameter(
304
- "_recursive",
305
- TypeFactory.keyword("boolean"),
306
- ts.factory.createTrue(),
307
- ),
308
- IdentifierFactory.parameter(
309
- "_depth",
310
- TypeFactory.keyword("number"),
311
- ExpressionFactory.number(0),
312
- ),
313
- ],
314
- TypeFactory.keyword("any"),
315
- undefined,
316
- RandomJoiner.tuple({
317
- decode: (metadata) =>
318
- decode({
319
- context: props.context,
320
- functor: props.functor,
321
- explore: {
322
- function: true,
323
- recursive: true,
324
- },
325
- metadata,
326
- }),
327
- elements: tuple.elements,
328
- }),
329
- ),
330
- }),
331
- );
332
-
333
- /* -----------------------------------------------------------
334
- DECODERS
335
- ----------------------------------------------------------- */
336
- const decode = (props: {
337
- context: ITypiaContext;
338
- functor: FunctionProgrammer;
339
- explore: IExplore;
340
- metadata: Metadata;
341
- }): ts.Expression => {
342
- const expressions: ts.Expression[] = [];
343
- if (props.metadata.any === true)
344
- expressions.push(ts.factory.createStringLiteral("any type used..."));
345
-
346
- // NULL COALESCING
347
- if (
348
- props.metadata.isRequired() === false ||
349
- props.metadata.functions.length !== 0
350
- )
351
- expressions.push(ts.factory.createIdentifier("undefined"));
352
- if (props.metadata.nullable === true)
353
- expressions.push(ts.factory.createNull());
354
-
355
- // CONSTANT TYPES
356
- for (const constant of props.metadata.constants)
357
- for (const { value } of constant.values)
358
- expressions.push(
359
- constant.type === "boolean"
360
- ? value === true
361
- ? ts.factory.createTrue()
362
- : ts.factory.createFalse()
363
- : constant.type === "bigint"
364
- ? ExpressionFactory.bigint(value as bigint)
365
- : constant.type === "number"
366
- ? ExpressionFactory.number(value as number)
367
- : ts.factory.createStringLiteral(value as string),
368
- );
369
-
370
- // ATOMIC VARIABLES
371
- for (const template of props.metadata.templates)
372
- expressions.push(
373
- decode_template({
374
- ...props,
375
- template,
376
- }),
377
- );
378
- for (const atomic of props.metadata.atomics)
379
- expressions.push(
380
- ...decode_atomic({
381
- context: props.context,
382
- atomic,
383
- }),
384
- );
385
-
386
- // INSTANCE TYPES
387
- if (props.metadata.escaped)
388
- expressions.push(
389
- decode({
390
- ...props,
391
- metadata: props.metadata.escaped.returns,
392
- }),
393
- );
394
- for (const array of props.metadata.arrays)
395
- expressions.push(
396
- ...decode_array({
397
- ...props,
398
- array,
399
- }),
400
- );
401
- for (const tuple of props.metadata.tuples)
402
- expressions.push(
403
- decode_tuple({
404
- ...props,
405
- tuple,
406
- }),
407
- );
408
- for (const object of props.metadata.objects)
409
- expressions.push(
410
- decode_object({
411
- ...props,
412
- object: object.type,
413
- }),
414
- );
415
- for (const native of props.metadata.natives)
416
- expressions.push(
417
- decode_native({
418
- context: props.context,
419
- functor: props.functor,
420
- explore: props.explore,
421
- name: native.name,
422
- }),
423
- );
424
- for (const set of props.metadata.sets)
425
- expressions.push(
426
- decode_set({
427
- ...props,
428
- set,
429
- }),
430
- );
431
- for (const entry of props.metadata.maps)
432
- expressions.push(
433
- decode_map({
434
- ...props,
435
- map: entry,
436
- }),
437
- );
438
-
439
- // PICK UP A TYPE
440
- if (expressions.length === 1) return expressions[0]!;
441
- return ts.factory.createCallExpression(
442
- ts.factory.createCallExpression(
443
- props.context.importer.internal("randomPick"),
444
- undefined,
445
- [
446
- ts.factory.createArrayLiteralExpression(
447
- expressions.map((expr) =>
448
- ts.factory.createArrowFunction(
449
- undefined,
450
- undefined,
451
- [],
452
- undefined,
453
- undefined,
454
- expr,
455
- ),
456
- ),
457
- true,
458
- ),
459
- ],
460
- ),
461
- undefined,
462
- undefined,
463
- );
464
- };
465
-
466
- const decode_atomic = (props: {
467
- context: ITypiaContext;
468
- atomic: MetadataAtomic;
469
- }) => {
470
- const schemaList: OpenApi.IJsonSchema[] =
471
- props.atomic.type === "boolean"
472
- ? json_schema_boolean(props.atomic)
473
- : props.atomic.type === "string"
474
- ? json_schema_string(props.atomic)
475
- : props.atomic.type === "bigint"
476
- ? json_schema_bigint(props.atomic)
477
- : json_schema_number(props.atomic);
478
- return schemaList.map((schema) => {
479
- interface IComposed {
480
- method: string;
481
- internal: string;
482
- arguments: ts.Expression[];
483
- }
484
- const composed = ((): IComposed => {
485
- if (props.atomic.type === "string") {
486
- const string: OpenApi.IJsonSchema.IString =
487
- schema as OpenApi.IJsonSchema.IString;
488
- if (string.format !== undefined) {
489
- const format: string = string.format!;
490
- if (format === "date-time")
491
- return {
492
- method: "datetime",
493
- internal: "randomFormatDatetime",
494
- arguments: [],
495
- };
496
- return {
497
- method: format
498
- .split("-")
499
- .map((s, i) => (i === 0 ? s : StringUtil.capitalize(s)))
500
- .join(""),
501
- internal: `randomFormat${format
502
- .split("-")
503
- .map(StringUtil.capitalize)
504
- .join("")}`,
505
- arguments: [],
506
- };
507
- } else if (string.pattern !== undefined)
508
- return {
509
- method: "pattern",
510
- internal: "randomPattern",
511
- arguments: [
512
- ts.factory.createNewExpression(
513
- ts.factory.createIdentifier("RegExp"),
514
- undefined,
515
- [
516
- ts.factory.createStringLiteral(
517
- (schema as OpenApi.IJsonSchema.IString).pattern!,
518
- ),
519
- ],
520
- ),
521
- ],
522
- };
523
- } else if (props.atomic.type === "number") {
524
- const number:
525
- | OpenApi.IJsonSchema.INumber
526
- | OpenApi.IJsonSchema.IInteger = schema as
527
- | OpenApi.IJsonSchema.INumber
528
- | OpenApi.IJsonSchema.IInteger;
529
- if (number.type === "integer")
530
- return {
531
- method: "integer",
532
- internal: "randomInteger",
533
- arguments: [LiteralFactory.write(schema)],
534
- };
535
- }
536
- return {
537
- method: props.atomic.type,
538
- internal: `random${StringUtil.capitalize(props.atomic.type)}`,
539
- arguments: [LiteralFactory.write(schema)],
540
- };
541
- })();
542
- return ts.factory.createCallExpression(
543
- ExpressionFactory.coalesce(
544
- ts.factory.createPropertyAccessChain(
545
- ts.factory.createIdentifier("_generator"),
546
- ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
547
- ts.factory.createIdentifier(composed.method),
548
- ),
549
- props.context.importer.internal(composed.internal),
550
- ),
551
- undefined,
552
- composed.arguments,
553
- );
554
- });
555
- };
556
-
557
- const decode_template = (props: {
558
- context: ITypiaContext;
559
- functor: FunctionProgrammer;
560
- explore: IExplore;
561
- template: MetadataTemplate;
562
- }) =>
563
- TemplateFactory.generate(
564
- props.template.row.map((metadata) =>
565
- decode({
566
- ...props,
567
- metadata,
568
- }),
569
- ),
570
- );
571
-
572
- const decode_array = (props: {
573
- context: ITypiaContext;
574
- functor: FunctionProgrammer;
575
- explore: IExplore;
576
- array: MetadataArray;
577
- }): ts.Expression[] => {
578
- const components: OpenApi.IComponents = {};
579
- const schemaList: OpenApi.IJsonSchema.IArray[] = json_schema_array({
580
- components,
581
- array: props.array,
582
- }) as OpenApi.IJsonSchema.IArray[];
583
- if (props.array.type.recursive)
584
- return schemaList.map((schema) =>
585
- ts.factory.createCallExpression(
586
- ts.factory.createIdentifier(
587
- props.functor.useLocal(Prefix.array(props.array.type.index!)),
588
- ),
589
- undefined,
590
- [
591
- ts.factory.createObjectLiteralExpression(
592
- Object.entries(schema)
593
- .filter(([key]) => key !== "items")
594
- .map(([key, value]) =>
595
- ts.factory.createPropertyAssignment(
596
- key,
597
- LiteralFactory.write(value),
598
- ),
599
- ),
600
- true,
601
- ),
602
- ],
603
- ),
604
- );
605
- return schemaList.map((schema) =>
606
- RandomJoiner.array({
607
- decode: (metadata) =>
608
- decode({
609
- ...props,
610
- metadata,
611
- }),
612
- expression: coalesce({
613
- context: props.context,
614
- method: "array",
615
- internal: "randomArray",
616
- }),
617
- array: props.array.type,
618
- recursive: props.explore.recursive,
619
- schema,
620
- }),
621
- );
622
- };
623
-
624
- const decode_tuple = (props: {
625
- context: ITypiaContext;
626
- functor: FunctionProgrammer;
627
- explore: IExplore;
628
- tuple: MetadataTuple;
629
- }): ts.Expression =>
630
- props.tuple.type.recursive
631
- ? ts.factory.createCallExpression(
632
- ts.factory.createIdentifier(
633
- props.functor.useLocal(Prefix.tuple(props.tuple.type.index!)),
634
- ),
635
- undefined,
636
- [
637
- ts.factory.createTrue(),
638
- props.explore.recursive
639
- ? ts.factory.createAdd(
640
- ExpressionFactory.number(1),
641
- ts.factory.createIdentifier("_depth"),
642
- )
643
- : ExpressionFactory.number(0),
644
- ],
645
- )
646
- : RandomJoiner.tuple({
647
- decode: (metadata) =>
648
- decode({
649
- ...props,
650
- metadata,
651
- }),
652
- elements: props.tuple.type.elements,
653
- });
654
-
655
- const decode_object = (props: {
656
- functor: FunctionProgrammer;
657
- explore: IExplore;
658
- object: MetadataObjectType;
659
- }) =>
660
- ts.factory.createCallExpression(
661
- ts.factory.createIdentifier(
662
- props.functor.useLocal(Prefix.object(props.object.index)),
663
- ),
664
- undefined,
665
- props.explore.function
666
- ? [
667
- props.explore.recursive
668
- ? ts.factory.createTrue()
669
- : ts.factory.createIdentifier("_recursive"),
670
- ts.factory.createConditionalExpression(
671
- ts.factory.createIdentifier("_recursive"),
672
- undefined,
673
- ts.factory.createAdd(
674
- ExpressionFactory.number(1),
675
- ts.factory.createIdentifier("_depth"),
676
- ),
677
- undefined,
678
- ts.factory.createIdentifier("_depth"),
679
- ),
680
- ]
681
- : undefined,
682
- );
683
-
684
- /* -----------------------------------------------------------
685
- NATIVE CLASSES
686
- ----------------------------------------------------------- */
687
- const decode_set = (props: {
688
- context: ITypiaContext;
689
- functor: FunctionProgrammer;
690
- explore: IExplore;
691
- set: MetadataSet;
692
- }) =>
693
- ts.factory.createNewExpression(
694
- ts.factory.createIdentifier("Set"),
695
- undefined,
696
- [
697
- decode_array({
698
- ...props,
699
- array: MetadataArray.create({
700
- tags: [],
701
- type: MetadataArrayType.create({
702
- value: props.set.value,
703
- recursive: false,
704
- index: null,
705
- nullables: [],
706
- name: props.set.getName(),
707
- }),
708
- }),
709
- })[0]!,
710
- ],
711
- );
712
-
713
- const decode_map = (props: {
714
- context: ITypiaContext;
715
- functor: FunctionProgrammer;
716
- explore: IExplore;
717
- map: MetadataMap;
718
- }) =>
719
- ts.factory.createNewExpression(
720
- ts.factory.createIdentifier("Map"),
721
- undefined,
722
- [
723
- decode_array({
724
- ...props,
725
- array: MetadataArray.create({
726
- tags: [],
727
- type: MetadataArrayType.create({
728
- name: props.map.getName(),
729
- index: null,
730
- recursive: false,
731
- nullables: [],
732
- value: Metadata.create({
733
- ...Metadata.initialize(),
734
- tuples: [
735
- (() => {
736
- const type = MetadataTupleType.create({
737
- name: `[${props.map.key.getName()}, ${props.map.value.getName()}]`,
738
- index: null,
739
- recursive: false,
740
- nullables: [],
741
- elements: [props.map.key, props.map.value],
742
- });
743
- type.of_map = true;
744
- return MetadataTuple.create({
745
- type,
746
- tags: [],
747
- });
748
- })(),
749
- ],
750
- }),
751
- }),
752
- }),
753
- })[0]!,
754
- ],
755
- );
756
-
757
- const decode_native = (props: {
758
- context: ITypiaContext;
759
- functor: FunctionProgrammer;
760
- explore: IExplore;
761
- name: string;
762
- }): ts.Expression => {
763
- if (
764
- props.name === "Boolean" ||
765
- props.name === "Number" ||
766
- props.name === "BigInt" ||
767
- props.name === "String"
768
- )
769
- return decode_atomic({
770
- context: props.context,
771
- atomic: MetadataAtomic.create({
772
- type: props.name.toLowerCase() as "string",
773
- tags: [],
774
- }),
775
- })[0]!;
776
- else if (props.name === "Date") return decode_native_date(props.context);
777
- else if (
778
- props.name === "Uint8Array" ||
779
- props.name === "Uint8ClampedArray" ||
780
- props.name === "Uint16Array" ||
781
- props.name === "Uint32Array" ||
782
- props.name === "BigUint64Array" ||
783
- props.name === "Int8Array" ||
784
- props.name === "Int16Array" ||
785
- props.name === "Int32Array" ||
786
- props.name === "BigInt64Array" ||
787
- props.name === "Float32Array" ||
788
- props.name === "Float64Array"
789
- )
790
- return decode_native_byte_array({
791
- ...props,
792
- name: props.name,
793
- });
794
- else if (props.name === "ArrayBuffer" || props.name === "SharedArrayBuffer")
795
- return decode_native_array_buffer({
796
- ...props,
797
- name: props.name,
798
- });
799
- else if (props.name === "DataView") return decode_native_data_view(props);
800
- else if (props.name === "Blob") return decode_native_blob(props);
801
- else if (props.name === "File") return decode_native_file(props);
802
- else if (props.name === "RegExp") return decode_regexp(props.context);
803
- else
804
- return ts.factory.createNewExpression(
805
- ts.factory.createIdentifier(props.name),
806
- undefined,
807
- [],
808
- );
809
- };
810
-
811
- const decode_native_date = (context: ITypiaContext) =>
812
- ts.factory.createNewExpression(
813
- ts.factory.createIdentifier("Date"),
814
- undefined,
815
- [
816
- ts.factory.createCallExpression(
817
- coalesce({
818
- context,
819
- method: "datetime",
820
- internal: "randomFormatDatetime",
821
- }),
822
- undefined,
823
- [],
824
- ),
825
- ],
826
- );
827
-
828
- const decode_native_byte_array = (props: {
829
- context: ITypiaContext;
830
- functor: FunctionProgrammer;
831
- explore: IExplore;
832
- name:
833
- | "Uint8Array"
834
- | "Uint8ClampedArray"
835
- | "Uint16Array"
836
- | "Uint32Array"
837
- | "BigUint64Array"
838
- | "Int8Array"
839
- | "Int16Array"
840
- | "Int32Array"
841
- | "BigInt64Array"
842
- | "Float32Array"
843
- | "Float64Array";
844
- }): ts.Expression => {
845
- new BigInt64Array();
846
- const [type, minimum, maximum]: [string, number, number] = (() => {
847
- if (props.name === "Uint8Array" || props.name === "Uint8ClampedArray")
848
- return ["uint32", 0, 255];
849
- else if (props.name === "Uint16Array") return ["uint32", 0, 65535];
850
- else if (props.name === "Uint32Array") return ["uint32", 0, 4294967295];
851
- else if (props.name === "BigUint64Array")
852
- return ["uint64", 0, 18446744073709551615];
853
- else if (props.name === "Int8Array") return ["int32", -128, 127];
854
- else if (props.name === "Int16Array") return ["int32", -32768, 32767];
855
- else if (props.name === "Int32Array")
856
- return ["int32", -2147483648, 2147483647];
857
- else if (props.name === "BigInt64Array")
858
- return ["uint64", -9223372036854775808, 9223372036854775807];
859
- else if (props.name === "Float32Array")
860
- return ["float", -1.175494351e38, 3.4028235e38];
861
- return ["double", Number.MIN_VALUE, Number.MAX_VALUE];
862
- })();
863
- const atomic: "bigint" | "number" =
864
- props.name === "BigInt64Array" || props.name === "BigUint64Array"
865
- ? "bigint"
866
- : "number";
867
- const value: Metadata = Metadata.create({
868
- ...Metadata.initialize(),
869
- atomics: [
870
- MetadataAtomic.create({
871
- type: atomic,
872
- tags: [
873
- [
874
- ...MetadataCommentTagFactory.get({
875
- kind: "type",
876
- type: atomic,
877
- value: type,
878
- }),
879
- ...MetadataCommentTagFactory.get({
880
- kind: "minimum",
881
- type: "number",
882
- value: minimum.toString(),
883
- }),
884
- ...MetadataCommentTagFactory.get({
885
- kind: "maximum",
886
- type: "number",
887
- value: maximum.toString(),
888
- }),
889
- ],
890
- ],
891
- }),
892
- ],
893
- });
894
- return ts.factory.createNewExpression(
895
- ts.factory.createIdentifier(props.name),
896
- [],
897
- decode_array({
898
- context: props.context,
899
- functor: props.functor,
900
- explore: props.explore,
901
- array: MetadataArray.create({
902
- tags: [],
903
- type: MetadataArrayType.create({
904
- name: `${props.name}<${atomic}>`,
905
- value,
906
- recursive: false,
907
- index: null,
908
- nullables: [],
909
- }),
910
- }),
911
- }),
912
- );
913
- };
914
-
915
- const decode_native_blob = (props: {
916
- context: ITypiaContext;
917
- functor: FunctionProgrammer;
918
- explore: IExplore;
919
- }) =>
920
- ts.factory.createNewExpression(
921
- ts.factory.createIdentifier("Blob"),
922
- undefined,
923
- [
924
- ts.factory.createArrayLiteralExpression(
925
- [
926
- decode_native_byte_array({
927
- context: props.context,
928
- functor: props.functor,
929
- explore: props.explore,
930
- name: "Uint8Array",
931
- }),
932
- ],
933
- true,
934
- ),
935
- ],
936
- );
937
-
938
- const decode_native_file = (props: {
939
- context: ITypiaContext;
940
- functor: FunctionProgrammer;
941
- explore: IExplore;
942
- }) =>
943
- ts.factory.createNewExpression(
944
- ts.factory.createIdentifier("File"),
945
- undefined,
946
- [
947
- ts.factory.createArrayLiteralExpression(
948
- [
949
- decode_native_byte_array({
950
- context: props.context,
951
- functor: props.functor,
952
- explore: props.explore,
953
- name: "Uint8Array",
954
- }),
955
- ],
956
- true,
957
- ),
958
- ts.factory.createTemplateExpression(ts.factory.createTemplateHead(""), [
959
- ts.factory.createTemplateSpan(
960
- writeRangedString({
961
- context: props.context,
962
- minLength: 1,
963
- maxLength: 8,
964
- }),
965
- ts.factory.createTemplateMiddle("."),
966
- ),
967
- ts.factory.createTemplateSpan(
968
- writeRangedString({
969
- context: props.context,
970
- minLength: 3,
971
- maxLength: 3,
972
- }),
973
- ts.factory.createTemplateTail(""),
974
- ),
975
- ]),
976
- ],
977
- );
978
-
979
- const decode_native_array_buffer = (props: {
980
- context: ITypiaContext;
981
- functor: FunctionProgrammer;
982
- explore: IExplore;
983
- name: "ArrayBuffer" | "SharedArrayBuffer";
984
- }): ts.Expression =>
985
- props.name === "ArrayBuffer"
986
- ? IdentifierFactory.access(
987
- decode_native_byte_array({
988
- context: props.context,
989
- functor: props.functor,
990
- explore: props.explore,
991
- name: "Uint8Array",
992
- }),
993
- "buffer",
994
- )
995
- : ExpressionFactory.selfCall(
996
- ts.factory.createBlock(
997
- [
998
- StatementFactory.constant({
999
- name: "length",
1000
- value: decode_atomic({
1001
- context: props.context,
1002
- atomic: MetadataAtomic.create({
1003
- type: "number",
1004
- tags: [
1005
- MetadataCommentTagFactory.get({
1006
- type: "number",
1007
- kind: "type",
1008
- value: "uint32",
1009
- }),
1010
- ],
1011
- }),
1012
- })[0]!,
1013
- }),
1014
- StatementFactory.constant({
1015
- name: "buffer",
1016
- value: ts.factory.createNewExpression(
1017
- ts.factory.createIdentifier("SharedArrayBuffer"),
1018
- [],
1019
- [ts.factory.createIdentifier("length")],
1020
- ),
1021
- }),
1022
- StatementFactory.constant({
1023
- name: "bytes",
1024
- value: ts.factory.createNewExpression(
1025
- ts.factory.createIdentifier("Uint8Array"),
1026
- [],
1027
- [ts.factory.createIdentifier("buffer")],
1028
- ),
1029
- }),
1030
- ts.factory.createExpressionStatement(
1031
- ts.factory.createCallExpression(
1032
- IdentifierFactory.access(
1033
- ts.factory.createIdentifier("bytes"),
1034
- "set",
1035
- ),
1036
- undefined,
1037
- [
1038
- ts.factory.createCallExpression(
1039
- ts.factory.createPropertyAccessExpression(
1040
- ts.factory.createCallExpression(
1041
- ts.factory.createPropertyAccessExpression(
1042
- ts.factory.createNewExpression(
1043
- ts.factory.createIdentifier("Array"),
1044
- undefined,
1045
- [ts.factory.createIdentifier("length")],
1046
- ),
1047
- ts.factory.createIdentifier("fill"),
1048
- ),
1049
- undefined,
1050
- [ts.factory.createNumericLiteral("0")],
1051
- ),
1052
- ts.factory.createIdentifier("map"),
1053
- ),
1054
- undefined,
1055
- [
1056
- ts.factory.createArrowFunction(
1057
- undefined,
1058
- undefined,
1059
- [],
1060
- undefined,
1061
- undefined,
1062
- decode_atomic({
1063
- context: props.context,
1064
- atomic: MetadataAtomic.create({
1065
- type: "number",
1066
- tags: [
1067
- [
1068
- ...MetadataCommentTagFactory.get({
1069
- kind: "type",
1070
- type: "number",
1071
- value: "uint32",
1072
- }),
1073
- ...MetadataCommentTagFactory.get({
1074
- kind: "minimum",
1075
- type: "number",
1076
- value: "0",
1077
- }),
1078
- ...MetadataCommentTagFactory.get({
1079
- kind: "maximum",
1080
- type: "number",
1081
- value: "255",
1082
- }),
1083
- ],
1084
- ],
1085
- }),
1086
- })[0]!,
1087
- ),
1088
- ],
1089
- ),
1090
- ExpressionFactory.number(0),
1091
- ],
1092
- ),
1093
- ),
1094
- ts.factory.createReturnStatement(
1095
- ts.factory.createIdentifier("buffer"),
1096
- ),
1097
- ],
1098
- true,
1099
- ),
1100
- );
1101
-
1102
- const decode_native_data_view = (props: {
1103
- context: ITypiaContext;
1104
- functor: FunctionProgrammer;
1105
- explore: IExplore;
1106
- }) =>
1107
- ts.factory.createNewExpression(
1108
- ts.factory.createIdentifier("DataView"),
1109
- [],
1110
- [
1111
- IdentifierFactory.access(
1112
- decode_native_byte_array({
1113
- context: props.context,
1114
- functor: props.functor,
1115
- explore: props.explore,
1116
- name: "Uint8Array",
1117
- }),
1118
- "buffer",
1119
- ),
1120
- ],
1121
- );
1122
-
1123
- const decode_regexp = (context: ITypiaContext) =>
1124
- ts.factory.createNewExpression(
1125
- ts.factory.createIdentifier("RegExp"),
1126
- [],
1127
- [
1128
- ts.factory.createCallExpression(
1129
- coalesce({
1130
- context,
1131
- method: "regex",
1132
- internal: "randomFormatRegex",
1133
- }),
1134
- undefined,
1135
- undefined,
1136
- ),
1137
- ],
1138
- );
1139
-
1140
- const writeRangedString = (props: {
1141
- context: ITypiaContext;
1142
- minLength: number;
1143
- maxLength: number;
1144
- }): ts.CallExpression =>
1145
- decode_atomic({
1146
- context: props.context,
1147
- atomic: MetadataAtomic.create({
1148
- type: "string",
1149
- tags: [
1150
- [
1151
- ...MetadataCommentTagFactory.get({
1152
- kind: "minLength",
1153
- type: "string",
1154
- value: props.minLength.toString(),
1155
- }),
1156
- ...MetadataCommentTagFactory.get({
1157
- kind: "maxLength",
1158
- type: "string",
1159
- value: props.maxLength.toString(),
1160
- }),
1161
- ],
1162
- ],
1163
- }),
1164
- })[0]!;
1165
- }
1166
-
1167
- const coalesce = (props: {
1168
- context: ITypiaContext;
1169
- method: string;
1170
- internal: string;
1171
- }): ts.Expression =>
1172
- ExpressionFactory.coalesce(
1173
- ts.factory.createPropertyAccessChain(
1174
- ts.factory.createIdentifier("_generator"),
1175
- ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
1176
- ts.factory.createIdentifier(props.method),
1177
- ),
1178
- props.context.importer.internal(props.internal),
1179
- );
1180
-
1181
- interface IExplore {
1182
- function: boolean;
1183
- recursive: boolean;
1184
- }
1185
-
1186
- const Prefix = {
1187
- object: (i: number) => `_ro${i}`,
1188
- array: (i: number) => `_ra${i}`,
1189
- tuple: (i: number) => `_rt${i}`,
1190
- };
1
+ import { OpenApi } from "@samchon/openapi";
2
+ import ts from "typescript";
3
+
4
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
5
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
6
+ import { LiteralFactory } from "../factories/LiteralFactory";
7
+ import { MetadataCollection } from "../factories/MetadataCollection";
8
+ import { MetadataCommentTagFactory } from "../factories/MetadataCommentTagFactory";
9
+ import { MetadataFactory } from "../factories/MetadataFactory";
10
+ import { StatementFactory } from "../factories/StatementFactory";
11
+ import { TemplateFactory } from "../factories/TemplateFactory";
12
+ import { TypeFactory } from "../factories/TypeFactory";
13
+
14
+ import { Metadata } from "../schemas/metadata/Metadata";
15
+ import { MetadataArray } from "../schemas/metadata/MetadataArray";
16
+ import { MetadataArrayType } from "../schemas/metadata/MetadataArrayType";
17
+ import { MetadataAtomic } from "../schemas/metadata/MetadataAtomic";
18
+ import { MetadataMap } from "../schemas/metadata/MetadataMap";
19
+ import { MetadataObjectType } from "../schemas/metadata/MetadataObjectType";
20
+ import { MetadataSet } from "../schemas/metadata/MetadataSet";
21
+ import { MetadataTemplate } from "../schemas/metadata/MetadataTemplate";
22
+ import { MetadataTuple } from "../schemas/metadata/MetadataTuple";
23
+ import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
24
+
25
+ import { ITypiaContext } from "../transformers/ITypiaContext";
26
+ import { TransformerError } from "../transformers/TransformerError";
27
+
28
+ import { StringUtil } from "../utils/StringUtil";
29
+
30
+ import { FeatureProgrammer } from "./FeatureProgrammer";
31
+ import { FunctionProgrammer } from "./helpers/FunctionProgrammer";
32
+ import { RandomJoiner } from "./helpers/RandomJoiner";
33
+ import { json_schema_array } from "./internal/json_schema_array";
34
+ import { json_schema_bigint } from "./internal/json_schema_bigint";
35
+ import { json_schema_boolean } from "./internal/json_schema_boolean";
36
+ import { json_schema_number } from "./internal/json_schema_number";
37
+ import { json_schema_string } from "./internal/json_schema_string";
38
+
39
+ export namespace RandomProgrammer {
40
+ export interface IProps {
41
+ context: ITypiaContext;
42
+ modulo: ts.LeftHandSideExpression;
43
+ type: ts.Type;
44
+ name: string | undefined;
45
+ init: ts.Expression | undefined;
46
+ }
47
+ export interface IDecomposeProps {
48
+ context: ITypiaContext;
49
+ functor: FunctionProgrammer;
50
+ type: ts.Type;
51
+ name: string | undefined;
52
+ init: ts.Expression | undefined;
53
+ }
54
+
55
+ export const decompose = (
56
+ props: IDecomposeProps,
57
+ ): FeatureProgrammer.IDecomposed => {
58
+ const collection: MetadataCollection = new MetadataCollection();
59
+ const result = MetadataFactory.analyze({
60
+ checker: props.context.checker,
61
+ transformer: props.context.transformer,
62
+ options: {
63
+ escape: false,
64
+ constant: true,
65
+ absorb: true,
66
+ validate: (meta) => {
67
+ const output: string[] = [];
68
+ if (meta.natives.some((native) => native.name === "WeakSet"))
69
+ output.push(`WeakSet is not supported.`);
70
+ else if (meta.natives.some((native) => native.name === "WeakMap"))
71
+ output.push(`WeakMap is not supported.`);
72
+ return output;
73
+ },
74
+ },
75
+ collection,
76
+ type: props.type,
77
+ });
78
+ if (result.success === false)
79
+ throw TransformerError.from({
80
+ code: props.functor.method,
81
+ errors: result.errors,
82
+ });
83
+
84
+ // GENERATE FUNCTION
85
+ const functions: Record<string, ts.VariableStatement> = Object.fromEntries([
86
+ ...write_object_functions({
87
+ context: props.context,
88
+ functor: props.functor,
89
+ collection,
90
+ }).map((v, i) => [Prefix.object(i), v]),
91
+ ...write_array_functions({
92
+ context: props.context,
93
+ functor: props.functor,
94
+ collection,
95
+ }).map((v, i) => [Prefix.array(i), v]),
96
+ ...write_tuple_functions({
97
+ context: props.context,
98
+ functor: props.functor,
99
+ collection,
100
+ }).map((v, i) => [Prefix.tuple(i), v]),
101
+ ]);
102
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
103
+ undefined,
104
+ undefined,
105
+ [
106
+ IdentifierFactory.parameter(
107
+ "generator",
108
+ ts.factory.createTypeReferenceNode("Partial", [
109
+ props.context.importer.type({
110
+ file: "typia",
111
+ name: "IRandomGenerator",
112
+ }),
113
+ ]),
114
+ props.init ?? ts.factory.createToken(ts.SyntaxKind.QuestionToken),
115
+ ),
116
+ ],
117
+ props.context.importer.type({
118
+ file: "typia",
119
+ name: "Resolved",
120
+ arguments: [
121
+ ts.factory.createTypeReferenceNode(
122
+ props.name ??
123
+ TypeFactory.getFullName({
124
+ checker: props.context.checker,
125
+ type: props.type,
126
+ }),
127
+ ),
128
+ ],
129
+ }),
130
+ undefined,
131
+ ts.factory.createBlock(
132
+ [
133
+ ts.factory.createExpressionStatement(
134
+ ts.factory.createBinaryExpression(
135
+ ts.factory.createIdentifier("_generator"),
136
+ ts.SyntaxKind.EqualsToken,
137
+ ts.factory.createIdentifier("generator"),
138
+ ),
139
+ ),
140
+ ts.factory.createReturnStatement(
141
+ decode({
142
+ context: props.context,
143
+ functor: props.functor,
144
+ explore: {
145
+ function: false,
146
+ recursive: false,
147
+ },
148
+ metadata: result.data,
149
+ }),
150
+ ),
151
+ ],
152
+ true,
153
+ ),
154
+ );
155
+ return {
156
+ functions,
157
+ statements: [
158
+ StatementFactory.mut({
159
+ name: "_generator",
160
+ type: ts.factory.createUnionTypeNode([
161
+ ts.factory.createTypeReferenceNode("Partial", [
162
+ props.context.importer.type({
163
+ file: "typia",
164
+ name: "IRandomGenerator",
165
+ }),
166
+ ]),
167
+ ts.factory.createTypeReferenceNode("undefined"),
168
+ ]),
169
+ }),
170
+ ],
171
+ arrow,
172
+ };
173
+ };
174
+
175
+ export const write = (props: IProps) => {
176
+ const functor: FunctionProgrammer = new FunctionProgrammer(
177
+ props.modulo.getText(),
178
+ );
179
+ const result: FeatureProgrammer.IDecomposed = decompose({
180
+ ...props,
181
+ functor,
182
+ });
183
+ return FeatureProgrammer.writeDecomposed({
184
+ modulo: props.modulo,
185
+ functor,
186
+ result,
187
+ });
188
+ };
189
+
190
+ const write_object_functions = (props: {
191
+ context: ITypiaContext;
192
+ functor: FunctionProgrammer;
193
+ collection: MetadataCollection;
194
+ }): ts.VariableStatement[] =>
195
+ props.collection.objects().map((obj, i) =>
196
+ StatementFactory.constant({
197
+ name: Prefix.object(i),
198
+ value: ts.factory.createArrowFunction(
199
+ undefined,
200
+ undefined,
201
+ [
202
+ IdentifierFactory.parameter(
203
+ "_recursive",
204
+ TypeFactory.keyword("boolean"),
205
+ ts.factory.createIdentifier(String(obj.recursive)),
206
+ ),
207
+ IdentifierFactory.parameter(
208
+ "_depth",
209
+ TypeFactory.keyword("number"),
210
+ ExpressionFactory.number(0),
211
+ ),
212
+ ],
213
+ TypeFactory.keyword("any"),
214
+ undefined,
215
+ RandomJoiner.object({
216
+ decode: (metadata) =>
217
+ decode({
218
+ context: props.context,
219
+ functor: props.functor,
220
+ explore: {
221
+ recursive: obj.recursive,
222
+ function: true,
223
+ },
224
+ metadata,
225
+ }),
226
+ object: obj,
227
+ }),
228
+ ),
229
+ }),
230
+ );
231
+
232
+ const write_array_functions = (props: {
233
+ context: ITypiaContext;
234
+ functor: FunctionProgrammer;
235
+ collection: MetadataCollection;
236
+ }): ts.VariableStatement[] =>
237
+ props.collection
238
+ .arrays()
239
+ .filter((a) => a.recursive)
240
+ .map((array, i) =>
241
+ StatementFactory.constant({
242
+ name: Prefix.array(i),
243
+ value: ts.factory.createArrowFunction(
244
+ undefined,
245
+ undefined,
246
+ [
247
+ IdentifierFactory.parameter(
248
+ "_schema",
249
+ TypeFactory.keyword("boolean"),
250
+ ),
251
+ IdentifierFactory.parameter(
252
+ "_recursive",
253
+ TypeFactory.keyword("boolean"),
254
+ ts.factory.createTrue(),
255
+ ),
256
+ IdentifierFactory.parameter(
257
+ "_depth",
258
+ TypeFactory.keyword("number"),
259
+ ExpressionFactory.number(0),
260
+ ),
261
+ ],
262
+ TypeFactory.keyword("any"),
263
+ undefined,
264
+ RandomJoiner.array({
265
+ decode: (metadata) =>
266
+ decode({
267
+ context: props.context,
268
+ functor: props.functor,
269
+ explore: {
270
+ recursive: true,
271
+ function: true,
272
+ },
273
+ metadata,
274
+ }),
275
+ recursive: true,
276
+ expression: coalesce({
277
+ context: props.context,
278
+ method: "array",
279
+ internal: "randomArray",
280
+ }),
281
+ array,
282
+ schema: undefined,
283
+ }),
284
+ ),
285
+ }),
286
+ );
287
+
288
+ const write_tuple_functions = (props: {
289
+ context: ITypiaContext;
290
+ functor: FunctionProgrammer;
291
+ collection: MetadataCollection;
292
+ }): ts.VariableStatement[] =>
293
+ props.collection
294
+ .tuples()
295
+ .filter((a) => a.recursive)
296
+ .map((tuple, i) =>
297
+ StatementFactory.constant({
298
+ name: Prefix.tuple(i),
299
+ value: ts.factory.createArrowFunction(
300
+ undefined,
301
+ undefined,
302
+ [
303
+ IdentifierFactory.parameter(
304
+ "_recursive",
305
+ TypeFactory.keyword("boolean"),
306
+ ts.factory.createTrue(),
307
+ ),
308
+ IdentifierFactory.parameter(
309
+ "_depth",
310
+ TypeFactory.keyword("number"),
311
+ ExpressionFactory.number(0),
312
+ ),
313
+ ],
314
+ TypeFactory.keyword("any"),
315
+ undefined,
316
+ RandomJoiner.tuple({
317
+ decode: (metadata) =>
318
+ decode({
319
+ context: props.context,
320
+ functor: props.functor,
321
+ explore: {
322
+ function: true,
323
+ recursive: true,
324
+ },
325
+ metadata,
326
+ }),
327
+ elements: tuple.elements,
328
+ }),
329
+ ),
330
+ }),
331
+ );
332
+
333
+ /* -----------------------------------------------------------
334
+ DECODERS
335
+ ----------------------------------------------------------- */
336
+ const decode = (props: {
337
+ context: ITypiaContext;
338
+ functor: FunctionProgrammer;
339
+ explore: IExplore;
340
+ metadata: Metadata;
341
+ }): ts.Expression => {
342
+ const expressions: ts.Expression[] = [];
343
+ if (props.metadata.any === true)
344
+ expressions.push(ts.factory.createStringLiteral("any type used..."));
345
+
346
+ // NULL COALESCING
347
+ if (
348
+ props.metadata.isRequired() === false ||
349
+ props.metadata.functions.length !== 0
350
+ )
351
+ expressions.push(ts.factory.createIdentifier("undefined"));
352
+ if (props.metadata.nullable === true)
353
+ expressions.push(ts.factory.createNull());
354
+
355
+ // CONSTANT TYPES
356
+ for (const constant of props.metadata.constants)
357
+ for (const { value } of constant.values)
358
+ expressions.push(
359
+ constant.type === "boolean"
360
+ ? value === true
361
+ ? ts.factory.createTrue()
362
+ : ts.factory.createFalse()
363
+ : constant.type === "bigint"
364
+ ? ExpressionFactory.bigint(value as bigint)
365
+ : constant.type === "number"
366
+ ? ExpressionFactory.number(value as number)
367
+ : ts.factory.createStringLiteral(value as string),
368
+ );
369
+
370
+ // ATOMIC VARIABLES
371
+ for (const template of props.metadata.templates)
372
+ expressions.push(
373
+ decode_template({
374
+ ...props,
375
+ template,
376
+ }),
377
+ );
378
+ for (const atomic of props.metadata.atomics)
379
+ expressions.push(
380
+ ...decode_atomic({
381
+ context: props.context,
382
+ atomic,
383
+ }),
384
+ );
385
+
386
+ // INSTANCE TYPES
387
+ if (props.metadata.escaped)
388
+ expressions.push(
389
+ decode({
390
+ ...props,
391
+ metadata: props.metadata.escaped.returns,
392
+ }),
393
+ );
394
+ for (const array of props.metadata.arrays)
395
+ expressions.push(
396
+ ...decode_array({
397
+ ...props,
398
+ array,
399
+ }),
400
+ );
401
+ for (const tuple of props.metadata.tuples)
402
+ expressions.push(
403
+ decode_tuple({
404
+ ...props,
405
+ tuple,
406
+ }),
407
+ );
408
+ for (const object of props.metadata.objects)
409
+ expressions.push(
410
+ decode_object({
411
+ ...props,
412
+ object: object.type,
413
+ }),
414
+ );
415
+ for (const native of props.metadata.natives)
416
+ expressions.push(
417
+ decode_native({
418
+ context: props.context,
419
+ functor: props.functor,
420
+ explore: props.explore,
421
+ name: native.name,
422
+ }),
423
+ );
424
+ for (const set of props.metadata.sets)
425
+ expressions.push(
426
+ decode_set({
427
+ ...props,
428
+ set,
429
+ }),
430
+ );
431
+ for (const entry of props.metadata.maps)
432
+ expressions.push(
433
+ decode_map({
434
+ ...props,
435
+ map: entry,
436
+ }),
437
+ );
438
+
439
+ // PICK UP A TYPE
440
+ if (expressions.length === 1) return expressions[0]!;
441
+ return ts.factory.createCallExpression(
442
+ ts.factory.createCallExpression(
443
+ props.context.importer.internal("randomPick"),
444
+ undefined,
445
+ [
446
+ ts.factory.createArrayLiteralExpression(
447
+ expressions.map((expr) =>
448
+ ts.factory.createArrowFunction(
449
+ undefined,
450
+ undefined,
451
+ [],
452
+ undefined,
453
+ undefined,
454
+ expr,
455
+ ),
456
+ ),
457
+ true,
458
+ ),
459
+ ],
460
+ ),
461
+ undefined,
462
+ undefined,
463
+ );
464
+ };
465
+
466
+ const decode_atomic = (props: {
467
+ context: ITypiaContext;
468
+ atomic: MetadataAtomic;
469
+ }) => {
470
+ const schemaList: OpenApi.IJsonSchema[] =
471
+ props.atomic.type === "boolean"
472
+ ? json_schema_boolean(props.atomic)
473
+ : props.atomic.type === "string"
474
+ ? json_schema_string(props.atomic)
475
+ : props.atomic.type === "bigint"
476
+ ? json_schema_bigint(props.atomic)
477
+ : json_schema_number(props.atomic);
478
+ return schemaList.map((schema) => {
479
+ interface IComposed {
480
+ method: string;
481
+ internal: string;
482
+ arguments: ts.Expression[];
483
+ }
484
+ const composed = ((): IComposed => {
485
+ if (props.atomic.type === "string") {
486
+ const string: OpenApi.IJsonSchema.IString =
487
+ schema as OpenApi.IJsonSchema.IString;
488
+ if (string.format !== undefined) {
489
+ const format: string = string.format!;
490
+ if (format === "date-time")
491
+ return {
492
+ method: "datetime",
493
+ internal: "randomFormatDatetime",
494
+ arguments: [],
495
+ };
496
+ return {
497
+ method: format
498
+ .split("-")
499
+ .map((s, i) => (i === 0 ? s : StringUtil.capitalize(s)))
500
+ .join(""),
501
+ internal: `randomFormat${format
502
+ .split("-")
503
+ .map(StringUtil.capitalize)
504
+ .join("")}`,
505
+ arguments: [],
506
+ };
507
+ } else if (string.pattern !== undefined)
508
+ return {
509
+ method: "pattern",
510
+ internal: "randomPattern",
511
+ arguments: [
512
+ ts.factory.createNewExpression(
513
+ ts.factory.createIdentifier("RegExp"),
514
+ undefined,
515
+ [
516
+ ts.factory.createStringLiteral(
517
+ (schema as OpenApi.IJsonSchema.IString).pattern!,
518
+ ),
519
+ ],
520
+ ),
521
+ ],
522
+ };
523
+ } else if (props.atomic.type === "number") {
524
+ const number:
525
+ | OpenApi.IJsonSchema.INumber
526
+ | OpenApi.IJsonSchema.IInteger = schema as
527
+ | OpenApi.IJsonSchema.INumber
528
+ | OpenApi.IJsonSchema.IInteger;
529
+ if (number.type === "integer")
530
+ return {
531
+ method: "integer",
532
+ internal: "randomInteger",
533
+ arguments: [LiteralFactory.write(schema)],
534
+ };
535
+ } else if (props.atomic.type === "boolean")
536
+ return {
537
+ method: props.atomic.type,
538
+ internal: "randomBoolean",
539
+ arguments: [],
540
+ };
541
+ return {
542
+ method: props.atomic.type,
543
+ internal: `random${StringUtil.capitalize(props.atomic.type)}`,
544
+ arguments: [LiteralFactory.write(schema)],
545
+ };
546
+ })();
547
+ return ts.factory.createCallExpression(
548
+ ExpressionFactory.coalesce(
549
+ ts.factory.createPropertyAccessChain(
550
+ ts.factory.createIdentifier("_generator"),
551
+ ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
552
+ ts.factory.createIdentifier(composed.method),
553
+ ),
554
+ props.context.importer.internal(composed.internal),
555
+ ),
556
+ undefined,
557
+ composed.arguments,
558
+ );
559
+ });
560
+ };
561
+
562
+ const decode_template = (props: {
563
+ context: ITypiaContext;
564
+ functor: FunctionProgrammer;
565
+ explore: IExplore;
566
+ template: MetadataTemplate;
567
+ }) =>
568
+ TemplateFactory.generate(
569
+ props.template.row.map((metadata) =>
570
+ decode({
571
+ ...props,
572
+ metadata,
573
+ }),
574
+ ),
575
+ );
576
+
577
+ const decode_array = (props: {
578
+ context: ITypiaContext;
579
+ functor: FunctionProgrammer;
580
+ explore: IExplore;
581
+ array: MetadataArray;
582
+ }): ts.Expression[] => {
583
+ const components: OpenApi.IComponents = {};
584
+ const schemaList: OpenApi.IJsonSchema.IArray[] = json_schema_array({
585
+ components,
586
+ array: props.array,
587
+ }) as OpenApi.IJsonSchema.IArray[];
588
+ if (props.array.type.recursive)
589
+ return schemaList.map((schema) =>
590
+ ts.factory.createCallExpression(
591
+ ts.factory.createIdentifier(
592
+ props.functor.useLocal(Prefix.array(props.array.type.index!)),
593
+ ),
594
+ undefined,
595
+ [
596
+ ts.factory.createObjectLiteralExpression(
597
+ Object.entries(schema)
598
+ .filter(([key]) => key !== "items")
599
+ .map(([key, value]) =>
600
+ ts.factory.createPropertyAssignment(
601
+ key,
602
+ LiteralFactory.write(value),
603
+ ),
604
+ ),
605
+ true,
606
+ ),
607
+ ],
608
+ ),
609
+ );
610
+ return schemaList.map((schema) =>
611
+ RandomJoiner.array({
612
+ decode: (metadata) =>
613
+ decode({
614
+ ...props,
615
+ metadata,
616
+ }),
617
+ expression: coalesce({
618
+ context: props.context,
619
+ method: "array",
620
+ internal: "randomArray",
621
+ }),
622
+ array: props.array.type,
623
+ recursive: props.explore.recursive,
624
+ schema,
625
+ }),
626
+ );
627
+ };
628
+
629
+ const decode_tuple = (props: {
630
+ context: ITypiaContext;
631
+ functor: FunctionProgrammer;
632
+ explore: IExplore;
633
+ tuple: MetadataTuple;
634
+ }): ts.Expression =>
635
+ props.tuple.type.recursive
636
+ ? ts.factory.createCallExpression(
637
+ ts.factory.createIdentifier(
638
+ props.functor.useLocal(Prefix.tuple(props.tuple.type.index!)),
639
+ ),
640
+ undefined,
641
+ [
642
+ ts.factory.createTrue(),
643
+ props.explore.recursive
644
+ ? ts.factory.createAdd(
645
+ ExpressionFactory.number(1),
646
+ ts.factory.createIdentifier("_depth"),
647
+ )
648
+ : ExpressionFactory.number(0),
649
+ ],
650
+ )
651
+ : RandomJoiner.tuple({
652
+ decode: (metadata) =>
653
+ decode({
654
+ ...props,
655
+ metadata,
656
+ }),
657
+ elements: props.tuple.type.elements,
658
+ });
659
+
660
+ const decode_object = (props: {
661
+ functor: FunctionProgrammer;
662
+ explore: IExplore;
663
+ object: MetadataObjectType;
664
+ }) =>
665
+ ts.factory.createCallExpression(
666
+ ts.factory.createIdentifier(
667
+ props.functor.useLocal(Prefix.object(props.object.index)),
668
+ ),
669
+ undefined,
670
+ props.explore.function
671
+ ? [
672
+ props.explore.recursive
673
+ ? ts.factory.createTrue()
674
+ : ts.factory.createIdentifier("_recursive"),
675
+ ts.factory.createConditionalExpression(
676
+ ts.factory.createIdentifier("_recursive"),
677
+ undefined,
678
+ ts.factory.createAdd(
679
+ ExpressionFactory.number(1),
680
+ ts.factory.createIdentifier("_depth"),
681
+ ),
682
+ undefined,
683
+ ts.factory.createIdentifier("_depth"),
684
+ ),
685
+ ]
686
+ : undefined,
687
+ );
688
+
689
+ /* -----------------------------------------------------------
690
+ NATIVE CLASSES
691
+ ----------------------------------------------------------- */
692
+ const decode_set = (props: {
693
+ context: ITypiaContext;
694
+ functor: FunctionProgrammer;
695
+ explore: IExplore;
696
+ set: MetadataSet;
697
+ }) =>
698
+ ts.factory.createNewExpression(
699
+ ts.factory.createIdentifier("Set"),
700
+ undefined,
701
+ [
702
+ decode_array({
703
+ ...props,
704
+ array: MetadataArray.create({
705
+ tags: [],
706
+ type: MetadataArrayType.create({
707
+ value: props.set.value,
708
+ recursive: false,
709
+ index: null,
710
+ nullables: [],
711
+ name: props.set.getName(),
712
+ }),
713
+ }),
714
+ })[0]!,
715
+ ],
716
+ );
717
+
718
+ const decode_map = (props: {
719
+ context: ITypiaContext;
720
+ functor: FunctionProgrammer;
721
+ explore: IExplore;
722
+ map: MetadataMap;
723
+ }) =>
724
+ ts.factory.createNewExpression(
725
+ ts.factory.createIdentifier("Map"),
726
+ undefined,
727
+ [
728
+ decode_array({
729
+ ...props,
730
+ array: MetadataArray.create({
731
+ tags: [],
732
+ type: MetadataArrayType.create({
733
+ name: props.map.getName(),
734
+ index: null,
735
+ recursive: false,
736
+ nullables: [],
737
+ value: Metadata.create({
738
+ ...Metadata.initialize(),
739
+ tuples: [
740
+ (() => {
741
+ const type = MetadataTupleType.create({
742
+ name: `[${props.map.key.getName()}, ${props.map.value.getName()}]`,
743
+ index: null,
744
+ recursive: false,
745
+ nullables: [],
746
+ elements: [props.map.key, props.map.value],
747
+ });
748
+ type.of_map = true;
749
+ return MetadataTuple.create({
750
+ type,
751
+ tags: [],
752
+ });
753
+ })(),
754
+ ],
755
+ }),
756
+ }),
757
+ }),
758
+ })[0]!,
759
+ ],
760
+ );
761
+
762
+ const decode_native = (props: {
763
+ context: ITypiaContext;
764
+ functor: FunctionProgrammer;
765
+ explore: IExplore;
766
+ name: string;
767
+ }): ts.Expression => {
768
+ if (
769
+ props.name === "Boolean" ||
770
+ props.name === "Number" ||
771
+ props.name === "BigInt" ||
772
+ props.name === "String"
773
+ )
774
+ return decode_atomic({
775
+ context: props.context,
776
+ atomic: MetadataAtomic.create({
777
+ type: props.name.toLowerCase() as "string",
778
+ tags: [],
779
+ }),
780
+ })[0]!;
781
+ else if (props.name === "Date") return decode_native_date(props.context);
782
+ else if (
783
+ props.name === "Uint8Array" ||
784
+ props.name === "Uint8ClampedArray" ||
785
+ props.name === "Uint16Array" ||
786
+ props.name === "Uint32Array" ||
787
+ props.name === "BigUint64Array" ||
788
+ props.name === "Int8Array" ||
789
+ props.name === "Int16Array" ||
790
+ props.name === "Int32Array" ||
791
+ props.name === "BigInt64Array" ||
792
+ props.name === "Float32Array" ||
793
+ props.name === "Float64Array"
794
+ )
795
+ return decode_native_byte_array({
796
+ ...props,
797
+ name: props.name,
798
+ });
799
+ else if (props.name === "ArrayBuffer" || props.name === "SharedArrayBuffer")
800
+ return decode_native_array_buffer({
801
+ ...props,
802
+ name: props.name,
803
+ });
804
+ else if (props.name === "DataView") return decode_native_data_view(props);
805
+ else if (props.name === "Blob") return decode_native_blob(props);
806
+ else if (props.name === "File") return decode_native_file(props);
807
+ else if (props.name === "RegExp") return decode_regexp(props.context);
808
+ else
809
+ return ts.factory.createNewExpression(
810
+ ts.factory.createIdentifier(props.name),
811
+ undefined,
812
+ [],
813
+ );
814
+ };
815
+
816
+ const decode_native_date = (context: ITypiaContext) =>
817
+ ts.factory.createNewExpression(
818
+ ts.factory.createIdentifier("Date"),
819
+ undefined,
820
+ [
821
+ ts.factory.createCallExpression(
822
+ coalesce({
823
+ context,
824
+ method: "datetime",
825
+ internal: "randomFormatDatetime",
826
+ }),
827
+ undefined,
828
+ [],
829
+ ),
830
+ ],
831
+ );
832
+
833
+ const decode_native_byte_array = (props: {
834
+ context: ITypiaContext;
835
+ functor: FunctionProgrammer;
836
+ explore: IExplore;
837
+ name:
838
+ | "Uint8Array"
839
+ | "Uint8ClampedArray"
840
+ | "Uint16Array"
841
+ | "Uint32Array"
842
+ | "BigUint64Array"
843
+ | "Int8Array"
844
+ | "Int16Array"
845
+ | "Int32Array"
846
+ | "BigInt64Array"
847
+ | "Float32Array"
848
+ | "Float64Array";
849
+ }): ts.Expression => {
850
+ new BigInt64Array();
851
+ const [type, minimum, maximum]: [string, number, number] = (() => {
852
+ if (props.name === "Uint8Array" || props.name === "Uint8ClampedArray")
853
+ return ["uint32", 0, 255];
854
+ else if (props.name === "Uint16Array") return ["uint32", 0, 65535];
855
+ else if (props.name === "Uint32Array") return ["uint32", 0, 4294967295];
856
+ else if (props.name === "BigUint64Array")
857
+ return ["uint64", 0, 18446744073709551615];
858
+ else if (props.name === "Int8Array") return ["int32", -128, 127];
859
+ else if (props.name === "Int16Array") return ["int32", -32768, 32767];
860
+ else if (props.name === "Int32Array")
861
+ return ["int32", -2147483648, 2147483647];
862
+ else if (props.name === "BigInt64Array")
863
+ return ["uint64", -9223372036854775808, 9223372036854775807];
864
+ else if (props.name === "Float32Array")
865
+ return ["float", -1.175494351e38, 3.4028235e38];
866
+ return ["double", Number.MIN_VALUE, Number.MAX_VALUE];
867
+ })();
868
+ const atomic: "bigint" | "number" =
869
+ props.name === "BigInt64Array" || props.name === "BigUint64Array"
870
+ ? "bigint"
871
+ : "number";
872
+ const value: Metadata = Metadata.create({
873
+ ...Metadata.initialize(),
874
+ atomics: [
875
+ MetadataAtomic.create({
876
+ type: atomic,
877
+ tags: [
878
+ [
879
+ ...MetadataCommentTagFactory.get({
880
+ kind: "type",
881
+ type: atomic,
882
+ value: type,
883
+ }),
884
+ ...MetadataCommentTagFactory.get({
885
+ kind: "minimum",
886
+ type: "number",
887
+ value: minimum.toString(),
888
+ }),
889
+ ...MetadataCommentTagFactory.get({
890
+ kind: "maximum",
891
+ type: "number",
892
+ value: maximum.toString(),
893
+ }),
894
+ ],
895
+ ],
896
+ }),
897
+ ],
898
+ });
899
+ return ts.factory.createNewExpression(
900
+ ts.factory.createIdentifier(props.name),
901
+ [],
902
+ decode_array({
903
+ context: props.context,
904
+ functor: props.functor,
905
+ explore: props.explore,
906
+ array: MetadataArray.create({
907
+ tags: [],
908
+ type: MetadataArrayType.create({
909
+ name: `${props.name}<${atomic}>`,
910
+ value,
911
+ recursive: false,
912
+ index: null,
913
+ nullables: [],
914
+ }),
915
+ }),
916
+ }),
917
+ );
918
+ };
919
+
920
+ const decode_native_blob = (props: {
921
+ context: ITypiaContext;
922
+ functor: FunctionProgrammer;
923
+ explore: IExplore;
924
+ }) =>
925
+ ts.factory.createNewExpression(
926
+ ts.factory.createIdentifier("Blob"),
927
+ undefined,
928
+ [
929
+ ts.factory.createArrayLiteralExpression(
930
+ [
931
+ decode_native_byte_array({
932
+ context: props.context,
933
+ functor: props.functor,
934
+ explore: props.explore,
935
+ name: "Uint8Array",
936
+ }),
937
+ ],
938
+ true,
939
+ ),
940
+ ],
941
+ );
942
+
943
+ const decode_native_file = (props: {
944
+ context: ITypiaContext;
945
+ functor: FunctionProgrammer;
946
+ explore: IExplore;
947
+ }) =>
948
+ ts.factory.createNewExpression(
949
+ ts.factory.createIdentifier("File"),
950
+ undefined,
951
+ [
952
+ ts.factory.createArrayLiteralExpression(
953
+ [
954
+ decode_native_byte_array({
955
+ context: props.context,
956
+ functor: props.functor,
957
+ explore: props.explore,
958
+ name: "Uint8Array",
959
+ }),
960
+ ],
961
+ true,
962
+ ),
963
+ ts.factory.createTemplateExpression(ts.factory.createTemplateHead(""), [
964
+ ts.factory.createTemplateSpan(
965
+ writeRangedString({
966
+ context: props.context,
967
+ minLength: 1,
968
+ maxLength: 8,
969
+ }),
970
+ ts.factory.createTemplateMiddle("."),
971
+ ),
972
+ ts.factory.createTemplateSpan(
973
+ writeRangedString({
974
+ context: props.context,
975
+ minLength: 3,
976
+ maxLength: 3,
977
+ }),
978
+ ts.factory.createTemplateTail(""),
979
+ ),
980
+ ]),
981
+ ],
982
+ );
983
+
984
+ const decode_native_array_buffer = (props: {
985
+ context: ITypiaContext;
986
+ functor: FunctionProgrammer;
987
+ explore: IExplore;
988
+ name: "ArrayBuffer" | "SharedArrayBuffer";
989
+ }): ts.Expression =>
990
+ props.name === "ArrayBuffer"
991
+ ? IdentifierFactory.access(
992
+ decode_native_byte_array({
993
+ context: props.context,
994
+ functor: props.functor,
995
+ explore: props.explore,
996
+ name: "Uint8Array",
997
+ }),
998
+ "buffer",
999
+ )
1000
+ : ExpressionFactory.selfCall(
1001
+ ts.factory.createBlock(
1002
+ [
1003
+ StatementFactory.constant({
1004
+ name: "length",
1005
+ value: decode_atomic({
1006
+ context: props.context,
1007
+ atomic: MetadataAtomic.create({
1008
+ type: "number",
1009
+ tags: [
1010
+ MetadataCommentTagFactory.get({
1011
+ type: "number",
1012
+ kind: "type",
1013
+ value: "uint32",
1014
+ }),
1015
+ ],
1016
+ }),
1017
+ })[0]!,
1018
+ }),
1019
+ StatementFactory.constant({
1020
+ name: "buffer",
1021
+ value: ts.factory.createNewExpression(
1022
+ ts.factory.createIdentifier("SharedArrayBuffer"),
1023
+ [],
1024
+ [ts.factory.createIdentifier("length")],
1025
+ ),
1026
+ }),
1027
+ StatementFactory.constant({
1028
+ name: "bytes",
1029
+ value: ts.factory.createNewExpression(
1030
+ ts.factory.createIdentifier("Uint8Array"),
1031
+ [],
1032
+ [ts.factory.createIdentifier("buffer")],
1033
+ ),
1034
+ }),
1035
+ ts.factory.createExpressionStatement(
1036
+ ts.factory.createCallExpression(
1037
+ IdentifierFactory.access(
1038
+ ts.factory.createIdentifier("bytes"),
1039
+ "set",
1040
+ ),
1041
+ undefined,
1042
+ [
1043
+ ts.factory.createCallExpression(
1044
+ ts.factory.createPropertyAccessExpression(
1045
+ ts.factory.createCallExpression(
1046
+ ts.factory.createPropertyAccessExpression(
1047
+ ts.factory.createNewExpression(
1048
+ ts.factory.createIdentifier("Array"),
1049
+ undefined,
1050
+ [ts.factory.createIdentifier("length")],
1051
+ ),
1052
+ ts.factory.createIdentifier("fill"),
1053
+ ),
1054
+ undefined,
1055
+ [ts.factory.createNumericLiteral("0")],
1056
+ ),
1057
+ ts.factory.createIdentifier("map"),
1058
+ ),
1059
+ undefined,
1060
+ [
1061
+ ts.factory.createArrowFunction(
1062
+ undefined,
1063
+ undefined,
1064
+ [],
1065
+ undefined,
1066
+ undefined,
1067
+ decode_atomic({
1068
+ context: props.context,
1069
+ atomic: MetadataAtomic.create({
1070
+ type: "number",
1071
+ tags: [
1072
+ [
1073
+ ...MetadataCommentTagFactory.get({
1074
+ kind: "type",
1075
+ type: "number",
1076
+ value: "uint32",
1077
+ }),
1078
+ ...MetadataCommentTagFactory.get({
1079
+ kind: "minimum",
1080
+ type: "number",
1081
+ value: "0",
1082
+ }),
1083
+ ...MetadataCommentTagFactory.get({
1084
+ kind: "maximum",
1085
+ type: "number",
1086
+ value: "255",
1087
+ }),
1088
+ ],
1089
+ ],
1090
+ }),
1091
+ })[0]!,
1092
+ ),
1093
+ ],
1094
+ ),
1095
+ ExpressionFactory.number(0),
1096
+ ],
1097
+ ),
1098
+ ),
1099
+ ts.factory.createReturnStatement(
1100
+ ts.factory.createIdentifier("buffer"),
1101
+ ),
1102
+ ],
1103
+ true,
1104
+ ),
1105
+ );
1106
+
1107
+ const decode_native_data_view = (props: {
1108
+ context: ITypiaContext;
1109
+ functor: FunctionProgrammer;
1110
+ explore: IExplore;
1111
+ }) =>
1112
+ ts.factory.createNewExpression(
1113
+ ts.factory.createIdentifier("DataView"),
1114
+ [],
1115
+ [
1116
+ IdentifierFactory.access(
1117
+ decode_native_byte_array({
1118
+ context: props.context,
1119
+ functor: props.functor,
1120
+ explore: props.explore,
1121
+ name: "Uint8Array",
1122
+ }),
1123
+ "buffer",
1124
+ ),
1125
+ ],
1126
+ );
1127
+
1128
+ const decode_regexp = (context: ITypiaContext) =>
1129
+ ts.factory.createNewExpression(
1130
+ ts.factory.createIdentifier("RegExp"),
1131
+ [],
1132
+ [
1133
+ ts.factory.createCallExpression(
1134
+ coalesce({
1135
+ context,
1136
+ method: "regex",
1137
+ internal: "randomFormatRegex",
1138
+ }),
1139
+ undefined,
1140
+ undefined,
1141
+ ),
1142
+ ],
1143
+ );
1144
+
1145
+ const writeRangedString = (props: {
1146
+ context: ITypiaContext;
1147
+ minLength: number;
1148
+ maxLength: number;
1149
+ }): ts.CallExpression =>
1150
+ decode_atomic({
1151
+ context: props.context,
1152
+ atomic: MetadataAtomic.create({
1153
+ type: "string",
1154
+ tags: [
1155
+ [
1156
+ ...MetadataCommentTagFactory.get({
1157
+ kind: "minLength",
1158
+ type: "string",
1159
+ value: props.minLength.toString(),
1160
+ }),
1161
+ ...MetadataCommentTagFactory.get({
1162
+ kind: "maxLength",
1163
+ type: "string",
1164
+ value: props.maxLength.toString(),
1165
+ }),
1166
+ ],
1167
+ ],
1168
+ }),
1169
+ })[0]!;
1170
+ }
1171
+
1172
+ const coalesce = (props: {
1173
+ context: ITypiaContext;
1174
+ method: string;
1175
+ internal: string;
1176
+ }): ts.Expression =>
1177
+ ExpressionFactory.coalesce(
1178
+ ts.factory.createPropertyAccessChain(
1179
+ ts.factory.createIdentifier("_generator"),
1180
+ ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
1181
+ ts.factory.createIdentifier(props.method),
1182
+ ),
1183
+ props.context.importer.internal(props.internal),
1184
+ );
1185
+
1186
+ interface IExplore {
1187
+ function: boolean;
1188
+ recursive: boolean;
1189
+ }
1190
+
1191
+ const Prefix = {
1192
+ object: (i: number) => `_ro${i}`,
1193
+ array: (i: number) => `_ra${i}`,
1194
+ tuple: (i: number) => `_rt${i}`,
1195
+ };