typia 13.1.1 → 13.2.0

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 (581) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +44 -0
  4. package/lib/executable/FileSystemIdentity.js +213 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +133 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +272 -106
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +239 -95
  11. package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
  12. package/lib/functional.d.ts +15 -12
  13. package/lib/functional.js.map +1 -1
  14. package/lib/functional.mjs.map +1 -1
  15. package/lib/internal/_ProtobufReader.d.ts +32 -0
  16. package/lib/internal/_ProtobufReader.js +148 -48
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +137 -41
  19. package/lib/internal/_ProtobufReader.mjs.map +1 -1
  20. package/lib/internal/_createStandardSchema.js +18 -1
  21. package/lib/internal/_createStandardSchema.js.map +1 -1
  22. package/lib/internal/_createStandardSchema.mjs +12 -1
  23. package/lib/internal/_createStandardSchema.mjs.map +1 -1
  24. package/lib/internal/_decimal.d.ts +14 -0
  25. package/lib/internal/_decimal.js +61 -0
  26. package/lib/internal/_decimal.js.map +1 -0
  27. package/lib/internal/_decimal.mjs +49 -0
  28. package/lib/internal/_decimal.mjs.map +1 -0
  29. package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
  30. package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
  31. package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
  32. package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
  33. package/lib/internal/_isFormatByte.js +2 -5
  34. package/lib/internal/_isFormatByte.js.map +1 -1
  35. package/lib/internal/_isFormatByte.mjs +2 -5
  36. package/lib/internal/_isFormatByte.mjs.map +1 -1
  37. package/lib/internal/_isFormatDate.js +15 -2
  38. package/lib/internal/_isFormatDate.js.map +1 -1
  39. package/lib/internal/_isFormatDate.mjs +22 -2
  40. package/lib/internal/_isFormatDate.mjs.map +1 -1
  41. package/lib/internal/_isFormatDateTime.js +21 -2
  42. package/lib/internal/_isFormatDateTime.js.map +1 -1
  43. package/lib/internal/_isFormatDateTime.mjs +13 -2
  44. package/lib/internal/_isFormatDateTime.mjs.map +1 -1
  45. package/lib/internal/_isFormatIri.js +3 -2
  46. package/lib/internal/_isFormatIri.js.map +1 -1
  47. package/lib/internal/_isFormatIri.mjs +3 -2
  48. package/lib/internal/_isFormatIri.mjs.map +1 -1
  49. package/lib/internal/_isFormatIriReference.js +10 -2
  50. package/lib/internal/_isFormatIriReference.js.map +1 -1
  51. package/lib/internal/_isFormatIriReference.mjs +9 -2
  52. package/lib/internal/_isFormatIriReference.mjs.map +1 -1
  53. package/lib/internal/_isFormatUriReference.js +1 -1
  54. package/lib/internal/_isFormatUriReference.js.map +1 -1
  55. package/lib/internal/_isFormatUriReference.mjs +1 -1
  56. package/lib/internal/_isFormatUriReference.mjs.map +1 -1
  57. package/lib/internal/_isMultipleOf.d.ts +1 -0
  58. package/lib/internal/_isMultipleOf.js +13 -0
  59. package/lib/internal/_isMultipleOf.js.map +1 -0
  60. package/lib/internal/_isMultipleOf.mjs +12 -0
  61. package/lib/internal/_isMultipleOf.mjs.map +1 -0
  62. package/lib/internal/_isTypeFloat.js +1 -1
  63. package/lib/internal/_isTypeFloat.js.map +1 -1
  64. package/lib/internal/_isTypeFloat.mjs +1 -1
  65. package/lib/internal/_isTypeFloat.mjs.map +1 -1
  66. package/lib/internal/_isTypeInt64.js +1 -0
  67. package/lib/internal/_isTypeInt64.js.map +1 -1
  68. package/lib/internal/_isTypeInt64.mjs.map +1 -1
  69. package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
  70. package/lib/internal/_isTypeInt64Bigint.js +15 -0
  71. package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
  72. package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
  73. package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
  74. package/lib/internal/_isTypeUint64.js +1 -0
  75. package/lib/internal/_isTypeUint64.js.map +1 -1
  76. package/lib/internal/_isTypeUint64.mjs.map +1 -1
  77. package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
  78. package/lib/internal/_isTypeUint64Bigint.js +10 -0
  79. package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
  80. package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
  81. package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
  82. package/lib/internal/_isUniqueItems.js +96 -109
  83. package/lib/internal/_isUniqueItems.js.map +1 -1
  84. package/lib/internal/_isUniqueItems.mjs +62 -50
  85. package/lib/internal/_isUniqueItems.mjs.map +1 -1
  86. package/lib/internal/_jsonStringifyArray.d.ts +1 -0
  87. package/lib/internal/_jsonStringifyArray.js +48 -0
  88. package/lib/internal/_jsonStringifyArray.js.map +1 -0
  89. package/lib/internal/_jsonStringifyArray.mjs +40 -0
  90. package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
  91. package/lib/internal/_jsonStringifyElement.d.ts +1 -0
  92. package/lib/internal/_jsonStringifyElement.js +23 -0
  93. package/lib/internal/_jsonStringifyElement.js.map +1 -0
  94. package/lib/internal/_jsonStringifyElement.mjs +23 -0
  95. package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
  96. package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
  97. package/lib/internal/_jsonStringifyProperty.js +31 -0
  98. package/lib/internal/_jsonStringifyProperty.js.map +1 -0
  99. package/lib/internal/_jsonStringifyProperty.mjs +31 -0
  100. package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
  101. package/lib/internal/_llmApplicationFinalize.js +1 -1
  102. package/lib/internal/_llmApplicationFinalize.js.map +1 -1
  103. package/lib/internal/_llmApplicationFinalize.mjs +1 -1
  104. package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
  105. package/lib/internal/_notationAny.js +8 -1
  106. package/lib/internal/_notationAny.js.map +1 -1
  107. package/lib/internal/_notationAny.mjs +7 -1
  108. package/lib/internal/_notationAny.mjs.map +1 -1
  109. package/lib/internal/_notationAssign.d.ts +1 -0
  110. package/lib/internal/_notationAssign.js +18 -0
  111. package/lib/internal/_notationAssign.js.map +1 -0
  112. package/lib/internal/_notationAssign.mjs +17 -0
  113. package/lib/internal/_notationAssign.mjs.map +1 -0
  114. package/lib/internal/_notationCamel.js +30 -9
  115. package/lib/internal/_notationCamel.js.map +1 -1
  116. package/lib/internal/_notationCamel.mjs +13 -5
  117. package/lib/internal/_notationCamel.mjs.map +1 -1
  118. package/lib/internal/_notationKebab.d.ts +1 -0
  119. package/lib/internal/_notationKebab.js +15 -0
  120. package/lib/internal/_notationKebab.js.map +1 -0
  121. package/lib/internal/_notationKebab.mjs +15 -0
  122. package/lib/internal/_notationKebab.mjs.map +1 -0
  123. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  124. package/lib/internal/_notationKeyCollision.js +8 -0
  125. package/lib/internal/_notationKeyCollision.js.map +1 -0
  126. package/lib/internal/_notationKeyCollision.mjs +8 -0
  127. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  128. package/lib/internal/_notationPascal.js +20 -5
  129. package/lib/internal/_notationPascal.js.map +1 -1
  130. package/lib/internal/_notationPascal.mjs +10 -5
  131. package/lib/internal/_notationPascal.mjs.map +1 -1
  132. package/lib/internal/_notationSnake.js +25 -22
  133. package/lib/internal/_notationSnake.js.map +1 -1
  134. package/lib/internal/_notationSnake.mjs +11 -11
  135. package/lib/internal/_notationSnake.mjs.map +1 -1
  136. package/lib/internal/_plainCloneAny.js +174 -38
  137. package/lib/internal/_plainCloneAny.js.map +1 -1
  138. package/lib/internal/_plainCloneAny.mjs +126 -22
  139. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  140. package/lib/internal/_randomArray.d.ts +1 -1
  141. package/lib/internal/_randomArray.js +11 -4
  142. package/lib/internal/_randomArray.js.map +1 -1
  143. package/lib/internal/_randomArray.mjs +9 -3
  144. package/lib/internal/_randomArray.mjs.map +1 -1
  145. package/lib/internal/_randomFormatByte.d.ts +2 -1
  146. package/lib/internal/_randomFormatByte.js +25 -1
  147. package/lib/internal/_randomFormatByte.js.map +1 -1
  148. package/lib/internal/_randomFormatByte.mjs +20 -1
  149. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  150. package/lib/internal/_randomFormatDate.d.ts +3 -4
  151. package/lib/internal/_randomFormatDate.js +3 -10
  152. package/lib/internal/_randomFormatDate.js.map +1 -1
  153. package/lib/internal/_randomFormatDate.mjs +3 -6
  154. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  155. package/lib/internal/_randomFormatDatetime.d.ts +3 -4
  156. package/lib/internal/_randomFormatDatetime.js +26 -8
  157. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  158. package/lib/internal/_randomFormatDatetime.mjs +17 -6
  159. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  160. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  161. package/lib/internal/_randomFormatDuration.js +23 -14
  162. package/lib/internal/_randomFormatDuration.js.map +1 -1
  163. package/lib/internal/_randomFormatDuration.mjs +22 -13
  164. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  165. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  166. package/lib/internal/_randomFormatEmail.js +8 -1
  167. package/lib/internal/_randomFormatEmail.js.map +1 -1
  168. package/lib/internal/_randomFormatEmail.mjs +5 -1
  169. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  170. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  171. package/lib/internal/_randomFormatHostname.js +45 -2
  172. package/lib/internal/_randomFormatHostname.js.map +1 -1
  173. package/lib/internal/_randomFormatHostname.mjs +38 -2
  174. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  175. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  176. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  177. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  178. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  179. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  180. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  181. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  182. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  183. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  184. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  185. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  186. package/lib/internal/_randomFormatIpv4.js +32 -1
  187. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  188. package/lib/internal/_randomFormatIpv4.mjs +23 -1
  189. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  190. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  191. package/lib/internal/_randomFormatIpv6.js +58 -1
  192. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  193. package/lib/internal/_randomFormatIpv6.mjs +45 -1
  194. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  195. package/lib/internal/_randomFormatIri.d.ts +2 -1
  196. package/lib/internal/_randomFormatIri.js +1 -1
  197. package/lib/internal/_randomFormatIri.js.map +1 -1
  198. package/lib/internal/_randomFormatIri.mjs +1 -1
  199. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  200. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  201. package/lib/internal/_randomFormatIriReference.js +1 -1
  202. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  203. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  204. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  205. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  206. package/lib/internal/_randomFormatJsonPointer.js +20 -1
  207. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  208. package/lib/internal/_randomFormatJsonPointer.mjs +15 -1
  209. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  210. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  211. package/lib/internal/_randomFormatPassword.js +7 -5
  212. package/lib/internal/_randomFormatPassword.js.map +1 -1
  213. package/lib/internal/_randomFormatPassword.mjs +5 -1
  214. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  215. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  216. package/lib/internal/_randomFormatRegex.js +15 -1
  217. package/lib/internal/_randomFormatRegex.js.map +1 -1
  218. package/lib/internal/_randomFormatRegex.mjs +14 -1
  219. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  220. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  221. package/lib/internal/_randomFormatRelativeJsonPointer.js +20 -5
  222. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  223. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -5
  224. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  225. package/lib/internal/_randomFormatTime.d.ts +2 -1
  226. package/lib/internal/_randomFormatTime.js +34 -7
  227. package/lib/internal/_randomFormatTime.js.map +1 -1
  228. package/lib/internal/_randomFormatTime.mjs +37 -4
  229. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  230. package/lib/internal/_randomFormatUri.d.ts +2 -1
  231. package/lib/internal/_randomFormatUri.js +1 -1
  232. package/lib/internal/_randomFormatUri.js.map +1 -1
  233. package/lib/internal/_randomFormatUri.mjs +1 -1
  234. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  235. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  236. package/lib/internal/_randomFormatUriReference.js +1 -1
  237. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  238. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  239. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  240. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  241. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  242. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  243. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  244. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  245. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  246. package/lib/internal/_randomFormatUrl.js +21 -1
  247. package/lib/internal/_randomFormatUrl.js.map +1 -1
  248. package/lib/internal/_randomFormatUrl.mjs +18 -1
  249. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  250. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  251. package/lib/internal/_randomFormatUuid.js +3 -2
  252. package/lib/internal/_randomFormatUuid.js.map +1 -1
  253. package/lib/internal/_randomFormatUuid.mjs +3 -2
  254. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  255. package/lib/internal/_randomInteger.js +59 -28
  256. package/lib/internal/_randomInteger.js.map +1 -1
  257. package/lib/internal/_randomInteger.mjs +56 -16
  258. package/lib/internal/_randomInteger.mjs.map +1 -1
  259. package/lib/internal/_randomMultiple.d.ts +8 -0
  260. package/lib/internal/_randomMultiple.js +168 -0
  261. package/lib/internal/_randomMultiple.js.map +1 -0
  262. package/lib/internal/_randomMultiple.mjs +158 -0
  263. package/lib/internal/_randomMultiple.mjs.map +1 -0
  264. package/lib/internal/_randomNumber.js +42 -42
  265. package/lib/internal/_randomNumber.js.map +1 -1
  266. package/lib/internal/_randomNumber.mjs +41 -27
  267. package/lib/internal/_randomNumber.mjs.map +1 -1
  268. package/lib/internal/_randomPattern.d.ts +2 -1
  269. package/lib/internal/_randomPattern.js +19 -4
  270. package/lib/internal/_randomPattern.js.map +1 -1
  271. package/lib/internal/_randomPattern.mjs +10 -4
  272. package/lib/internal/_randomPattern.mjs.map +1 -1
  273. package/lib/internal/_randomStringLength.d.ts +64 -0
  274. package/lib/internal/_randomStringLength.js +84 -0
  275. package/lib/internal/_randomStringLength.js.map +1 -0
  276. package/lib/internal/_randomStringLength.mjs +79 -0
  277. package/lib/internal/_randomStringLength.mjs.map +1 -0
  278. package/lib/internal/_stringLength.d.ts +1 -0
  279. package/lib/internal/_stringLength.js +11 -0
  280. package/lib/internal/_stringLength.js.map +1 -0
  281. package/lib/internal/_stringLength.mjs +10 -0
  282. package/lib/internal/_stringLength.mjs.map +1 -0
  283. package/lib/internal/_validateReport.js +4 -1
  284. package/lib/internal/_validateReport.js.map +1 -1
  285. package/lib/internal/_validateReport.mjs +2 -1
  286. package/lib/internal/_validateReport.mjs.map +1 -1
  287. package/lib/internal/private/__notationRename.d.ts +14 -0
  288. package/lib/internal/private/__notationRename.js +25 -0
  289. package/lib/internal/private/__notationRename.js.map +1 -0
  290. package/lib/internal/private/__notationRename.mjs +24 -0
  291. package/lib/internal/private/__notationRename.mjs.map +1 -0
  292. package/lib/internal/private/__randomComposition.d.ts +23 -0
  293. package/lib/internal/private/__randomComposition.js +48 -0
  294. package/lib/internal/private/__randomComposition.js.map +1 -0
  295. package/lib/internal/private/__randomComposition.mjs +54 -0
  296. package/lib/internal/private/__randomComposition.mjs.map +1 -0
  297. package/lib/internal/private/__randomEpoch.d.ts +19 -0
  298. package/lib/internal/private/__randomEpoch.js +31 -0
  299. package/lib/internal/private/__randomEpoch.js.map +1 -0
  300. package/lib/internal/private/__randomEpoch.mjs +28 -0
  301. package/lib/internal/private/__randomEpoch.mjs.map +1 -0
  302. package/lib/json.d.ts +2 -2
  303. package/lib/json.mjs.map +1 -1
  304. package/lib/module.d.ts +2 -2
  305. package/lib/module.js.map +1 -1
  306. package/lib/module.mjs.map +1 -1
  307. package/lib/notations.d.ts +20 -4
  308. package/lib/notations.js.map +1 -1
  309. package/lib/notations.mjs.map +1 -1
  310. package/native/adapter/plugin_options.go +117 -0
  311. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  312. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  313. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  314. package/native/cmd/ttsc-typia/build.go +84 -64
  315. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  316. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  317. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  318. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  319. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  320. package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
  321. package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
  322. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  323. package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
  324. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  325. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  326. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  327. package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
  328. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  329. package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
  330. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  331. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  332. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  333. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  334. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  335. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  336. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  337. package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
  338. package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
  339. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  340. package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
  341. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  342. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  343. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  344. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  345. package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
  346. package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
  347. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  348. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  349. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  350. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  351. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  352. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  353. package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
  354. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  355. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  356. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  357. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  358. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  359. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  360. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  361. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  362. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  363. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  364. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  365. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  366. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  367. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  368. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  369. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  370. package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
  371. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  372. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  373. package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
  374. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  375. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  376. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  377. package/native/cmd/ttsc-typia/transform.go +251 -39
  378. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  379. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  380. package/native/cmd/ttsc-typia/transform_helpers_test.go +236 -3
  381. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  382. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  383. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  384. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  385. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  386. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  387. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  388. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  389. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  390. package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
  391. package/native/core/factories/FormatCheatSheet.go +40 -7
  392. package/native/core/factories/IdentifierFactory.go +131 -4
  393. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  394. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  395. package/native/core/factories/NumericRangeFactory.go +60 -17
  396. package/native/core/factories/ProtobufFactory.go +13 -5
  397. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  398. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  399. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  400. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  401. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  402. package/native/core/factories/internal/metadata/MetadataHelper.go +226 -17
  403. package/native/core/factories/internal/metadata/emplace_metadata_object.go +141 -8
  404. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  405. package/native/core/factories/internal/metadata/iterate_metadata_function.go +5 -12
  406. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +111 -29
  407. package/native/core/factories/internal/metadata/iterate_metadata_map.go +5 -0
  408. package/native/core/factories/internal/metadata/iterate_metadata_native.go +45 -2
  409. package/native/core/factories/internal/metadata/iterate_metadata_set.go +5 -0
  410. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  411. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  412. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  413. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  414. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  415. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  416. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  417. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  418. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  419. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  420. package/native/core/programmers/IsProgrammer.go +15 -1
  421. package/native/core/programmers/RandomProgrammer.go +51 -14
  422. package/native/core/programmers/compare/CompareEqualProgrammer.go +410 -8
  423. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  424. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  425. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  426. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  427. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  428. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  429. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  430. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  431. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  432. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  433. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  434. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  435. package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
  436. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  437. package/native/core/programmers/helpers/StringifyJoinder.go +161 -51
  438. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  439. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -118
  440. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  441. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  442. package/native/core/programmers/iterate/check_template.go +344 -32
  443. package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
  444. package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
  445. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  446. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  447. package/native/core/programmers/iterate/json_schema_object.go +49 -7
  448. package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
  449. package/native/core/programmers/iterate/openapi_v3_downgrader.go +674 -0
  450. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  451. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  452. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  453. package/native/core/programmers/iterate/template_runtime_pattern.go +63 -7
  454. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  455. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  456. package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
  457. package/native/core/programmers/llm/LlmApplicationProgrammer.go +21 -11
  458. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  459. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  460. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  461. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  462. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  463. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  464. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  465. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  466. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  467. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  468. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  469. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +41 -22
  470. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  471. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  472. package/native/core/schemas/metadata/MetadataCollection.go +266 -25
  473. package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
  474. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  475. package/native/core/schemas/metadata/MetadataObjectType.go +24 -22
  476. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  477. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  478. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  479. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  480. package/native/core/utils/PatternUtil.go +13 -0
  481. package/native/core/utils/PromiseTypeFactory.go +59 -0
  482. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  483. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  484. package/native/go.mod +9 -1
  485. package/native/transform/CallExpressionTransformer.go +12 -0
  486. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  487. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  488. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  489. package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
  490. package/package.json +12 -4
  491. package/src/executable/FileSystemIdentity.ts +222 -0
  492. package/src/executable/TypiaGenerateWizard.ts +386 -113
  493. package/src/functional.ts +30 -60
  494. package/src/internal/_ProtobufReader.ts +161 -46
  495. package/src/internal/_createStandardSchema.ts +15 -1
  496. package/src/internal/_decimal.ts +69 -0
  497. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  498. package/src/internal/_isFormatByte.ts +2 -5
  499. package/src/internal/_isFormatDate.ts +15 -2
  500. package/src/internal/_isFormatDateTime.ts +28 -2
  501. package/src/internal/_isFormatIri.ts +5 -2
  502. package/src/internal/_isFormatIriReference.ts +11 -3
  503. package/src/internal/_isFormatUriReference.ts +1 -1
  504. package/src/internal/_isMultipleOf.ts +8 -0
  505. package/src/internal/_isTypeFloat.ts +1 -1
  506. package/src/internal/_isTypeInt64.ts +1 -0
  507. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  508. package/src/internal/_isTypeUint64.ts +1 -0
  509. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  510. package/src/internal/_isUniqueItems.ts +134 -132
  511. package/src/internal/_jsonStringifyArray.ts +50 -0
  512. package/src/internal/_jsonStringifyElement.ts +19 -0
  513. package/src/internal/_jsonStringifyProperty.ts +30 -0
  514. package/src/internal/_llmApplicationFinalize.ts +6 -1
  515. package/src/internal/_notationAny.ts +9 -4
  516. package/src/internal/_notationAssign.ts +20 -0
  517. package/src/internal/_notationCamel.ts +31 -10
  518. package/src/internal/_notationKebab.ts +11 -0
  519. package/src/internal/_notationKeyCollision.ts +9 -0
  520. package/src/internal/_notationPascal.ts +19 -6
  521. package/src/internal/_notationSnake.ts +24 -21
  522. package/src/internal/_plainCloneAny.ts +208 -33
  523. package/src/internal/_randomArray.ts +13 -4
  524. package/src/internal/_randomFormatByte.ts +31 -1
  525. package/src/internal/_randomFormatDate.ts +6 -17
  526. package/src/internal/_randomFormatDatetime.ts +34 -15
  527. package/src/internal/_randomFormatDuration.ts +30 -13
  528. package/src/internal/_randomFormatEmail.ts +8 -2
  529. package/src/internal/_randomFormatHostname.ts +48 -1
  530. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  531. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  532. package/src/internal/_randomFormatIpv4.ts +43 -2
  533. package/src/internal/_randomFormatIpv6.ts +67 -2
  534. package/src/internal/_randomFormatIri.ts +3 -1
  535. package/src/internal/_randomFormatIriReference.ts +3 -1
  536. package/src/internal/_randomFormatJsonPointer.ts +28 -2
  537. package/src/internal/_randomFormatPassword.ts +11 -6
  538. package/src/internal/_randomFormatRegex.ts +22 -1
  539. package/src/internal/_randomFormatRelativeJsonPointer.ts +26 -6
  540. package/src/internal/_randomFormatTime.ts +46 -10
  541. package/src/internal/_randomFormatUri.ts +3 -1
  542. package/src/internal/_randomFormatUriReference.ts +3 -1
  543. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  544. package/src/internal/_randomFormatUrl.ts +25 -2
  545. package/src/internal/_randomFormatUuid.ts +10 -6
  546. package/src/internal/_randomInteger.ts +87 -40
  547. package/src/internal/_randomMultiple.ts +245 -0
  548. package/src/internal/_randomNumber.ts +72 -55
  549. package/src/internal/_randomPattern.ts +29 -4
  550. package/src/internal/_randomStringLength.ts +116 -0
  551. package/src/internal/_stringLength.ts +5 -0
  552. package/src/internal/_validateReport.ts +5 -1
  553. package/src/internal/private/__notationRename.ts +21 -0
  554. package/src/internal/private/__randomComposition.ts +50 -0
  555. package/src/internal/private/__randomEpoch.ts +34 -0
  556. package/src/json.ts +2 -2
  557. package/src/module.ts +4 -6
  558. package/src/notations.ts +20 -4
  559. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  560. package/lib/internal/private/__notationCapitalize.js +0 -6
  561. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  562. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  563. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  564. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  565. package/lib/internal/private/__notationUnsnake.js +0 -26
  566. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  567. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  568. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  569. package/native/adapter/visit.go +0 -173
  570. package/native/adapter/visit_property_chain_edges_test.go +0 -129
  571. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  572. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  573. package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
  574. package/native/core/programmers/iterate/check_union_array_like.go +0 -422
  575. package/native/core/programmers/iterate/prune_object_properties.go +0 -105
  576. package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
  577. package/native/core/programmers/iterate/stringify_native.go +0 -14
  578. package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
  579. package/native/core/schemas/metadata/MetadataApplication.go +0 -41
  580. package/src/internal/private/__notationCapitalize.ts +0 -2
  581. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -0,0 +1,245 @@
1
+ import {
2
+ _IDecimal,
3
+ _IDecimalRatio,
4
+ _decimalDecompose,
5
+ _decimalDivide,
6
+ _decimalGcd,
7
+ _decimalIntegerStep,
8
+ _decimalPower,
9
+ _decimalToNumber,
10
+ } from "./_decimal";
11
+ import { _isMultipleOf } from "./_isMultipleOf";
12
+
13
+ export const _randomMultiple = (props: {
14
+ minimum: number;
15
+ maximum: number;
16
+ multipleOf: number;
17
+ exclusiveMinimum: boolean;
18
+ exclusiveMaximum: boolean;
19
+ integer: boolean;
20
+ }): number => {
21
+ const step: _IDecimal | null = props.integer
22
+ ? _decimalIntegerStep(props.multipleOf)
23
+ : _decimalDecompose(props.multipleOf);
24
+ if (step === null || step.coefficient <= BigInt(0))
25
+ throw new Error("The multipleOf value must be a positive finite number.");
26
+
27
+ const lower: _IDecimalRatio | null = _decimalDivide(props.minimum, step);
28
+ const upper: _IDecimalRatio | null = _decimalDivide(props.maximum, step);
29
+ if (lower === null || upper === null)
30
+ throw new Error("The random number range must be finite.");
31
+ const minimum: bigint = lowerBound(lower, props.exclusiveMinimum);
32
+ const maximum: bigint = upperBound(upper, props.exclusiveMaximum);
33
+ if (minimum > maximum)
34
+ throw new Error("The range does not contain a multipleOf value.");
35
+
36
+ const selected: bigint = randomBigint(minimum, maximum);
37
+ const candidates: bigint[] = unique([
38
+ selected,
39
+ minimum,
40
+ maximum,
41
+ clamp(BigInt(0), minimum, maximum),
42
+ clamp(BigInt(1), minimum, maximum),
43
+ clamp(BigInt(-1), minimum, maximum),
44
+ ...nearby(selected, minimum, maximum),
45
+ ]);
46
+ for (const coefficient of candidates) {
47
+ const value: number = _decimalToNumber({
48
+ coefficient: step.coefficient * coefficient,
49
+ exponent: step.exponent,
50
+ });
51
+ if (isValid(props, value)) return value;
52
+ }
53
+ const aligned: number | null = findRepresentableIntegerMultiple(props);
54
+ if (aligned !== null) return aligned;
55
+ const decimalAligned: number | null = findRepresentableDecimalMultiple(
56
+ props,
57
+ step,
58
+ );
59
+ if (decimalAligned !== null) return decimalAligned;
60
+ throw new Error(
61
+ "The range does not contain a representable multipleOf value.",
62
+ );
63
+ };
64
+
65
+ const isValid = (
66
+ props: Parameters<typeof _randomMultiple>[0],
67
+ value: number,
68
+ ): boolean =>
69
+ Number.isFinite(value) &&
70
+ (props.integer === false || Number.isInteger(value)) &&
71
+ (props.exclusiveMinimum ? value > props.minimum : value >= props.minimum) &&
72
+ (props.exclusiveMaximum ? value < props.maximum : value <= props.maximum) &&
73
+ _isMultipleOf(value, props.multipleOf);
74
+
75
+ const findRepresentableDecimalMultiple = (
76
+ props: Parameters<typeof _randomMultiple>[0],
77
+ step: _IDecimal,
78
+ ): number | null => {
79
+ const limit: bigint = BigInt("999999999999999");
80
+ for (let exponent = -324; exponent <= 308; ++exponent) {
81
+ const unit: _IDecimal = { coefficient: BigInt(1), exponent };
82
+ const lower: _IDecimalRatio | null = _decimalDivide(props.minimum, unit);
83
+ const upper: _IDecimalRatio | null = _decimalDivide(props.maximum, unit);
84
+ if (lower === null || upper === null) return null;
85
+
86
+ const coefficientMinimum: bigint = max(
87
+ -limit,
88
+ lowerBound(lower, props.exclusiveMinimum),
89
+ );
90
+ const coefficientMaximum: bigint = min(
91
+ limit,
92
+ upperBound(upper, props.exclusiveMaximum),
93
+ );
94
+ if (coefficientMinimum > coefficientMaximum) continue;
95
+
96
+ const coefficientStep: bigint = decimalCoefficientStep(step, exponent);
97
+ const minimum: bigint = lowerBound(
98
+ { numerator: coefficientMinimum, denominator: coefficientStep },
99
+ false,
100
+ );
101
+ const maximum: bigint = upperBound(
102
+ { numerator: coefficientMaximum, denominator: coefficientStep },
103
+ false,
104
+ );
105
+ if (minimum > maximum) continue;
106
+
107
+ const selected: bigint = randomBigint(minimum, maximum);
108
+ for (const quotient of unique([
109
+ selected,
110
+ minimum,
111
+ maximum,
112
+ clamp(BigInt(0), minimum, maximum),
113
+ ...nearby(selected, minimum, maximum),
114
+ ])) {
115
+ const value: number = _decimalToNumber({
116
+ coefficient: coefficientStep * quotient,
117
+ exponent,
118
+ });
119
+ if (isValid(props, value)) return value;
120
+ }
121
+ }
122
+ return null;
123
+ };
124
+
125
+ const decimalCoefficientStep = (step: _IDecimal, exponent: number): bigint => {
126
+ const difference: number = exponent - step.exponent;
127
+ if (difference >= 0) {
128
+ const power: bigint = _decimalPower(difference);
129
+ return step.coefficient / _decimalGcd(step.coefficient, power);
130
+ }
131
+ return step.coefficient * _decimalPower(-difference);
132
+ };
133
+
134
+ const findRepresentableIntegerMultiple = (
135
+ props: Parameters<typeof _randomMultiple>[0],
136
+ ): number | null => {
137
+ const step: _IDecimal | null = _decimalIntegerStep(props.multipleOf);
138
+ if (step === null) return null;
139
+ const unit: _IDecimal = { coefficient: BigInt(1), exponent: 0 };
140
+ const lower: _IDecimalRatio | null = _decimalDivide(props.minimum, unit);
141
+ const upper: _IDecimalRatio | null = _decimalDivide(props.maximum, unit);
142
+ if (lower === null || upper === null) return null;
143
+
144
+ const minimum: bigint = lowerBound(lower, props.exclusiveMinimum);
145
+ const maximum: bigint = upperBound(upper, props.exclusiveMaximum);
146
+ if (minimum > maximum) return null;
147
+ if (minimum <= BigInt(0) && maximum >= BigInt(0)) return 0;
148
+
149
+ const candidate: bigint | null =
150
+ minimum > BigInt(0)
151
+ ? findPositiveAligned(minimum, maximum, step.coefficient)
152
+ : (() => {
153
+ const magnitude: bigint | null = findPositiveAligned(
154
+ -maximum,
155
+ -minimum,
156
+ step.coefficient,
157
+ );
158
+ return magnitude === null ? null : -magnitude;
159
+ })();
160
+ if (candidate === null) return null;
161
+ const value: number = Number(candidate);
162
+ return isValid(props, value) ? value : null;
163
+ };
164
+
165
+ const findPositiveAligned = (
166
+ minimum: bigint,
167
+ maximum: bigint,
168
+ integerStep: bigint,
169
+ ): bigint | null => {
170
+ const first: number = bitLength(minimum) - 1;
171
+ const last: number = bitLength(maximum) - 1;
172
+ for (let exponent = first; exponent <= last; ++exponent) {
173
+ const bandMinimum: bigint = max(minimum, BigInt(1) << BigInt(exponent));
174
+ const bandMaximum: bigint = min(
175
+ maximum,
176
+ (BigInt(1) << BigInt(exponent + 1)) - BigInt(1),
177
+ );
178
+ const quantum: bigint =
179
+ exponent <= 52 ? BigInt(1) : BigInt(1) << BigInt(exponent - 52);
180
+ const alignedStep: bigint =
181
+ (integerStep / _decimalGcd(integerStep, quantum)) * quantum;
182
+ const lower: bigint = lowerBound(
183
+ { numerator: bandMinimum, denominator: alignedStep },
184
+ false,
185
+ );
186
+ const upper: bigint = upperBound(
187
+ { numerator: bandMaximum, denominator: alignedStep },
188
+ false,
189
+ );
190
+ if (lower <= upper) return randomBigint(lower, upper) * alignedStep;
191
+ }
192
+ return null;
193
+ };
194
+
195
+ const bitLength = (value: bigint): number => value.toString(2).length;
196
+
197
+ const min = (x: bigint, y: bigint): bigint => (x < y ? x : y);
198
+ const max = (x: bigint, y: bigint): bigint => (x > y ? x : y);
199
+
200
+ const lowerBound = (ratio: _IDecimalRatio, exclusive: boolean): bigint => {
201
+ const quotient: bigint = ratio.numerator / ratio.denominator;
202
+ const remainder: bigint = ratio.numerator % ratio.denominator;
203
+ const ceiling: bigint =
204
+ quotient + (remainder > BigInt(0) ? BigInt(1) : BigInt(0));
205
+ return (
206
+ ceiling + (exclusive && remainder === BigInt(0) ? BigInt(1) : BigInt(0))
207
+ );
208
+ };
209
+
210
+ const upperBound = (ratio: _IDecimalRatio, exclusive: boolean): bigint => {
211
+ const quotient: bigint = ratio.numerator / ratio.denominator;
212
+ const remainder: bigint = ratio.numerator % ratio.denominator;
213
+ const floor: bigint =
214
+ quotient - (remainder < BigInt(0) ? BigInt(1) : BigInt(0));
215
+ return floor - (exclusive && remainder === BigInt(0) ? BigInt(1) : BigInt(0));
216
+ };
217
+
218
+ const randomBigint = (minimum: bigint, maximum: bigint): bigint => {
219
+ const scale: bigint = BigInt(1) << BigInt(53);
220
+ const sample: bigint = BigInt(
221
+ Math.min(
222
+ Number(scale - BigInt(1)),
223
+ Math.floor(Math.max(0, Math.random()) * Number(scale)),
224
+ ),
225
+ );
226
+ return minimum + ((maximum - minimum + BigInt(1)) * sample) / scale;
227
+ };
228
+
229
+ const clamp = (value: bigint, minimum: bigint, maximum: bigint): bigint =>
230
+ value < minimum ? minimum : value > maximum ? maximum : value;
231
+
232
+ const nearby = (
233
+ selected: bigint,
234
+ minimum: bigint,
235
+ maximum: bigint,
236
+ ): bigint[] => {
237
+ const output: bigint[] = [];
238
+ for (let distance = BigInt(1); distance <= BigInt(32); ++distance) {
239
+ if (selected - distance >= minimum) output.push(selected - distance);
240
+ if (selected + distance <= maximum) output.push(selected + distance);
241
+ }
242
+ return output;
243
+ };
244
+
245
+ const unique = (values: bigint[]): bigint[] => [...new Set(values)];
@@ -1,80 +1,97 @@
1
1
  import { OpenApi } from "@typia/interface";
2
2
 
3
+ import { _randomMultiple } from "./_randomMultiple";
4
+
3
5
  export const _randomNumber = (schema: OpenApi.IJsonSchema.INumber): number => {
6
+ const lower: IBoundary | null = getLowerBoundary(schema);
7
+ const upper: IBoundary | null = getUpperBoundary(schema);
4
8
  const minimum: number =
5
- schema.minimum ??
6
- schema.exclusiveMinimum ??
7
- (schema.multipleOf ?? 1) *
8
- (schema.maximum === undefined && schema.exclusiveMaximum === undefined
9
- ? 0
10
- : (schema.maximum ?? schema.exclusiveMaximum!) - 100);
9
+ lower?.value ?? (upper === null ? 0 : upper.value - 100);
11
10
  const maximum: number =
12
- schema.maximum ??
13
- schema.exclusiveMaximum ??
14
- (schema.multipleOf ?? 1) *
15
- (schema.minimum === undefined && schema.exclusiveMinimum === undefined
16
- ? 100
17
- : (schema.minimum ?? schema.exclusiveMinimum!) + 100);
11
+ upper?.value ?? (lower === null ? 100 : lower.value + 100);
18
12
  if (minimum > maximum)
19
13
  throw new Error("Minimum value is greater than maximum value.");
20
14
  return schema.multipleOf === undefined
21
15
  ? scalar({
22
16
  minimum,
23
17
  maximum,
24
- exclusiveMinimum: schema.exclusiveMinimum !== undefined,
25
- exclusiveMaximum: schema.exclusiveMaximum !== undefined,
18
+ exclusiveMinimum: lower?.exclusive ?? false,
19
+ exclusiveMaximum: upper?.exclusive ?? false,
26
20
  })
27
- : multiple({
21
+ : _randomMultiple({
28
22
  minimum,
29
23
  maximum,
30
24
  multipleOf: schema.multipleOf,
31
- exclusiveMinimum: schema.exclusiveMinimum !== undefined,
32
- exclusiveMaximum: schema.exclusiveMaximum !== undefined,
25
+ exclusiveMinimum: lower?.exclusive ?? false,
26
+ exclusiveMaximum: upper?.exclusive ?? false,
27
+ integer: false,
33
28
  });
34
29
  };
35
30
 
36
- const scalar = (p: {
31
+ const scalar = (props: {
37
32
  minimum: number;
38
33
  maximum: number;
39
- exclusiveMinimum?: boolean;
40
- exclusiveMaximum?: boolean;
34
+ exclusiveMinimum: boolean;
35
+ exclusiveMaximum: boolean;
41
36
  }): number => {
42
- if (p.minimum === p.maximum && (p.exclusiveMinimum || p.exclusiveMaximum))
43
- throw new Error(
44
- p.exclusiveMinimum
45
- ? "Exclusive minimum value equals maximum value."
46
- : "Exclusive maximum value equals minimum value.",
47
- );
48
- while (true) {
49
- const value: number = Math.random() * (p.maximum - p.minimum) + p.minimum;
50
- if (p.exclusiveMinimum && value === p.minimum) continue;
51
- else if (p.exclusiveMaximum && value === p.maximum) continue;
52
- return value;
37
+ if (
38
+ props.minimum === props.maximum &&
39
+ (props.exclusiveMinimum || props.exclusiveMaximum)
40
+ )
41
+ throw new Error("Exclusive numeric range is empty.");
42
+ const value: number =
43
+ Math.random() * (props.maximum - props.minimum) + props.minimum;
44
+ if (
45
+ (props.exclusiveMinimum && value === props.minimum) ||
46
+ (props.exclusiveMaximum && value === props.maximum)
47
+ ) {
48
+ const middle: number = props.minimum + (props.maximum - props.minimum) / 2;
49
+ if (middle <= props.minimum || middle >= props.maximum)
50
+ throw new Error("Exclusive numeric range has no representable value.");
51
+ return middle;
53
52
  }
53
+ return value;
54
54
  };
55
55
 
56
- const multiple = (p: {
57
- minimum: number;
58
- maximum: number;
59
- multipleOf: number;
60
- exclusiveMinimum?: boolean;
61
- exclusiveMaximum?: boolean;
62
- }): number => {
63
- let minimum = Math.ceil(p.minimum / p.multipleOf) * p.multipleOf;
64
- let maximum = Math.floor(p.maximum / p.multipleOf) * p.multipleOf;
65
- if (p.exclusiveMinimum === true && minimum % p.multipleOf === 0)
66
- minimum += p.multipleOf;
67
- if (p.exclusiveMaximum === true && maximum % p.multipleOf === 0)
68
- maximum -= p.multipleOf;
69
- if (minimum > maximum)
70
- throw new Error(
71
- "The range of the integer is smaller than the multipleOf value.",
72
- );
73
- const value: number = scalar({
74
- minimum,
75
- maximum,
76
- exclusiveMinimum: p.exclusiveMinimum,
77
- exclusiveMaximum: p.exclusiveMaximum,
78
- });
79
- return value - (value % p.multipleOf);
56
+ const getLowerBoundary = (
57
+ schema: OpenApi.IJsonSchema.INumber,
58
+ ): IBoundary | null =>
59
+ selectBoundary(
60
+ schema.minimum === undefined
61
+ ? null
62
+ : { value: schema.minimum, exclusive: false },
63
+ schema.exclusiveMinimum === undefined
64
+ ? null
65
+ : { value: schema.exclusiveMinimum, exclusive: true },
66
+ Math.max,
67
+ );
68
+
69
+ const getUpperBoundary = (
70
+ schema: OpenApi.IJsonSchema.INumber,
71
+ ): IBoundary | null =>
72
+ selectBoundary(
73
+ schema.maximum === undefined
74
+ ? null
75
+ : { value: schema.maximum, exclusive: false },
76
+ schema.exclusiveMaximum === undefined
77
+ ? null
78
+ : { value: schema.exclusiveMaximum, exclusive: true },
79
+ Math.min,
80
+ );
81
+
82
+ const selectBoundary = (
83
+ x: IBoundary | null,
84
+ y: IBoundary | null,
85
+ compare: (x: number, y: number) => number,
86
+ ): IBoundary | null => {
87
+ if (x === null) return y;
88
+ if (y === null) return x;
89
+ if (x.value === y.value)
90
+ return { value: x.value, exclusive: x.exclusive || y.exclusive };
91
+ return compare(x.value, y.value) === x.value ? x : y;
80
92
  };
93
+
94
+ interface IBoundary {
95
+ value: number;
96
+ exclusive: boolean;
97
+ }
@@ -1,10 +1,35 @@
1
1
  import RandExp from "randexp";
2
2
 
3
- export const _randomPattern = (regex: RegExp): string => {
3
+ import { _ILengthProps } from "./_randomStringLength";
4
+
5
+ export const _randomPattern = (
6
+ regex: RegExp,
7
+ props?: _ILengthProps,
8
+ ): string => {
4
9
  const r: RandExp = new RandExp(regex);
5
- for (let i: number = 0; i < 10; ++i) {
10
+ const min: number | undefined = props?.minLength;
11
+ const max: number | undefined = props?.maxLength;
12
+
13
+ // RandExp expands an unbounded quantifier to `randInt(token.min, token.min +
14
+ // r.max)`, so steering `r.max` biases the generated length toward the window.
15
+ // There is no matching floor control, so the length is still verified below.
16
+ if (max !== undefined) r.max = max;
17
+ else if (min !== undefined && min * 2 > r.max) r.max = min * 2;
18
+
19
+ const bounded: boolean = min !== undefined || max !== undefined;
20
+ const limit: number = bounded ? 1024 : 10;
21
+ for (let i: number = 0; i < limit; ++i) {
6
22
  const str: string = r.gen();
7
- if (regex.test(str)) return str;
23
+ if (
24
+ regex.test(str) &&
25
+ (min === undefined || str.length >= min) &&
26
+ (max === undefined || str.length <= max)
27
+ )
28
+ return str;
8
29
  }
9
- return r.gen();
30
+ throw new Error(
31
+ bounded
32
+ ? "unable to generate a random string matching the pattern within the length range."
33
+ : "unable to generate a random string matching the pattern.",
34
+ );
10
35
  };
@@ -0,0 +1,116 @@
1
+ import { _randomInteger } from "./_randomInteger";
2
+ import { _randomString } from "./_randomString";
3
+
4
+ export const _RANDOM_LENGTH_ERROR =
5
+ "unable to generate a random string satisfying both the format and the length constraints.";
6
+
7
+ /**
8
+ * Length bounds forwarded to a string format or pattern generator.
9
+ *
10
+ * `typia.random<T>()` passes this object to the `_randomFormat*` and
11
+ * `_randomPattern` helpers whenever the string leaf also carries a `MinLength`
12
+ * or `MaxLength` tag, so a constrained format or pattern is generated at a
13
+ * length its own validator accepts (issue #2189).
14
+ */
15
+ export interface _ILengthProps {
16
+ minLength?: number;
17
+ maxLength?: number;
18
+ }
19
+
20
+ /**
21
+ * Builds the variable segment of a fixed-shape format string so that the total
22
+ * length `fixed + segment.length` lands inside the requested window.
23
+ *
24
+ * `fixed` is the number of characters the format always contributes around the
25
+ * segment, `fallback` is the segment length used when the leaf is unconstrained
26
+ * on that side, and `minimum` is the smallest segment the format still
27
+ * validates with. Throws when the window cannot be satisfied by this format's
28
+ * shape (e.g. `Format<"email"> & MaxLength<3>`).
29
+ */
30
+ export const _randomSegmentLength = (
31
+ props: _ILengthProps | undefined,
32
+ fixed: number,
33
+ fallback: number,
34
+ minimum: number,
35
+ ): string => {
36
+ let low: number =
37
+ props?.minLength === undefined ? minimum : props.minLength - fixed;
38
+ if (low < minimum) low = minimum;
39
+ // With only a lower bound, spread the segment across `fallback` extra
40
+ // characters so the generated length varies, mirroring `_randomString`.
41
+ const high: number =
42
+ props?.maxLength === undefined ? low + fallback : props.maxLength - fixed;
43
+ if (high < low || high < minimum) throw new Error(_RANDOM_LENGTH_ERROR);
44
+ return _randomString({ type: "string", minLength: low, maxLength: high });
45
+ };
46
+
47
+ /**
48
+ * Intersects the requested length window with the lengths a format's grammar
49
+ * can express, and draws one of them.
50
+ *
51
+ * `minimum` and `maximum` are the shortest and longest values the format admits
52
+ * — omit `maximum` when the grammar is open above — and `spread` is how far
53
+ * past the floor an unbounded request may reach, so an open side still varies
54
+ * the way `_randomString` does. The caller draws from the returned window and
55
+ * applies whatever step its grammar has (base64 lengths are multiples of four,
56
+ * a fractional second needs at least one digit).
57
+ *
58
+ * Throws only when the window and the grammar do not overlap at all. That is
59
+ * the distinction the retry driver below cannot make: it redraws one shape, so
60
+ * it gives up on every length that shape never emits even when the format
61
+ * itself accepts one (issue #2284).
62
+ */
63
+ export const _randomLengthWindow = (
64
+ props: _ILengthProps | undefined,
65
+ format: { minimum: number; maximum?: number; spread?: number },
66
+ ): { low: number; high: number } => {
67
+ const ceiling: number = format.maximum ?? Number.MAX_SAFE_INTEGER;
68
+ const low: number = Math.max(
69
+ props?.minLength ?? format.minimum,
70
+ format.minimum,
71
+ );
72
+ const high: number = Math.min(
73
+ props?.maxLength ?? low + (format.spread ?? 0),
74
+ ceiling,
75
+ );
76
+ if (low > high) throw new Error(_RANDOM_LENGTH_ERROR);
77
+ return { low, high };
78
+ };
79
+
80
+ /** Draws a length inside a window produced by {@link _randomLengthWindow}. */
81
+ export const _randomLengthPick = (window: {
82
+ low: number;
83
+ high: number;
84
+ }): number =>
85
+ _randomInteger({
86
+ type: "integer",
87
+ minimum: window.low,
88
+ maximum: window.high,
89
+ });
90
+
91
+ /**
92
+ * Wraps a fixed-length format generator (uuid, date) with the requested length
93
+ * window.
94
+ *
95
+ * Use it only where the grammar admits exactly one length, so a window that
96
+ * excludes it is genuinely unsatisfiable. A format that can express more than
97
+ * one length must build its value at a length drawn from
98
+ * {@link _randomLengthWindow} instead; redrawing one shape cannot reach a length
99
+ * that shape never emits.
100
+ */
101
+ export const _randomFormatLength = (
102
+ props: _ILengthProps | undefined,
103
+ generate: () => string,
104
+ ): string => {
105
+ if (props?.minLength === undefined && props?.maxLength === undefined)
106
+ return generate();
107
+ for (let i: number = 0; i < 256; ++i) {
108
+ const value: string = generate();
109
+ if (
110
+ (props.minLength === undefined || value.length >= props.minLength) &&
111
+ (props.maxLength === undefined || value.length <= props.maxLength)
112
+ )
113
+ return value;
114
+ }
115
+ throw new Error(_RANDOM_LENGTH_ERROR);
116
+ };
@@ -0,0 +1,5 @@
1
+ export const _stringLength = (value: string): number => {
2
+ let count: number = 0;
3
+ for (const _ch of value) ++count;
4
+ return count;
5
+ };
@@ -1,10 +1,14 @@
1
1
  import { IValidation } from "@typia/interface";
2
2
 
3
3
  export const _validateReport = (array: IValidation.IError[]) => {
4
+ const isAncestor = (ancestor: string, descendant: string): boolean =>
5
+ descendant === ancestor ||
6
+ descendant.startsWith(`${ancestor}.`) ||
7
+ descendant.startsWith(`${ancestor}[`);
4
8
  const reportable = (path: string): boolean => {
5
9
  if (array.length === 0) return true;
6
10
  const last: string = array[array.length - 1]!.path;
7
- return path.length > last.length || last.substring(0, path.length) !== path;
11
+ return isAncestor(path, last) === false && isAncestor(last, path) === false;
8
12
  };
9
13
  return (exceptable: boolean, error: IValidation.IError): false => {
10
14
  if (exceptable && reportable(error.path)) {
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared outer walk for the `camel`/`pascal` notations.
3
+ *
4
+ * Mirrors the `CamelCase<T>` / `PascalCase<T>` typings: leading underscores are
5
+ * preserved verbatim, an all-underscore key stays untouched, and the presence
6
+ * of any remaining underscore — not the number of non-empty segments — selects
7
+ * the `snake` conversion. Routing on underscore presence keeps a trailing or
8
+ * doubled underscore (`fooBar_`) on the same path the type takes, instead of
9
+ * collapsing it to the underscore-free `plain` path.
10
+ */
11
+ export const __notationRename =
12
+ (props: { plain: (str: string) => string; snake: (str: string) => string }) =>
13
+ (str: string): string => {
14
+ let prefix: string = "";
15
+ while (str.startsWith("_")) {
16
+ prefix += "_";
17
+ str = str.substring(1);
18
+ }
19
+ if (str.length === 0) return prefix;
20
+ return `${prefix}${str.includes("_") ? props.snake(str) : props.plain(str)}`;
21
+ };
@@ -0,0 +1,50 @@
1
+ import { _randomInteger } from "../_randomInteger";
2
+
3
+ /**
4
+ * Splits `total` into `count` parts, each inside `[minimum, maximum]`.
5
+ *
6
+ * Used where a format's length is the sum of its segments — an IPv4 octet spans
7
+ * one to three digits, an IPv6 group one to four — so a requested total length
8
+ * is realized by choosing how many characters each segment contributes instead
9
+ * of redrawing whole addresses and hoping one lands in the window (issue
10
+ * #2284).
11
+ *
12
+ * The caller guarantees `count * minimum <= total <= count * maximum`; each
13
+ * part is drawn from the range that still leaves the remaining parts
14
+ * satisfiable.
15
+ */
16
+ export const __randomComposition = (props: {
17
+ total: number;
18
+ count: number;
19
+ minimum: number;
20
+ maximum: number;
21
+ }): number[] => {
22
+ const parts: number[] = [];
23
+ let remaining: number = props.total;
24
+ for (let i: number = 0; i < props.count; ++i) {
25
+ const rest: number = props.count - i - 1;
26
+ const value: number = _randomInteger({
27
+ type: "integer",
28
+ minimum: Math.max(props.minimum, remaining - rest * props.maximum),
29
+ maximum: Math.min(props.maximum, remaining - rest * props.minimum),
30
+ });
31
+ parts.push(value);
32
+ remaining -= value;
33
+ }
34
+ return parts;
35
+ };
36
+
37
+ /** Draws `length` decimal digits, leading zeros included. */
38
+ export const __randomDigits = (length: number): string => {
39
+ let text: string = "";
40
+ for (let i: number = 0; i < length; ++i)
41
+ text += String(_randomInteger({ type: "integer", minimum: 0, maximum: 9 }));
42
+ return text;
43
+ };
44
+
45
+ /** Draws a decimal number of exactly `length` digits without a leading zero. */
46
+ export const __randomNumeric = (length: number): string =>
47
+ length <= 1
48
+ ? String(_randomInteger({ type: "integer", minimum: 0, maximum: 9 }))
49
+ : String(_randomInteger({ type: "integer", minimum: 1, maximum: 9 })) +
50
+ __randomDigits(length - 1);