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,216 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ // TestDefaultLibrarySpoofNativeIdentityTransform keeps a declaration package out
13
+ // of the runtime-native authority even when its file is named like a TypeScript
14
+ // default library (#2200).
15
+ //
16
+ // Runtime-native identity admits a global whose constructor a default library
17
+ // provides, so how "default library" is decided is the whole boundary. `lib.d.ts`
18
+ // is an ordinary published file name, so a base-name test makes that authority
19
+ // claimable by any package a project pulls in through `typeRoots` — the forged
20
+ // declarations below are a full-member copy of the DOM `File` and `Blob`,
21
+ // including their `declare var` constructor bindings, and nothing but the
22
+ // containing directory distinguishes them from the real thing.
23
+ //
24
+ // 1. Publish `lib.dom.d.ts` and `lib.es5.d.ts` from a fixture `@types` package
25
+ // that declares global File and Blob with their constructors.
26
+ // 2. Transform validators for those globals with no DOM library and no Node
27
+ // types loaded, so the forged package is their only declaration source.
28
+ // 3. Require the emit to keep the forged members instead of an `instanceof`.
29
+ // 4. Execute the validators in Node against the forged structural values and
30
+ // against the real runtime instances, requiring an exact case count.
31
+ func TestDefaultLibrarySpoofNativeIdentityTransform(t *testing.T) {
32
+ project := defaultLibrarySpoofNativeIdentityProject(t)
33
+ js, errText, code := ttscTypiaTestCapture(func() int {
34
+ return runTransform([]string{
35
+ "--cwd", project,
36
+ "--tsconfig", "tsconfig.json",
37
+ "--file", "src/input.ts",
38
+ "--output", "js",
39
+ })
40
+ })
41
+ if code != 0 {
42
+ t.Fatalf("default library spoof transform failed: code=%d stderr=\n%s", code, errText)
43
+ }
44
+
45
+ failures := []string{}
46
+ for _, native := range []string{"instanceof File", "instanceof Blob"} {
47
+ if strings.Contains(js, native) {
48
+ failures = append(failures, fmt.Sprintf("a lib.*.d.ts named package declaration was promoted to %q", native))
49
+ }
50
+ }
51
+ for _, member := range []string{"spoofBlobBrand", "spoofFileBrand"} {
52
+ if !strings.Contains(js, member) {
53
+ failures = append(failures, fmt.Sprintf("emit dropped forged declaration member %q", member))
54
+ }
55
+ }
56
+
57
+ output, runtimeErr := defaultLibrarySpoofNativeIdentityRun(t, project, js)
58
+ if runtimeErr != nil {
59
+ failures = append(failures, fmt.Sprintf("runtime matrix failed: %v\n%s", runtimeErr, output))
60
+ }
61
+ if expected := "RAN 6 SPOOF CASES"; !strings.Contains(output, expected) {
62
+ failures = append(failures, fmt.Sprintf("spoof runner did not report %q; got:\n%s", expected, output))
63
+ }
64
+ if len(failures) != 0 {
65
+ t.Fatalf("default library spoof mismatches:\n%s\n\nemit:\n%s", strings.Join(failures, "\n"), js)
66
+ }
67
+ }
68
+
69
+ func defaultLibrarySpoofNativeIdentityProject(t *testing.T) string {
70
+ t.Helper()
71
+ root := ttscTypiaTestRepoRoot(t)
72
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
73
+ if err := os.MkdirAll(base, 0o755); err != nil {
74
+ t.Fatalf("mkdir temp base: %v", err)
75
+ }
76
+ dir, err := os.MkdirTemp(base, "default-library-spoof-native-identity-")
77
+ if err != nil {
78
+ t.Fatalf("create temp fixture: %v", err)
79
+ }
80
+ t.Cleanup(func() {
81
+ _ = os.RemoveAll(dir)
82
+ })
83
+ for name, content := range map[string]string{
84
+ "tsconfig.json": defaultLibrarySpoofNativeIdentityTSConfig,
85
+ "node_modules/@types/spoof-lib/package.json": defaultLibrarySpoofNativeIdentityPackageJSON,
86
+ "node_modules/@types/spoof-lib/lib.dom.d.ts": defaultLibrarySpoofNativeIdentityDeclarations,
87
+ "node_modules/@types/spoof-lib/lib.es5.d.ts": defaultLibrarySpoofNativeIdentityExtraDeclarations,
88
+ "src/input.ts": defaultLibrarySpoofNativeIdentitySource,
89
+ } {
90
+ path := filepath.Join(dir, filepath.FromSlash(name))
91
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
92
+ t.Fatalf("mkdir fixture path %s: %v", filepath.Dir(path), err)
93
+ }
94
+ if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
95
+ t.Fatalf("write fixture file %s: %v", path, err)
96
+ }
97
+ }
98
+ return dir
99
+ }
100
+
101
+ func defaultLibrarySpoofNativeIdentityRun(t *testing.T, project string, js string) (string, error) {
102
+ t.Helper()
103
+ node, err := exec.LookPath("node")
104
+ if err != nil {
105
+ t.Skip("node executable not found")
106
+ return "", nil
107
+ }
108
+ runtimeDir := filepath.Join(project, "runtime")
109
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
110
+ t.Fatalf("mkdir runtime dir: %v", err)
111
+ }
112
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
113
+ for name, content := range map[string]string{
114
+ "input.cjs": ttscTypiaTestRewriteCommonJS(t, js),
115
+ "run.cjs": defaultLibrarySpoofNativeIdentityRuntimeRunner,
116
+ } {
117
+ if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
118
+ t.Fatalf("write runtime file %s: %v", name, err)
119
+ }
120
+ }
121
+ cmd := exec.Command(node, filepath.Join(runtimeDir, "run.cjs"))
122
+ cmd.Dir = runtimeDir
123
+ output, err := cmd.CombinedOutput()
124
+ return string(output), err
125
+ }
126
+
127
+ const defaultLibrarySpoofNativeIdentityTSConfig = `{
128
+ "compilerOptions": {
129
+ "target": "ES2022",
130
+ "module": "commonjs",
131
+ "moduleResolution": "bundler",
132
+ "ignoreDeprecations": "6.0",
133
+ "lib": ["ES2022"],
134
+ "types": ["spoof-lib"],
135
+ "esModuleInterop": true,
136
+ "strict": true,
137
+ "skipLibCheck": true
138
+ },
139
+ "include": ["src"]
140
+ }
141
+ `
142
+
143
+ const defaultLibrarySpoofNativeIdentityPackageJSON = `{
144
+ "name": "@types/spoof-lib",
145
+ "version": "1.0.0",
146
+ "types": "lib.dom.d.ts"
147
+ }
148
+ `
149
+
150
+ const defaultLibrarySpoofNativeIdentityDeclarations = `/// <reference path="./lib.es5.d.ts" />
151
+
152
+ interface Blob {
153
+ readonly size: number;
154
+ readonly type: string;
155
+ spoofBlobBrand: string;
156
+ }
157
+ declare var Blob: {
158
+ prototype: Blob;
159
+ new (parts?: unknown[], options?: unknown): Blob;
160
+ };
161
+ `
162
+
163
+ const defaultLibrarySpoofNativeIdentityExtraDeclarations = `interface File extends Blob {
164
+ readonly lastModified: number;
165
+ readonly name: string;
166
+ readonly webkitRelativePath: string;
167
+ spoofFileBrand: string;
168
+ }
169
+ declare var File: {
170
+ prototype: File;
171
+ new (parts: unknown[], name: string, options?: unknown): File;
172
+ };
173
+ `
174
+
175
+ const defaultLibrarySpoofNativeIdentitySource = `import typia from "typia";
176
+
177
+ export const createdIsBlob = typia.createIs<Blob>();
178
+ export const createdIsFile = typia.createIs<File>();
179
+ `
180
+
181
+ const defaultLibrarySpoofNativeIdentityRuntimeRunner = `const validators = require("./input.cjs");
182
+
183
+ let ran = 0;
184
+ const failures = [];
185
+ const eq = (name, actual, expected) => {
186
+ ran += 1;
187
+ if (actual !== expected) {
188
+ failures.push(name + ": expected " + expected + " but got " + actual);
189
+ }
190
+ };
191
+
192
+ const spoofBlob = {
193
+ size: 1,
194
+ type: "text/plain",
195
+ spoofBlobBrand: "spoof",
196
+ };
197
+ const spoofFile = {
198
+ ...spoofBlob,
199
+ lastModified: 0,
200
+ name: "x.txt",
201
+ webkitRelativePath: "",
202
+ spoofFileBrand: "spoof",
203
+ };
204
+
205
+ eq("spoof Blob structural", validators.createdIsBlob(spoofBlob), true);
206
+ eq("spoof Blob rejects runtime instance", validators.createdIsBlob(new Blob(["x"])), false);
207
+ eq("spoof Blob missing brand", validators.createdIsBlob({ size: 1, type: "text/plain" }), false);
208
+ eq("spoof File structural", validators.createdIsFile(spoofFile), true);
209
+ eq("spoof File rejects runtime instance", validators.createdIsFile(new File(["x"], "x.txt")), false);
210
+ eq("spoof File missing brand", validators.createdIsFile({ ...spoofFile, spoofFileBrand: undefined }), false);
211
+
212
+ console.log("RAN " + ran + " SPOOF CASES");
213
+ if (failures.length !== 0) {
214
+ throw new Error("MISMATCHES:\n" + failures.join("\n"));
215
+ }
216
+ `
@@ -0,0 +1,193 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "testing"
8
+ )
9
+
10
+ // TestEscapedPropertyKeyPathTransform verifies emits with hostile keys parse.
11
+ //
12
+ // Sole-literal property keys are folded into the emit as accessor path text, and
13
+ // no build step reads the file back, so a wrongly escaped key shipped as a
14
+ // broken artifact while ttsc still exited 0. A `"` in a key terminated the path
15
+ // string early and the emitted module stopped being JavaScript; a control
16
+ // character stayed raw and the reported path could not be parsed. Only running
17
+ // node against a real emit can catch that, which is why this asserts on the
18
+ // transform output rather than on the factory in isolation.
19
+ //
20
+ // 1. Transform a fixture whose keys carry quotes, backslashes, and control
21
+ // characters.
22
+ // 2. Assert node --check accepts the emitted module as JavaScript.
23
+ // 3. Execute it and assert each reported path is the accessor JSON.stringify
24
+ // defines for that key, which is what the runtime helper produces for
25
+ // dynamic keys.
26
+ func TestEscapedPropertyKeyPathTransform(t *testing.T) {
27
+ project := escapedPropertyKeyPathProject(t)
28
+ js := escapedPropertyKeyPathTransform(t, project)
29
+ escapedPropertyKeyPathCheckSyntax(t, project, js)
30
+ escapedPropertyKeyPathRunRuntimeCases(t, project, js)
31
+ }
32
+
33
+ func escapedPropertyKeyPathProject(t *testing.T) string {
34
+ t.Helper()
35
+ root := ttscTypiaTestRepoRoot(t)
36
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
37
+ if err := os.MkdirAll(base, 0o755); err != nil {
38
+ t.Fatalf("mkdir temp base: %v", err)
39
+ }
40
+ dir, err := os.MkdirTemp(base, "escaped-property-key-path-")
41
+ if err != nil {
42
+ t.Fatalf("create temp fixture: %v", err)
43
+ }
44
+ t.Cleanup(func() {
45
+ _ = os.RemoveAll(dir)
46
+ })
47
+ src := filepath.Join(dir, "src")
48
+ if err := os.MkdirAll(src, 0o755); err != nil {
49
+ t.Fatalf("mkdir fixture src: %v", err)
50
+ }
51
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(escapedPropertyKeyPathTSConfig), 0o644); err != nil {
52
+ t.Fatalf("write tsconfig: %v", err)
53
+ }
54
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(escapedPropertyKeyPathSource), 0o644); err != nil {
55
+ t.Fatalf("write source: %v", err)
56
+ }
57
+ return dir
58
+ }
59
+
60
+ func escapedPropertyKeyPathTransform(t *testing.T, project string) string {
61
+ t.Helper()
62
+ out, errText, code := ttscTypiaTestCapture(func() int {
63
+ return runTransform([]string{
64
+ "--cwd", project,
65
+ "--tsconfig", "tsconfig.json",
66
+ "--file", "src/main.ts",
67
+ "--output", "js",
68
+ })
69
+ })
70
+ if code != 0 {
71
+ t.Fatalf("escaped property key transform failed: code=%d stderr=\n%s", code, errText)
72
+ }
73
+ return out
74
+ }
75
+
76
+ // escapedPropertyKeyPathCheckSyntax runs node against the emit exactly as it
77
+ // would ship. node --check only parses, so the unresolved typia imports in the
78
+ // untouched output do not matter, and that keeps this a check of the real
79
+ // artifact rather than of a rewritten copy.
80
+ func escapedPropertyKeyPathCheckSyntax(t *testing.T, project string, js string) {
81
+ t.Helper()
82
+ node, err := exec.LookPath("node")
83
+ if err != nil {
84
+ t.Skip("node executable not found")
85
+ }
86
+ emitted := filepath.Join(project, "emitted.cjs")
87
+ if err := os.WriteFile(emitted, []byte(js), 0o644); err != nil {
88
+ t.Fatalf("write emitted module: %v", err)
89
+ }
90
+ if output, err := exec.Command(node, "--check", emitted).CombinedOutput(); err != nil {
91
+ t.Fatalf("emitted module is not valid JavaScript: %v\n%s\n--- emit ---\n%s", err, output, js)
92
+ }
93
+ }
94
+
95
+ func escapedPropertyKeyPathRunRuntimeCases(t *testing.T, project string, js string) {
96
+ t.Helper()
97
+ node, err := exec.LookPath("node")
98
+ if err != nil {
99
+ t.Skip("node executable not found")
100
+ }
101
+ runtimeDir := filepath.Join(project, "runtime")
102
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
103
+ t.Fatalf("mkdir runtime dir: %v", err)
104
+ }
105
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
106
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
107
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
108
+ t.Fatalf("write runtime module: %v", err)
109
+ }
110
+ runner := filepath.Join(runtimeDir, "run.cjs")
111
+ if err := os.WriteFile(runner, []byte(escapedPropertyKeyPathRuntimeRunner), 0o644); err != nil {
112
+ t.Fatalf("write runtime runner: %v", err)
113
+ }
114
+ cmd := exec.Command(node, runner)
115
+ cmd.Dir = project
116
+ if output, err := cmd.CombinedOutput(); err != nil {
117
+ t.Fatalf("escaped property key runtime cases failed: %v\n%s", err, output)
118
+ }
119
+ }
120
+
121
+ const escapedPropertyKeyPathTSConfig = `{
122
+ "compilerOptions": {
123
+ "target": "ES2022",
124
+ "module": "commonjs",
125
+ "moduleResolution": "bundler",
126
+ "ignoreDeprecations": "6.0",
127
+ "types": ["*"],
128
+ "esModuleInterop": true,
129
+ "strict": true,
130
+ "skipLibCheck": true
131
+ },
132
+ "include": ["src"]
133
+ }
134
+ `
135
+
136
+ const escapedPropertyKeyPathSource = `import typia from "typia";
137
+
138
+ interface IHostileKeys {
139
+ "quote\"key": number;
140
+ "back\\slash": number;
141
+ "line\nbreak": number;
142
+ "tab\tkey": number;
143
+ "bell\u0007key": number;
144
+ "nul\u0000key": number;
145
+ "sep\u2028key": number;
146
+ "plain-key": number;
147
+ plainIdentifier: number;
148
+ }
149
+
150
+ export const KEYS: string[] = [
151
+ "quote\"key",
152
+ "back\\slash",
153
+ "line\nbreak",
154
+ "tab\tkey",
155
+ "bell\u0007key",
156
+ "nul\u0000key",
157
+ "sep\u2028key",
158
+ "plain-key",
159
+ ];
160
+
161
+ const validateHostile = typia.createValidate<IHostileKeys>();
162
+
163
+ export const run = () => {
164
+ const input: Record<string, unknown> = { plainIdentifier: 1 };
165
+ for (const key of KEYS) input[key] = "not a number";
166
+ return validateHostile(input);
167
+ };
168
+ `
169
+
170
+ // The expected path is rebuilt with JSON.stringify rather than written out
171
+ // literally, because that is the contract _accessExpressionAsString implements
172
+ // for dynamic keys and the compile-time fold must agree with it.
173
+ const escapedPropertyKeyPathRuntimeRunner = `const mod = require("./main.cjs");
174
+ const result = mod.run();
175
+
176
+ if (result.success !== false) {
177
+ throw new Error("validate accepted non-number values");
178
+ }
179
+ for (const key of mod.KEYS) {
180
+ const expected = "$input[" + JSON.stringify(key) + "]";
181
+ const found = result.errors.find((error) => error.path === expected);
182
+ if (!found) {
183
+ throw new Error(
184
+ "missing path for key " + JSON.stringify(key) +
185
+ ": expected " + JSON.stringify(expected) +
186
+ ", got " + JSON.stringify(result.errors.map((error) => error.path)),
187
+ );
188
+ }
189
+ }
190
+ if (result.errors.some((error) => error.path === "$input.plainIdentifier")) {
191
+ throw new Error("identifier fast path reported an error for a valid value");
192
+ }
193
+ `
@@ -0,0 +1,240 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ // TestFiniteOptionNumberLeafTransform pins the finite/numeric option matrix for a
13
+ // bare `number` leaf across typia.is, typia.assert, and typia.validate (#2196).
14
+ //
15
+ // The `finite` option is documented as an independent flag that rejects both NaN
16
+ // and Infinity, yet it was inert unless `numeric` was also set: typia.is dropped
17
+ // `finite` when it built its number gate, and assert/validate gate their verdict
18
+ // on that same is-checker, so all three accepted NaN and Infinity under
19
+ // `finite:true` alone. The other three rows are regression guards that must not
20
+ // move:
21
+ //
22
+ // - finite alone -> reject NaN, Infinity, -Infinity (the #2196 red case)
23
+ // - numeric alone -> reject NaN, ACCEPT Infinity/-Infinity (numeric != finite)
24
+ // - finite+numeric -> reject NaN, Infinity, -Infinity (already worked)
25
+ // - neither option -> ACCEPT everything (the documented default)
26
+ //
27
+ // 1. Transform the same `number`-leaf fixture once per option row, injecting the
28
+ // row's options through the resolved --plugins-json payload (the only option
29
+ // source runTransform reads).
30
+ // 2. Execute the emitted validators in Node against a finite value plus NaN,
31
+ // Infinity, and -Infinity, requiring is/assert/validate to agree with the row.
32
+ // 3. Require the runner to report the exact executed case count so a runner that
33
+ // silently exercised nothing cannot pass as green.
34
+ func TestFiniteOptionNumberLeafTransform(t *testing.T) {
35
+ for _, tc := range finiteOptionNumberLeafCases() {
36
+ t.Run(tc.name, func(t *testing.T) {
37
+ project := finiteOptionNumberLeafProject(t)
38
+ js := finiteOptionNumberLeafTransform(t, project, tc.payload())
39
+ finiteOptionNumberLeafRunRuntimeCases(t, project, js, tc)
40
+ })
41
+ }
42
+ }
43
+
44
+ type finiteOptionNumberLeafCase struct {
45
+ name string
46
+ // config is the JSON fragment appended to typia's resolved plugin entry, e.g.
47
+ // `,"finite":true`. Empty means typia's documented defaults.
48
+ config string
49
+ // acceptNaN and acceptInfinity are the expected verdicts for the non-finite
50
+ // inputs; a finite value is always accepted.
51
+ acceptNaN bool
52
+ acceptInfinity bool
53
+ }
54
+
55
+ func (tc finiteOptionNumberLeafCase) payload() string {
56
+ return `[{"config":{"transform":"typia/lib/transform"` + tc.config + `},"name":"typia","stage":"transform"}]`
57
+ }
58
+
59
+ func finiteOptionNumberLeafCases() []finiteOptionNumberLeafCase {
60
+ return []finiteOptionNumberLeafCase{
61
+ {
62
+ name: "finite alone rejects NaN and Infinity",
63
+ config: `,"finite":true`,
64
+ acceptNaN: false,
65
+ acceptInfinity: false,
66
+ },
67
+ {
68
+ name: "numeric alone rejects NaN but accepts Infinity",
69
+ config: `,"numeric":true`,
70
+ acceptNaN: false,
71
+ acceptInfinity: true,
72
+ },
73
+ {
74
+ name: "finite and numeric together reject NaN and Infinity",
75
+ config: `,"finite":true,"numeric":true`,
76
+ acceptNaN: false,
77
+ acceptInfinity: false,
78
+ },
79
+ {
80
+ name: "neither option accepts NaN and Infinity",
81
+ config: ``,
82
+ acceptNaN: true,
83
+ acceptInfinity: true,
84
+ },
85
+ }
86
+ }
87
+
88
+ func finiteOptionNumberLeafProject(t *testing.T) string {
89
+ t.Helper()
90
+ root := ttscTypiaTestRepoRoot(t)
91
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
92
+ if err := os.MkdirAll(base, 0o755); err != nil {
93
+ t.Fatalf("mkdir temp base: %v", err)
94
+ }
95
+ dir, err := os.MkdirTemp(base, "finite-option-number-leaf-")
96
+ if err != nil {
97
+ t.Fatalf("create temp fixture: %v", err)
98
+ }
99
+ t.Cleanup(func() {
100
+ _ = os.RemoveAll(dir)
101
+ })
102
+ src := filepath.Join(dir, "src")
103
+ if err := os.MkdirAll(src, 0o755); err != nil {
104
+ t.Fatalf("mkdir fixture src: %v", err)
105
+ }
106
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(finiteOptionNumberLeafTSConfig), 0o644); err != nil {
107
+ t.Fatalf("write tsconfig: %v", err)
108
+ }
109
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(finiteOptionNumberLeafSource), 0o644); err != nil {
110
+ t.Fatalf("write source: %v", err)
111
+ }
112
+ return dir
113
+ }
114
+
115
+ func finiteOptionNumberLeafTransform(t *testing.T, project string, payload string) string {
116
+ t.Helper()
117
+ out, errText, code := ttscTypiaTestCapture(func() int {
118
+ return runTransform([]string{
119
+ "--cwd", project,
120
+ "--tsconfig", "tsconfig.json",
121
+ "--file", "src/main.ts",
122
+ "--output", "js",
123
+ "--plugins-json", payload,
124
+ })
125
+ })
126
+ if code != 0 {
127
+ t.Fatalf("finite option transform failed: code=%d stderr=\n%s", code, errText)
128
+ }
129
+ return out
130
+ }
131
+
132
+ func finiteOptionNumberLeafRunRuntimeCases(t *testing.T, project string, js string, tc finiteOptionNumberLeafCase) {
133
+ t.Helper()
134
+ node, err := exec.LookPath("node")
135
+ if err != nil {
136
+ t.Skip("node executable not found")
137
+ }
138
+ runtimeDir := filepath.Join(project, "runtime")
139
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
140
+ t.Fatalf("mkdir runtime dir: %v", err)
141
+ }
142
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
143
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
144
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
145
+ t.Fatalf("write runtime module: %v", err)
146
+ }
147
+ runner := filepath.Join(runtimeDir, "run.cjs")
148
+ if err := os.WriteFile(runner, []byte(finiteOptionNumberLeafRuntimeRunner(tc)), 0o644); err != nil {
149
+ t.Fatalf("write runtime runner: %v", err)
150
+ }
151
+ cmd := exec.Command(node, runner)
152
+ cmd.Dir = project
153
+ output, err := cmd.CombinedOutput()
154
+ if err != nil {
155
+ t.Fatalf("finite option runtime cases failed: %v\n%s", err, output)
156
+ }
157
+ // Every input drives is, validate, and assert, so the runner must report one
158
+ // executed assertion per (input, function) pair. Pinning the count keeps a
159
+ // runner that short-circuited or skipped cases from passing as a false green.
160
+ const expected = "RAN 12 CASES"
161
+ if !strings.Contains(string(output), expected) {
162
+ t.Fatalf("finite option runner did not report %q; got:\n%s", expected, output)
163
+ }
164
+ }
165
+
166
+ func finiteOptionNumberLeafRuntimeRunner(tc finiteOptionNumberLeafCase) string {
167
+ return fmt.Sprintf(`const mod = require("./main.cjs");
168
+
169
+ const cases = [
170
+ { name: "finite 1", value: 1, accept: true },
171
+ { name: "NaN", value: Number.NaN, accept: %[1]t },
172
+ { name: "Infinity", value: Number.POSITIVE_INFINITY, accept: %[2]t },
173
+ { name: "-Infinity", value: Number.NEGATIVE_INFINITY, accept: %[2]t },
174
+ ];
175
+
176
+ let ran = 0;
177
+ for (const c of cases) {
178
+ const result = mod.run(c.value);
179
+
180
+ ran += 1;
181
+ if (result.is !== c.accept) {
182
+ throw new Error(c.name + ": typia.is expected " + c.accept + " but got " + result.is);
183
+ }
184
+
185
+ ran += 1;
186
+ if (result.validate !== c.accept) {
187
+ throw new Error(c.name + ": typia.validate.success expected " + c.accept + " but got " + result.validate);
188
+ }
189
+
190
+ ran += 1;
191
+ const assertAccepted = result.assertThrew === false;
192
+ if (assertAccepted !== c.accept) {
193
+ throw new Error(c.name + ": typia.assert accepted=" + assertAccepted + " but expected " + c.accept);
194
+ }
195
+ }
196
+
197
+ console.log("RAN " + ran + " CASES");
198
+ `, tc.acceptNaN, tc.acceptInfinity)
199
+ }
200
+
201
+ const finiteOptionNumberLeafTSConfig = `{
202
+ "compilerOptions": {
203
+ "target": "ES2022",
204
+ "module": "commonjs",
205
+ "moduleResolution": "bundler",
206
+ "ignoreDeprecations": "6.0",
207
+ "types": ["*"],
208
+ "esModuleInterop": true,
209
+ "strict": true,
210
+ "skipLibCheck": true
211
+ },
212
+ "include": ["src"]
213
+ }
214
+ `
215
+
216
+ const finiteOptionNumberLeafSource = `import typia from "typia";
217
+
218
+ interface FiniteBox {
219
+ value: number;
220
+ }
221
+
222
+ const check = typia.createIs<FiniteBox>();
223
+ const validate = typia.createValidate<FiniteBox>();
224
+ const assert = typia.createAssert<FiniteBox>();
225
+
226
+ const captureThrow = (task: () => void): boolean => {
227
+ try {
228
+ task();
229
+ return false;
230
+ } catch {
231
+ return true;
232
+ }
233
+ };
234
+
235
+ export const run = (value: number) => ({
236
+ is: check({ value }),
237
+ validate: validate({ value }).success,
238
+ assertThrew: captureThrow(() => assert({ value })),
239
+ });
240
+ `