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,309 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestNotationUnicodeKeyTransform verifies the notation emit keeps a non-ASCII
12
+ // key intact and agrees with the runtime helper.
13
+ //
14
+ // Issue #2227: the emit computed each renamed key by slicing one *byte*
15
+ // (`value[:1]`) before case-converting it, so a multi-byte rune's lead byte was
16
+ // handed to the case operation on its own, could not be decoded, and came back
17
+ // as U+FFFD — `typia.notations.createPascal<{ "École": number }>()` emitted the
18
+ // key `"��cole"`. The static path corrupted the key while the dynamic
19
+ // (index-signature) path, which calls the runtime `_notationPascal`, did not, so
20
+ // one object could carry two different renamings of the same character and the
21
+ // emitted key did not match its declared `CamelCase<T>` / `PascalCase<T>` type.
22
+ //
23
+ // The same fix covers the second half of the divergence: JavaScript performs
24
+ // Unicode *full* case conversion while Go's `strings.ToUpper`/`ToLower` perform
25
+ // the *simple* per-rune mapping, so the emit also disagreed with the runtime on
26
+ // `ß` -> `SS`, `İ` -> `i` + U+0307, and the word-final sigma `ΑΣ` -> `ας`. That
27
+ // half reached `snake`/`kebab` too, which never sliced a byte.
28
+ //
29
+ // Every key and every expectation below is written with `\uXXXX` escapes so the
30
+ // fixture cannot be silently renormalized (NFC/NFD) by an editor, and so the
31
+ // combining-mark and surrogate-pair cases stay exactly what they claim to be.
32
+ //
33
+ // 1. Transform a fixture whose keys cover a multi-byte first character, a
34
+ // multi-byte character right after an underscore, a key that is a single
35
+ // multi-byte character, a combining mark (NFD), a surrogate pair, and the
36
+ // case-folding-sensitive `İ`, `ß`, and word-final sigma — plus two ASCII
37
+ // keys as a regression anchor.
38
+ // 2. Require the emitted JavaScript to carry no U+FFFD at all.
39
+ // 3. Execute each statically emitted converter and assert its key-to-value map
40
+ // equals the expectation derived from JavaScript's own case semantics.
41
+ // 4. Execute the dynamic `Record` converter, which routes through the runtime
42
+ // `_notation*` helper, over the same keys and require an identical map, so
43
+ // the compile-time emit and the runtime helper are proven equal per key.
44
+ func TestNotationUnicodeKeyTransform(t *testing.T) {
45
+ project := notationUnicodeKeyProject(t)
46
+ out, errText, code := ttscTypiaTestCapture(func() int {
47
+ return runTransform([]string{
48
+ "--cwd", project,
49
+ "--tsconfig", "tsconfig.json",
50
+ "--file", "src/main.ts",
51
+ "--output", "js",
52
+ })
53
+ })
54
+ if code != 0 {
55
+ t.Fatalf("unicode notation transform failed: code=%d stderr=\n%s", code, errText)
56
+ }
57
+ // The printer escapes every non-ASCII code unit, so a corrupted key reaches
58
+ // the output as the escape text rather than as the replacement rune itself.
59
+ // Both forms are rejected; checking only the rune would never fire.
60
+ if strings.Contains(out, `\uFFFD`) || strings.ContainsRune(out, '�') {
61
+ t.Fatalf("emitted converter must not contain U+FFFD; a key was corrupted by byte slicing:\n%s", out)
62
+ }
63
+ // Pin the exact emitted assignments for the witnesses of each half of the
64
+ // defect: the multi-byte first character and the post-underscore segment that
65
+ // byte slicing destroyed, plus the two characters that the simple per-rune
66
+ // case mapping got wrong. The printer escapes every non-ASCII code unit, so
67
+ // these are the literal bytes of the emitted JavaScript.
68
+ for _, assignment := range []string{
69
+ `["\u00E9cole"]: input["\u00C9cole"]`,
70
+ `["Key\u00D6lig"]: input["key_\u00D6lig"]`,
71
+ `["SS"]: input["\u00DF"]`,
72
+ `["i\u0307stanbul"]: input["\u0130stanbul"]`,
73
+ } {
74
+ if !strings.Contains(out, assignment) {
75
+ t.Fatalf("emitted converter should contain the assignment %s:\n%s", assignment, out)
76
+ }
77
+ }
78
+ notationUnicodeKeyRunRuntimeCases(t, project, out)
79
+ }
80
+
81
+ func notationUnicodeKeyProject(t *testing.T) string {
82
+ t.Helper()
83
+ root := ttscTypiaTestRepoRoot(t)
84
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
85
+ if err := os.MkdirAll(base, 0o755); err != nil {
86
+ t.Fatalf("mkdir temp base: %v", err)
87
+ }
88
+ dir, err := os.MkdirTemp(base, "notation-unicode-")
89
+ if err != nil {
90
+ t.Fatalf("create temp fixture: %v", err)
91
+ }
92
+ t.Cleanup(func() {
93
+ _ = os.RemoveAll(dir)
94
+ })
95
+ src := filepath.Join(dir, "src")
96
+ if err := os.MkdirAll(src, 0o755); err != nil {
97
+ t.Fatalf("mkdir fixture src: %v", err)
98
+ }
99
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(notationUnicodeKeyTSConfig), 0o644); err != nil {
100
+ t.Fatalf("write tsconfig: %v", err)
101
+ }
102
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(notationUnicodeKeySource), 0o644); err != nil {
103
+ t.Fatalf("write source: %v", err)
104
+ }
105
+ return dir
106
+ }
107
+
108
+ func notationUnicodeKeyRunRuntimeCases(t *testing.T, project string, js string) {
109
+ t.Helper()
110
+ node, err := exec.LookPath("node")
111
+ if err != nil {
112
+ t.Skip("node executable not found")
113
+ }
114
+ runtimeDir := filepath.Join(project, "runtime")
115
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
116
+ t.Fatalf("mkdir runtime dir: %v", err)
117
+ }
118
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
119
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
120
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
121
+ t.Fatalf("write runtime module: %v", err)
122
+ }
123
+ runner := filepath.Join(runtimeDir, "run.cjs")
124
+ if err := os.WriteFile(runner, []byte(notationUnicodeKeyRuntimeRunner), 0o644); err != nil {
125
+ t.Fatalf("write runtime runner: %v", err)
126
+ }
127
+ cmd := exec.Command(node, runner)
128
+ cmd.Dir = runtimeDir
129
+ output, err := cmd.CombinedOutput()
130
+ if err != nil {
131
+ t.Fatalf("unicode notation runtime cases failed: %v\n%s", err, output)
132
+ }
133
+ }
134
+
135
+ const notationUnicodeKeyTSConfig = `{
136
+ "compilerOptions": {
137
+ "target": "ES2022",
138
+ "module": "commonjs",
139
+ "moduleResolution": "bundler",
140
+ "ignoreDeprecations": "6.0",
141
+ "types": ["*"],
142
+ "esModuleInterop": true,
143
+ "strict": true,
144
+ "skipLibCheck": true
145
+ },
146
+ "include": ["src"]
147
+ }
148
+ `
149
+
150
+ const notationUnicodeKeySource = `import typia from "typia";
151
+
152
+ interface SourceRecord {
153
+ "\u00C9cole": number;
154
+ "\u00F6lwert": number;
155
+ "\u65E5\u672C\u8A9E": number;
156
+ "key_\u00D6lig": number;
157
+ "\u00D6": number;
158
+ "\u0130stanbul": number;
159
+ "\u00DF": number;
160
+ "\uD801\uDC28test": number;
161
+ "\u0391\u03A3_\u0391\u03A3": number;
162
+ "e\u0301cole": number;
163
+ "\u00FCber_Stra\u00DFe": number;
164
+ MAX_COUNT: number;
165
+ fooBar: number;
166
+ }
167
+
168
+ type DynamicRecord = Record<string, number>;
169
+
170
+ export const toCamel = typia.notations.createCamel<SourceRecord>();
171
+ export const toPascal = typia.notations.createPascal<SourceRecord>();
172
+ export const toSnake = typia.notations.createSnake<SourceRecord>();
173
+ export const toKebab = typia.notations.createKebab<SourceRecord>();
174
+
175
+ export const toCamelDynamic = typia.notations.createCamel<DynamicRecord>();
176
+ export const toPascalDynamic = typia.notations.createPascal<DynamicRecord>();
177
+ export const toSnakeDynamic = typia.notations.createSnake<DynamicRecord>();
178
+ export const toKebabDynamic = typia.notations.createKebab<DynamicRecord>();
179
+ `
180
+
181
+ const notationUnicodeKeyRuntimeRunner = `const mod = require("./main.cjs");
182
+
183
+ // Every source key carries a distinct value, so comparing the whole
184
+ // key-to-value map proves the per-key renaming rather than just the key set.
185
+ const input = {
186
+ ["\u00C9cole"]: 1,
187
+ ["\u00F6lwert"]: 2,
188
+ ["\u65E5\u672C\u8A9E"]: 3,
189
+ ["key_\u00D6lig"]: 4,
190
+ ["\u00D6"]: 5,
191
+ ["\u0130stanbul"]: 6,
192
+ ["\u00DF"]: 7,
193
+ ["\uD801\uDC28test"]: 8,
194
+ ["\u0391\u03A3_\u0391\u03A3"]: 9,
195
+ ["e\u0301cole"]: 10,
196
+ ["\u00FCber_Stra\u00DFe"]: 11,
197
+ ["MAX_COUNT"]: 12,
198
+ ["fooBar"]: 13,
199
+ };
200
+
201
+ // Expectations are JavaScript's own case semantics, not a snapshot of the Go
202
+ // emit: full case conversion (ß -> SS, İ -> i + U+0307, word-final
203
+ // sigma ΑΣ -> ας) and UTF-16 code-unit indexing, under which
204
+ // str[0] of an astral character is an uncased lone surrogate and stays put.
205
+ const expected = {
206
+ camel: {
207
+ ["\u00E9cole"]: 1,
208
+ ["\u00F6lwert"]: 2,
209
+ ["\u65E5\u672C\u8A9E"]: 3,
210
+ ["key\u00D6lig"]: 4,
211
+ ["\u00F6"]: 5,
212
+ ["i\u0307stanbul"]: 6,
213
+ ["\u00DF"]: 7,
214
+ ["\uD801\uDC28test"]: 8,
215
+ ["\u03B1\u03C2\u0391\u03C3"]: 9,
216
+ ["e\u0301cole"]: 10,
217
+ ["\u00FCberStra\u00DFe"]: 11,
218
+ ["maxCount"]: 12,
219
+ ["fooBar"]: 13,
220
+ },
221
+ pascal: {
222
+ ["\u00C9cole"]: 1,
223
+ ["\u00D6lwert"]: 2,
224
+ ["\u65E5\u672C\u8A9E"]: 3,
225
+ ["Key\u00D6lig"]: 4,
226
+ ["\u00D6"]: 5,
227
+ ["\u0130stanbul"]: 6,
228
+ ["SS"]: 7,
229
+ ["\uD801\uDC28test"]: 8,
230
+ ["\u0391\u03C3\u0391\u03C3"]: 9,
231
+ ["E\u0301cole"]: 10,
232
+ ["\u00DCberStra\u00DFe"]: 11,
233
+ ["MaxCount"]: 12,
234
+ ["FooBar"]: 13,
235
+ },
236
+ snake: {
237
+ ["\u00E9cole"]: 1,
238
+ ["\u00F6lwert"]: 2,
239
+ ["\u65E5\u672C\u8A9E"]: 3,
240
+ ["key_\u00F6lig"]: 4,
241
+ ["\u00F6"]: 5,
242
+ ["i\u0307stanbul"]: 6,
243
+ ["\u00DF"]: 7,
244
+ ["\uD801\uDC28test"]: 8,
245
+ ["\u03B1\u03C2_\u03B1\u03C2"]: 9,
246
+ ["e\u0301cole"]: 10,
247
+ ["\u00FCber_stra\u00DFe"]: 11,
248
+ ["max_count"]: 12,
249
+ ["foo_bar"]: 13,
250
+ },
251
+ kebab: {
252
+ ["\u00E9cole"]: 1,
253
+ ["\u00F6lwert"]: 2,
254
+ ["\u65E5\u672C\u8A9E"]: 3,
255
+ ["key-\u00F6lig"]: 4,
256
+ ["\u00F6"]: 5,
257
+ ["i\u0307stanbul"]: 6,
258
+ ["\u00DF"]: 7,
259
+ ["\uD801\uDC28test"]: 8,
260
+ ["\u03B1\u03C2-\u03B1\u03C2"]: 9,
261
+ ["e\u0301cole"]: 10,
262
+ ["\u00FCber-stra\u00DFe"]: 11,
263
+ ["max-count"]: 12,
264
+ ["foo-bar"]: 13,
265
+ },
266
+ };
267
+
268
+ const normalize = (object) =>
269
+ JSON.stringify(
270
+ Object.entries(object)
271
+ .map(([key, value]) => [Array.from(key, (c) => c.charCodeAt(0)), value])
272
+ .sort((a, b) => (String(a) < String(b) ? -1 : 1)),
273
+ );
274
+
275
+ const notations = ["camel", "pascal", "snake", "kebab"];
276
+ const capitalize = (name) => name[0].toUpperCase() + name.substring(1);
277
+
278
+ for (const notation of notations) {
279
+ const want = normalize(expected[notation]);
280
+
281
+ // The statically emitted converter: one property assignment per known key.
282
+ const staticResult = mod["to" + capitalize(notation)](input);
283
+ if (normalize(staticResult) !== want) {
284
+ throw new Error(
285
+ "static " + notation + " emit disagreed with JavaScript case semantics:\n" +
286
+ " expected " + want + "\n" +
287
+ " actual " + normalize(staticResult),
288
+ );
289
+ }
290
+
291
+ // The dynamic converter: one runtime _notation* call per index-signature key.
292
+ const dynamicResult = mod["to" + capitalize(notation) + "Dynamic"](input);
293
+ if (normalize(dynamicResult) !== normalize(staticResult)) {
294
+ throw new Error(
295
+ "static " + notation + " emit disagreed with the runtime helper:\n" +
296
+ " runtime " + normalize(dynamicResult) + "\n" +
297
+ " emit " + normalize(staticResult),
298
+ );
299
+ }
300
+
301
+ for (const key of Object.keys(staticResult)) {
302
+ if (key.includes("�")) {
303
+ throw new Error(
304
+ "renamed " + notation + " key contains U+FFFD: " + JSON.stringify(key),
305
+ );
306
+ }
307
+ }
308
+ }
309
+ `
@@ -0,0 +1,293 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ // TestPackageDeclarationNativeIdentityIsTransform pins runtime-native identity
13
+ // across ordinary package declarations and the genuine global controls (#2239).
14
+ //
15
+ // A declaration file is a normal published TypeScript package surface, so its
16
+ // source form cannot by itself establish that a Date/Map/Set/WeakMap symbol is
17
+ // the JavaScript native. The package types below are checker-equivalent to local
18
+ // structural controls and must keep their own members. Conversely, real global
19
+ // Date/Map/Set/WeakMap/WeakSet and Node-provided File/Blob types must retain
20
+ // their native checks.
21
+ //
22
+ // 1. Publish colliding structural declarations through a fixture package's
23
+ // index.d.ts and transform validators for them plus local controls.
24
+ // 2. Transform genuine global validators with DOM libraries excluded, making
25
+ // File and Blob come from the installed @types/node declaration package.
26
+ // 3. Inspect the emitted classification and execute all validators in Node,
27
+ // requiring an exact case count so an omitted branch cannot pass silently.
28
+ func TestPackageDeclarationNativeIdentityIsTransform(t *testing.T) {
29
+ project := packageDeclarationNativeIdentityProject(t)
30
+ transform := func(file string) string {
31
+ t.Helper()
32
+ out, errText, code := ttscTypiaTestCapture(func() int {
33
+ return runTransform([]string{
34
+ "--cwd", project,
35
+ "--tsconfig", "tsconfig.json",
36
+ "--file", file,
37
+ "--output", "js",
38
+ })
39
+ })
40
+ if code != 0 {
41
+ t.Fatalf("package declaration native identity transform %s failed: code=%d stderr=\n%s", file, code, errText)
42
+ }
43
+ return out
44
+ }
45
+
46
+ packageJS := transform("src/package.ts")
47
+ nativeJS := transform("src/native.ts")
48
+ failures := []string{}
49
+ for _, member := range []string{"stamp", "brandMap", "brandSet", "brandWeakMap"} {
50
+ if !strings.Contains(packageJS, member) {
51
+ failures = append(failures, fmt.Sprintf("package declaration member %q was dropped", member))
52
+ }
53
+ }
54
+ for _, gone := range []string{"instanceof Date", "instanceof Map", "instanceof Set", "instanceof WeakMap"} {
55
+ if strings.Contains(packageJS, gone) {
56
+ failures = append(failures, fmt.Sprintf("package declaration collision kept %q", gone))
57
+ }
58
+ }
59
+ for _, kept := range []string{
60
+ "instanceof Date",
61
+ "instanceof Map",
62
+ "instanceof Set",
63
+ "instanceof WeakMap",
64
+ "instanceof WeakSet",
65
+ "instanceof File",
66
+ "instanceof Blob",
67
+ } {
68
+ if !strings.Contains(nativeJS, kept) {
69
+ failures = append(failures, fmt.Sprintf("genuine native path %q was dropped", kept))
70
+ }
71
+ }
72
+ output, runtimeErr := packageDeclarationNativeIdentityRun(t, project, packageJS, nativeJS)
73
+ if runtimeErr != nil {
74
+ failures = append(failures, fmt.Sprintf("runtime matrix failed: %v\n%s", runtimeErr, output))
75
+ }
76
+ const expected = "RAN 30 CASES"
77
+ if !strings.Contains(output, expected) {
78
+ failures = append(failures, fmt.Sprintf("runtime runner did not report %q; got:\n%s", expected, output))
79
+ }
80
+ if len(failures) != 0 {
81
+ t.Fatalf("package declaration native identity mismatches:\n%s\n\npackage emit:\n%s\n\nnative emit:\n%s", strings.Join(failures, "\n"), packageJS, nativeJS)
82
+ }
83
+ }
84
+
85
+ func packageDeclarationNativeIdentityProject(t *testing.T) string {
86
+ t.Helper()
87
+ root := ttscTypiaTestRepoRoot(t)
88
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
89
+ if err := os.MkdirAll(base, 0o755); err != nil {
90
+ t.Fatalf("mkdir temp base: %v", err)
91
+ }
92
+ dir, err := os.MkdirTemp(base, "package-declaration-native-identity-")
93
+ if err != nil {
94
+ t.Fatalf("create temp fixture: %v", err)
95
+ }
96
+ t.Cleanup(func() {
97
+ _ = os.RemoveAll(dir)
98
+ })
99
+
100
+ src := filepath.Join(dir, "src")
101
+ dependency := filepath.Join(dir, "node_modules", "native-name-package")
102
+ for _, path := range []string{src, dependency} {
103
+ if err := os.MkdirAll(path, 0o755); err != nil {
104
+ t.Fatalf("mkdir fixture path %s: %v", path, err)
105
+ }
106
+ }
107
+ files := map[string]string{
108
+ filepath.Join(dir, "tsconfig.json"): packageDeclarationNativeIdentityTSConfig,
109
+ filepath.Join(dependency, "package.json"): packageDeclarationNativeIdentityPackageJSON,
110
+ filepath.Join(dependency, "index.d.ts"): packageDeclarationNativeIdentityDeclarations,
111
+ filepath.Join(src, "package.ts"): packageDeclarationNativeIdentitySource,
112
+ filepath.Join(src, "native.ts"): packageDeclarationNativeIdentityNativeSource,
113
+ }
114
+ for path, content := range files {
115
+ if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
116
+ t.Fatalf("write fixture file %s: %v", path, err)
117
+ }
118
+ }
119
+ return dir
120
+ }
121
+
122
+ func packageDeclarationNativeIdentityRun(t *testing.T, project string, packageJS string, nativeJS string) (string, error) {
123
+ t.Helper()
124
+ node, err := exec.LookPath("node")
125
+ if err != nil {
126
+ t.Skip("node executable not found")
127
+ return "", nil
128
+ }
129
+ runtimeDir := filepath.Join(project, "runtime")
130
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
131
+ t.Fatalf("mkdir runtime dir: %v", err)
132
+ }
133
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
134
+ modules := map[string]string{
135
+ "package.cjs": ttscTypiaTestRewriteCommonJS(t, packageJS),
136
+ "native.cjs": ttscTypiaTestRewriteCommonJS(t, nativeJS),
137
+ "run.cjs": packageDeclarationNativeIdentityRuntimeRunner,
138
+ }
139
+ for name, content := range modules {
140
+ if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
141
+ t.Fatalf("write runtime file %s: %v", name, err)
142
+ }
143
+ }
144
+ cmd := exec.Command(node, filepath.Join(runtimeDir, "run.cjs"))
145
+ cmd.Dir = runtimeDir
146
+ output, err := cmd.CombinedOutput()
147
+ return string(output), err
148
+ }
149
+
150
+ const packageDeclarationNativeIdentityTSConfig = `{
151
+ "compilerOptions": {
152
+ "target": "ES2022",
153
+ "module": "commonjs",
154
+ "moduleResolution": "bundler",
155
+ "ignoreDeprecations": "6.0",
156
+ "lib": ["ES2022"],
157
+ "types": ["node"],
158
+ "esModuleInterop": true,
159
+ "strict": true,
160
+ "skipLibCheck": true
161
+ },
162
+ "include": ["src"]
163
+ }
164
+ `
165
+
166
+ const packageDeclarationNativeIdentityPackageJSON = `{
167
+ "name": "native-name-package",
168
+ "version": "1.0.0",
169
+ "types": "index.d.ts"
170
+ }
171
+ `
172
+
173
+ const packageDeclarationNativeIdentityDeclarations = `export interface Date {
174
+ stamp: number;
175
+ }
176
+ export interface Map<K, V> {
177
+ brandMap: K;
178
+ valueMap: V;
179
+ }
180
+ export interface Set<T> {
181
+ brandSet: T;
182
+ }
183
+ export interface WeakMap<K extends object, V> {
184
+ brandWeakMap: K;
185
+ valueWeakMap: V;
186
+ }
187
+ `
188
+
189
+ const packageDeclarationNativeIdentitySource = `import typia from "typia";
190
+ import type {
191
+ Date as PackageDate,
192
+ Map as PackageMap,
193
+ Set as PackageSet,
194
+ WeakMap as PackageWeakMap,
195
+ } from "native-name-package";
196
+
197
+ interface LocalDate {
198
+ stamp: number;
199
+ }
200
+ interface LocalMap<K, V> {
201
+ brandMap: K;
202
+ valueMap: V;
203
+ }
204
+ interface LocalSet<T> {
205
+ brandSet: T;
206
+ }
207
+ interface LocalWeakMap<K extends object, V> {
208
+ brandWeakMap: K;
209
+ valueWeakMap: V;
210
+ }
211
+
212
+ type Assert<T extends true> = T;
213
+ type Same<X, Y> = [X] extends [Y]
214
+ ? [Y] extends [X]
215
+ ? true
216
+ : false
217
+ : false;
218
+ type _PackageDateIsLocal = Assert<Same<PackageDate, LocalDate>>;
219
+ type _PackageMapIsLocal = Assert<Same<PackageMap<string, number>, LocalMap<string, number>>>;
220
+ type _PackageSetIsLocal = Assert<Same<PackageSet<string>, LocalSet<string>>>;
221
+ type _PackageWeakMapIsLocal = Assert<Same<PackageWeakMap<object, string>, LocalWeakMap<object, string>>>;
222
+
223
+ export const isPackageDate = typia.createIs<PackageDate>();
224
+ export const isPackageMap = typia.createIs<PackageMap<string, number>>();
225
+ export const isPackageSet = typia.createIs<PackageSet<string>>();
226
+ export const isPackageWeakMap = typia.createIs<PackageWeakMap<object, string>>();
227
+ export const isLocalDate = typia.createIs<LocalDate>();
228
+ export const isLocalMap = typia.createIs<LocalMap<string, number>>();
229
+ export const isLocalSet = typia.createIs<LocalSet<string>>();
230
+ export const isLocalWeakMap = typia.createIs<LocalWeakMap<object, string>>();
231
+ `
232
+
233
+ const packageDeclarationNativeIdentityNativeSource = `import typia from "typia";
234
+
235
+ export const isNativeDate = typia.createIs<Date>();
236
+ export const isNativeMap = typia.createIs<Map<string, number>>();
237
+ export const isNativeSet = typia.createIs<Set<string>>();
238
+ export const isNativeWeakMap = typia.createIs<WeakMap<object, string>>();
239
+ export const isNativeWeakSet = typia.createIs<WeakSet<object>>();
240
+ export const isNativeFile = typia.createIs<File>();
241
+ export const isNativeBlob = typia.createIs<Blob>();
242
+ `
243
+
244
+ const packageDeclarationNativeIdentityRuntimeRunner = `const packageTypes = require("./package.cjs");
245
+ const natives = require("./native.cjs");
246
+
247
+ let ran = 0;
248
+ const failures = [];
249
+ const eq = (name, actual, expected) => {
250
+ ran += 1;
251
+ if (actual !== expected) {
252
+ failures.push(name + ": expected " + expected + " but got " + actual);
253
+ }
254
+ };
255
+
256
+ eq("package Date valid", packageTypes.isPackageDate({ stamp: 1 }), true);
257
+ eq("package Date invalid", packageTypes.isPackageDate({}), false);
258
+ eq("package Date rejects native", packageTypes.isPackageDate(new Date()), false);
259
+ eq("package Map valid", packageTypes.isPackageMap({ brandMap: "x", valueMap: 1 }), true);
260
+ eq("package Map invalid", packageTypes.isPackageMap({ brandMap: "x" }), false);
261
+ eq("package Map rejects native", packageTypes.isPackageMap(new Map([["x", 1]])), false);
262
+ eq("package Set valid", packageTypes.isPackageSet({ brandSet: "x" }), true);
263
+ eq("package Set invalid", packageTypes.isPackageSet({}), false);
264
+ eq("package Set rejects native", packageTypes.isPackageSet(new Set(["x"])), false);
265
+ eq("package WeakMap valid", packageTypes.isPackageWeakMap({ brandWeakMap: {}, valueWeakMap: "x" }), true);
266
+ eq("package WeakMap invalid", packageTypes.isPackageWeakMap({ brandWeakMap: {} }), false);
267
+ eq("package WeakMap rejects native", packageTypes.isPackageWeakMap(new WeakMap()), false);
268
+
269
+ eq("local Date control", packageTypes.isLocalDate({ stamp: 1 }), true);
270
+ eq("local Map control", packageTypes.isLocalMap({ brandMap: "x", valueMap: 1 }), true);
271
+ eq("local Set control", packageTypes.isLocalSet({ brandSet: "x" }), true);
272
+ eq("local WeakMap control", packageTypes.isLocalWeakMap({ brandWeakMap: {}, valueWeakMap: "x" }), true);
273
+
274
+ eq("native Date real", natives.isNativeDate(new Date()), true);
275
+ eq("native Date plain", natives.isNativeDate({}), false);
276
+ eq("native Map real", natives.isNativeMap(new Map([["x", 1]])), true);
277
+ eq("native Map plain", natives.isNativeMap({}), false);
278
+ eq("native Set real", natives.isNativeSet(new Set(["x"])), true);
279
+ eq("native Set plain", natives.isNativeSet({}), false);
280
+ eq("native WeakMap real", natives.isNativeWeakMap(new WeakMap()), true);
281
+ eq("native WeakMap plain", natives.isNativeWeakMap({}), false);
282
+ eq("native WeakSet real", natives.isNativeWeakSet(new WeakSet()), true);
283
+ eq("native WeakSet plain", natives.isNativeWeakSet({}), false);
284
+ eq("Node File real", natives.isNativeFile(new File(["x"], "x.txt")), true);
285
+ eq("Node File plain", natives.isNativeFile({ name: "x.txt", size: 1 }), false);
286
+ eq("Node Blob real", natives.isNativeBlob(new Blob(["x"])), true);
287
+ eq("Node Blob plain", natives.isNativeBlob({ size: 1, type: "text/plain" }), false);
288
+
289
+ console.log("RAN " + ran + " CASES");
290
+ if (failures.length !== 0) {
291
+ throw new Error("MISMATCHES:\n" + failures.join("\n"));
292
+ }
293
+ `