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,234 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestNativeCollectionIdentityIsTransform pins the runtime and emit behavior of
12
+ // typia.is for a user type whose name collides with a built-in collection native
13
+ // (#2212, the collection half of #2200).
14
+ //
15
+ // Collection-native classification matched Map/Set (iterate_metadata_map.go /
16
+ // iterate_metadata_set.go) and WeakMap/WeakSet (the generics loop in
17
+ // iterate_metadata_native.go) by base name alone, so a module-scoped user
18
+ // `interface Map<K, V> { brandMap; keyMap; valMap }` yielded the base name "Map"
19
+ // and was emitted as `input instanceof Map && [...]` — its own members dropped,
20
+ // byte-identical to the real-lib Map. Every valid structural value was rejected
21
+ // and the emit could throw where no such global exists.
22
+ //
23
+ // After the fix, collection-native classification (like the simples path #2200
24
+ // already gated) requires the matched symbol to be declared in a `.d.ts`
25
+ // declaration file, which a real built-in always is and a user type in a `.ts`
26
+ // module never is. A colliding user type then falls through to the structural
27
+ // object path and validates against its declared members, while the genuine
28
+ // natives keep their `instanceof` check.
29
+ //
30
+ // 1. Transform is for user interfaces named Map/Set/WeakMap/WeakSet (main.ts,
31
+ // module-scoped, shadowing the globals) and for the genuine globals of the
32
+ // same names (real.ts, unshadowed).
33
+ // 2. Assert the user emit is structural (its own brand members survive, no
34
+ // `instanceof`) while the genuine natives keep their `instanceof` path.
35
+ // 3. Execute both emitted modules in Node against the boundary matrix, requiring
36
+ // the runner to report the exact executed case count so a runner that
37
+ // silently skipped cases cannot pass as a false green.
38
+ func TestNativeCollectionIdentityIsTransform(t *testing.T) {
39
+ project := nativeCollectionIdentityProject(t)
40
+ transform := func(file string) string {
41
+ out, errText, code := ttscTypiaTestCapture(func() int {
42
+ return runTransform([]string{
43
+ "--cwd", project,
44
+ "--tsconfig", "tsconfig.json",
45
+ "--file", file,
46
+ "--output", "js",
47
+ })
48
+ })
49
+ if code != 0 {
50
+ t.Fatalf("collection identity transform %s failed: code=%d stderr=\n%s", file, code, errText)
51
+ }
52
+ return out
53
+ }
54
+ userJS := transform("src/main.ts")
55
+ realJS := transform("src/real.ts")
56
+
57
+ // The colliding user types must validate structurally: their own members
58
+ // survive and no native instanceof is emitted for them.
59
+ for _, member := range []string{"brandMap", "brandSet", "brandWeakMap", "brandWeakSet"} {
60
+ if !strings.Contains(userJS, member) {
61
+ t.Fatalf("expected user collection type member %q to survive structurally, but it was dropped in:\n%s", member, userJS)
62
+ }
63
+ }
64
+ for _, gone := range []string{"instanceof Map", "instanceof Set", "instanceof WeakMap", "instanceof WeakSet"} {
65
+ if strings.Contains(userJS, gone) {
66
+ t.Fatalf("expected user collection collision %q to be reclassified structurally, but it survived in:\n%s", gone, userJS)
67
+ }
68
+ }
69
+ // The genuine globals of the same names must stay native.
70
+ for _, kept := range []string{"instanceof Map", "instanceof Set", "instanceof WeakMap", "instanceof WeakSet"} {
71
+ if !strings.Contains(realJS, kept) {
72
+ t.Fatalf("expected genuine native path %q to remain in transform output:\n%s", kept, realJS)
73
+ }
74
+ }
75
+ nativeCollectionIdentityRunRuntimeCases(t, project, userJS, realJS)
76
+ }
77
+
78
+ func nativeCollectionIdentityProject(t *testing.T) string {
79
+ t.Helper()
80
+ root := ttscTypiaTestRepoRoot(t)
81
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
82
+ if err := os.MkdirAll(base, 0o755); err != nil {
83
+ t.Fatalf("mkdir temp base: %v", err)
84
+ }
85
+ dir, err := os.MkdirTemp(base, "native-collection-identity-")
86
+ if err != nil {
87
+ t.Fatalf("create temp fixture: %v", err)
88
+ }
89
+ t.Cleanup(func() {
90
+ _ = os.RemoveAll(dir)
91
+ })
92
+ src := filepath.Join(dir, "src")
93
+ if err := os.MkdirAll(src, 0o755); err != nil {
94
+ t.Fatalf("mkdir fixture src: %v", err)
95
+ }
96
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(finiteOptionNumberLeafTSConfig), 0o644); err != nil {
97
+ t.Fatalf("write tsconfig: %v", err)
98
+ }
99
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(nativeCollectionIdentityUserSource), 0o644); err != nil {
100
+ t.Fatalf("write user source: %v", err)
101
+ }
102
+ if err := os.WriteFile(filepath.Join(src, "real.ts"), []byte(nativeCollectionIdentityRealSource), 0o644); err != nil {
103
+ t.Fatalf("write real source: %v", err)
104
+ }
105
+ return dir
106
+ }
107
+
108
+ func nativeCollectionIdentityRunRuntimeCases(t *testing.T, project string, userJS string, realJS 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
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(ttscTypiaTestRewriteCommonJS(t, userJS)), 0o644); err != nil {
120
+ t.Fatalf("write user runtime module: %v", err)
121
+ }
122
+ if err := os.WriteFile(filepath.Join(runtimeDir, "real.cjs"), []byte(ttscTypiaTestRewriteCommonJS(t, realJS)), 0o644); err != nil {
123
+ t.Fatalf("write real runtime module: %v", err)
124
+ }
125
+ runner := filepath.Join(runtimeDir, "run.cjs")
126
+ if err := os.WriteFile(runner, []byte(nativeCollectionIdentityRuntimeRunner), 0o644); err != nil {
127
+ t.Fatalf("write runtime runner: %v", err)
128
+ }
129
+ cmd := exec.Command(node, runner)
130
+ cmd.Dir = runtimeDir
131
+ output, err := cmd.CombinedOutput()
132
+ if err != nil {
133
+ t.Fatalf("collection identity runtime cases failed: %v\n%s", err, output)
134
+ }
135
+ const expected = "RAN 27 CASES"
136
+ if !strings.Contains(string(output), expected) {
137
+ t.Fatalf("collection identity runner did not report %q; got:\n%s", expected, output)
138
+ }
139
+ }
140
+
141
+ // main.ts declares module-scoped interfaces named exactly Map/Set/WeakMap/WeakSet
142
+ // that shadow the globals within this module, so their base name is exactly the
143
+ // native name (the #2212 collision). Their type parameters are their own.
144
+ const nativeCollectionIdentityUserSource = `import typia from "typia";
145
+
146
+ interface Map<K, V> {
147
+ brandMap: string;
148
+ keyMap: K;
149
+ valMap: V;
150
+ }
151
+ interface Set<T> {
152
+ brandSet: string;
153
+ elemSet: T;
154
+ }
155
+ interface WeakMap<K extends object, V> {
156
+ brandWeakMap: string;
157
+ }
158
+ interface WeakSet<T extends object> {
159
+ brandWeakSet: string;
160
+ }
161
+
162
+ export const isUserMap = typia.createIs<Map<string, number>>();
163
+ export const isUserSet = typia.createIs<Set<number>>();
164
+ export const isUserWeakMap = typia.createIs<WeakMap<object, number>>();
165
+ export const isUserWeakSet = typia.createIs<WeakSet<object>>();
166
+ `
167
+
168
+ // real.ts declares no local shadow, so its Map/Set/WeakMap/WeakSet resolve to the
169
+ // genuine globals declared in a lib `.d.ts` and must stay native.
170
+ const nativeCollectionIdentityRealSource = `import typia from "typia";
171
+
172
+ export const isRealMap = typia.createIs<Map<string, number>>();
173
+ export const isRealSet = typia.createIs<Set<number>>();
174
+ export const isRealWeakMap = typia.createIs<WeakMap<object, number>>();
175
+ export const isRealWeakSet = typia.createIs<WeakSet<object>>();
176
+ `
177
+
178
+ const nativeCollectionIdentityRuntimeRunner = `const user = require("./main.cjs");
179
+ const real = require("./real.cjs");
180
+
181
+ let ran = 0;
182
+ const eq = (name, actual, expected) => {
183
+ ran += 1;
184
+ if (actual !== expected) {
185
+ throw new Error(name + ": expected " + expected + " but got " + actual);
186
+ }
187
+ };
188
+
189
+ // A user interface named Map must validate against its own members, not the
190
+ // native Map instanceof path (#2212).
191
+ eq("isUserMap valid", user.isUserMap({ brandMap: "x", keyMap: "k", valMap: 1 }), true);
192
+ eq("isUserMap missing brand", user.isUserMap({ keyMap: "k", valMap: 1 }), false);
193
+ eq("isUserMap wrong valMap type", user.isUserMap({ brandMap: "x", keyMap: "k", valMap: "1" }), false);
194
+ eq("isUserMap rejects a real Map", user.isUserMap(new Map([["k", 1]])), false);
195
+ eq("isUserMap null", user.isUserMap(null), false);
196
+ eq("isUserMap empty object", user.isUserMap({}), false);
197
+
198
+ // A user interface named Set is structural too.
199
+ eq("isUserSet valid", user.isUserSet({ brandSet: "s", elemSet: 2 }), true);
200
+ eq("isUserSet missing brand", user.isUserSet({ elemSet: 2 }), false);
201
+ eq("isUserSet rejects a real Set", user.isUserSet(new Set([1])), false);
202
+
203
+ // A user interface named WeakMap is structural, not instanceof WeakMap.
204
+ eq("isUserWeakMap valid", user.isUserWeakMap({ brandWeakMap: "w" }), true);
205
+ eq("isUserWeakMap missing brand", user.isUserWeakMap({}), false);
206
+ eq("isUserWeakMap rejects a real WeakMap", user.isUserWeakMap(new WeakMap()), false);
207
+
208
+ // A user interface named WeakSet is structural, not instanceof WeakSet.
209
+ eq("isUserWeakSet valid", user.isUserWeakSet({ brandWeakSet: "z" }), true);
210
+ eq("isUserWeakSet missing brand", user.isUserWeakSet({}), false);
211
+ eq("isUserWeakSet rejects a real WeakSet", user.isUserWeakSet(new WeakSet()), false);
212
+
213
+ // The genuine globals keep their instanceof check and accept a real instance
214
+ // while rejecting a plain object of the same shape.
215
+ eq("isRealMap real", real.isRealMap(new Map([["a", 1]])), true);
216
+ eq("isRealMap empty real", real.isRealMap(new Map()), true);
217
+ eq("isRealMap plain object", real.isRealMap({}), false);
218
+ eq("isRealMap user Map shape", real.isRealMap({ brandMap: "x", keyMap: "k", valMap: 1 }), false);
219
+
220
+ eq("isRealSet real", real.isRealSet(new Set([1, 2])), true);
221
+ eq("isRealSet plain object", real.isRealSet({}), false);
222
+
223
+ eq("isRealWeakMap real", real.isRealWeakMap(new WeakMap()), true);
224
+ eq("isRealWeakMap plain object", real.isRealWeakMap({}), false);
225
+
226
+ eq("isRealWeakSet real", real.isRealWeakSet(new WeakSet()), true);
227
+ eq("isRealWeakSet plain object", real.isRealWeakSet({}), false);
228
+
229
+ // Real collections stay disjoint from one another.
230
+ eq("isRealMap rejects a real Set", real.isRealMap(new Set()), false);
231
+ eq("isRealWeakMap rejects a real WeakSet", real.isRealWeakMap(new WeakSet()), false);
232
+
233
+ console.log("RAN " + ran + " CASES");
234
+ `
@@ -0,0 +1,194 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestNativeGenericNameGuardIsTransform verifies that a user type whose name
12
+ // begins with WeakMap/WeakSet is not misdetected as the native generic.
13
+ //
14
+ // Native generic detection matched WeakMap/WeakSet with a bare
15
+ // strings.HasPrefix(name, generic.Name) while the Map/Set siblings require the
16
+ // name to be exactly the generic. A user interface named WeakMapLike therefore
17
+ // took the native path and emitted `input instanceof WeakMap`, so
18
+ // typia.is<WeakMapLike>({...}) returned false (issue #2181). The guard now
19
+ // admits a native only when the stripped name equals the generic, so a genuine
20
+ // WeakMap<K, V>/WeakSet<T> stays native while WeakMapLike validates its shape.
21
+ //
22
+ // 1. Transform typia.is calls for WeakMapLike, WeakSetLike, WeakMapEntry, a
23
+ // MapLike control, and genuine WeakMap<object, number>/WeakSet<object>.
24
+ // 2. Assert the emitted TypeScript keeps the native `instanceof` path for the
25
+ // genuine generics.
26
+ // 3. Execute the emitted validators so the user-named objects validate as
27
+ // their shape while the genuine natives still accept only their instance.
28
+ func TestNativeGenericNameGuardIsTransform(t *testing.T) {
29
+ project := nativeGenericNameGuardProject(t)
30
+ ts := nativeGenericNameGuardTransform(t, project, "ts")
31
+ for _, needle := range []string{"instanceof WeakMap", "instanceof WeakSet"} {
32
+ if !strings.Contains(ts, needle) {
33
+ t.Fatalf("expected genuine native path %q in transform output:\n%s", needle, ts)
34
+ }
35
+ }
36
+ nativeGenericNameGuardRunRuntimeCases(t, project, nativeGenericNameGuardTransform(t, project, "js"))
37
+ }
38
+
39
+ func nativeGenericNameGuardProject(t *testing.T) string {
40
+ t.Helper()
41
+ root := ttscTypiaTestRepoRoot(t)
42
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
43
+ if err := os.MkdirAll(base, 0o755); err != nil {
44
+ t.Fatalf("mkdir temp base: %v", err)
45
+ }
46
+ dir, err := os.MkdirTemp(base, "native-generic-name-guard-")
47
+ if err != nil {
48
+ t.Fatalf("create temp fixture: %v", err)
49
+ }
50
+ t.Cleanup(func() {
51
+ _ = os.RemoveAll(dir)
52
+ })
53
+ src := filepath.Join(dir, "src")
54
+ if err := os.MkdirAll(src, 0o755); err != nil {
55
+ t.Fatalf("mkdir fixture src: %v", err)
56
+ }
57
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(nativeGenericNameGuardTSConfig), 0o644); err != nil {
58
+ t.Fatalf("write tsconfig: %v", err)
59
+ }
60
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(nativeGenericNameGuardSource), 0o644); err != nil {
61
+ t.Fatalf("write source: %v", err)
62
+ }
63
+ return dir
64
+ }
65
+
66
+ func nativeGenericNameGuardTransform(t *testing.T, project string, output string) string {
67
+ t.Helper()
68
+ out, errText, code := ttscTypiaTestCapture(func() int {
69
+ return runTransform([]string{
70
+ "--cwd", project,
71
+ "--tsconfig", "tsconfig.json",
72
+ "--file", "src/main.ts",
73
+ "--output", output,
74
+ })
75
+ })
76
+ if code != 0 {
77
+ t.Fatalf("native generic name guard transform failed: output=%s code=%d stderr=\n%s", output, code, errText)
78
+ }
79
+ return out
80
+ }
81
+
82
+ func nativeGenericNameGuardRunRuntimeCases(t *testing.T, project string, js string) {
83
+ t.Helper()
84
+ node, err := exec.LookPath("node")
85
+ if err != nil {
86
+ t.Skip("node executable not found")
87
+ }
88
+ runtimeDir := filepath.Join(project, "runtime")
89
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
90
+ t.Fatalf("mkdir runtime dir: %v", err)
91
+ }
92
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
93
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
94
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
95
+ t.Fatalf("write runtime module: %v", err)
96
+ }
97
+ runner := filepath.Join(runtimeDir, "run.cjs")
98
+ if err := os.WriteFile(runner, []byte(nativeGenericNameGuardRuntimeRunner), 0o644); err != nil {
99
+ t.Fatalf("write runtime runner: %v", err)
100
+ }
101
+ cmd := exec.Command(node, runner)
102
+ cmd.Dir = runtimeDir
103
+ if output, err := cmd.CombinedOutput(); err != nil {
104
+ t.Fatalf("native generic name guard runtime cases failed: %v\n%s", err, output)
105
+ }
106
+ }
107
+
108
+ const nativeGenericNameGuardTSConfig = `{
109
+ "compilerOptions": {
110
+ "target": "ES2022",
111
+ "module": "commonjs",
112
+ "moduleResolution": "bundler",
113
+ "ignoreDeprecations": "6.0",
114
+ "types": ["*"],
115
+ "esModuleInterop": true,
116
+ "strict": true,
117
+ "skipLibCheck": true
118
+ },
119
+ "include": ["src"]
120
+ }
121
+ `
122
+
123
+ const nativeGenericNameGuardSource = `import typia from "typia";
124
+
125
+ interface WeakMapLike {
126
+ id: number;
127
+ count: number;
128
+ }
129
+ interface WeakSetLike {
130
+ id: number;
131
+ count: number;
132
+ }
133
+ interface WeakMapEntry {
134
+ id: number;
135
+ count: number;
136
+ }
137
+ interface MapLike {
138
+ id: number;
139
+ count: number;
140
+ }
141
+
142
+ export const isWeakMapLike = (input: unknown): boolean =>
143
+ typia.is<WeakMapLike>(input);
144
+ export const isWeakSetLike = (input: unknown): boolean =>
145
+ typia.is<WeakSetLike>(input);
146
+ export const isWeakMapEntry = (input: unknown): boolean =>
147
+ typia.is<WeakMapEntry>(input);
148
+ export const isMapLike = (input: unknown): boolean =>
149
+ typia.is<MapLike>(input);
150
+ export const isNativeWeakMap = (input: unknown): boolean =>
151
+ typia.is<WeakMap<object, number>>(input);
152
+ export const isNativeWeakSet = (input: unknown): boolean =>
153
+ typia.is<WeakSet<object>>(input);
154
+ `
155
+
156
+ const nativeGenericNameGuardRuntimeRunner = `const mod = require("./main.cjs");
157
+
158
+ const expect = (label, actual, expected) => {
159
+ if (actual !== expected) {
160
+ throw new Error(label + ": expected " + expected + ", got " + actual);
161
+ }
162
+ };
163
+
164
+ const shaped = { id: 1, count: 2 };
165
+
166
+ // A user interface whose name is merely prefixed by a native generic must
167
+ // validate against its declared shape, not the native instanceof path.
168
+ expect("WeakMapLike accepts its shape", mod.isWeakMapLike(shaped), true);
169
+ expect("WeakMapLike rejects a missing property", mod.isWeakMapLike({ id: 1 }), false);
170
+ expect("WeakMapLike rejects a wrong property type", mod.isWeakMapLike({ id: 1, count: "2" }), false);
171
+ expect("WeakMapLike rejects a real WeakMap", mod.isWeakMapLike(new WeakMap()), false);
172
+
173
+ expect("WeakSetLike accepts its shape", mod.isWeakSetLike(shaped), true);
174
+ expect("WeakSetLike rejects a missing property", mod.isWeakSetLike({ id: 1 }), false);
175
+ expect("WeakSetLike rejects a real WeakSet", mod.isWeakSetLike(new WeakSet()), false);
176
+
177
+ expect("WeakMapEntry accepts its shape", mod.isWeakMapEntry(shaped), true);
178
+ expect("WeakMapEntry rejects a missing property", mod.isWeakMapEntry({ id: 1 }), false);
179
+
180
+ // MapLike is the already-guarded control: it stays a plain object exactly as
181
+ // the WeakMap*/WeakSet* names now do.
182
+ expect("MapLike control accepts its shape", mod.isMapLike(shaped), true);
183
+ expect("MapLike control rejects a missing property", mod.isMapLike({ id: 1 }), false);
184
+
185
+ // Genuine native generics always carry angle brackets, so the exact-name guard
186
+ // keeps them on the native instanceof path unchanged.
187
+ expect("native WeakMap accepts an instance", mod.isNativeWeakMap(new WeakMap()), true);
188
+ expect("native WeakMap rejects a plain object", mod.isNativeWeakMap(shaped), false);
189
+ expect("native WeakMap rejects a WeakSet", mod.isNativeWeakMap(new WeakSet()), false);
190
+
191
+ expect("native WeakSet accepts an instance", mod.isNativeWeakSet(new WeakSet()), true);
192
+ expect("native WeakSet rejects a plain object", mod.isNativeWeakSet(shaped), false);
193
+ expect("native WeakSet rejects a WeakMap", mod.isNativeWeakSet(new WeakMap()), false);
194
+ `
@@ -0,0 +1,204 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestNativeNameCollisionIsTransform pins the runtime and emit behavior of
12
+ // typia.is / assert / validate for a user type whose name collides with a
13
+ // built-in native (#2200).
14
+ //
15
+ // Native classification matched a type against the simples table by name alone,
16
+ // so a user `interface File { name; size }` yielded the base name "File", matched
17
+ // iterate_metadata_native_simples["File"], and emitted `input instanceof File` —
18
+ // ignoring the user's own members. Every valid `File` value was therefore
19
+ // rejected, and in a runtime without the DOM/File global the check threw a
20
+ // ReferenceError. The same struck `Blob`, `Date`, the typed arrays, and every
21
+ // other simples name.
22
+ //
23
+ // After the fix native classification requires the matched symbol to be declared
24
+ // in a `.d.ts` declaration file (a TypeScript default library or an ambient
25
+ // package such as @types/node), which a real built-in always is and a user type
26
+ // in a `.ts` module never is. A colliding user type then falls through to the
27
+ // structural object path and validates against its declared members, while a
28
+ // genuine native (`Date`, `Uint8Array`) keeps its native `instanceof` check.
29
+ //
30
+ // 1. Transform is / validate for user interfaces named File and Blob, a near-miss
31
+ // control (Filer), and the genuine natives Date and Uint8Array.
32
+ // 2. Assert the emitted TypeScript drops `instanceof File` / `instanceof Blob`
33
+ // for the user types while keeping `instanceof Date` / `instanceof Uint8Array`
34
+ // for the real natives.
35
+ // 3. Execute the emitted validators in Node against the boundary matrix, and
36
+ // require the runner to report the exact executed case count so a runner that
37
+ // silently skipped cases cannot pass as a false green.
38
+ func TestNativeNameCollisionIsTransform(t *testing.T) {
39
+ project := nativeNameCollisionProject(t)
40
+ js := nativeNameCollisionTransform(t, project)
41
+ for _, gone := range []string{"instanceof File", "instanceof Blob"} {
42
+ if strings.Contains(js, gone) {
43
+ t.Fatalf("expected user type collision %q to be reclassified structurally, but it survived in:\n%s", gone, js)
44
+ }
45
+ }
46
+ for _, kept := range []string{"instanceof Date", "instanceof Uint8Array"} {
47
+ if !strings.Contains(js, kept) {
48
+ t.Fatalf("expected genuine native path %q to remain in transform output:\n%s", kept, js)
49
+ }
50
+ }
51
+ nativeNameCollisionRunRuntimeCases(t, project, js)
52
+ }
53
+
54
+ func nativeNameCollisionProject(t *testing.T) string {
55
+ t.Helper()
56
+ root := ttscTypiaTestRepoRoot(t)
57
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
58
+ if err := os.MkdirAll(base, 0o755); err != nil {
59
+ t.Fatalf("mkdir temp base: %v", err)
60
+ }
61
+ dir, err := os.MkdirTemp(base, "native-name-collision-")
62
+ if err != nil {
63
+ t.Fatalf("create temp fixture: %v", err)
64
+ }
65
+ t.Cleanup(func() {
66
+ _ = os.RemoveAll(dir)
67
+ })
68
+ src := filepath.Join(dir, "src")
69
+ if err := os.MkdirAll(src, 0o755); err != nil {
70
+ t.Fatalf("mkdir fixture src: %v", err)
71
+ }
72
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(finiteOptionNumberLeafTSConfig), 0o644); err != nil {
73
+ t.Fatalf("write tsconfig: %v", err)
74
+ }
75
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(nativeNameCollisionSource), 0o644); err != nil {
76
+ t.Fatalf("write source: %v", err)
77
+ }
78
+ return dir
79
+ }
80
+
81
+ func nativeNameCollisionTransform(t *testing.T, project string) string {
82
+ t.Helper()
83
+ payload := `[{"config":{"transform":"typia/lib/transform"},"name":"typia","stage":"transform"}]`
84
+ out, errText, code := ttscTypiaTestCapture(func() int {
85
+ return runTransform([]string{
86
+ "--cwd", project,
87
+ "--tsconfig", "tsconfig.json",
88
+ "--file", "src/main.ts",
89
+ "--output", "js",
90
+ "--plugins-json", payload,
91
+ })
92
+ })
93
+ if code != 0 {
94
+ t.Fatalf("native name collision transform failed: code=%d stderr=\n%s", code, errText)
95
+ }
96
+ return out
97
+ }
98
+
99
+ func nativeNameCollisionRunRuntimeCases(t *testing.T, project string, js string) {
100
+ t.Helper()
101
+ node, err := exec.LookPath("node")
102
+ if err != nil {
103
+ t.Skip("node executable not found")
104
+ }
105
+ runtimeDir := filepath.Join(project, "runtime")
106
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
107
+ t.Fatalf("mkdir runtime dir: %v", err)
108
+ }
109
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
110
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
111
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
112
+ t.Fatalf("write runtime module: %v", err)
113
+ }
114
+ runner := filepath.Join(runtimeDir, "run.cjs")
115
+ if err := os.WriteFile(runner, []byte(nativeNameCollisionRuntimeRunner), 0o644); err != nil {
116
+ t.Fatalf("write runtime runner: %v", err)
117
+ }
118
+ cmd := exec.Command(node, runner)
119
+ cmd.Dir = runtimeDir
120
+ output, err := cmd.CombinedOutput()
121
+ if err != nil {
122
+ t.Fatalf("native name collision runtime cases failed: %v\n%s", err, output)
123
+ }
124
+ const expected = "RAN 23 CASES"
125
+ if !strings.Contains(string(output), expected) {
126
+ t.Fatalf("native name collision runner did not report %q; got:\n%s", expected, output)
127
+ }
128
+ }
129
+
130
+ const nativeNameCollisionSource = `import typia from "typia";
131
+
132
+ interface File {
133
+ name: string;
134
+ size: number;
135
+ }
136
+ interface Blob {
137
+ size: number;
138
+ type: string;
139
+ }
140
+ interface Filer {
141
+ name: string;
142
+ }
143
+
144
+ export const isFile = typia.createIs<File>();
145
+ export const validateFile = typia.createValidate<File>();
146
+ export const isBlob = typia.createIs<Blob>();
147
+ export const isFiler = typia.createIs<Filer>();
148
+
149
+ export const isDate = typia.createIs<Date>();
150
+ export const isU8 = typia.createIs<Uint8Array>();
151
+ `
152
+
153
+ const nativeNameCollisionRuntimeRunner = `const mod = require("./main.cjs");
154
+
155
+ let ran = 0;
156
+ const eq = (name, actual, expected) => {
157
+ ran += 1;
158
+ if (actual !== expected) {
159
+ throw new Error(name + ": expected " + expected + " but got " + actual);
160
+ }
161
+ };
162
+
163
+ // A user interface named File must validate against its own members, not the
164
+ // native File instanceof path (#2200 core cases).
165
+ eq("isFile valid", mod.isFile({ name: "a", size: 1 }), true);
166
+ eq("isFile missing size", mod.isFile({ name: "a" }), false);
167
+ eq("isFile missing name", mod.isFile({ size: 1 }), false);
168
+ eq("isFile wrong size type", mod.isFile({ name: "a", size: "1" }), false);
169
+ eq("isFile null", mod.isFile(null), false);
170
+ eq("isFile primitive", mod.isFile(5), false);
171
+
172
+ // validate shares the structural object path, so it agrees with is and names no
173
+ // File expected type.
174
+ eq("validateFile valid", mod.validateFile({ name: "a", size: 1 }).success, true);
175
+ eq("validateFile invalid", mod.validateFile({ name: "a" }).success, false);
176
+
177
+ // A user interface named Blob is structural too.
178
+ eq("isBlob valid", mod.isBlob({ size: 1, type: "x" }), true);
179
+ eq("isBlob missing type", mod.isBlob({ size: 1 }), false);
180
+ eq("isBlob null", mod.isBlob(null), false);
181
+
182
+ // A near-miss name that is not a native was always structural and stays so.
183
+ eq("isFiler valid", mod.isFiler({ name: "a" }), true);
184
+ eq("isFiler invalid", mod.isFiler({}), false);
185
+
186
+ // Genuine natives keep their instanceof check and accept a real instance while
187
+ // rejecting a plain object of the same shape.
188
+ eq("isDate real", mod.isDate(new Date()), true);
189
+ eq("isDate plain object", mod.isDate({}), false);
190
+ eq("isDate null", mod.isDate(null), false);
191
+
192
+ eq("isU8 real", mod.isU8(new Uint8Array(4)), true);
193
+ eq("isU8 plain object", mod.isU8({}), false);
194
+ eq("isU8 array", mod.isU8([1, 2, 3]), false);
195
+ eq("isU8 null", mod.isU8(null), false);
196
+
197
+ // A user File/Blob value is not a real native instance, and a real native is not
198
+ // a user shape: the two classifications stay disjoint.
199
+ eq("isFile rejects a real Date", mod.isFile(new Date()), false);
200
+ eq("isDate rejects a user File shape", mod.isDate({ name: "a", size: 1 }), false);
201
+ eq("isBlob rejects a real Date", mod.isBlob(new Date()), false);
202
+
203
+ console.log("RAN " + ran + " CASES");
204
+ `